home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Garbo
/
Garbo.cdr
/
pc
/
source
/
pct.arc
/
MAKEARG.H
< prev
next >
Wrap
Text File
|
1986-03-29
|
2KB
|
89 lines
/* ..make a global argv[] by parsing command line.. */
#include <stdio.h>
#include <dos.h>
#include <ctype.h>
#define MAXARGS 30
#define START 1
#define NORMAL 2
#define QUOTE 3
int argc;
extern unsigned _pspbase;
char *cl, tail[0x80], **argv, *getarg(), *argbuf[MAXARGS];
makeargv()
{
/* ..initialize argc/argv[].. */
argc = 0;
argv = argbuf;
argv[0] = "";
/* ..get command line from DOS.. */
_copy(PTR(tail),0x80,_pspbase,0x80);
cl = tail + 1;
cl[*tail] = '\0';
/* ..get parsed arguments.. */
while (argv[++argc] = getarg()) ;
}
/* ..parse arguments.. */
char *getarg()
{
static char arg[0x80], *q;
int state;
register i;
for (i = 0, state = START ; *cl ; ++cl)
switch(state)
{
case START:
if (*cl == '\\')
if (*++cl)
{
arg[i++] = *cl;
state = NORMAL;
}
else
goto done;
else if (*cl == '\"')
state = QUOTE;
else if (!isspace(*cl))
{
--cl;
state = NORMAL;
}
break;
case NORMAL:
if (isspace(*cl))
goto done;
if (*cl == '\\' && *++cl == '\0')
goto done;
arg[i++] = *cl;
break;
case QUOTE:
if (*cl == '\"')
{
++cl;
goto done;
}
if (*cl == '\\' && *++cl == '\0')
goto done;
arg[i++] = *cl;
break;
}
done:
/* ..ran out?.. */
if (i == 0)
return NULL;
/* ..get some memory and store this arg.. */
arg[i] = '\0';
q = (char *) malloc(i);
strcpy(q,arg);
return q;
}