/* Scan through whitespace in the current buffer (read more if required) */ STATICFNDEF char *scan_space(FILE *handle, char *buff, char *buffptr, char *buff_top) { char *fgets_rc; while (TRUE) { for (; (buffptr < buff_top) && (ISSPACE_ASCII(*buffptr)); buffptr++) ; if (buffptr < buff_top) return buffptr; /* first non-whitespace character */ if (NEWLINE == *(buffptr - 1)) return EOL_REACHED; /* current buffer is exhausted and we haven't seen a newline; read more */ FGETS_FILE(buff, MAX_READ_SZ, handle, fgets_rc); if (NULL == fgets_rc) break; buffptr = buff; buff_top = buffptr + STRLEN(buff); } return EOF_REACHED; }
int cli_get_string_token(int *eof) { int arg_no, token_len, in_len; char *from, *to; IN_PARMS *new_cli_lex_in_ptr; assert(cli_lex_in_ptr); /* Reading from program argument list */ if (cli_lex_in_ptr->argc > 1 && cli_lex_in_ptr->tp == 0) { cli_lex_in_ptr->tp = cli_lex_in_ptr->in_str; arg_no = 1; /* convert arguments into array */ while(arg_no < cli_lex_in_ptr->argc) { if (arg_no > 1) strcat(cli_lex_in_ptr->in_str, " "); if (strlen(cli_lex_in_ptr->in_str) + strlen(cli_lex_in_ptr->argv[arg_no]) > MAX_LINE) break; if (cli_has_space(cli_lex_in_ptr->argv[arg_no])) { from = cli_lex_in_ptr->argv[arg_no++]; to = cli_lex_in_ptr->in_str + strlen(cli_lex_in_ptr->in_str) - 1; *to++ = '\"'; while(*from != '\0') { if ('\"' == *from) *to++ = *from; *to++ = *from++; } *to++ = '\"'; *to = '\0'; } else strcat(cli_lex_in_ptr->in_str, cli_lex_in_ptr->argv[arg_no++]); } } if (NULL == cli_lex_in_ptr->tp || strlen(cli_lex_in_ptr->tp) < 1) { cli_token_buf[0] = '\0'; FGETS_FILE(cli_token_buf, MAX_LINE, stdin, cli_lex_in_ptr->tp); if (NULL != cli_lex_in_ptr->tp) { in_len = strlen(cli_token_buf); if (cli_lex_in_ptr->buflen < in_len) { new_cli_lex_in_ptr = (IN_PARMS *)malloc(sizeof(IN_PARMS) + in_len); new_cli_lex_in_ptr->argc = cli_lex_in_ptr->argc; new_cli_lex_in_ptr->argv = cli_lex_in_ptr->argv; new_cli_lex_in_ptr->buflen = in_len; free(cli_lex_in_ptr); cli_lex_in_ptr = new_cli_lex_in_ptr; } memcpy(cli_lex_in_ptr->in_str, cli_token_buf, in_len); cli_lex_in_ptr->in_str[in_len - 1] = '\0'; cli_lex_in_ptr->tp = cli_lex_in_ptr->in_str; /* Repoint to new home from cli_token_buf */ *eof = 0; } else { *eof = EOF; return (0); } } token_len = tok_string_extract(); *eof = (cli_lex_in_ptr->argc > 1 && token_len == 0); return token_len; }