Annotation of 43BSDTahoe/usr.bin/learn/copy.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)copy.c     4.4     (Berkeley)      9/11/87";
                      3: #endif not lint
                      4: 
                      5: #include "stdio.h"
                      6: #include "signal.h"
                      7: #include "lrnref.h"
                      8: 
                      9: char togo[50];
                     10: char last[100];
                     11: char logf[100];
                     12: char subdir[100];
                     13: extern char *ctime();
                     14: extern int review;
                     15: int noclobber;
                     16: 
                     17: copy(prompt, fin)
                     18: int prompt;
                     19: FILE *fin;
                     20: {
                     21:        FILE *fout, *f;
                     22:        char s[100], t[100], s1[100], nm[30];
                     23:        char *r, *tod, c;
                     24:        int *p, tv[2];
                     25:        extern int intrpt(), *action();
                     26:        extern char *wordb();
                     27:        int nmatch = 0;
                     28:        long mark;
                     29: 
                     30:        if (subdir[0]==0)
                     31:                sprintf(subdir, "%s/%s", direct, sname);
                     32:        for (;;) {
                     33:                if (pgets(s, prompt, fin) == 0)
                     34:                        if (fin == stdin) {
                     35:                                fprintf(stderr, "Type \"bye\" if you want to leave learn.\n");
                     36:                                fflush(stderr);
                     37:                                clearerr(stdin);
                     38:                                continue;
                     39:                        } else
                     40:                                break;
                     41:                trim(s);                /* trim newline */
                     42:                /* change the sequence %s to lesson directory */
                     43:                /* if needed */
                     44:                for (r = s; *r; r++)
                     45:                        if (*r == '%') {
                     46:                                sprintf(s1, s, subdir, subdir, subdir);
                     47:                                strcpy(s, s1);
                     48:                                break;
                     49:                        }
                     50:                r = wordb(s, t);        /* t = first token, r = rest */
                     51:                p = action(t);          /* p = token class */
                     52:                if (p && *p == ONCE) {  /* some actions done only once per script */
                     53:                        if (wrong && !review) { /* we are on 2nd time */
                     54:                                scopy(fin, NULL);
                     55:                                continue;
                     56:                        }
                     57:                        strcpy(s, r);
                     58:                        r = wordb(s, t);
                     59:                        p = action(t);
                     60:                }
                     61:                if (p == 0) {
                     62:                        if (comfile >= 0) {     /* if #pipe in effect ... */
                     63:                                write(comfile, s, strlen(s));
                     64:                                write(comfile, "\n", 1);
                     65:                        }
                     66:                        else {          /* else must be UNIX command ... */
                     67:                                signal(SIGINT, SIG_IGN);
                     68:                                status = mysys(s);
                     69:                                signal(SIGINT, intrpt);
                     70:                        }
                     71:                        if (incopy) {
                     72:                                fprintf(incopy, "%s\n", s);
                     73:                                strcpy(last, s);
                     74:                        }
                     75:                        continue;
                     76:                }
                     77:                switch (*p) {
                     78:                case READY:
                     79:                        if (incopy && r) {
                     80:                                fprintf(incopy, "%s\n", r);
                     81:                                strcpy(last, r);
                     82:                        }
                     83:                        return;
                     84:                case PRINT:
                     85:                        if (wrong)
                     86:                                scopy(fin, NULL);       /* don't repeat message */
                     87:                        else if (r)
                     88:                                list(r);
                     89:                        else
                     90:                                scopy(fin, stdout);
                     91:                        break;
                     92:                case HINT:
                     93:                        mark = ftell(scrin);
                     94:                        if (r)
                     95:                                rewind(scrin);
                     96:                        while ((int)(c=fgetc(scrin)) != EOF)
                     97:                                putchar(c);
                     98:                        fflush(stdout);
                     99:                        fseek(scrin, mark, 0);
                    100:                        break;
                    101:                case NOP:
                    102:                        break;
                    103:                case MATCH:
                    104:                        if (nmatch > 0) /* we have already passed */
                    105:                                scopy(fin, NULL);
                    106:                        else if ((status = strcmp(r, last)) == 0) {     /* did we pass this time? */
                    107:                                nmatch++;
                    108:                                scopy(fin, stdout);
                    109:                        } else
                    110:                                scopy(fin, NULL);
                    111:                        break;
                    112:                case BAD:
                    113:                        if (strcmp(r, last) == 0) {
                    114:                                scopy(fin, stdout);
                    115:                        } else
                    116:                                scopy(fin, NULL);
                    117:                        break;
                    118:                case SUCCEED:
                    119:                        scopy(fin, (status == 0) ? stdout : NULL);
                    120:                        break;
                    121:                case FAIL:
                    122:                        scopy(fin, (status != 0) ? stdout : NULL);
                    123:                        break;
                    124:                case CREATE:
                    125:                        if (noclobber)
                    126:                                fout = NULL;
                    127:                        else
                    128:                                fout = fopen(r, "w");
                    129:                        scopy(fin, fout);
                    130:                        if (!noclobber)
                    131:                                fclose(fout);
                    132:                        break;
                    133:                case CMP:
                    134:                        status = cmp(r);        /* contains two file names */
                    135:                        break;
                    136:                case MV:
                    137:                        sprintf(nm, "%s/L%s.%s", subdir, todo, r);
                    138:                        fcopy(r, nm);
                    139:                        break;
                    140:                case USER:
                    141:                case NEXT:
                    142:                        if (noclobber)
                    143:                                noclobber = 0;
                    144:                        more = 1;
                    145:                        return;
                    146:                /* "again previous_lesson" has a hard-to-reproduce bug */
                    147:                case AGAIN:
                    148:                        review = 0;
                    149:                        if (!r) {
                    150:                                r = todo;
                    151:                                noclobber = 1;
                    152:                                review = 1;
                    153:                        }
                    154:                        again = 1;
                    155:                        strcpy(togo, r);
                    156:                        unhook();
                    157:                        return;
                    158:                case SKIP:
                    159:                        skip = 1;
                    160:                        unhook();
                    161:                        return;
                    162:                case COPYIN:
                    163:                        incopy = fopen(".copy", "w");
                    164:                        break;
                    165:                case UNCOPIN:
                    166:                        fclose(incopy);
                    167:                        incopy = NULL;
                    168:                        break;
                    169:                case COPYOUT:
                    170:                        teed = maktee();
                    171:                        break;
                    172:                case UNCOPOUT:
                    173:                        untee();
                    174:                        teed = 0;
                    175:                        break;
                    176:                case PIPE:
                    177:                        comfile = makpipe();
                    178:                        break;
                    179:                case UNPIPE:
                    180:                        close(comfile);
                    181:                        wait(0);
                    182:                        comfile = -1;
                    183:                        break;
                    184:                case YES:
                    185:                case NO:
                    186:                        if (incopy) {
                    187:                                fprintf(incopy, "%s\n", s);
                    188:                                strcpy(last, s);
                    189:                        }
                    190:                        return;
                    191:                case WHERE:
                    192:                        printf("You are in lesson %s of \"%s\" with a speed rating of %d.\n", todo, sname, speed);
                    193:                        printf("You have completed %d out of a possible %d lessons.\n", sequence-1, total);
                    194:                        if (r)
                    195:                                tellwhich();
                    196:                        fflush(stdout);
                    197:                        break;
                    198:                case BYE:
                    199:                        more=0;
                    200:                        return;
                    201:                case CHDIR:
                    202:                        printf("cd not allowed\n");
                    203:                        fflush(stdout);
                    204:                        break;
                    205:                case LEARN:
                    206:                        printf("You are already in learn.\n");
                    207:                        fflush(stdout);
                    208:                        break;
                    209:                case LOG:       /* logfiles should be created mode 666 */
                    210:                        if (!logging)
                    211:                                break;
                    212:                        if (logf[0] == 0)
                    213:                                sprintf(logf, "%s/log/%s", direct, sname);
                    214:                        f = fopen((r ? r : logf), "a");
                    215:                        if (f == NULL)
                    216:                                break;
                    217:                        time(tv);
                    218:                        tod = ctime(tv);
                    219:                        tod[24] = 0;
                    220:                        fprintf(f, "%s L%-6s %s %2d %s\n", tod,
                    221:                                todo, status? "fail" : "pass", speed, pwline);
                    222:                        fclose(f);
                    223:                        break;
                    224:                }
                    225:        }
                    226:        return;
                    227: }
                    228: 
                    229: pgets(s, prompt, f)
                    230: char *s;
                    231: int prompt;
                    232: FILE *f;
                    233: {
                    234:        if (prompt) {
                    235:                if (comfile < 0)
                    236:                        fputs("% ", stdout);
                    237:                fflush(stdout);
                    238:        }
                    239:        if (fgets(s, 100,f))
                    240:                return(1);
                    241:        else
                    242:                return(0);
                    243: }
                    244: 
                    245: trim(s)
                    246: char *s;
                    247: {
                    248:        while (*s)
                    249:                s++;
                    250:        if (*--s == '\n')
                    251:                *s=0;
                    252: }
                    253: 
                    254: scopy(fi, fo)  /* copy fi to fo until a line with #
                    255:                 * sequence "#\n" means a line not ending with \n
                    256:                 * control-M's are filtered out */
                    257: FILE *fi, *fo;
                    258: {
                    259:        int c;
                    260: 
                    261:        while ((c = getc(fi)) != '#' && c != EOF) {
                    262:                do {
                    263:                        if (c == '#')   {
                    264:                                c = getc(fi);
                    265:                                if (c == '\n')
                    266:                                        break;
                    267:                                if (c == EOF)   {
                    268:                                        if (fo != NULL)
                    269:                                                fflush(fo);
                    270:                                        return;
                    271:                                }
                    272:                                if (fo != NULL)
                    273:                                        putc('#', fo);
                    274:                        }
                    275:                        if (c == '\r')
                    276:                                break;
                    277:                        if (fo != NULL)
                    278:                                putc(c, fo);
                    279:                        if (c == '\n')
                    280:                                break;
                    281:                } while ((c = getc(fi)) != EOF);
                    282:        }
                    283:        if (c == '#')
                    284:                ungetc(c, fi);
                    285:        if (fo != NULL)
                    286:                fflush(fo);
                    287: }
                    288: 
                    289: cmp(r) /* compare two files for status; #cmp f1 f2 [ firstnlinesonly ] */
                    290: char *r;
                    291: {
                    292:        char *s, *h;
                    293:        FILE *f1, *f2;
                    294:        int c1, c2, stat, n;
                    295: 
                    296:        for (s = r; *s != ' ' && *s != '\0'; s++)
                    297:                ;
                    298:        *s++ = 0;       /* r contains file 1 */
                    299:        while (*s == ' ')
                    300:                s++;
                    301:        for (h = s; *h != ' ' && *h != '\0'; h++)
                    302:                ;
                    303:        if (*h) {
                    304:                *h++ = 0;
                    305:                while (*h == ' ')
                    306:                        h++;
                    307:                n = atoi(h);
                    308:        }
                    309:        else
                    310:                n = 077777;
                    311:        f1 = fopen(r, "r");
                    312:        f2 = fopen(s, "r");
                    313:        if (f1 == NULL || f2 == NULL)
                    314:                return(1);      /* failure */
                    315:        stat = 0;
                    316:        for (;;) {
                    317:                c1 = getc(f1);
                    318:                c2 = getc(f2);
                    319:                if (c1 != c2) {
                    320:                        stat = 1;
                    321:                        break;
                    322:                }
                    323:                if (*h && c1 == '\n')
                    324:                        if (--n)
                    325:                                break;
                    326:                if (c1 == EOF || c2 == EOF)
                    327:                        break;
                    328:        }
                    329:        fclose(f1);
                    330:        fclose(f2);
                    331:        return(stat);
                    332: }
                    333: 
                    334: char *
                    335: wordb(s, t)    /* in s, t is prefix; return tail */
                    336: char *s, *t;
                    337: {
                    338:        int c;
                    339: 
                    340:        while (c = *s++) {
                    341:                if (c == ' ' || c == '\t')
                    342:                        break;
                    343:                *t++ = c;
                    344:        }
                    345:        *t = 0;
                    346:        while (*s == ' ' || *s == '\t')
                    347:                s++;
                    348:        return(c ? s : NULL);
                    349: }
                    350: 
                    351: unhook()
                    352: {
                    353:        if (incopy) {
                    354:                fclose(incopy);
                    355:                incopy = NULL;
                    356:        }
                    357:        if (comfile >= 0) {
                    358:                close(comfile);
                    359:                wait(0);
                    360:                comfile = -1;
                    361:        }
                    362:        if (teed) {
                    363:                teed = 0;
                    364:                untee();
                    365:        }
                    366:        fclose(scrin);
                    367:        scrin = NULL;
                    368: }

unix.superglobalmegacorp.com

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