|
|
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: exit(0); ! 73: } ! 74: ! 75: execute(buf) ! 76: char *buf; ! 77: { ! 78: char *scan=buf; ! 79: char cmd[80]; ! 80: char line[128]; ! 81: char env[4096], *ep=env; ! 82: int i; ! 83: ! 84: while (*scan==' ') ! 85: scan++; ! 86: if (!*scan) ! 87: return 0; ! 88: while (*scan && *scan!=' ') ! 89: scan++; ! 90: if (*scan) ! 91: *scan++='\0'; ! 92: ! 93: for (i=0; buildins[i].name; i++) ! 94: if (!strcmp(buf, buildins[i].name)) ! 95: return (*buildins[i].func)(scan); ! 96: ! 97: if (!searchpath(buf, cmd)) ! 98: { printf("%s: not found\n", buf); ! 99: return -1; ! 100: } ! 101: ! 102: strcpy(line+1, scan); ! 103: line[0]=strlen(scan); ! 104: for (i=0; i<MAXENV && myenv[i].name; i++) ! 105: { strcpy(ep, myenv[i].name); ! 106: strcat(ep, "="); ! 107: strcat(ep, myenv[i].value); ! 108: ep+=strlen(ep)+1; ! 109: } ! 110: ! 111: *ep='\0'; ! 112: ! 113: return Pexec(0, cmd, line, env); ! 114: } ! 115: ! 116: searchpath(from, to) ! 117: char *from, *to; ! 118: { ! 119: char *path=""; ! 120: char *scan; ! 121: char *end; ! 122: char *q; ! 123: int i; ! 124: ! 125: for (i=0; i<MAXENV && myenv[i].name; i++) ! 126: if (!strcmp(myenv[i].name,"PATH")) ! 127: path=myenv[i].value; ! 128: for (scan=from; *scan; scan++) ! 129: if (*scan==':' || *scan=='\\') ! 130: { path=0; ! 131: break; ! 132: } ! 133: if (!path) ! 134: { strcpy(to, from); ! 135: end=to+strlen(to); ! 136: strcpy(end, ".prg"); if (try(to)) return 1; ! 137: strcpy(end, ".ttp"); if (try(to)) return 1; ! 138: strcpy(end, ".tos"); if (try(to)) return 1; ! 139: *to='\0'; return 0; ! 140: } ! 141: for (scan=path; *scan; ) ! 142: { ! 143: for (q=to; *scan && *scan!=';' && *scan!=','; scan++) ! 144: *q++=*scan; ! 145: if (*scan==';' || *scan==',') ! 146: scan++; ! 147: *q++='\\'; ! 148: *q='\0'; ! 149: strcpy(q, from); ! 150: end=q+strlen(q); ! 151: strcpy(end, ".prg"); if (try(to)) return 1; ! 152: strcpy(end, ".ttp"); if (try(to)) return 1; ! 153: strcpy(end, ".tos"); if (try(to)) return 1; ! 154: } ! 155: *to='\0'; ! 156: return 0; ! 157: } ! 158: ! 159: try(name) ! 160: char *name; ! 161: { ! 162: if (Fattrib(name, 0, 0) < 0) ! 163: return 0; ! 164: return 1; ! 165: } ! 166: ! 167: cmd_exit() ! 168: { ! 169: exit(0); ! 170: } ! 171: ! 172: cmd_set(line) ! 173: char *line; ! 174: { ! 175: char *value; ! 176: int i; ! 177: ! 178: if (!*line) ! 179: { ! 180: for (i=0; i<MAXENV && myenv[i].name; i++) ! 181: printf("%s=%s\n", myenv[i].name, myenv[i].value); ! 182: return 0; ! 183: } ! 184: ! 185: for (value=line; *value && *value!='='; value++) ! 186: ; ! 187: if (!*value) ! 188: { printf("Usage: set name=var\n"); ! 189: return -1; ! 190: } ! 191: *value++='\0'; ! 192: return doset(line, value); ! 193: } ! 194: ! 195: doset(line, value) ! 196: char *line, *value; ! 197: { ! 198: int i; ! 199: ! 200: for (i=0; i<MAXENV && myenv[i].name && strcmp(myenv[i].name, line); i++) ! 201: ; ! 202: if (i==MAXENV) ! 203: { printf("No Space\n"); ! 204: return -1; ! 205: } ! 206: if (!myenv[i].name) ! 207: { myenv[i].name=malloc(strlen(line)+1); ! 208: strcpy(myenv[i].name, line); ! 209: } ! 210: if (myenv[i].value) ! 211: free(myenv[i].value); ! 212: myenv[i].value=malloc(strlen(value)+1); ! 213: strcpy(myenv[i].value, value); ! 214: return 0; ! 215: } ! 216: ! 217: script(name) ! 218: char *name; ! 219: { ! 220: FILE *fp; ! 221: char buf[128], *p; ! 222: ! 223: if ((fp=fopen(name, "r"))==0) ! 224: return; ! 225: while (fgets(buf, sizeof buf, fp)) ! 226: { ! 227: if ((p=strchr(buf, '\n'))!=0) ! 228: *p='\0'; ! 229: execute(buf); ! 230: } ! 231: fclose(fp); ! 232: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.