📄 pbsshow.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<pwd.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 9struct 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 busstate{ int bus; int time; char regi; int reguser; int regtime; char check; int gate; int checkuser; int checkbegintime; int checkendtime; char print; int printuser; int printtime; char settle; int owner; int rate; int setleuser; int setletime;}*bs;int nbs;int *order;int col[NITEM]={2,10,18,27,35,44,50,58,67};char *tab[]={ "班 次 状 态 信 息 查 询", "----------------------------------------" "---------------------------------------", "Q-退出 D-日期 N-指定 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 orderflag=0;main(int argc,char *argv[]){ char c; int flag=0; int quit=0; int sbs=0,pbs=0; int n,date; long tn,minute; struct time t; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; minute=t.minute; if((nbs=readbs(date))==-1) nbs=0; if(orderflag) sortbybus(); else sortbytime(); show(1,sbs,pbs); while(quit==0) { move(21,41+strlen(tab[2])/2); refresh(); alarm(1); c=getkey(); clrin(); clrmsg(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: tn=time(0); gettime(tn,&t); if(t.second%10==0) { nbs=readbs(date); if(nbs==-1) nbs=0; if(orderflag) sortbybus(); else sortbytime(); show(1,sbs,pbs); } break; case Down: if(pbs<nbs-1) pbs++; if(pbs-sbs>=ROWS) { sbs++; show(1,sbs,pbs); } else show(0,sbs,pbs); break; case Up: if(pbs>0) pbs--; if(pbs<sbs&&sbs>0) { sbs--; show(1,sbs,pbs); } else show(0,sbs,pbs); break; case PgUp: if(pbs>=ROWS) pbs-=ROWS; else pbs=0; if(sbs>=ROWS) { sbs-=ROWS; show(1,sbs,pbs); } else if(sbs>0) { sbs=0; show(1,sbs,pbs); } else show(0,sbs,pbs); break; case PgDn: if(pbs<nbs-ROWS) pbs+=ROWS; else pbs=nbs-1; if(sbs<nbs-ROWS) { sbs+=ROWS; show(1,sbs,pbs); } else show(0,sbs,pbs); break; case Home: if(sbs>0) { sbs=0; pbs=0; show(1,sbs,pbs); } else { pbs=0; show(0,sbs,pbs); } break; case End: pbs=nbs-1; if(pbs-sbs>=ROWS) { sbs=nbs-ROWS; show(1,sbs,pbs); } else show(0,sbs,pbs); break; case 'd': n=indate(date); if(n==-1||checkdate(n)==0) { date=n; nbs=readbs(date); if(nbs==-1) nbs=0; if(orderflag) sortbybus(); else sortbytime(); show(1,sbs,pbs); } else printf("\7\7"); break; case 'n': n=appoint(pbs); if(n!=-1) if(n-sbs>=ROWS||n<sbs) { sbs=n; pbs=n; show(1,sbs,pbs); } else { pbs=n; show(0,sbs,pbs); } break; case 'b': sortbybus(); show(1,sbs,pbs); break; case 't': sortbytime(); show(1,sbs,pbs); break; case 'p': print(); break; case 'q': quit=1; break; default: printf("\07"); break; } } sigignore(SIGALRM); erase(); refresh(); endwin();}init(){ int i; void showtime(); signal(SIGINT,SIG_IGN); sigset(SIGALRM,showtime); 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 readbs(int date){ char fn[80]; char errs[128]; int fd; long size; int i,n; sprintf(fn,"%s/data/state/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); if(bs!=NULL) free(bs); if(order!=NULL) free(order); bs=(struct busstate *)malloc(size); order=(int *)malloc((size/sizeof(struct busstate))*sizeof(int)); if(bs==NULL||order==NULL) { showmsg("为班次状态数据分配内存出错!"); return -1; } else { lseek(fd,0L,0); size=read(fd,(char *)bs,size); close(fd); n=size/sizeof(struct busstate); for(i=0;i<n;i++) order[i]=i; return n; }}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 showtime(); sigset(SIGALRM,showtime); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}void showtime(){ long tn; struct time t; tn=time(0); gettime(tn,&t); mvprintw(0,0,"%d年%2d月%2d日%2d时%2d分%2d秒",t.year,t.month, t.mday,t.hour,t.minute,t.second); refresh();}show(int flag,int sbs,int pbs){ static int s=-1,p=-1; int i; void showtime(); move(2,70); clrtoeol(); if(nbs!=0) mvprintw(2,70,"%d/%d",pbs+1,nbs); else mvprintw(2,70,"0/0"); if(nbs<=0) { clrscr(); return; } if(flag==0) mvaddch(p-s+ROW,col[0]-1,' '); else { for(i=0;i<ROWS&&(sbs+i)<nbs;i++) { sigignore(SIGALRM); showone(ROW+i,sbs+i); sigset(SIGALRM,showtime); } for(;i<ROWS;i++) move(ROW+i,0), clrtoeol(); } mvaddch(pbs-sbs+ROW,col[0]-1,'>'); s=sbs; p=pbs; refresh();}int indate(int date){ int d=date; if(get_n(INROW,30,"请输入日期: ",&d,10)==-1) return -1; else return d;}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;}showone(int row,int pbs){ int i,n; struct passwd *upwd; n=order[pbs]; move(row,0); clrtoeol(); mvprintw(row,col[0],"%d",bs[n].bus); mvprintw(row,col[1],"%2d:%02d",bs[n].time/100,bs[n].time%100); if(bs[n].regi==0) mvaddstr(row,col[2],"(无)"); else { upwd=getpwuid(bs[n].reguser); if(upwd!=NULL) mvaddstr(row,col[2],upwd->pw_comment); else mvprintw(row,col[2],"%d",bs[n].reguser); } mvprintw(row,col[3],"%2d:%02d",bs[n].regtime/100,bs[n].regtime%100); if(bs[n].check==0) mvaddstr(row,col[4],"(无)"); else { upwd=getpwuid(bs[n].checkuser); if(upwd!=NULL) mvaddstr(row,col[4],upwd->pw_comment); else mvprintw(row,col[4],"%d",bs[n].checkuser); } mvprintw(row,col[5],"%2d:%02d",bs[n].checkbegintime/100,bs[n].checkbegintime%100); mvprintw(row,col[6],"%2d:%02d",bs[n].checkendtime/100,bs[n].checkendtime%100); if(bs[n].print==0) mvaddstr(row,col[7],"(无)"); else { upwd=getpwuid(bs[n].printuser); if(upwd!=NULL) mvaddstr(row,col[7],upwd->pw_comment); else mvprintw(row,col[7],"%d",bs[n].printuser); } mvprintw(row,col[8],"%2d:%02d",bs[n].printtime/100,bs[n].printtime%100); refresh();}int appoint(int pbs){ int i,n; n=bs[order[pbs+1]].time; if(get_n(INROW,30,"请输入时间: ",&n,6)==-1) return -1; if(n<0||n>2359) { showmsg("错误的时间, 请重新输入!"); return -1; } for(i=0;i<nbs&&n>bs[order[i]].time;i++) ; if(i<nbs) return i; else return -1;}sortbybus(){ int i,j,k,n; k=nbs/2; while(k>0) { for(j=k;j<nbs;j++) { n=order[j]; i=j-k; while(i>=0&&bs[order[i]].bus>bs[n].bus) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; } orderflag=1;}sortbytime(){ int i,j,k,n; k=nbs/2; while(k>0) { for(j=k;j<nbs;j++) { n=order[j]; i=j-k; while(i>=0&&bs[order[i]].time>bs[n].time) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; } orderflag=0;}int print(){ int i,n,start,end; char yes[]="是",no[]="否"; start=0; while(1) { clrin(); if(get_n(INROW,30,"起始序号: ",&start,10)==-1) return -1; if(start>=0&&start<nbs) break; } end=nbs-1; while(1) { clrin(); if(get_n(INROW,30,"结束序号: ",&end,10)==-1) return -1; if(end>=start&&end<nbs) break; } printf("%c{",0x1b); /* print initialize string */ printf("%30s\n",tab[0]); printf("%15s%15s%15s%15s%15s%15s\n",title[0],"发车时间", "报班与否","报班时间","检票与否","结算与否"); printf("%s\n",tab[1]); for(i=start;i<end;i++) { n=order[i]; printf("%15d%12d:%02d",bs[n].bus,bs[n].time/100,bs[n].bus%100); if(bs[n].regi==0) printf("%15s%12d:%02d",no,0,0); else printf("%15s%12d:%02d",yes,bs[n].regtime/100, bs[n].regtime%100); if(bs[n].check==0) printf("%15s",no); else printf("%15s",yes); if(bs[n].print==0) printf("%15s",no); else printf("%15s",yes); printf("\n"); } printf("%c}",0x1b); /* print end string */ return 0;}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 gettime(long tn,struct time *t){ int days,ydays; short TZ; char *tzs; short 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}; short 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 getdays(int date1,int date2){ int days; short 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}; short i; int dd1,dd2; short y1,y2,m1,m2,d1,d2; if(date1>date2) dd1=date2, dd2=date1; else if(date1<date2) dd1=date1, dd2=date2; else return 0; y1=dd1/10000, y2=dd2/10000; m1=dd1%10000/100, m2=dd2%10000/100; d1=dd1%100, d2=dd2%100; days=0; for(i=y1+1;i<y2;i++) if(i%4==0) days+=366; else days+=365; if(y1==y2) for(i=m1;i<m2;i++) if(y1%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; else { for(i=m1+1;i<=12;i++) if(y1%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; for(i=1;i<m2;i++) if(y2%4==0) days+=mdays[1][i-1]; else days+=mdays[0][i-1]; } days-=d1; days+=d2; if(date1>date2) return -days; else return days;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -