#include #include #include #include #include #include char prefix[128],sep[]="\\",suffix[16]="*.TYP", filename[128],name[16]; char *cp; char *text,line[80],clrscr[]="\33E\33e\33q\n",cursoff[]="\33f"; char title[]=" \33p Bob Areddy's Typing Tutor, v. 2.1 (c) 1990 Genesis Software \33q\n"; char instr[]=" please select file for test\n"; int drv,result,button,fhandle,num=0,lnum,counter,counter2; int tot_char,event,key,junk1,junk2,flag,flag2,errorflag; long *ptr,time1,time2,wpm,best_wpm=0,best_wpm_er=0, sec,error,keystrokes; main() { init(); /* do initialization */ for(;;) { setup(); /* get text file, etc. */ get_input(); /* start test */ prnt_result(); /* give the result */ } } init() { appl_init(); /* initialize an application*/ text=(char *)Malloc(5000L); /* reserve space for text */ if (text==NULL) { form_alert(1,"[1][Not enough memory!][Quit]"); quit(); } } setup() { num=0; keystrokes=0; flag=0; button=1; Cconws(clrscr); printf("%s",title); printf("%s",instr); Cconws(cursoff); strncpy(filename,"\0",128); strncpy(name,"\0",16); strncpy(text,"\0",5000); cp=prefix; /* build path for directory */ drv=Dgetdrv(); /* get current drive */ *cp++=Dgetdrv()+'A'; /* change into ASCII */ *cp++=':'; /* add a ':' into string */ Dgetpath(cp,drv+1); /* get name of curr direct */ strcpy(filename,prefix); /* build string */ strcat(filename,sep); strcat(filename,suffix); while(name[0]=='\0' && button==1) result=fsel_input(filename,name,&button); graf_mouse(M_OFF,0); if (button==0) { quit(); /* if cancel, quit pgm */ return; } fhandle=Fopen(name,0); /* open selected file */ tot_char=Fread(fhandle, /* read all the data */ 5000L,text); Fclose(fhandle); /* close the file */ error=0; /* reset value for errors */ counter2=0; /* and for total keys typed */ } printline() { Cconws(clrscr); /* clear screen */ Cconws("\33b3"); for(num=0;num32 && key<127) || (counter!=0 && (key>31 && key<127))) { if (key!=text[num]) { Cconws("\33p"); /* change color of letter */ error+=errorflag; /* count the error */ Cconout(key); Cconws("\33D\7"); errorflag=0; } else { errorflag=1; Cconws("\33q"); /* normal character color */ Cconout(key); /* print the letter */ num++; counter++; /* counter for current line */ counter2++; /* total keys pressed */ keystrokes++; } if (text[num]==13) { num+=2; counter2++; counter=0; printf("\n\n"); } } } ptr=&time2; Supexec(gettime); /* get the ending time */ } prnt_result() { Cconws(clrscr); /* clear the screen */ printf("\33b3Total number of words: %ld\n",keystrokes/5); printf("Total number of errors: %ld\n",error); sec=(time2-time1)/200; printf("Total time (seconds): %ld\n\n",sec); wpm=(sec>0) ? (keystrokes*60/5/sec) : 0; if (flag==0) { best_wpm=(wpm>best_wpm) ? wpm : best_wpm; best_wpm_er=((wpm-error)>best_wpm_er) ? wpm-error : best_wpm_er; } printf("Words per minute: %ld\n",wpm); printf("Best words per minute: %ld\n\n",best_wpm); printf("Words per minute with\n"); printf("1 wpm penalty/error %ld\n\n",wpm-error); printf("Best WPM with penalty: %ld\n\n",best_wpm_er); printf("\nAny key to run test again. RETURN to exit\n"); key=evnt_keybd() & 0xFF; if (key==13) quit(); graf_mouse(M_ON,0); } quit() { Mfree(text); /* free allocated memory */ appl_exit(); printf("\33f\n"); /* turn cursor off */ exit(0); /* quit */ }