xref: /original-bsd/usr.bin/learn/learn/dounit.c (revision 7e7b101a)
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