📄 recheck.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<errno.h>#include<unistd.h>#include<pwd.h>#define MAXSEAT 60#define MSGROW 23#define BEGINYEAR 1970#define DSEC 86400#define HSEC 3600#define MSEC 60struct 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 regiuser; int regitime; 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;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;int uno;main(){ long tn; struct time t; int busno=0; int i; char msg[80]; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; uno=getuid(); nbs=readbs(); if(nbs==-1) return -1; signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); while(1) { clear(); mvaddstr(10,30,"*** 设置车次重检 ***"); mvaddstr(MSGROW,30,"敲<ESC>键退出..."); refresh(); if(get_n(15,30,"请输入班次号: ",&busno,10)==-1) break; for(i=0;i<nbs&&busno!=bs[i].bus;i++) ; if(i<nbs) { if(check(busno)!=0) continue; if(bs[i].print==1) { tn=time(0); gettime(tn,&t); bs[i].print=0; writebs(i,bs[i]); showmsg("设置重检成功!"); } else { sprintf(msg,"班次%d并未打印结算单,可以继续检票!",busno); showmsg(msg); } } else { sprintf(msg,"班次%d不存在, 无法设置重检!",busno); showmsg(msg); } } if(bs!=NULL) free(bs); erase(); clear(); refresh(); endwin();}int readbs(){ int fd; char fn[80]; long size; char msg[80]; long tn; struct time t; tn=time(0); gettime(tn,&t); sprintf(fn,"%s/data/state/%d",RP,t.year*10000+t.month*100+t.mday); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件 %s 打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); bs=(struct busstate *)malloc(size); if(bs==NULL) { showmsg("为班次数据分配内存出错!"); close(fd); return -1; } else { lseek(fd,0L,0); read(fd,(char *)bs,size); close(fd); return size/sizeof(struct busstate); }}int check(int bus){ long tn; struct time t; struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT]; }tl; char fn[80],msg[80]; int fd; long size,ss; tn=time(0); gettime(tn,&t); sprintf(fn,"%s/data/ticlib/%d",RP,t.year*10000+t.month*100+t.mday); fd=open(fn,O_RDONLY); if(fd==-1) { showmsg("票库文件无法打开, 请排除故障后重试!"); return -1; } size=sizeof(tl); while(1) { ss=read(fd,(char *)&tl,size); if(ss!=size) { showmsg("票库中无此班次, 请核实后重试!"); close(fd); return -1; } if(tl.bus==bus) { close(fd); if(tl.state==0) return 0; else { sprintf(msg,"班次%d已经停开, 不能重检!",bus); showmsg(msg); return -1; } } }}int writebs(int seat,struct busstate bs){ int fd; char fn[80]; long tn; struct time t; char msg[80]; tn=time(0); gettime(tn,&t); sprintf(fn,"%s/data/state/%d",RP,t.year*10000+t.month*100+t.mday); fd=open(fn,O_WRONLY); if(fd==-1) { sprintf(msg,"文件%s无法打开!",fn); showmsg(msg); return -1; } lseek(fd,seat*sizeof(struct busstate),0); lockf(fd,F_LOCK,sizeof(struct busstate)); write(fd,(char *)&bs,sizeof(struct busstate)); close(fd); return 0;}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++,days-=ydays) if(t->year%400==0||(t->year%4==0&&t->year%100!=0)) ydays=366; else ydays=365; t->yday=days; t->month=1; if(t->year%400==0||(t->year%4==0&&t->year%100!=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 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,NONE,PgDn,Home, PgUp,NONE,End,Ins}; void timeint(); sigset(SIGALRM,timeint); key=getch(); refresh(); if(key==0x1b) { alarm(1); if(getch()!=-1) { c=getch(); refresh(); key=keys[c-'A']; } } sigignore(SIGALRM); return key;}void timeint(){}showmsg(char s[]){ move(MSGROW,0); clrtoeol(); mvaddstr(MSGROW,(80-strlen(s))/2,s); refresh(); printf("\7\7"); getch(); refresh();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -