#include #include #include #include #include #include #include "mouseg.h" #define MAX_NUM 300 #define PAUSE printf("HIT ANY KEY TO CONTINUE.\n");getch() #define SCREEN_WIDTH 160 #define EQLIST 0x410 #define MEMSIZ 0x413 #define NAME_SIZE 100 #define S_SIZE 40 #define F_SIZE 20 #define T_SIZE 15 #define MAX_WIDE 250 #define MAX_LINE 30000 /*********************************************************************** ** bit map of colors * ** F B B B R T T T ** ** F = flash 0 = OFF 1 = ON ** B = Background Color ** R = Brightness 0 = Dark 1 = Bright ** T = Text Color ** ** 0 = black ** 1 = blue ** 2 = green ** 3 = cyan ** 4 = red ** 5 = magenta ** 6 = yellow ** 7 = white ** ************************************************************************/ int A_Int=0x3f; int A_Reverse=0x70,A_Black=0x07; int A_Brite=0x1b,A_Norm=0x78; int A_Flash=0xcf; int X1=0,X2=79,Y1=1,Y2=22; extern unsigned char far *Video_Buffer[4]; int Monitor; int Char1=0; union REGS regs; struct equipment { int printers; /* number present */ int sprinter; /* serial printer installed? 0=no 1=yes */ int game; /* game adapter installed? */ int sports; /* number of serial ports */ int dma; /* DMA chip installed? */ int drives; /* number of disk drives */ int video; /* video mode 1=40 color 2=80 color 3=80 B/W */ int disk; /* any disk drives? */ int memory; /* memory size in Kbytes */ }Eq; long huge *Line_Offset; int *StrLen; char *TV_Buffer[24]; long Max_Line; int Monitor; int Page=0xc; void SetCursor(int,int); void ClearScreen(int); void ClearBox(); void WriteStringAtxy(); void ScrollUp(); void ScrollDown(); void DoubleBox(); int load_File(); int check_equip(); int scroll_list(); int search(char *word,int *cx,int *cy,int y1,int y2,int x1, int x2, FILE *fp,int *n1,int *n2,int numline,int maxline,int start); /*********************************************************************** ** ** ** ** ************************************************************************/ int text_view(char *string,long max_line) { int i,j,k; int wildcard=0; char message[100],filename[100]; FILE *fp; Max_Line=max_line; for(i=0;i<24;i++) { TV_Buffer[i]=(char *)malloc(MAX_WIDE); if(TV_Buffer[i]==NULL) { printf( "at i = %d Not enough space for screen buffer to be loaded.\n\n",i); exit(0); } } Line_Offset=(long *)malloc(Max_Line*sizeof(long)); if(Line_Offset==NULL) { printf( "Not enough space for line pointers to be loaded.\n\n",i); for(i=0;i<24;i++) free(TV_Buffer[i]); exit(0); } StrLen=(int *)malloc(Max_Line*sizeof(long)); if(StrLen==NULL) { printf( "Not enough space for string lengths to be loaded.\n\n",i); for(i=0;i<24;i++) free(TV_Buffer[i]); free(Line_Offset); exit(0); } for(i=0;i0) { if(get_file_name(string,filename)>=0) { sprintf(message,"file: %s",filename); scan_text(filename,message,0xc); } else printf("Could not find any '%s' files\n\n",string); } else { fp=fopen(string,"rb"); if(fp) { fclose(fp); sprintf(message,"file: %s",string); if(scan_text(string,message,0xc)<0) printf("Could not open '%s'\n\n",string); } else printf("Could not open '%s'\n\n",string); } for(i=0;i<24;i++) free(TV_Buffer[i]); free(Line_Offset); free(StrLen); } /************************************************************************** ** ** ** ** ***************************************************************************/ int scan_text(filename,message,page) char *filename,*message; { int i,j,k; char string[100],lookfor[100]; int x1=X1,x2=X2,y1=Y1,y2=Y2; Page=page; Monitor=check_equip(&Eq); ClearScreen(A_Norm); DoubleBox(x1,x2,y1,y2,A_Norm); WriteStringAtxy(0,0,80,A_Int,message); WriteStringAtxy(0,y2+1,80,A_Int, "Home, End, PgUp, PgDn, Ctrl PgUp, Ctrl PgDn and up & down arrows to move:"); WriteStringAtxy(0,y2+2,80,A_Int, "arrows=scroll, F2=search, F4=print or Esc to exit"); if(display_text(x1,x2,y1,y2,filename,message)<0) return(-1); ClearScreen(A_Black); SetCursor(0,0); } /************************************************************************** ** ** ** ** ***************************************************************************/ int display_text(x1,x2,y1,y2,filename,message) int x1,x2,y1,y2; char *filename,*message; { int i,j,k,l=0; int numline=0; int cy=y1+1,cx=x1+1,val; FILE *fp,*fpout; char string[MAX_WIDE],string2[50],word[100]; unsigned char ans; int xs=x2-x1-1,ys=y2-y1-1,len; int n1=0,n2=xs-1,n; int maxline=ys,attrib; int speed=5,textwide=x2-x1-1,start=0; long offset; word[0]='\0'; fp=fopen(filename,"rt"); if(!fp) return(-1); sprintf(string2," Scanning File "); WriteStringAtxy(50,y2+2,0,A_Flash,string2); Line_Offset[numline++]=ftell(fp); while(fgets(string,MAX_WIDE-1,fp)&&numline=Max_Line) { ClearScreen(A_Norm); j=Max_Line; printf("Too many lines in file.\n"); printf("Can only work first %d lines.\n",j); printf("\nHIT ANY KEY TO CONTINUE\n\n"); getch(); ClearScreen(A_Norm); DoubleBox(x1,x2,y1,y2,A_Norm); WriteStringAtxy(0,0,80,A_Int,message); WriteStringAtxy(0,y2+1,80,A_Int, "Use Home, End, PgUp, PgDn, and up & down arrows to move: Enter to quit"); WriteStringAtxy(0,y2+2,80,A_Int, "arrows=scroll, F2=search, F4=print or Esc to exit"); re_print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } } l=maxline; n1=0; n2=n1+maxline-1; if(n2>=Max_Line) n2=Max_Line-1; sprintf(string2,"char = %3d line = %5d", Char1+1,n1+(cy-(y1+1))+1); WriteStringAtxy(50,y2+2,0,A_Int,string2); while((ans=getch())!=27&&ans!=13) { if(ans==0) { ans=getch(); if(ans==60||ans==31) /* F2 or Alt S */ start=search(word,&cx,&cy,y1,y2,x1,x2,fp,&n1,&n2, numline,maxline,start); if(ans==62) /* F4 */ { fpout=fopen("PRN","wt"); rewind(fp); ClearScreen(0); printf("\n\n\n\n Printing entire file -- Hit 'Esc' to stop\n\n\n"); while(fgets(string,81,fp)) { if(kbhit()>0) { val=getch(); if(val==27) exit(0); } fprintf(fpout,"%s",string); } exit(0); } if(ans==81) /* Screen Down */ { start=0; if(cy==y2-1) /* cursor at bottom */ { n1+=maxline; n2=n1+maxline-1; if(n2>=numline) { n2=numline-1; n1=n2-maxline+1; if(n1<0) n1=0; } print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } else /* move cursor to bottom */ { if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Norm,TV_Buffer[cy]+Char1); cy=y2-1; if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); } } if(ans==73) /* Screen Up */ { start=0; if(cy==y1+1) /* cursor at top */ { n1-=maxline; if(n1<0) n1=0; n2=n1+maxline-1; if(n2>=numline) { n2=numline-1; n1=n2-maxline+1; } print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } else /* move cursor to top */ { if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Norm,TV_Buffer[cy]+Char1); cy=y1+1; if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); } } if(ans==132) /* PgUp */ { start=0; for(n=n1-1;n>=0;n--) if(Line_Offset[n]<0) break; n1=n; if(n1<0) n1=0; n2=n1+maxline-1; if(n2>=numline) { n2=numline-1; n1=n2-maxline+1; if(n1<0) n1=0; } cy=y1+1; print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); SetCursor(x1+1,cy); } if(ans==118) /* PgDn */ { start=0; for(n=n1+1;n=numline) { n2=numline-1; n1=n2-maxline+1; if(n1<0) n1=0; } cy=y1+1; print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); SetCursor(x1+1,cy); } if(ans==75&&Char1>0) /* left arrow */ { Char1-=speed; if(Char1<0) Char1=0; re_print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } if(ans==77&&Char1+textwide=MAX_WIDE) Char1=MAX_WIDE-textwide+1; re_print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } if(ans==72) /* up arrow */ { start=0; if(cy>y1+1) /* not at top */ { cy-=1; if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); if(StrLen[n1+cy-y1]>Char1) WriteStringAtxy(x1+1,cy+1,xs,A_Norm,TV_Buffer[cy+1]+Char1); } else if(n1>0) /* cursor at top of screen but not of file */ { if(StrLen[n1+cy-y1-1]>Char1) /*cursor off*/ WriteStringAtxy(x1+1,cy,xs,A_Norm,TV_Buffer[cy]+Char1); ScrollDown(1,x1+1,x2-1,y1+1,y2-1,A_Norm); for(i=y2-1;i>y1+1;i--) strcpy(TV_Buffer[i],TV_Buffer[i-1]); n1-=1; n2-=1; if(Line_Offset[n1]>=0) offset=Line_Offset[n1]; else offset=Line_Offset[n1]*-1; fseek(fp,offset,SEEK_SET); fgets(string,MAX_WIDE-1,fp); len=strlen(string); string[len-1]='\0'; strcpy(TV_Buffer[cy],string); if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); } } if(ans==80) /* down arrow */ { start=0; if(cyChar1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); if(StrLen[n1+cy-y1-2]>Char1) WriteStringAtxy(x1+1,cy-1,xs,A_Norm,TV_Buffer[cy-1]+Char1); } else if(n2Char1) /* cursor off */ WriteStringAtxy(x1+1,cy,xs,A_Norm,TV_Buffer[cy]+Char1); ScrollUp(1,x1+1,x2-1,y1+1,y2-1,A_Norm); for(i=y1+1;i=0) offset=Line_Offset[n2]; else offset=Line_Offset[n2]*-1; fseek(fp,offset,SEEK_SET); fgets(string,MAX_WIDE-1,fp); len=strlen(string); string[len-1]='\0'; strcpy(TV_Buffer[cy],string); if(StrLen[n1+cy-y1-1]>Char1) WriteStringAtxy(x1+1,cy,xs,A_Brite,TV_Buffer[cy]+Char1); SetCursor(x1+1,cy); } } if(ans==71) /* Home */ { start=0; n1=0; n2=n1+maxline-1; if(n2>=numline) { n2=numline-1; n1=n2-maxline+1; if(n1<0) n1=0; } cy=y1+1; print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } if(ans==79) /* End */ { start=0; n2=numline-1; n1=n2-maxline+1; if(n1<0) n1=0; cy=y2-1; print_page(x1+1,x2-1,y1+1,y2-1,fp,n1,n2,cy); } } sprintf(string2,"char = %3d line = %5d", Char1+1,n1+(cy-(y1+1))+1); WriteStringAtxy(50,y2+2,0,A_Int,string2); } return(1); } /*********************************************************************** ** ** return: 1 -- valid word ** -1 -- no word chosen ** ************************************************************************/ int search(char *word,int *cx,int *cy,int y1,int y2,int x1, int x2, FILE *fp,int *n1,int *n2,int numline,int maxline,int start) { int i,j,k,n; char string[80],ans,*txt; int end=0,time=0,ret=1,hit=0,tabs=0,over=0; long offset; for(i=0;i<80;i++) string[i]=' '; WriteStringAtxy(0,y2+2,80,0xc,string); WriteStringAtxy(0,y2+2,80,0xc,word); SetCursor(0,y2+2); k=0; do { ans=getch(); if(ans==0) { ans=getch(); if(ans==60||ans==31) /* F2 or Alt S */ { end=1; if(time==0) { if(strlen(word)>0) ret=1; else ret=-1; } else word[k]='\0'; } } if(ans==13) /* Enter */ { end=1; if(time==0) { end=1; if(strlen(word)>0) ret=1; else ret=-1; } word[k]='\0'; } if(ans==8) { if(k>0) k-=1; word[k]='\0'; SetCursor(k,y2+2); } else if(end==0) { word[k++]=ans; word[k]='\0'; SetCursor(k,y2+2); } WriteStringAtxy(0,y2+2,80,0xc,string); WriteStringAtxy(0,y2+2,80,0xc,word); time+=1; }while(end==0); n=*cy-(y1+1)+*n1; if(Line_Offset[n]>=0) offset=Line_Offset[n]; else offset=Line_Offset[n]*-1; fseek(fp,offset,SEEK_SET); if(start<0) start=0; start+=strlen(word); for(i=n;i0) { *n1=n-9; if(*n1<0) *n1=0; *n2=*n1+maxline-1; if(*n2>=numline) { *n2=numline-1; *n1=*n2-maxline+1; if(*n1<0) *n1=0; } *cy=n-*n1+y1+1; print_page(x1+1,x2-1,y1+1,y2-1,fp,*n1,*n2,*cy); ret=start=(int)(txt-string); for(j=0;jChar1) WriteStringAtxy(x1,y,xs,attrib,TV_Buffer[y]+Char1); } } /************************************************************************** ** ** ** ** ***************************************************************************/ int print_page(x1,x2,y1,y2,fp,l1,l2,cy) int x1,x2,y1,y2; FILE *fp; int l1,l2,cy; { int i,j,k,y; char string[MAX_WIDE]; int attrib,xs=x2-x1+1,len; long offset; ClearBox(x1,x2,y1,y2,A_Norm); if(Line_Offset[l1]>=0) offset=Line_Offset[l1]; else offset=Line_Offset[l1]*-1; fseek(fp,offset,SEEK_SET); SetCursor(x1+1,cy); for(i=l1;i<=l2;i++) { y=i-l1+y1; fgets(string,MAX_WIDE-1,fp); len=strlen(string); string[len-1]='\0'; if(y==cy) attrib=A_Brite; else attrib=A_Norm; if(StrLen[i]>Char1) WriteStringAtxy(x1,y,xs,attrib,string+Char1); strcpy(TV_Buffer[y],string); } }