1: #include "stdio.h" 2: #include "signal.h" 3: #include "lrnref" 4: 5: char last[100]; 6: char logf[100]; 7: char subdir[100]; 8: extern char * ctime(); 9: 10: copy(prompt, fin) 11: FILE *fin; 12: { 13: FILE *fout, *f; 14: char s[100], t[100], s1[100], *r, *tod; 15: char nm[30]; 16: int *p, tv[2]; 17: extern int intrpt(), *action(); 18: extern char *wordb(); 19: int nmatch = 0; 20: 21: if (subdir[0]==0) 22: sprintf(subdir, "../../%s", sname); 23: for (;;) { 24: if (pgets(s, prompt, fin) == 0) 25: if (fin == stdin) { 26: /* fprintf(stderr, "Don't type control-D\n"); */ 27: /* this didn't work out very well */ 28: continue; 29: } else 30: break; 31: trim(s); 32: /* change the sequence %s to lesson directory */ 33: /* if needed */ 34: for (r = s; *r; r++) 35: if (*r == '%') { 36: sprintf(s1, s, subdir, subdir, subdir); 37: strcpy(s, s1); 38: break; 39: } 40: r = wordb(s, t); 41: p = action(t); 42: if (*p == ONCE) { /* some actions done only once per script */ 43: if (wrong) { /* we are on 2nd time */ 44: scopy(fin, NULL); 45: continue; 46: } 47: strcpy(s, r); 48: r = wordb(s, t); 49: p = action(t); 50: } 51: if (p == 0) { 52: if (comfile >= 0) { 53: write(comfile, s, strlen(s)); 54: write(comfile, "\n", 1); 55: } 56: else { 57: signal(SIGINT, SIG_IGN); 58: status = mysys(s); 59: signal(SIGINT, intrpt); 60: } 61: if (incopy) { 62: fprintf(incopy, "%s\n", s); 63: strcpy(last, s); 64: } 65: continue; 66: } 67: switch (*p) { 68: case READY: 69: if (incopy && r) { 70: fprintf(incopy, "%s\n", r); 71: strcpy(last, r); 72: } 73: return; 74: case PRINT: 75: if (wrong) 76: scopy(fin, NULL); /* don't repeat message */ 77: else if (r) 78: list(r); 79: else 80: scopy(fin, stdout); 81: break; 82: case NOP: 83: break; 84: case MATCH: 85: if (nmatch > 0) /* we have already passed */ 86: scopy(fin, NULL); 87: else if ((status = strcmp(r, last)) == 0) { /* did we pass this time? */ 88: nmatch++; 89: scopy(fin, stdout); 90: } else 91: scopy(fin, NULL); 92: break; 93: case BAD: 94: if (strcmp(r, last) == 0) { 95: scopy(fin, stdout); 96: } else 97: scopy(fin, NULL); 98: break; 99: case SUCCEED: 100: scopy(fin, (status == 0) ? stdout : NULL); 101: break; 102: case FAIL: 103: scopy(fin, (status != 0) ? stdout : NULL); 104: break; 105: case CREATE: 106: fout = fopen(r, "w"); 107: scopy(fin, fout); 108: fclose(fout); 109: break; 110: case CMP: 111: status = cmp(r); /* contains two file names */ 112: break; 113: case MV: 114: sprintf(nm, "%s/L%s.%s", subdir, todo, r); 115: fcopy(r, nm); 116: break; 117: case USER: 118: case NEXT: 119: more = 1; 120: return; 121: case COPYIN: 122: incopy = fopen(".copy", "w"); 123: break; 124: case UNCOPIN: 125: fclose(incopy); 126: incopy = NULL; 127: break; 128: case COPYOUT: 129: maktee(); 130: break; 131: case UNCOPOUT: 132: untee(); 133: break; 134: case PIPE: 135: comfile = makpipe(); 136: break; 137: case UNPIPE: 138: close(comfile); 139: wait(0); 140: comfile = -1; 141: break; 142: case YES: 143: case NO: 144: if (incopy) { 145: fprintf(incopy, "%s\n", s); 146: strcpy(last, s); 147: } 148: return; 149: case WHERE: 150: printf("You are in lesson %s\n", todo); 151: fflush(stdout); 152: break; 153: case BYE: 154: more=0; 155: return; 156: case CHDIR: 157: printf("cd not allowed\n"); 158: fflush(stdout); 159: break; 160: case LEARN: 161: printf("You are already in learn.\n"); 162: fflush(stdout); 163: break; 164: case LOG: 165: if (!logging) 166: break; 167: if (logf[0] == 0) 168: sprintf(logf, "%s/log/%s", direct, sname); 169: f = fopen( (r? r : logf), "a"); 170: if (f == NULL) 171: break; 172: time(tv); 173: tod = ctime(tv); 174: tod[24] = 0; 175: fprintf(f, "%s L%-6s %s %2d %s\n", tod, 176: todo, status? "fail" : "pass", speed, pwline); 177: fclose(f); 178: break; 179: } 180: } 181: return; 182: } 183: 184: pgets(s, prompt, f) 185: FILE *f; 186: { 187: if (prompt) { 188: if (comfile < 0) 189: printf("$ "); 190: fflush(stdout); 191: } 192: if (fgets(s, 100,f)) 193: return(1); 194: else 195: return(0); 196: } 197: 198: trim(s) 199: char *s; 200: { 201: while (*s) 202: s++; 203: if (*--s == '\n') 204: *s=0; 205: } 206: 207: scopy(fi, fo) /* copy fi to fo until a line with # */ 208: FILE *fi, *fo; 209: { 210: int c; 211: 212: while ((c = getc(fi)) != '#' && c != EOF) { 213: do { 214: if (fo != NULL) 215: putc(c, fo); 216: if (c == '\n') 217: break; 218: } while ((c = getc(fi)) != EOF); 219: } 220: if (c == '#') 221: ungetc(c, fi); 222: fflush(fo); 223: } 224: 225: cmp(r) /* compare two files for status */ 226: char *r; 227: { 228: char *s; 229: FILE *f1, *f2; 230: int c1, c2, stat; 231: 232: for (s = r; *s != ' ' && *s != '\0'; s++) 233: ; 234: *s++ = 0; /* r contains file 1 */ 235: while (*s == ' ') 236: s++; 237: f1 = fopen(r, "r"); 238: f2 = fopen(s, "r"); 239: if (f1 == NULL || f2 == NULL) 240: return(1); /* failure */ 241: stat = 0; 242: for (;;) { 243: c1 = getc(f1); 244: c2 = getc(f2); 245: if (c1 != c2) { 246: stat = 1; 247: break; 248: } 249: if (c1 == EOF || c2 == EOF) 250: break; 251: } 252: fclose(f1); 253: fclose(f2); 254: return(stat); 255: } 256: 257: char * 258: wordb(s, t) /* in s, t is prefix; return tail */ 259: char *s, *t; 260: { 261: int c; 262: 263: while (c = *s++) { 264: if (c == ' ' || c == '\t') 265: break; 266: *t++ = c; 267: } 268: *t = 0; 269: while (*s == ' ' || *s == '\t') 270: s++; 271: return(c ? s : NULL); 272: }