mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 08:24:18 +00:00
80 lines
3.2 KiB
C
80 lines
3.2 KiB
C
/*****************************************************************************
|
|
*
|
|
* R U N T I M E S T A R T O F F R O U T I N E
|
|
* -----------------------------------------------
|
|
*
|
|
* Routine "_main" is entered from the C header routine to start a C
|
|
* program. The command string from CP/M is parsed into
|
|
* a UNIX-like "argc/argv" setup, including simple I/O redirection.
|
|
*
|
|
* Calling Sequence:
|
|
*
|
|
* return = _main(command,length);
|
|
*
|
|
* Where:
|
|
*
|
|
* command Is the address of the command line from CP/M
|
|
* length Is the number of characters in the line,
|
|
* excluding the termination character (CR/LF).
|
|
*
|
|
*****************************************************************************/
|
|
#include "stdio.h" /* Include std definitions */
|
|
#include "cpm.h" /* Include CP/M Definitions */
|
|
extern char __tname[]; /* -> terminal name */
|
|
extern char __pname[]; /* -> Program name */
|
|
_main(com, len) /****************************/
|
|
char *com; /* Command address */
|
|
int len; /* Command length */
|
|
{ /****************************/
|
|
char *av[30]; /* Unix's "ARGV" for main */
|
|
register i; /* Define a count var. */
|
|
register char *s; /* Temp byte pointer */
|
|
int ac; /* Number of args we find */
|
|
/****************************/
|
|
_chinit(); /* Initialize channels */
|
|
open(__tname,READ); /* Open STDIN */
|
|
open(__tname,WRITE); /* Open STDOUT */
|
|
open(__tname,WRITE); /* Open STDERR */
|
|
av[0] = __pname; /* */
|
|
com[len] = '\0'; /* Insure null at line end */
|
|
ac = 1; /* Initialize count */
|
|
for (s = com; *s; s =+ i) /* One arg at a time */
|
|
{ /* */
|
|
while (*s && iswhite(*s)) /* Skip leading spaces */
|
|
++s; /* */
|
|
if (!*s) /* End of line? */
|
|
break; /* Yes, don't continue */
|
|
for (i = 0; !iswhite(s[i]); ++i)/* How many characters? */
|
|
s[i] = tolower(s[i]); /* lower case please ... */
|
|
if (s[i]) /* If last is space, etc... */
|
|
s[i++] = '\0'; /* Make it a null for C */
|
|
/****************************/
|
|
if (*s == '<') /* Redirecting input?? */
|
|
{ /* */
|
|
close(STDIN); /* Yes, close TTY */
|
|
if (open(s + 1, READ,0) != STDIN) /* Open New */
|
|
_err("Cannot open ", s + 1) ;/* Can't ... */
|
|
} /****************************/
|
|
else if (*s == '>') /* Redirecting output?? */
|
|
{ /* */
|
|
close(STDOUT); /* Close output */
|
|
if (creat(s+1,0,0)!=STDOUT) /* Try to open new */
|
|
_err("Cannot create ", s + 1);/* Can't */
|
|
} /****************************/
|
|
else /* Just a regular arg */
|
|
av[ac++] = s; /* save in argv */
|
|
} /****************************/
|
|
av[ac] = NULL; /* Insure terminator */
|
|
return (main(ac, av)); /* Invoke C program */
|
|
} /****************************/
|
|
|
|
_err(s1,s2) /* Error routine */
|
|
char *s1; /* Message text */
|
|
char *s2; /* Filename */
|
|
{ /****************************/
|
|
write(STDERR,s1,_clenf(s1)); /* Output error message */
|
|
write(STDERR,s2,_clenf(s2)); /* And filename */
|
|
write(STDERR,"\n",1); /* + Newline */
|
|
exit(-1); /* And fail hard */
|
|
} /****************************/
|