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: }

Defined functions

cmp defined in line 225; used 1 times
copy defined in line 10; used 3 times
pgets defined in line 184; used 1 times
  • in line 24
scopy defined in line 207; used 11 times
trim defined in line 198; used 2 times
wordb defined in line 257; used 3 times

Defined variables

last defined in line 5; used 5 times
logf defined in line 6; used 3 times
subdir defined in line 7; used 6 times
Last modified: 1979-01-10
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 834
Valid CSS Valid XHTML 1.0 Strict