📄 pgate.c
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<fcntl.h>#include<signal.h>#include<curses.h>#include<malloc.h>#define MAXGAT 100#define ROWS 15#define ROW 5#define INROW 22#define MSGROW 23#define NITEM 2struct gate{ int no; char tty[10];}gat[MAXGAT];int ngat;int order[MAXGAT];int delf[MAXGAT];int col[NITEM]={30,40};char *title[NITEM]={"编号","终端"};char *tab[]={"检 票 口 信 息 管 理", "----------------------------------------" "---------------------------------------", "Q-退出 A-添加 M-修改 D-删除 U-恢复 S-保存 R-排序" };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 flag=0; int quit=0; int sgat,pgat; int n; RP=getenv("ROOTPATH"); if(RP==NULL) return -1; init(); if((ngat=readgat())!=-1) { sgat=0; pgat=0; sort(); for(n=0;n<ngat;n++) delf[n]=0; } else ngat=0; while(quit==0) { show(sgat,pgat); 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(pgat<ngat-1) pgat++; if(pgat-sgat>=ROWS) sgat++; break; case Up: if(pgat>0) pgat--; if(pgat<sgat&&sgat>0) sgat--; break; case PgUp: if(sgat>=ROWS) sgat-=ROWS; else sgat=0; if(pgat>=ROWS) pgat-=ROWS; else pgat=0; break; case PgDn: if(sgat<ngat-ROWS) sgat+=ROWS; if(pgat<ngat-ROWS) pgat+=ROWS; else pgat=ngat-1; break; case Home: sgat=0; pgat=0; break; case End: if(ngat%ROWS==0) sgat=ngat-ROWS; else sgat=ngat-ngat%ROWS; pgat=ngat-1; break; case 'a': if(append()==0) flag=1; if(ngat%ROWS==0) sgat=ngat-ROWS; else sgat=ngat-ngat%ROWS; pgat=ngat-1; break; case 'm': if(modify(sgat,pgat)==0) flag=1; break; case 'd': if(delete(sgat,pgat)==0) flag=1; break; case 'u': if(undelete(sgat,pgat)==0) flag=1; break; case 's': if(save()==0) flag=0; break; case 'r': sort(); 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; } } erase(); clear(); refresh(); endwin();}init(){ int i; signal(SIGINT,SIG_IGN); initscr(); raw(); nonl(); noecho(); clear(); 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 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 0; } else { size=lseek(fd,0L,2); if(size>MAXGAT*sizeof(struct gate)) size=MAXGAT*sizeof(struct gate); lseek(fd,0L,0); read(fd,(char *)gat,size); close(fd); return size/sizeof(struct gate); }}sort(){ int i,j,k,n; for(i=0;i<ngat;i++) order[i]=i; k=ngat/2; while(k>0) { for(j=k;j<ngat;j++) { n=order[j]; i=j-k; while(i>=0&&gat[order[i]].no>gat[n].no) { order[i+k]=order[i]; i-=k; } order[i+k]=n; } k/=2; }}int append(){ int i,j,n; int no; char tty[10]; int sgat,pgat; sgat=ngat-ngat%ROWS; i=0; while(1) { ngat++; if(ngat>=MAXGAT) { showmsg("空间已满, 不能再增加!"); break; } pgat=ngat-1; order[pgat]=pgat; if(ngat>1) no=gat[order[pgat-1]].no+1; else no=0; tty[0]='\0'; gat[order[pgat]].no=no; gat[order[pgat]].tty[0]='\0'; if(pgat-sgat>=ROWS) sgat++; show(sgat,pgat); while(1) { if((n=get_n(pgat-sgat+ROW,col[0],"",&no,5))==-1) break; for(j=0;j<ngat-1&&no!=gat[j].no;j++) ; if(j<ngat-1) showmsg("此车主号有重复!"); else break; } if(n==-1) break; if(get_s(pgat-sgat+ROW,col[1],"",tty,50)==-1) break; gat[pgat].no=no; strcpy(gat[pgat].tty,tty); i++; } move(pgat-sgat+ROW,0); clrtoeol(); refresh(); if(i>0) return i; else return -1;}int modify(int sgat,int pgat){ char tty[10]; strcpy(tty,gat[order[pgat]].tty); if(get_s(pgat-sgat+ROW,col[1],"",tty,50)==-1) return -1; strcpy(gat[order[pgat]].tty,tty); return 0;}int delete(int sgat,int pgat){ if(ngat<=0) return -1; if(delf[order[pgat]]==0) { delf[order[pgat]]=1; mvaddch(pgat-sgat+ROW,col[0]-1,'*'); refresh(); return 0; } else return -1;}int undelete(int sgat,int pgat){ if(ngat<=0) return -1; if(delf[order[pgat]]==0) return -1; else { delf[order[pgat]]=0; mvaddch(pgat-sgat+ROW,col[0]-1,' '); refresh(); return 0; }}int save(){ char fn[80]; char msg[128]; int fd; long size; int i; sprintf(fn,"%s/bas/gate.dat",RP); fd=open(fn,O_WRONLY|O_TRUNC); if(fd==-1) { fd=open(fn,O_CREAT|O_WRONLY,0666); if(fd==-1) { sprintf(msg,"文件%s打开失败!",fn); showmsg(msg); return -1; } } size=sizeof(struct gate); for(i=0;i<ngat;i++) if(delf[i]==0) write(fd,(char *)(gat+i),size); close(fd); return 0;}int get_n(int y,int x,char *prompt,int *n,int b){ char c,ss[128]; int i; sprintf(ss,"%d",*n); for(i=strlen(ss);i<b-1;i++) ss[i]=' '; ss[b-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=b-1) c=0x0d; else c=getkey(); switch(c) { case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) *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; ss[i]='\0'; break; default: printf("\7\7"); break; } mvaddstr(y,x,ss); refresh(); }}int get_s(int y,int x,char prompt[],char s[],int n) /* x,y location of cursor; s the string */ /* n length of s; */{ char c,ss[128]; int i; strcpy(ss,s); for(i=strlen(ss);i<n-1;i++) ss[i]=' '; ss[n-1]='\0'; mvaddstr(y,x,prompt); x+=strlen(prompt); mvaddstr(y,x,ss); refresh(); i=0; while(1) { move(y,x+i); refresh(); if(i>=n-1) c=0x0d; else c=getkey(); switch(c) { case 0x1b: /* <ESC> pressed */ return -1; case 0x0d: /* <ENTER> pressed */ if(i) strcpy(s,ss); return 0; case 0x08: /* <BS> pressed */ if(i<=0) continue; else { ss[--i]=' '; ss[i]='\0'; } break; default: ss[i++]=c; ss[i]='\0'; 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(); 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(){}show(int sgat,int pgat){ static int n=-1; static int s=-1; static int p=-1; static int o[ROWS]; int i; move(2,70); clrtoeol(); if(ngat>0) mvprintw(2,70,"%d/%d",pgat+1,ngat); else { mvaddstr(2,70,"0/0"); clrscr(); refresh(); return; } mvaddch(p-s+ROW,col[0]-2,' '); if(p!=pgat) p=pgat; for(i=0;i<ROWS&&s+i<ngat&&o[i]==order[s+i];i++) ; if((n!=ngat&&(p-s)>=ROWS)||s!=sgat||(i<ROWS&&s+i<ngat)) { n=ngat; s=sgat; clrscr(); for(i=0;i<ROWS&&(s+i)<ngat;i++) { o[i]=order[s+i]; showone(ROW+i,o[i]); } } else { move(p-s+ROW,0); clrtoeol(); showone(p-s+ROW,order[p]); } mvaddch(p-s+ROW,col[0]-2,'>'); refresh();}showone(int row,int n){ if(delf[n]) mvaddch(row,col[0]-1,'*'); move(row,col[0]); printw("%d",gat[n].no); mvaddstr(row,col[1],gat[n].tty); refresh();}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 yn(char *p){ char c; do{ move(INROW,0); clrtoeol(); mvprintw(INROW,40-strlen(p)/2,p); move(INROW,41+strlen(p)/2); refresh(); c=getkey(); }while(c!='y'&&c!='Y'&&c!='n'&&c!='N'); if(c>='A'&&c<='Z') c=c-'A'+'a'; if(c=='y') return 0; else return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -