|
|
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 == 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.