BSD 3 development
[unix-history] / usr / src / cmd / learn / selunit.c
#include "stdio.h"
#include "lrnref"
int nsave = 0;
selunit()
{
char fnam[20], s[50];
static char dobuff[50];
char posslev[20][20];
int diff[20], i, k, m, n, best, alts;
FILE *f;
char zb[200];
static char saved[20];
while (ask) {
printf("What lesson? ");
fflush(stdout);
gets(dobuff);
if (strcmp(dobuff, "bye") == 0)
wrapup(0);
level = todo = dobuff;
sprintf(s, "../../%s/L%s", sname, dobuff);
if (access(s, 04) == 0)
return;
printf("no such lesson\n");
}
alts = 0;
retry:
f=scrin;
if (f==NULL) {
sprintf(fnam, "../../%s/L%s", sname, level);
f = fopen(fnam, "r");
if (f==NULL) {
fprintf(stderr, "No script for lesson %s.\n", level);
wrapup(1);
}
while (fgets(zb, 200, f)) {
trim(zb);
if (strcmp(zb, "#next")==0)
break;
}
}
if (feof(f)) {
printf("Congratulations; you have finished this sequence.\n");
fflush(stdout);
todo = 0;
return;
}
for(i=0; fgets(s, 50, f); i++) {
sscanf(s, "%s %d", posslev[i], &diff[i]);
}
best = -1;
/* cycle through lessons from random start */
/* first try the current place, failing that back up to
last place there are untried alternatives (but only one backup) */
n = grand()%i;
for(k=0; k<i; k++) {
m = (n+k)%i;
if (already(posslev[m],0)) continue;
if (best<0) best=m;
/* real alternatives */
alts++;
if (abs(diff[m]-speed) < abs(diff[best]-speed))
best=m;
}
if (best < 0 && nsave) {
nsave--;
strcpy(level, saved);
goto retry;
}
if (best <0) {
/* lessons exhausted or missing */
printf("Sorry, there are no alternative lessons at this stage.\n");
printf("See someone for help.\n");
fflush(stdout);
todo = 0;
return;
}
strcpy (dobuff, posslev[best]);
if (alts>1) {
nsave=1;
strcpy (saved, level);
}
todo = dobuff;
fclose(f);
}
abs(x)
{
return(x>=0? x: -x);
}
grand()
{
static int garbage;
int a[2], b;
time(a);
b = a[1]+10*garbage++;
return(b&077777);
}