MCPcopy Index your code
hub / github.com/RsyncProject/rsync / poptParseArgvString

Function poptParseArgvString

popt/poptparse.c:54–126  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

52}
53
54int poptParseArgvString(const char * s, int * argcPtr, const char *** argvPtr)
55{
56 const char * src;
57 char quote = '\0';
58 int argvAlloced = POPT_ARGV_ARRAY_GROW_DELTA;
59 const char ** argv = malloc(sizeof(*argv) * argvAlloced);
60 const char ** argv_tmp;
61 int argc = 0;
62 size_t buflen = strlen(s) + 1;
63 char * buf, * bufOrig = NULL;
64 int rc = POPT_ERROR_MALLOC;
65
66 if (argv == NULL) return rc;
67 buf = bufOrig = calloc((size_t)1, buflen);
68 if (buf == NULL) {
69 free(argv);
70 return rc;
71 }
72 argv[argc] = buf;
73
74 for (src = s; *src != '\0'; src++) {
75 if (quote == *src) {
76 quote = '\0';
77 } else if (quote != '\0') {
78 if (*src == '\\') {
79 src++;
80 if (!*src) {
81 rc = POPT_ERROR_BADQUOTE;
82 goto exit;
83 }
84 if (*src != quote) *buf++ = '\\';
85 }
86 *buf++ = *src;
87 } else if (_isspaceptr(src)) {
88 if (*argv[argc] != '\0') {
89 buf++, argc++;
90 if (argc == argvAlloced) {
91 argvAlloced += POPT_ARGV_ARRAY_GROW_DELTA;
92 argv_tmp = realloc(argv, sizeof(*argv) * argvAlloced);
93 if (argv_tmp == NULL) goto exit;
94 argv = argv_tmp;
95 }
96 argv[argc] = buf;
97 }
98 } else switch (*src) {
99 case '"':
100 case '\'':
101 quote = *src;
102 break;
103 case '\\':
104 src++;
105 if (!*src) {
106 rc = POPT_ERROR_BADQUOTE;
107 goto exit;
108 }
109 /* fallthrough */
110 default:
111 *buf++ = *src;

Callers 1

poptConfigLineFunction · 0.85

Calls 1

poptDupArgvFunction · 0.85

Tested by

no test coverage detected