|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)selsub.c 4.5 (Berkeley) 10/22/87";
3: #endif not lint
4:
5: #include "stdio.h"
6: #include "sys/types.h"
7: #include "sys/file.h"
8: #include "sys/stat.h"
9: #include "lrnref.h"
10:
11: char learnrc[100];
12:
13: selsub(argc,argv)
14: char *argv[];
15: {
16: char ans1[100];
17: static char ans2[40];
18: static char dirname[40];
19: static char subname[40];
20: FILE *fp;
21: char *getenv();
22: char *home;
23:
24: if (argc > 1 && argv[1][0] == '-') {
25: direct = argv[1]+1;
26: argc--;
27: argv++;
28: }
29: if (chdir(direct) != 0) {
30: perror(direct);
31: fprintf(stderr, "Selsub: couldn't cd to non-standard directory\n");
32: exit(1);
33: }
34: sname = argc > 1 ? argv[1] : 0;
35: if (argc > 2) {
36: strcpy (level=ans2, argv[2]);
37: if (strcmp(level, "-") == 0) /* no lesson name is - */
38: ask = 1;
39: else if (strcmp(level, "0") == 0)
40: level = 0;
41: else
42: again = 1; /* treat as if "again" lesson */
43: }
44: else
45: level = 0;
46: if (argc > 3 )
47: speed = atoi(argv[3]);
48: if ((home = getenv("HOME")) != NULL) {
49: sprintf(learnrc, "%s/.learnrc", home);
50: if ((fp=fopen(learnrc, "r")) != NULL) {
51: char xsub[40], xlev[40]; int xsp;
52: fscanf(fp, "%s %s %d", xsub, xlev, &xsp);
53: fclose(fp);
54: if (*xsub && *xlev && xsp >= 0 /* all read OK */
55: && (argc == 2 && strcmp(sname, xsub) == 0
56: || argc <= 1)) {
57: strcpy(sname = subname, xsub);
58: strcpy(level = ans2, xlev);
59: speed = xsp;
60: again = 1;
61: printf("[ Taking up where you left off last time: learn %s %s.\n",
62: sname, level);
63: printf("%s\n \"rm $HOME/.learnrc\", and re-enter with \"learn %s\". ]\n",
64: " To start this sequence over leave learn by typing \"bye\", then",
65: sname);
66: }
67: }
68: }
69: if (!sname) {
70: printf("These are the available courses -\n");
71: list("Linfo");
72: printf("If you want more information about the courses,\n");
73: printf("or if you have never used 'learn' before,\n");
74: printf("press RETURN; otherwise type the name of\n");
75: printf("the course you want, followed by RETURN.\n");
76: fflush(stdout);
77: if (gets(sname=subname) == NULL)
78: exit(0);
79: if (sname[0] == '\0') {
80: list("Xinfo");
81: do {
82: printf("\nWhich subject? ");
83: fflush(stdout);
84: if (gets(sname=subname) == NULL)
85: exit(0);
86: } while (sname[0] == '\0');
87: }
88: }
89: chknam(sname);
90: total = cntlessons(sname);
91: if (!level) {
92: printf("If you were in the middle of this subject\n");
93: printf("and want to start where you left off, type\n");
94: printf("the last lesson number the computer printed.\n");
95: printf("If you don't know the number, type in a word\n");
96: printf("you think might appear in the lesson you want,\n");
97: printf("and I will look for the first lesson containing it.\n");
98: printf("To start at the beginning, just hit RETURN.\n");
99: fflush(stdout);
100: if (gets(ans2) == NULL)
101: exit(0);
102: if (ans2[0]==0)
103: strcpy(ans2,"0");
104: else
105: again = 1;
106: level=ans2;
107: getlesson();
108: }
109:
110: /* make new directory for user to play in */
111: if (chdir("/tmp") != 0) {
112: perror("/tmp");
113: fprintf(stderr, "Selsub: couldn't cd to public directory\n");
114: exit(1);
115: }
116: sprintf(dir=dirname, "pl%da", getpid());
117: sprintf(ans1, "mkdir %s", dir);
118: system(ans1);
119: if (chdir(dir) < 0) {
120: perror(dir);
121: fprintf(stderr, "Selsub: couldn't make play directory with %s.\nBye.\n", ans1);
122: exit(1);
123: }
124: /* after this point, we have a working directory. */
125: /* have to call wrapup to clean up */
126: (void)sprintf(ans1, "%s/%s/Init", direct, sname);
127: if (access(ans1, R_OK)==0) {
128: (void)sprintf(ans1, "%s/%s/Init %s", direct, sname, level);
129: if (system(ans1) != 0) {
130: printf("Leaving learn.\n");
131: wrapup(1);
132: }
133: }
134: }
135:
136: chknam(name)
137: char *name;
138: {
139: if (access(name, 05) < 0) {
140: printf("Sorry, there is no subject or lesson named %s.\nBye.\n", name);
141: exit(1);
142: }
143: }
144:
145: #ifndef DIR
146: #include <sys/dir.h>
147: #endif
148:
149: cntlessons(sname) /* return number of entries in lesson directory; */
150: char *sname; /* approximate at best since I don't count L0, Init */
151: { /* and lessons skipped by good students */
152: #if BSD4_2
153: struct direct dbuf;
154: register struct direct *ep = &dbuf; /* directory entry pointer */
155: int n = 0;
156: DIR *dp;
157:
158: if ((dp = opendir(sname)) == NULL) {
159: perror(sname);
160: wrapup(1);
161: }
162: for (ep = readdir(dp); ep != NULL; ep = readdir(dp)) {
163: if (ep->d_ino != 0)
164: n++;
165: }
166: closedir(dp);
167: return n - 2; /* minus . and .. */
168: #else
169: struct stat statbuf;
170:
171: stat(sname, &statbuf);
172: return statbuf.st_size / 16 - 2;
173: #endif
174: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.