|
|
1.1 ! root 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 != 0 && *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: if (!prompt) /* if not input from tty, ! 54: delay write to sh, fix timing prob */ ! 55: sleep(2); ! 56: write(comfile, s, strlen(s)); ! 57: write(comfile, "\n", 1); ! 58: } ! 59: else { ! 60: signal(SIGINT, SIG_IGN); ! 61: status = mysys(s); ! 62: signal(SIGINT, intrpt); ! 63: } ! 64: if (incopy) { ! 65: fprintf(incopy, "%s\n", s); ! 66: strcpy(last, s); ! 67: } ! 68: continue; ! 69: } ! 70: switch (*p) { ! 71: case READY: ! 72: if (incopy && r) { ! 73: fprintf(incopy, "%s\n", r); ! 74: strcpy(last, r); ! 75: } ! 76: return; ! 77: case PRINT: ! 78: if (wrong) ! 79: scopy(fin, NULL); /* don't repeat message */ ! 80: else if (r) ! 81: list(r); ! 82: else ! 83: scopy(fin, stdout); ! 84: break; ! 85: case NOP: ! 86: break; ! 87: case MATCH: ! 88: if (nmatch > 0) /* we have already passed */ ! 89: scopy(fin, NULL); ! 90: else if ((status = strcmp(r, last)) == 0) { /* did we pass this time? */ ! 91: nmatch++; ! 92: scopy(fin, stdout); ! 93: } else ! 94: scopy(fin, NULL); ! 95: break; ! 96: case BAD: ! 97: if (strcmp(r, last) == 0) { ! 98: scopy(fin, stdout); ! 99: } else ! 100: scopy(fin, NULL); ! 101: break; ! 102: case SUCCEED: ! 103: scopy(fin, (status == 0) ? stdout : NULL); ! 104: break; ! 105: case FAIL: ! 106: scopy(fin, (status != 0) ? stdout : NULL); ! 107: break; ! 108: case CREATE: ! 109: fout = fopen(r, "w"); ! 110: scopy(fin, fout); ! 111: fclose(fout); ! 112: break; ! 113: case CMP: ! 114: status = cmp(r); /* contains two file names */ ! 115: break; ! 116: case MV: ! 117: sprintf(nm, "%s/L%s.%s", subdir, todo, r); ! 118: fcopy(r, nm); ! 119: break; ! 120: case USER: ! 121: case NEXT: ! 122: more = 1; ! 123: return; ! 124: case COPYIN: ! 125: incopy = fopen(".copy", "w"); ! 126: break; ! 127: case UNCOPIN: ! 128: fclose(incopy); ! 129: incopy = NULL; ! 130: break; ! 131: case COPYOUT: ! 132: maktee(); ! 133: break; ! 134: case UNCOPOUT: ! 135: untee(); ! 136: break; ! 137: case PIPE: ! 138: comfile = makpipe(); ! 139: break; ! 140: case UNPIPE: ! 141: close(comfile); ! 142: wait(0); ! 143: comfile = -1; ! 144: break; ! 145: case YES: ! 146: case NO: ! 147: if (incopy) { ! 148: fprintf(incopy, "%s\n", s); ! 149: strcpy(last, s); ! 150: } ! 151: return; ! 152: case WHERE: ! 153: printf("You are in lesson %s\n", todo); ! 154: fflush(stdout); ! 155: break; ! 156: case BYE: ! 157: more=0; ! 158: return; ! 159: case CHDIR: ! 160: printf("cd not allowed\n"); ! 161: fflush(stdout); ! 162: break; ! 163: case LEARN: ! 164: printf("You are already in learn.\n"); ! 165: fflush(stdout); ! 166: break; ! 167: case LOG: ! 168: if (!logging) ! 169: break; ! 170: if (logf[0] == 0) ! 171: sprintf(logf, "%s/log/%s", direct, sname); ! 172: f = fopen( (r? r : logf), "a"); ! 173: if (f == NULL) ! 174: break; ! 175: time(tv); ! 176: tod = ctime(tv); ! 177: tod[24] = 0; ! 178: fprintf(f, "%s L%-6s %s %2d %s\n", tod, ! 179: todo, status? "fail" : "pass", speed, pwline); ! 180: fclose(f); ! 181: break; ! 182: } ! 183: } ! 184: return; ! 185: } ! 186: ! 187: pgets(s, prompt, f) ! 188: FILE *f; ! 189: { ! 190: if (prompt) { ! 191: if (comfile < 0) ! 192: printf("$ "); ! 193: fflush(stdout); ! 194: } ! 195: if (fgets(s, 100,f)) ! 196: return(1); ! 197: else ! 198: return(0); ! 199: } ! 200: ! 201: trim(s) ! 202: char *s; ! 203: { ! 204: while (*s) ! 205: s++; ! 206: if (*--s == '\n') ! 207: *s=0; ! 208: } ! 209: ! 210: scopy(fi, fo) /* copy fi to fo until a line with # */ ! 211: FILE *fi, *fo; ! 212: { ! 213: int c; ! 214: ! 215: while ((c = getc(fi)) != '#' && c != EOF) { ! 216: do { ! 217: if (fo != NULL) ! 218: putc(c, fo); ! 219: if (c == '\n') ! 220: break; ! 221: } while ((c = getc(fi)) != EOF); ! 222: } ! 223: if (c == '#') ! 224: ungetc(c, fi); ! 225: if (fo != NULL) ! 226: fflush(fo); ! 227: } ! 228: ! 229: cmp(r) /* compare two files for status */ ! 230: char *r; ! 231: { ! 232: char *s; ! 233: FILE *f1, *f2; ! 234: int c1, c2, stat; ! 235: ! 236: for (s = r; *s != ' ' && *s != '\0'; s++) ! 237: ; ! 238: *s++ = 0; /* r contains file 1 */ ! 239: while (*s == ' ') ! 240: s++; ! 241: f1 = fopen(r, "r"); ! 242: f2 = fopen(s, "r"); ! 243: if (f1 == NULL || f2 == NULL) ! 244: return(1); /* failure */ ! 245: stat = 0; ! 246: for (;;) { ! 247: c1 = getc(f1); ! 248: c2 = getc(f2); ! 249: if (c1 != c2) { ! 250: stat = 1; ! 251: break; ! 252: } ! 253: if (c1 == EOF || c2 == EOF) ! 254: break; ! 255: } ! 256: fclose(f1); ! 257: fclose(f2); ! 258: return(stat); ! 259: } ! 260: ! 261: char * ! 262: wordb(s, t) /* in s, t is prefix; return tail */ ! 263: char *s, *t; ! 264: { ! 265: int c; ! 266: ! 267: while (c = *s++) { ! 268: if (c == ' ' || c == '\t') ! 269: break; ! 270: *t++ = c; ! 271: } ! 272: *t = 0; ! 273: while (*s == ' ' || *s == '\t') ! 274: s++; ! 275: return(c ? s : NULL); ! 276: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.