?? pshow.c
字號:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#include<time.h>#include<unistd.h>#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60#define ROWS 15#define ROW 5#define INROW 22#define MSGROW 23#define NITEM 8struct time{ int second; /* 0--59 */ int minute; /* 0--59 */ int hour; /* 0--23 */ int mday; /* 1--31 */ int month; /* 1--12 */ int year; /* 1970-- */ int wday; /* 0--6(0=Sunday)*/ int yday; /* 1--365(366) */ long tseconds; /* seconds from 1970.1.1,0:0:0 */};struct plans{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[60];}*pln;int npln;int *order;int col[NITEM]={4,12,20,28,36,44,52,66};struct model{ int no; char name[50];}*mod;int nmod;struct station{ int no; char code[5]; char name[10]; unsigned int howfar;}*sta;int nsta;char *tab[]={ "***** 計 劃 信 息 *****", "----------------------------------------" "---------------------------------------", "Q-退出 D-日期 S-停班 U-恢復 M-改發車時間 B-班序 T-時序 P-打印"};char *title[]={"班次","狀態","時間","座數","余座","檢口","車型","終點"};enum Key{ NONE,Up,Down,Right,Left,Center,End,PgDn,Home, PgUp,Ins,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12};char *RP;char refreshflag=0;char orderflag=0;main(int argc,char *argv[]){ char c; int flag=0; int quit=0; int spln,ppln; int n,date,dd; long tn; struct time t; void timeint(); RP=getenv("ROOTPATH"); if(RP==NULL) return -1; init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; if((nmod=readmod())==-1) nmod=0; if((nsta=readsta())==-1) nsta=0; if((npln=readpln(date))==-1) npln=0; spln=0; ppln=0; while(quit==0) { show(spln,ppln); move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); sigset(SIGALRM,timeint); alarm(1); c=getkey(); sigignore(SIGALRM); clrin(); clrmsg(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: tn=time(0); gettime(tn,&t); /*dd=t.year*10000+t.month*100+t.mday;*/ if(t.second%10==0) { npln=readpln(date); if(npln==-1) { npln=0; spln=0; ppln=0; } refreshflag=1; } break; case Down: if(ppln<npln-1) ppln++; if(ppln-spln>=ROWS) spln++; break; case Up: if(ppln>0) ppln--; if(ppln<spln&&spln>0) spln--; break; case PgUp: if(spln>=ROWS) spln-=ROWS; else spln=0; if(ppln>=ROWS) ppln-=ROWS; else ppln=0; break; case PgDn: if(spln<npln-ROWS) spln+=ROWS; if(ppln<npln-ROWS) ppln+=ROWS; else ppln=npln-1; break; case Home: spln=0; ppln=0; break; case End: spln=npln-npln%ROWS; ppln=npln-1; break; case 'd': n=indate(date); if(n!=-1) if(checkdate(n)==0) { date=n; npln=readpln(date); if(npln==-1) npln=0; spln=0; ppln=0; } else showmsg("error date!"); break; case 's': stop(date,ppln); break; case 'u': unstop(date,ppln); break; case 'b': orderflag=0; sortbybus(npln); break; case 't': orderflag=1; sortbytime(npln); break; case 'm': modifytime(date,spln,ppln); break; case 'n': n=appoint(npln,ppln); if(n!=-1) { spln=n; ppln=n; } break; case 'p': print(); break; case 'q': quit=1; break; default: printf("\07"); break; } } sigignore(SIGALRM); erase(); refresh(); endwin();}init(){ int i;/* void timeint();*/ signal(SIGINT,SIG_IGN);/* sigset(SIGALRM,timeint);*/ initscr(); raw(); nonl(); noecho(); erase(); mvaddstr(ROW-4,40-strlen(tab[0])/2,tab[0]); for(i=0;i<NITEM;i++) mvaddstr(ROW-2,col[i],title[i]); mvaddstr(ROW-1,0,tab[1]); mvaddstr(ROW+ROWS,0,tab[1]); mvaddstr(ROW+ROWS+1,40-strlen(tab[2])/2,tab[2]); refresh();}int readmod(){ char fn[80]; char errs[128]; int fd; long size; sprintf(fn,"%s/bas/model.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打開失敗!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); mod=(struct model *)malloc(size); if(mod==NULL) { showmsg("為車型數據分配內存出錯!"); return -1; } else { lseek(fd,0L,0); read(fd,(char *)mod,size); close(fd); return size/sizeof(struct model); }}int readsta(){ char fn[80]; char errs[128]; int fd; long size; sprintf(fn,"%s/bas/stas.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打開失敗!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); sta=(struct station *)malloc(size); if(sta==NULL) { showmsg("為站點數據分配內存出錯!"); return -1; } else { lseek(fd,0L,0); read(fd,(char *)sta,size); close(fd); return size/sizeof(struct station); }}int readpln(int date){ char fn[80]; char errs[128]; int fd; long size; int i,npln; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打開失敗!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); pln=(struct plans *)malloc(size); order=(int *)malloc(size/sizeof(struct plans)*sizeof(int)); if(pln==NULL) { showmsg("為計劃數據分配內存出錯!"); return -1; } else { lseek(fd,0L,0); read(fd,(char *)pln,size); close(fd); npln=size/sizeof(struct plans); for(i=0;i<npln;i++) order[i]=i; if(orderflag==0) sortbybus(npln); else sortbytime(npln); return npln; }}stop(int date,int ppln){ int n; char fn[80]; int fd; n=order[ppln]; if(pln[n].state==1) return; pln[n].state=1; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { showmsg("無法寫入車次狀態數據, 請排除故障后再試!"); return; } lseek(fd,(long)(n*sizeof(struct plans)),0); lockf(fd,F_LOCK,sizeof(struct plans)); write(fd,(char *)(pln+n),sizeof(struct plans)); close(fd);}unstop(int date,int ppln){ int n; char fn[80]; int fd; n=order[ppln]; if(pln[n].state==0) return; pln[n].state=0; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { showmsg("無法寫入車次狀態數據, 請排除故障后再試!"); return; } lseek(fd,(long)(n*sizeof(struct plans)),0); lockf(fd,F_LOCK,sizeof(struct plans)); write(fd,(char *)(pln+n),sizeof(struct plans)); close(fd);}modifytime(int date,int spln,int ppln){ int n; char fn[80]; int fd; int time; n=order[ppln]; time=pln[n].time; while(1) { if(get_n(ROW+ppln-spln,col[2],"",&time,6)==-1) return; if(time>=0&&time<2400) break; else showmsg("錯誤的時間!"); } pln[n].time=time; sprintf(fn,"%s/data/ticlib/%d",RP,date); fd=open(fn,O_RDWR); if(fd==-1) { showmsg("無法寫入車次狀態數據, 請排除故障后再試!"); return; } lseek(fd,(long)(n*sizeof(struct plans)),0); lockf(fd,F_LOCK,sizeof(struct plans)); write(fd,(char *)(pln+n),sizeof(struct plans)); close(fd);}sortbybus(int npln){ int i,j,k,n; k=npln/2; while(k>0) { for(j=k;j<npln;j++) { n=order[j]; i=j-k; while(i>=0&&pln[order[i]].bus>pln[n].bus) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}sortbytime(int npln){ int i,j,k,n; k=npln/2; while(k>0) { for(j=k;j<npln;j++) { n=order[j]; i=j-k; while(i>=0&&pln[order[i]].time>pln[n].time) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}int print(){ int i,j,n,start,end; char states[10],models[14],stas[10]; start=0; while(1) { clrin(); if(get_n(INROW,30,"起始序號: ",&start,10)==-1) return -1; if(start>=0&&start<npln) break; } end=npln-1; while(1) { clrin(); if(get_n(INROW,30,"結束序號: ",&end,10)==-1) return -1; if(end>=start&&end<npln) break; }/* if(orderflag==0) sortbybus(npln);*/ printf("%c{",0x1b); /* print initialize string */ printf("%30s\n%-8s%-6s%-7s%-6s%-6s%-6s%-14s%s\n%s\n", tab[0],title[0],title[1],title[2],title[3],title[4], title[5],title[6],title[7],tab[1]); for(i=start;i<=end;i++) { n=order[i]; if(pln[n].state==0) strcpy(states,"正常"); else strcpy(states,"撤銷"); for(j=0;j<nmod&&pln[n].model!=mod[j].no;j++) ; if(j<nmod) strcpy(models,mod[j].name); else strcpy(models,"(無)"); for(j=0;j<nsta&&pln[n].laststa!=sta[j].no;j++) ; if(j<nsta) strcpy(stas,sta[j].name); else strcpy(stas,"(無)");/* if(i>0&&pln[n].time!=pln[order[i-1]].time) printf("\n"); */ printf("%-8d%-6s%2d:%02d %-6d%-6d%-6d%-14s%s\n", pln[n].bus,states,pln[n].time/100,pln[n].time%100, pln[n].nseat,pln[n].lseat,pln[n].gate, models,stas); } printf("%c}",0x1b); /* print end string *//* if(orderflag==0) sortbybus(npln);*/ return 0;}int get_n(int y,int x,char *prompt,int *n,int b){ char c,s[80],ss[80]; int i; sprintf(s,"%d",*n); for(i=0;i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); mvaddstr(y,x,s); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=b-1) c=0x0d; else c=getkey(); switch(c) { case -1: continue; case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) { ss[i]='\0'; *n=atoi(ss); } return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else { ss[--i]=' '; ss[i]='\0'; } break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ss[i++]=c; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); refresh(); }}getkey(){ char c,key; char keys[]={Up,Down,Right,Left,NONE,End,PgDn,Home, PgUp,NONE,NONE,Ins}; void timeint(); key=getch(); refresh(); if(key==0x1b) { sigset(SIGALRM,timeint); alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } sigignore(SIGALRM); } return key;}void timeint(){ long tn; struct time t; tn=time(0); gettime(tn,&t); mvprintw(0,0,"%4d年%02d月%02d日%2d時%02d分%02d秒",t.year,t.month, t.mday,t.hour,t.minute,t.second); refresh();}show(int spln,int ppln){ static int n=-1; static int s=-1; static int p=-1; static int o[ROWS]; int i; void timeint(); move(2,70); clrtoeol(); if(npln<=0) { n=npln; mvprintw(2,70,"0/0"); clrscr(); refresh(); return; } else mvprintw(2,70,"%d/%d",ppln+1,npln); sigignore(SIGALRM); mvaddch(p-s+ROW,col[0]-1,' '); if(p!=ppln) p=ppln; if(s==spln) for(i=0;i<ROWS&&s+i<npln&&o[i]==order[s+i];i++) ; if(n!=npln||s!=spln||(i<ROWS&&s+i<npln)||refreshflag==1) { n=npln; s=spln; for(i=0;i<ROWS&&(s+i)<npln;i++) { o[i]=order[s+i]; showone(ROW+i,o[i]); } for(;i<ROWS;i++) move(ROW+i,0), clrtoeol(); refreshflag=0; } else showone(ROW+p-s,order[ppln]); mvaddch(p-s+ROW,col[0]-1,'>'); refresh(); sigset(SIGALRM,timeint);}showone(int row,int n){ int i,j,k,l; move(row,0), clrtoeol(); mvprintw(row,col[0],"%d",pln[n].bus); if(pln[n].state==0) mvaddstr(row,col[1],"正常"); else mvaddstr(row,col[1],"撤銷"); mvprintw(row,col[2],"%2d:%02d",pln[n].time/100,pln[n].time%100); mvprintw(row,col[3],"%d",pln[n].nseat); mvprintw(row,col[4],"%d",pln[n].lseat); mvprintw(row,col[5],"%d",pln[n].gate); for(i=0;i<nmod&&pln[n].model!=mod[i].no;i++) ; if(i>=nmod) mvaddstr(row,col[6],"(none)"); else mvaddstr(row,col[6],mod[i].name); j=0; k=nsta-1; while(j<=k) { l=(j+k)/2; if(pln[n].laststa<sta[l].no) k=l-1; else if(pln[n].laststa>sta[l].no) j=l+1; else break; } if(j>k) mvaddstr(row,col[7],""); else mvaddstr(row,col[7],sta[l].name); refresh();}int appoint(int npln,int ppln){ int n; n=ppln+1; if(get_n(INROW,30,"請輸入序號: ",&n,6)==-1) return -1; if(n>0&&n<=npln) return n-1; else return -1;}clrscr(){ int i; for(i=0;i<ROWS;i++) { move(ROW+i,0); clrtoeol(); } refresh();}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,(80-strlen(s))/2,s); refresh(); printf("\7\7");}clrmsg(){ move(MSGROW,0); clrtoeol(); refresh();}clrin(){ move(INROW,0); clrtoeol(); refresh();}int indate(int date){ int d=date; if(get_n(INROW,30,"請輸入日期: ",&d,10)==-1) return -1; else return d;}int gettime(long tn,struct time *t){ int days,ydays; int TZ; char *tzs; int mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; int i; tzs=(char *)getenv("TZ"); if(tzs==NULL) TZ=0; else { for(;*tzs!='\0'&&*tzs!='+'&&*tzs!='-'&&(*tzs<'0'||*tzs>'9');tzs++) ; TZ=atoi(tzs); TZ=-TZ; } tn+=TZ*HSEC; days=tn/DSEC; t->tseconds=tn; t->wday=(days+4)%7; ydays=365; for(t->year=BEGINYEAR;days>=ydays;t->year++) { if(t->year%4==0) ydays=366; else ydays=365; days-=ydays; } t->yday=days; t->month=1; if(t->year%4==0) for(i=0;days>=mdays[1][i];i++) { days-=mdays[1][i]; t->month++; } else for(i=0;days>=mdays[0][i];i++) { days-=mdays[0][i]; t->month++; } t->mday=days+1; t->hour=tn%DSEC/HSEC; t->minute=tn%HSEC/MSEC; t->second=tn%MSEC; return 0;}int checkdate(int date){ int year,month,day; int mdays[2][12]={31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31}; long tn; struct time t; year=date/10000; month=date%10000/100; day=date%100; tn=time(0); gettime(tn,&t); if(year<t.year||year>t.year+1) return -1; if(month<1||month>12) return -1; if(year%4==0) { if(day<1||day>mdays[1][month-1]) return -1; } else if(day<1||day>mdays[0][month-1]) return -1; return 0;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -