📄 pbusapp.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#include<unistd.h>#include<time.h>#include<pwd.h>#define MAXBUS 10#define MAXSEAT 60#define RATE 6#define ROWS 15#define ROW 5#define INROW 22#define MSGROW 23#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 buses{ int no; int time; int owner; int rate; int gate; int model; int nseat;}bus[MAXBUS];int nbus=0;char ssta[MAXBUS][10];int order[MAXBUS];int delf[MAXBUS]; int col[NITEM]={6,14,22,30,50,56,62,74};struct ticketlib{ int bus; int state; int time; int nseat; int lseat; int gate; int model; int laststa; char tab[MAXSEAT];};struct owner{ int no; char name[50];}*own;int nown;struct gate{ int no; char tty[10];}*gat;int ngat;struct model{ int no; char name[50];}*mod;int nmod;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 *tab[]={ "加 班 班 次 信 息 管 理", "----------------------------------------" "---------------------------------------", "Q-退出 N-指定 A-添加 M-修改 D-删除 U-恢复 S-保存"};char *title[]={"班次","终点","时间","车主","提成","检口","车型","座数"};int uno;struct passwd *upwd;char ucode[10],homedir[80];char *RP;main(int argc,char *argv[]){ char c; int flag=0; int quit=0; int sbus=0,pbus=0; int n; RP=getenv("ROOTPATH"); if(RP==NULL) { printf("\n\r环境变量'ROOTPATH'未初始化!\0x7\0x7\n\r"); return -1; } uno=getuid(); upwd=getpwuid(uno); if(upwd==NULL) { printf("\nTHE USER %d DOES NOT EXIST!\n",uno); return -1; } else { strcpy(ucode,upwd->pw_name); strcpy(homedir,upwd->pw_dir); } init(); nown=readown(); if(nown==-1) nown=0; ngat=readgat(); if(ngat==-1) ngat=0; nmod=readmod(); if(nmod==-1) nmod=0;/* nbbus=readbbus(); if(nbbus==-1) nbbus=0;*/ nbus=readbus(); if(nbus==-1) nbus=0; else { for(n=0;n<nbus;n++) delf[n]=0; readlsta(); } while(quit==0) { show(sbus,pbus); move(ROW+ROWS+1,41+strlen(tab[2])/2); refresh(); c=getkey(); clrin(); clrmsg(); if(c>='A'&&c<='Z') c=c-'A'+'a'; switch(c) { case -1: break; case Down: if(pbus<nbus-1) pbus++; if(pbus-sbus>=ROWS) sbus++; break; case Up: if(pbus>0) pbus--; if(pbus<sbus&&sbus>0) sbus--; break; case PgUp: if(sbus>=ROWS) sbus-=ROWS; else sbus=0; if(pbus>=ROWS) pbus-=ROWS; else pbus=0; break; case PgDn: if(sbus<nbus-ROWS) sbus+=ROWS; if(pbus<nbus-ROWS) pbus+=ROWS; else pbus=nbus-1; break; case Home: sbus=0; pbus=0; break; case End: if(nbus%ROWS==0) sbus=nbus-ROWS; else sbus=nbus-nbus%ROWS; pbus=nbus-1; break; case 'n': n=appoint(pbus); if(n!=-1) { sbus=n; pbus=n; } break; case 'a': if(append()==0) flag=1; if(nbus%ROWS==0) sbus=nbus-ROWS; else sbus=nbus-nbus%ROWS; pbus=nbus-1; break; case 'm': if(modify(sbus,pbus)==0) flag=1; break; case 'd': if(delete(sbus,pbus)==0) flag=1; break; case 'u': undelete(sbus,pbus); break; case 's': if(save()==0) flag=0; break; case 'q': if(flag==0) quit=1; else if(save()==0) quit=1; else if(yn("fail to save, quit(y/n)? ")==0) quit=1; break; default: printf("\07"); break; } } sigignore(SIGALRM); erase(); refresh(); endwin();}init(){ int i; signal(SIGINT,SIG_IGN); 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 readown(){ char fn[80]; char msg[128]; int fd; long size; sprintf(fn,"%s/bas/owner.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); own=(struct owner *)malloc(size); if(own==NULL) { showmsg("Failed to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)own,size); close(fd); return size/sizeof(struct owner);}int readgat(){ char fn[80]; char msg[128]; int fd; long size; sprintf(fn,"%s/bas/gate.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); gat=(struct gate *)malloc(size); if(gat==NULL) { showmsg("Failed to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)gat,size); close(fd); return size/sizeof(struct gate);}int readmod(){ char fn[80]; char msg[128]; int fd; long size; sprintf(fn,"%s/bas/model.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); mod=(struct model *)malloc(size); if(mod==NULL) { showmsg("Failed to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)mod,size); close(fd); return size/sizeof(struct model);}readlsta(){ struct rstation{ int bus; int sta; unsigned price; unsigned bprice; }*rsta; struct station{ int no; char code[5]; char name[10]; unsigned int howfar; }*sta,tsta; int nsta,nrsta; int lsta[MAXBUS]; char fn[80]; char msg[128]; int fd; long size; int i,j,k,n; sprintf(fn,"%s/tmp/route.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); /*showmsg(msg);*/ for(i=0;i<nbus;i++) strcpy(ssta[i],"(无)"); return fd; } size=lseek(fd,0L,2); rsta=(struct rstation *)malloc(size); if(rsta==NULL) { showmsg("Failed to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)rsta,size); close(fd); nrsta=size/sizeof(struct rstation); for(i=0;i<nbus;i++) lsta[i]=-1; for(i=0;i<nrsta;i++) { j=0; k=nbus-1; while(j<=k) { n=(j+k)/2; if(rsta[i].bus<bus[n].no) k=n-1; else if(rsta[i].bus>bus[n].no) j=n+1; else { lsta[n]=rsta[i].sta; break; } } } free(rsta); sprintf(fn,"%s/bas/stas.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } size=lseek(fd,0L,2); sta=(struct station *)malloc(size); if(sta==NULL) { showmsg("Failed to alloc memory!"); return -1; } lseek(fd,0L,0); read(fd,(char *)sta,size); close(fd); nsta=size/sizeof(struct station); size=sizeof(struct station); /* now to sort station */ k=nsta/2; while(k>0) { for(j=k;j<nsta;j++) { memcpy(&tsta,sta+j,size); i=j-k; while(i>=0&&sta[i].no>sta[j].no) { memcpy(sta+i+k,sta+i,size); i-=k; } memcpy(sta+i+k,&tsta,size); } k/=2; } for(i=0;i<nbus;i++) { j=0; k=nsta-1; while(j<=k) { n=(j+k)/2; if(lsta[i]<sta[n].no) k=n-1; else if(lsta[i]>sta[n].no) j=n+1; else { strcpy(ssta[i],sta[n].name); break; } } if(j>k) strcpy(ssta[i],"(无)"); } free(sta);}int readbus(){ char fn[80]; char msg[128]; int fd; long size; sprintf(fn,"%s/bus.dat",homedir); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } else { size=lseek(fd,0L,2); if(size>MAXBUS*sizeof(struct buses)) size=MAXBUS*sizeof(struct buses); lseek(fd,0L,0); read(fd,(char *)bus,size); close(fd); return size/sizeof(struct buses); }}/*int readbbus(){ char fn[80]; char msg[128]; int fd; long size; sprintf(fn,"%s/bas/bus.dat",RP); fd=open(fn,O_RDONLY); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return fd; } else { size=lseek(fd,0L,2); bbus=(struct buses *)malloc(size); if(bbus==NULL) { showmsg("为正常班次数据分配内存出错!"); close(fd); return -1; } lseek(fd,0L,0); read(fd,(char *)bbus,size); close(fd); return size/sizeof(struct buses); }}*/int append(){ char ret=0; int i,j; int no,time,owner,rate,gate,model,nseat; int nb,sb,pb; nb=nbus; sb=nbus-nbus%ROWS; while(ret==0) { nbus++; if(nbus>=MAXBUS) { showmsg("空间已满, 不能再增加!"); break; } pb=nbus-1; delf[pb]=0; order[pb]=pb; if(nbus>1) no=bus[order[pb-1]].no+1; else no=0; time=0; owner=(nown>0) ? own[0].no : 0; rate=RATE; gate=(ngat>0) ? gat[0].no : 0; model=(nmod>0) ? mod[0].no : 0; nseat=0; bus[pb].no=no; strcpy(ssta[pb],"(无)"); bus[pb].time=time; bus[pb].owner=owner; bus[pb].rate=rate; bus[pb].gate=gate; bus[pb].model=model; bus[pb].nseat=nseat; if(pb-sb>=ROWS) sb++; show(sb,pb); while(ret==0) if(get_n(pb-sb+ROW,col[0],"",&no,col[1]-col[0])==-1) ret=1; else if(checkbus(no)==-1) showmsg("该班次在计划中已经存在!"); else { for(i=0;i<nbus;i++) if(no==bus[i].no&&i!=pb) break;/* for(j=0;j<nbbus&&no!=bbus[j].no;j++) ;*/ if(i<nbus/*||j<nbbus*/) showmsg("此车次有重复!"); else break; } while(ret==0) if(get_n(pb-sb+ROW,col[2],"",&time,col[3]-col[2])==-1) ret=1; else if(time<0||time>=2400) showmsg("错误的时间!"); else { mvprintw(pb-sb+ROW,col[2],"%2d:%02d", time/100,time%100); refresh(); break; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -