📄 ask.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 ROWS 15#define ROW 4#define SHOWROW 24#define MSGROW 22#define NITEM 8#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 ticket{ int bus; int sta; unsigned user; /* sale user */ char flag; /* 0-all 1-half */ int date; /* date saled */ int time; /* time saled */ char checkflag; /* checked or not */ unsigned number; /* number of ticket */ int seat; /* seat of ticket in bus */ int price; /* all price or half price */ int ruser; /* return user(normal -1) */ int rdate; /* date returned */ int rtime; /* time returned */ unsigned rprice; /* price returned */}*tic; struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];}*tl;int *order;int ntl;struct statobus{ int sta; int bus; unsigned price; unsigned bprice;}*sb,*cursb;int nsb,ncursb;struct station{ int no; char code[5]; char name[10]; unsigned int howfar;}*sta;int nsta;struct model{ int no; char name[50];}*mod;int nmod;struct buses{ int psb; int ptl;}*bus;int nbus;char *tab[]={ "*** 服 务 台 查 询 系 统 ***", "----------------------------------------" "---------------------------------------", "Q-退出 空格--到站 '-'-前一天 '+'-后一天"};char *title[]={"班次","时间","座数","余座","检票口","车型","终点","票价"};int col[NITEM]={4,12,20,28,36,44,60,70};int uno;struct passwd *upwd;int date,psta;char ucode[5],uname[10],csta[10];int showcol[5]={20,40,60};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;main(int argc,char *argv[]){ char c; int sbus,pbus,quit; long tn; struct time t; int n; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; uno=getuid(); upwd=getpwuid(uno); if(upwd==NULL) { printf("\nTHE USER %d DOS NOT EXIST!\n",uno); return -1; } else { strcpy(ucode,upwd->pw_name); strcpy(uname,upwd->pw_comment); } init(); tn=time(0); gettime(tn,&t); date=t.year*10000+t.month*100+t.mday; psta=311; nsta=readsta(); nmod=readmod(); nsb=readsb(date); ntl=readtl(date); if(nsta==-1||nmod==-1||nsb==-1||ntl==-1) quit=1; else { showitem(); nbus=takebus(); quit=0; sbus=0; pbus=0; } show(1,sbus,pbus); while(quit==0) { move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); alarm(1); c=getkey(); refresh(); if(c!=-1) clrmsg(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: /* return of alarm */ tn=time(0); gettime(tn,&t); if(t.hour==0&&t.minute==0&&t.second==0) { n=t.year*10000+t.month*100+t.mday; if(n>date) date=n; } if(t.second%10==0) { showitem(); nsb=readsb(date); ntl=readtl(date); n=takebus(); if(n!=nbus) { sbus=0; pbus=0; nbus=n; } show(1,sbus,pbus); } break; case Down: if(pbus<nbus-1) pbus++; if(pbus-sbus>=ROWS) { sbus++; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case Up: if(pbus>0) pbus--; if(pbus<sbus&&sbus>0) { sbus--; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case PgUp: if(pbus>ROWS) pbus-=ROWS; else pbus=0; if(sbus>ROWS) { sbus-=ROWS; show(1,sbus,pbus); } else if(sbus>0) { sbus=0; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case PgDn: if(pbus<nbus-ROWS) pbus+=ROWS; else pbus=nbus-1; if(sbus<nbus-ROWS) { sbus+=ROWS; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case Home: pbus=0; if(sbus>0) { sbus=0; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case End: pbus=nbus-1; if(pbus-sbus>=ROWS) { sbus=nbus-ROWS; show(1,sbus,pbus); } else show(0,sbus,pbus); break; case ' ': if(insta()!=-1) { nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); } showitem(); break; case '+': tn=time(0); do{ tn+=86400; /* 24h. * 3600Sec. */ gettime(tn,&t); n=t.year*10000+t.month*100+t.mday; }while(n<=date); date=n; showitem(); nsb=readsb(date); ntl=readtl(date); nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); break; case '-': n=date; tn=time(0); while(1) { gettime(tn,&t); if(t.year*10000+t.month*100+t.mday<date) { n=t.year*10000+t.month*100 +t.mday; tn+=86400; } else break; } if(n<date) { date=n; showitem(); nsb=readsb(date); ntl=readtl(date); nbus=takebus(); sbus=0; pbus=0; show(1,sbus,pbus); } break; case 'q': quit=1; break; default: printf("\07"); break; } } getch(); 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]); mvaddstr(ROW+ROWS+2,0,tab[1]); 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; int i,nsta; 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); nsta=size/sizeof(struct station); for(i=0;i<nsta&&psta!=sta[i].no;i++) ; if(i<nsta) strcpy(csta,sta[i].name); else csta[0]='\0'; return nsta; }}int readsb(int date){ char fn[80]; char errs[128]; int i,fd; long size; if(sb!=NULL) free(sb); sprintf(fn,"%s/data/idex/%d",RP,date); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(errs,"文件%s打开失败!",fn); showmsg(errs); return fd; } size=lseek(fd,0L,2); sb=(struct statobus *)malloc(size); if(sb==NULL) { showmsg("为站点-班车数据分配内存出错!"); return -1; } lseek(fd,0L,0); read(fd,(char *)sb,size); close(fd); return size/sizeof(struct statobus);}int readtl(int date){ char fn[80]; char errs[128]; int fd; long size; int i; if(tl!=NULL) free(tl); if(order!=NULL) free(order); 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); ntl=size/sizeof(struct ticketlib); tl=(struct ticketlib *)malloc(size); order=(int *)malloc(ntl*sizeof(int)); if(tl==NULL||order==NULL) { showmsg("为排序数据分配内存出错!"); return -1; } lseek(fd,0L,0); read(fd,(char *)tl,size); close(fd); for(i=0;i<ntl;i++) order[i]=i; sorttl(ntl); return ntl;}sorttl(int ntl){ int i,j,k,n; k=ntl/2; while(k>0) { for(j=k;j<ntl;j++) { n=order[j];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -