home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / learn / copy.c next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  4.6 KB  |  273 lines

  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. }
  273.