int argcv_get_n (const char *command, int len, const char *delim, const char *cmnt, int *argc, char ***argv) { int i = 0; int start, end, save; *argv = NULL; /* Count number of arguments */ *argc = 0; save = 0; if (!delim) delim = ""; if (!cmnt) cmnt = ""; while (argcv_scan (len, command, delim, cmnt, &start, &end, &save) <= len) (*argc)++; *argv = calloc ((*argc + 1), sizeof (char *)); if (*argv == NULL) return ENOMEM; i = 0; save = 0; for (i = 0; i < *argc; i++) { int n; int unquote; argcv_scan (len, command, delim, cmnt, &start, &end, &save); if ((command[start] == '"' || command[end] == '\'') && command[end] == command[start]) { if (start < end) { start++; end--; } unquote = 0; } else unquote = 1; n = end - start + 1; (*argv)[i] = calloc (n+1, sizeof (char)); if ((*argv)[i] == NULL) return ENOMEM; if (unquote) argcv_unquote_copy ((*argv)[i], &command[start], n); else memcpy ((*argv)[i], &command[start], n); (*argv)[i][n] = 0; } (*argv)[i] = NULL; return 0; }
int argcv_get_np (const char *command, int len, const char *delim, const char *cmnt, int flags, int *pargc, char ***pargv, char **endp) { int i = 0; struct argcv_info info; int argc; char **argv; if (!delim) delim = ""; if (!cmnt) cmnt = ""; init_argcv_info (&info, flags, len, command, delim, cmnt); /* Count number of arguments */ argc = 0; while (argcv_scan (&info) <= len) argc++; argv = calloc ((argc + 1), sizeof (char *)); if (argv == NULL) return ENOMEM; i = 0; info.save = 0; for (i = 0; i < argc; i++) { int n; int unquote; argcv_scan (&info); if ((command[info.start] == '"' || command[info.end] == '\'') && command[info.end] == command[info.start]) { if (info.start < info.end) { info.start++; info.end--; } unquote = 0; } else unquote = 1; n = info.end - info.start + 1; argv[i] = calloc (n + 1, sizeof (char)); if (argv[i] == NULL) { argcv_free (i, argv); return ENOMEM; } if (unquote) argcv_unquote_copy (argv[i], &command[info.start], n); else memcpy (argv[i], &command[info.start], n); argv[i][n] = 0; } argv[i] = NULL; *pargc = argc; *pargv = argv; if (endp) *endp = (char*) (command + info.finish_pos); return 0; }