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