Annotation of 3BSD/cmd/learn/selunit.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "lrnref"
                      3: 
                      4: int    nsave   = 0;
                      5: 
                      6: selunit()
                      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;
                     29: retry:
                     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: 
                     89: abs(x)
                     90: {
                     91:        return(x>=0? x: -x);
                     92: }
                     93: 
                     94: grand()
                     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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.