home *** CD-ROM | disk | FTP | other *** search
- /* 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;
- }
-