Annotation of 42BSD/usr.bin/learn/selunit.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

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