|
|
1.1 root 1: /* shell.c */
2:
3: /* Author:
4: * Guntram Blohm
5: * Buchenstrasse 19
6: * 7904 Erbach, West Germany
7: * Tel. ++49-7305-6997
8: * sorry - no regular network connection
9: */
10:
11: /*
12: * This file contains a minimal version of a shell for TOS. It allows the
13: * setting of an environment, calling programs, and exiting.
14: * If you don't have another one, this might be sufficient, but you should
15: * prefer *any* other shell.
16: * You may, however, want to set your SHELL environment variable to this
17: * shell: it implements the -c switch, which is required by Elvis, and
18: * not supported by most other atari shells.
19: */
20:
21: #include <stdio.h>
22: #include <string.h>
23: #include <osbind.h>
24: extern char *getenv(), *malloc();
25: extern char **environ;
26: long _stksize=16384;
27:
28: #define MAXENV 50
29:
30: struct
31: {
32: char *name;
33: char *value;
34: } myenv[MAXENV];
35:
36: int cmd_set(), cmd_exit();
37:
38: struct buildins
39: {
40: char *name;
41: int (*func)();
42: } buildins[]=
43: { "exit", cmd_exit,
44: "set", cmd_set,
45: 0,
46: };
47:
48: main(argc, argv)
49: int argc;
50: char **argv;
51: {
52: char buf[128];
53: int i;
54:
55: for (i=0; environ[i] && strncmp(environ[i],"ARGV=",5); i++)
56: cmd_set(environ[i]);
57: script("profile.sh");
58:
59: if (argc>1 && !strcmp(argv[1], "-c"))
60: {
61: buf[0]='\0';
62: for (i=2; i<argc; i++)
63: { if (i>2)
64: strcat(buf, " ");
65: strcat(buf, argv[i]);
66: }
67: execute(buf);
68: }
69: else
70: while (fputs("$ ", stdout), gets(buf))
71: execute(buf);
72: }
73:
74: execute(buf)
75: char *buf;
76: {
77: char *scan=buf;
78: char cmd[80];
79: char line[128];
80: char env[4096], *ep=env;
81: int i;
82:
83: while (*scan==' ')
84: scan++;
85: if (!*scan)
86: return;
87: while (*scan && *scan!=' ')
88: scan++;
89: if (*scan)
90: *scan++='\0';
91:
92: for (i=0; buildins[i].name; i++)
93: if (!strcmp(buf, buildins[i].name))
94: return (*buildins[i].func)(scan);
95:
96: if (!searchpath(buf, cmd))
97: { printf("%s: not found\n", buf);
98: return -1;
99: }
100:
101: strcpy(line+1, scan);
102: line[0]=strlen(scan);
103: for (i=0; i<MAXENV && myenv[i].name; i++)
104: { strcpy(ep, myenv[i].name);
105: strcat(ep, "=");
106: strcat(ep, myenv[i].value);
107: ep+=strlen(ep)+1;
108: }
109:
110: *ep='\0';
111:
112: return Pexec(0, cmd, line, env);
113: }
114:
115: searchpath(from, to)
116: char *from, *to;
117: {
118: char *path="";
119: char *scan;
120: char *end;
121: char *q;
122: int i;
123:
124: for (i=0; i<MAXENV && myenv[i].name; i++)
125: if (!strcmp(myenv[i].name,"PATH"))
126: path=myenv[i].value;
127: for (scan=from; *scan; scan++)
128: if (*scan==':' || *scan=='\\')
129: { path=0;
130: break;
131: }
132: if (!path)
133: { strcpy(to, from);
134: end=to+strlen(to);
135: strcpy(end, ".prg"); if (try(to)) return 1;
136: strcpy(end, ".ttp"); if (try(to)) return 1;
137: strcpy(end, ".tos"); if (try(to)) return 1;
138: *to='\0'; return 0;
139: }
140: for (scan=path; *scan; )
141: {
142: for (q=to; *scan && *scan!=';' && *scan!=','; scan++)
143: *q++=*scan;
144: if (*scan==';' || *scan==',')
145: scan++;
146: *q++='\\';
147: *q='\0';
148: strcpy(q, from);
149: end=q+strlen(q);
150: strcpy(end, ".prg"); if (try(to)) return 1;
151: strcpy(end, ".ttp"); if (try(to)) return 1;
152: strcpy(end, ".tos"); if (try(to)) return 1;
153: }
154: *to='\0';
155: return 0;
156: }
157:
158: try(name)
159: char *name;
160: {
161: if (Fattrib(name, 0, 0) < 0)
162: return 0;
163: return 1;
164: }
165:
166: cmd_exit()
167: {
168: exit(0);
169: }
170:
171: cmd_set(line)
172: char *line;
173: {
174: char *value;
175: int i;
176:
177: if (!*line)
178: {
179: for (i=0; i<MAXENV && myenv[i].name; i++)
180: printf("%s=%s\n", myenv[i].name, myenv[i].value);
181: return 0;
182: }
183:
184: for (value=line; *value && *value!='='; value++)
185: ;
186: if (!*value)
187: { printf("Usage: set name=var\n");
188: return -1;
189: }
190: *value++='\0';
191: doset(line, value);
192: }
193:
194: doset(line, value)
195: char *line, *value;
196: {
197: int i;
198:
199: for (i=0; i<MAXENV && myenv[i].name && strcmp(myenv[i].name, line); i++)
200: ;
201: if (i==MAXENV)
202: { printf("No Space\n");
203: return -1;
204: }
205: if (!myenv[i].name)
206: { myenv[i].name=malloc(strlen(line)+1);
207: strcpy(myenv[i].name, line);
208: }
209: if (myenv[i].value)
210: free(myenv[i].value);
211: myenv[i].value=malloc(strlen(value)+1);
212: strcpy(myenv[i].value, value);
213: return 0;
214: }
215:
216: script(name)
217: char *name;
218: {
219: FILE *fp;
220: char buf[128], *p;
221:
222: if ((fp=fopen(name, "r"))==0)
223: return;
224: while (fgets(buf, sizeof buf, fp))
225: {
226: if ((p=strchr(buf, '\n'))!=0)
227: *p='\0';
228: execute(buf);
229: }
230: fclose(fp);
231: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.