// makeargv written by ian a. mason @ une 1/8/2002 // the argv and each argv[i] can be freed after use. // no sharing with the original string. #include #include #include #define DEBUG 0 int makeargv(const char *s, const char *delimiters, char ***argvp){ if(argvp == NULL) return -1; if(s == NULL){ *argvp = NULL; return 0; } else { int argc = 0, len = strlen(s); if(len == 0){ *argvp = NULL; return 0; } else { int start = 0, end = 0; char **argv = (char **)calloc(len, sizeof(char *)); if(argv == NULL) return -1; if(DEBUG) fprintf(stderr, "Entering loop &s[start] = \"%s\"\n", &s[start]); while(s[start] != '\0'){ if(DEBUG) fprintf(stderr, "Looping\n"); //remove all starting delimiters while((s[start] != '\0') && (strchr(delimiters, s[start]) != NULL)) start++; if(DEBUG) fprintf(stderr, "Delimiters removed &s[start] = \"%s\"\n", &s[start]); if(s[start] == '\0'){ if(DEBUG) fprintf(stderr, "End of string\n"); if(argc == 0){ free(argv); *argvp = NULL; return argc; } else { argv[argc] = NULL; *argvp = argv; return argc; } } //s[start] != '\0' end = start; //find the end of the current token while((s[end] != '\0') && strchr(delimiters, s[end]) == NULL) end++; if(DEBUG) fprintf(stderr, "Token end found: &s[end] = \"%s\"\n", &s[end]); argv[argc] = (char *)calloc((end - start) + 1, sizeof(char)); if(argv[argc] == NULL){ free(argv); return -1; } strncpy(argv[argc], &s[start], end - start); argv[argc][end - start] = '\0'; argc++; start = end; } argv[argc] = NULL; *argvp = argv; return argc; } } }