BSD 3 development
[unix-history] / usr / src / cmd / learn / selunit.c
CommitLineData
42d6e430
BJ
1#include "stdio.h"
2#include "lrnref"
3
4int nsave = 0;
5
6selunit()
7{
8 char fnam[20], s[50];
9 static char dobuff[50];
10 char posslev[20][20];
11 int diff[20], i, k, m, n, best, alts;
12 FILE *f;
13 char zb[200];
14 static char saved[20];
15
16 while (ask) {
17 printf("What lesson? ");
18 fflush(stdout);
19 gets(dobuff);
20 if (strcmp(dobuff, "bye") == 0)
21 wrapup(0);
22 level = todo = dobuff;
23 sprintf(s, "../../%s/L%s", sname, dobuff);
24 if (access(s, 04) == 0)
25 return;
26 printf("no such lesson\n");
27 }
28 alts = 0;
29retry:
30 f=scrin;
31 if (f==NULL) {
32 sprintf(fnam, "../../%s/L%s", sname, level);
33 f = fopen(fnam, "r");
34 if (f==NULL) {
35 fprintf(stderr, "No script for lesson %s.\n", level);
36 wrapup(1);
37 }
38 while (fgets(zb, 200, f)) {
39 trim(zb);
40 if (strcmp(zb, "#next")==0)
41 break;
42 }
43 }
44 if (feof(f)) {
45 printf("Congratulations; you have finished this sequence.\n");
46 fflush(stdout);
47 todo = 0;
48 return;
49 }
50 for(i=0; fgets(s, 50, f); i++) {
51 sscanf(s, "%s %d", posslev[i], &diff[i]);
52 }
53 best = -1;
54 /* cycle through lessons from random start */
55 /* first try the current place, failing that back up to
56 last place there are untried alternatives (but only one backup) */
57 n = grand()%i;
58 for(k=0; k<i; k++) {
59 m = (n+k)%i;
60 if (already(posslev[m],0)) continue;
61 if (best<0) best=m;
62 /* real alternatives */
63 alts++;
64 if (abs(diff[m]-speed) < abs(diff[best]-speed))
65 best=m;
66 }
67 if (best < 0 && nsave) {
68 nsave--;
69 strcpy(level, saved);
70 goto retry;
71 }
72 if (best <0) {
73 /* lessons exhausted or missing */
74 printf("Sorry, there are no alternative lessons at this stage.\n");
75 printf("See someone for help.\n");
76 fflush(stdout);
77 todo = 0;
78 return;
79 }
80 strcpy (dobuff, posslev[best]);
81 if (alts>1) {
82 nsave=1;
83 strcpy (saved, level);
84 }
85 todo = dobuff;
86 fclose(f);
87}
88
89abs(x)
90{
91 return(x>=0? x: -x);
92}
93
94grand()
95{
96 static int garbage;
97 int a[2], b;
98
99 time(a);
100 b = a[1]+10*garbage++;
101 return(b&077777);
102}