2 * Copyright 1987, 1988 by MIT Student Information Processing Board
4 * This file may be copied under the terms of the GNU Public License.
15 #include "ss_internal.h"
17 enum parse_mode { WHITESPACE, TOKEN, QUOTED_STRING };
20 * parse(line_ptr, argc_ptr)
23 * Parses line, dividing at whitespace, into tokens, returns
24 * the "argc" and "argv" values.
27 * Pointer to text string to be parsed.
29 * Where to put the "argc" (number of tokens) value.
32 * Series of pointers to parsed tokens.
35 #define NEW_ARGV(old,n) (char **)realloc((char *)old,\
36 (unsigned)(n+2)*sizeof(char*))
38 char **ss_parse (sci_idx, line_ptr, argc_ptr)
40 register char *line_ptr;
43 register char **argv, *cp;
45 register enum parse_mode parse_mode;
47 argv = (char **) malloc (sizeof(char *));
48 if (argv == (char **)NULL) {
49 ss_error(sci_idx, errno, "Can't allocate storage");
57 parse_mode = WHITESPACE; /* flushing whitespace */
58 cp = line_ptr; /* cp is for output */
62 printf ("character `%c', mode %d\n", *line_ptr, parse_mode);
65 while (parse_mode == WHITESPACE) {
66 if (*line_ptr == '\0')
68 if (*line_ptr == ' ' || *line_ptr == '\t') {
72 if (*line_ptr == '"') {
73 /* go to quoted-string mode */
74 parse_mode = QUOTED_STRING;
76 argv = NEW_ARGV (argv, argc);
81 /* random-token mode */
84 argv = NEW_ARGV (argv, argc);
85 argv[argc++] = line_ptr;
89 while (parse_mode == TOKEN) {
90 if (*line_ptr == '\0') {
94 else if (*line_ptr == ' ' || *line_ptr == '\t') {
97 parse_mode = WHITESPACE;
99 else if (*line_ptr == '"') {
101 parse_mode = QUOTED_STRING;
107 while (parse_mode == QUOTED_STRING) {
108 if (*line_ptr == '\0') {
109 ss_error (sci_idx, 0,
110 "Unbalanced quotes in command line");
115 else if (*line_ptr == '"') {
116 if (*++line_ptr == '"') {
134 printf ("argc = %d\n", argc);
135 for (i = 0; i <= argc; i++)
136 printf ("\targv[%2d] = `%s'\n", i,
137 argv[i] ? argv[i] : "<NULL>");