home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
466.lha
/
AztecArp_v1.9
/
Source.LZH
/
cliparse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-05
|
2KB
|
102 lines
/* Copyright (C) 1986,1987 by Manx Software Systems, Inc. */
/*
* This routine is called from the _main() routine and is used to
* parse the arguments passed from the CLI to the program. It sets
* up an array of pointers to arguments in the global variables and
* and sets up _argc and _argv which will be passed by _main() to
* the main() procedure. If no arguments are ever going to be
* parsed, this routine may be replaced by a stub routine to reduce
* program size.
*
* If _arg_lin is non-zero, the _exit() routine will call FreeMem()
* with _arg_lin as the memory to free and _arg_len as the size.
*
*/
extern int _argc, _arg_len;
extern char **_argv, *_arg_lin;
extern char *_detach_name; /* for DETACHED programs */
void
_cli_parse(struct Process *pp, long alen, char *aptr)
{
char *cp;
struct CommandLineInterface *cli;
int c;
if (pp -> pr_CLI)
{
cli = (struct CommandLineInterface *)BADDR(pp -> pr_CLI);
cp = (char *)BADDR(cli -> cli_CommandName);
}
else
cp = _detach_name;
_arg_len = cp[0] + alen + 2;
if(!(_arg_lin = ArpAlloc(_arg_len)))
ArpExit(20L,ERROR_NO_FREE_STORE);
c = cp[0];
strncpy(_arg_lin, cp + 1, (size_t)c);
strcpy(_arg_lin + c, " ");
strncat(_arg_lin, aptr, (size_t)alen);
_arg_lin[c] = 0;
for(_argc = 1, aptr = cp = _arg_lin + c + 1 ; ; _argc++)
{
while((c = *cp) == ' ' || c == '\t' || c == '\f' || c == '\r' || c == '\n')
cp++;
if(*cp < ' ')
break;
if(*cp == '"')
{
cp++;
while (c = *cp++)
{
*aptr++ = c;
if(c == '"')
{
if(*cp == '"')
cp++;
else
{
aptr[-1] = 0;
break;
}
}
}
}
else
{
while((c = *cp++) && c != ' ' && c != '\t' && c != '\f' && c != '\r' && c != '\n')
*aptr++ = c;
*aptr++ = 0;
}
if(c == 0)
--cp;
}
*aptr = 0;
if(!(_argv = ArpAlloc((_argc + 1) * sizeof(*_argv))))
ArpExit(20L,ERROR_NO_FREE_STORE);
for(c = 0,cp = _arg_lin ; c < _argc ; c++)
{
_argv[c] = cp;
cp += strlen(cp) + 1;
}
_argv[c] = 0;
}