static int fp_parse_line( int lineno, char *line ) { char * token; cargc = 0; token = strtok_quote( line, " \t" ); if ( strtok_quote_ptr ) { *strtok_quote_ptr = ' '; } if ( strtok_quote_ptr ) { *strtok_quote_ptr = '\0'; } for ( ; token != NULL; token = strtok_quote( NULL, " \t" ) ) { if ( cargc == cargv_size - 1 ) { char **tmp; tmp = realloc( cargv, (cargv_size + ARGS_STEP) * sizeof(*cargv) ); if ( tmp == NULL ) { return -1; } cargv = tmp; cargv_size += ARGS_STEP; } cargv[cargc++] = token; } cargv[cargc] = NULL; return 0; }
/* Builds an argv array from cmd. Spaces and tabs within double quotes * are not considered delimiters. Double quotes are removed. * * The return value is argc, and the pointer to char ** is set. argc * is non-negative, argv[0], ..., argv[argc - 1] are pointers to * strings, and argv[argc] == NULL. All argv[0], ..., argv[argc - 1] * must be freed by the user, and also the argv pointer itself. * * Example: cmd = abc"/program files/"olle nisse, results in * argv[0] = abc/program files/olle, argv[1] = nisse, argc = 2. * */ int esock_build_argv(char *cmd, char ***argvp) { int argvsize = 10, argc = 0; char *args, *tokp, *argp; char **argv; argv = esock_malloc(argvsize * sizeof(char *)); args = esock_malloc(strlen(cmd) + 1); strcpy(args, cmd); tokp = strtok_quote(args, " \t"); while (tokp != NULL) { if (argc + 1 >= argvsize) { argvsize += 10; argv = esock_realloc(argv, argvsize * sizeof(char *)); } argp = esock_malloc(strlen(tokp) + 1); strcpy(argp, tokp); argv[argc++] = argp; tokp = strtok_quote(NULL, " \t"); } esock_free(args); argv[argc] = NULL; *argvp = argv; return argc; }