home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fresh Fish 4
/
FreshFish_May-June1994.bin
/
bbs
/
gnu
/
emacs-18.59-bin.lha
/
lib
/
emacs
/
18.59
/
etc
/
sh.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-06-05
|
2KB
|
146 lines
;/*
SC LINK NOSTKCHK DEF SASC=1 sh.c
QUIT
*/
/*
* original version: David Gay
*
* 05/18/93 ch added SAS support, external verbose flag and primitive_parse
*/
#include <exec/types.h>
#include <dos/dostags.h>
#include <stdio.h>
#ifdef SASC
#include <string.h>
#include <stdlib.h>
#endif
#include <proto/dos.h>
/*
translates:
echo "string1;string2" ; cd xx:c ; copy xx yy
into
echo "string1;string2" \n cd xx:c \n copy xx yy
note:
this is a really primitive function ;-) , it may be
changed if necessary
*/
#define QUOTE '"'
void primitive_parse(char *s)
{
int c;
while(c = *s++)
{
if(c == QUOTE)
{
while((c = *s++) && (c != QUOTE))
;
if(!c)
break;
}
else if(c == ';')
*(s-1) = '\n';
}
}
int execute(char *cmd, int debug)
{
long rc;
char *s;
while (*cmd == ' ') cmd++;
if (strncmp(cmd, "exec", 4) == 0 && (cmd[4] == ' ' || cmd[4] == '\t'))
cmd += 4;
s = cmd;
primitive_parse(s);
if(debug)
fprintf(stderr,"/etc/sh: preparsed line:\n%s\n", cmd);
if ((rc = SystemTags(cmd, SYS_UserShell, TRUE, TAG_END)) == -1)
{
fprintf(stderr, "Failed to execute command %s\n", cmd);
return 20;
}
return rc;
}
void main(int argc, char **argv)
{
int command;
char *command_string;
char *program_name = argv[0];
struct RDArgs *args;
long opts[1];
static char options[] = "";
long debug = 0;
char *shenv;
/* Throw out AmigaDOS args so that Input() is clean */
if (args = ReadArgs(options, opts, NULL)) FreeArgs(args);
shenv = getenv("EMACS_SH_DEBUG");
if(shenv)
if(strstr(shenv, "-v")) /* external verbose flag */
debug = 1;
command = 0;
/* Simplistic argument parsing */
argv++;
argc--;
while (argc > 0 && argv[0][0] == '-')
{
switch (argv[0][1])
{
case 'c':
if (argc == 1) goto usage;
command = 1;
command_string = argv[1];
argv++;
argc--;
break;
case 'v':
debug = 1;
break;
case 'i':
/* ignored for now */
break;
default: goto usage;
}
argc--;
argv++;
}
if (argc != 0) goto usage;
if (command)
{
if(debug)
fprintf(stderr,"%s: command_string = %s\n", argv[0], command_string);
exit(execute(command_string, debug));
}
else exit(Execute("", Input(), NULL) ? 0 : 1);
usage:
fprintf(stderr, "%s [-i] [-v] [-c command]\n", program_name);
exit(1);
}
/*
* Local variables:
* compile-command: "sc link nostkchk def SASC=1 sh.c"
* end:
*/