mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-23 16:34:07 +00:00
Upload
Digital Research
This commit is contained in:
79
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v101/klib/main.c
Normal file
79
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v101/klib/main.c
Normal file
@@ -0,0 +1,79 @@
|
||||
/*****************************************************************************
|
||||
*
|
||||
* 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 */
|
||||
} /****************************/
|
Reference in New Issue
Block a user