ins_bxs@jhunix.UUCP (Xuning Shan) (12/01/87)
Since the program is a simple less-like pager, it only supports some essential features. The program has been tested with VAXC V2.2. Shan Xuning ins_bxs@jhuvms.BITNET ins_bxs%jhuvms.BITNET@wiscvm.ARPA ----------------------------------------CUT HERE--------------------- /*Shan Xuning, Dept. of Chem. Engr, JHU 18/11/87 */ /*No warranty of any kind, either expressed or implied.*/ /* options: f==>skip forward 22 lines; t==>top of the file; b==>skip backward; h==>help message; q==>quit; +==>print next line; !==>spawn subprocess; /string==> search forward for string. The question mark "?" matches any characters. The string found will be printed as first word on the next screen. The search ignores cases. <cr> and all other characters not listed above print next screen. Send comments and revisions to ins_bxs@jhuvms.BITNET*/ #include <stdio.h> #include <ctype.h> #include <descrip.h> #define T 1 #define F 0 FILE *fp,*fopen(); main(argc, argv) int argc; char **argv; { if (argc < 2) { printf("File:"); scanf("%s",argv[1]); } if ((fp = fopen(argv[1], "r")) == NULL) { printf("can't open %s\n", argv[1]); exit(); } less(fp); } less(fp) FILE *fp; { char c,psign='%',*pcmd,cmd[40],string[80],str1[160],str2[160]; char term[40],*tp,*getenv(); static char vt100[10]="vt100",vt52[10]="vt52"; int i = 0,j=0,k=0,wc=1,test=0,dev1=0,dev2=0; int ftell(),fseek(),getpattern(),find(); int win[150],temp=0,info=0,sizet=0; win[0]=0; fseek(fp,0,2); sizet=ftell(fp); tp=(&term[0]); tp=getenv("TERM"); fseek(fp,0,0); /* I use vt100 series termial. If you use different type, the escape sequences for writing in reverse mode should be changed in the message line. If you don't care, just use plain message line. */ dev1=find(vt100,tp); dev2=find(vt52,tp); prwindow(fp); while(T){ info=ftell(fp); win[wc++]=info; temp=(float)info/(float)sizet*100.0; if(dev1){ printf("\033[7mless...%d%c\033[0m",temp,psign); } else if(dev2){ printf("\033\010less...%d%c\033\007",temp,psign); } /*add your terminal type here*/ else { printf("less...%d%c",temp,psign); } getline(cmd); switch(cmd[0]){ case '+': prline(fp); break; case '\n': prwindow(fp); break; case '!': spawn(); wc=wc-2; if(wc<=0){ wc=1; fseek(fp,0,0); prwindow(fp); } else{ fseek(fp,win[wc],0); prwindow(fp); } break; case 'b': wc=wc-3; if(wc<=0){ wc=1; fseek(fp,0,0); prwindow(fp); } else{ fseek(fp,win[wc],0); prwindow(fp); } break; case 't': fseek(fp,0,0); wc=1; prwindow(fp); break; case 'q': printf("\n\n"); exit(); case 'f': j=0; printf("\nSkipping forward 22 lines.\n"); while(j<=22){ if(fgets(str1,160,fp)==NULL){ printf("\n\nEND OF FILE\n"); exit(); } j++; } break; case '/': k=1; while(k<=39){ string[k-1]=cmd[k]; k++; } getpattern(str2,fp); while(!(test=find(string,str2))){ if(!getpattern(str2,fp)){ wc=wc-2; if(wc<0)wc=1; fseek(fp,win[wc],0); printf("\nPattern not found.\n"); sleep(-2); break; } } if(test){ printf("%s",str2); } prwindow(fp); break; case 'h': printf("\n\n\tt: top of the file;\n"); printf("\tf: skip forward;\n"); printf("\tb: skip backward;\n"); printf("\th: print this message;\n"); printf("\t!: spawn subprocess;\n"); printf("\t\\string: search forward;\n"); printf("\tq: quit for now.\n\n"); printf("type <return> to continue\n"); getchar(); break; default: prwindow(fp); break; } } } prwindow(fp) FILE *fp; { int i=0; char *fgets(),str[160]; printf("\n"); while(i<22){ if(fgets(str,160,fp)==NULL) { printf("\nEND OF FILE\n"); exit(); } printf("%s",str); i=i+1; } } prline(fp) FILE *fp; { char *fgets(),str[160]; if(fgets(str,160,fp)==NULL){ printf("\nEND OF FILE\n"); exit(); } printf("%s",str); } getline(cmd) char *cmd; { int i=0; char c; while((c=getchar())!='\n') { if(isspace(c)){ continue; } cmd[i++]=tolower(c); /*eliminate spaces, ignore cases */ } cmd[i]='\0'; } int len(str) char *str; { int i=0; while(*str++) i++; return(i); } int getpattern(str,fp) char *str; FILE *fp; { int c,i=0; while(T){ c=getc(fp); if(c==EOF){ return(F); } if(isalnum(c)) break; } *str++=tolower(c); while(i++<=80){ c=getc(fp); if(c==EOF) return(F); if(isspace(c)) break; *str++=tolower(c); } *str='\0'; return(T); } int find(str1,str2) char *str1,*str2; { int i=0,len1=0,len2=0,strlen(); char *temp; temp=str1; len1=strlen(str1); len2=strlen(str2); if(len1>len2) return(F); while((*temp)!='\0'){ if((*str2=='\0')) return(F); if(*temp=='?') { temp++; str2++; continue; } if((*temp++)!=(*str2++)) temp=str1; } return(T); } spawn() { static char cmd[10]="spawn\0"; $DESCRIPTOR(cmddesc,cmd); printf("Spawning subprocess......"); lib$spawn(&cmddesc); } ---------------------------END HERE------------------------------