1 #ifndef lint 2 static char sccsid[] = "@(#)dounit.c 4.2 (Berkeley) 04/25/83"; 3 #endif not lint 4 5 #include "stdio.h" 6 #include "lrnref.h" 7 8 int remind = 2; /* to remind user of "again" and "bye" */ 9 extern int noclobber; 10 11 dounit() 12 { 13 char tbuff[100]; 14 15 if (todo == 0) 16 return; 17 wrong = 0; 18 retry: 19 if (!noclobber) 20 start(todo); /* clean up play directory */ 21 sprintf(tbuff, "%s/%s/L%s", direct, sname, todo); /* script = lesson */ 22 scrin = fopen(tbuff, "r"); 23 if (scrin == NULL) { 24 perror(tbuff); 25 fprintf(stderr, "Dounit: no lesson %s.\n", tbuff); 26 wrapup(1); 27 } 28 29 copy(0, scrin); /* print lesson, usually */ 30 if (more == 0) 31 return; 32 copy(1, stdin); /* user takes over */ 33 if (skip) 34 setdid(todo, sequence++); 35 if (again || skip) /* if "again" or "skip" */ 36 return; 37 if (more == 0) 38 return; 39 copy(0, scrin); /* evaluate user's response */ 40 41 if (comfile >= 0) 42 close(comfile); 43 wait(&didok); 44 didok = (status == 0); 45 if (!didok) { 46 wrong++; 47 printf("\nSorry, that's %snot right. Do you want to try again? ", 48 wrong > 1 ? "still " : ""); 49 fflush(stdout); 50 for(;;) { 51 gets(tbuff); 52 if (tbuff[0] == 'y') { 53 printf("Try the problem again.\n"); 54 if (remind--) { 55 printf("[ Whenever you want to re-read the lesson, type \"again\".\n"); 56 printf(" You can always leave learn by typing \"bye\". ]\n"); 57 } 58 goto retry; 59 } else if (strcmp(tbuff, "bye") == 0) { 60 wrapup(0); 61 } else if (tbuff[0] == 'n') { 62 wrong = 0; 63 printf("\nOK. That was lesson %s.\n", todo); 64 printf("Skipping to next lesson.\n\n"); 65 fflush(stdout); 66 break; 67 } else { 68 printf("Please type yes, no or bye: "); 69 fflush(stdout); 70 } 71 } 72 } 73 setdid(todo, sequence++); 74 } 75 76