| 124 | }; |
| 125 | |
| 126 | int split_cmdline(char *cmdline, const char ***argv) |
| 127 | { |
| 128 | size_t src, dst, count = 0, size = 16; |
| 129 | char quoted = 0; |
| 130 | |
| 131 | ALLOC_ARRAY(*argv, size); |
| 132 | |
| 133 | /* split alias_string */ |
| 134 | (*argv)[count++] = cmdline; |
| 135 | for (src = dst = 0; cmdline[src];) { |
| 136 | char c = cmdline[src]; |
| 137 | if (!quoted && isspace(c)) { |
| 138 | cmdline[dst++] = 0; |
| 139 | while (cmdline[++src] |
| 140 | && isspace(cmdline[src])) |
| 141 | ; /* skip */ |
| 142 | ALLOC_GROW(*argv, count + 1, size); |
| 143 | (*argv)[count++] = cmdline + dst; |
| 144 | } else if (!quoted && (c == '\'' || c == '"')) { |
| 145 | quoted = c; |
| 146 | src++; |
| 147 | } else if (c == quoted) { |
| 148 | quoted = 0; |
| 149 | src++; |
| 150 | } else { |
| 151 | if (c == '\\' && quoted != '\'') { |
| 152 | src++; |
| 153 | c = cmdline[src]; |
| 154 | if (!c) { |
| 155 | FREE_AND_NULL(*argv); |
| 156 | return -SPLIT_CMDLINE_BAD_ENDING; |
| 157 | } |
| 158 | } |
| 159 | cmdline[dst++] = c; |
| 160 | src++; |
| 161 | } |
| 162 | } |
| 163 | |
| 164 | cmdline[dst] = 0; |
| 165 | |
| 166 | if (quoted) { |
| 167 | FREE_AND_NULL(*argv); |
| 168 | return -SPLIT_CMDLINE_UNCLOSED_QUOTE; |
| 169 | } |
| 170 | |
| 171 | if (count >= INT_MAX) { |
| 172 | FREE_AND_NULL(*argv); |
| 173 | return -SPLIT_CMDLINE_ARGC_OVERFLOW; |
| 174 | } |
| 175 | |
| 176 | ALLOC_GROW(*argv, count + 1, size); |
| 177 | (*argv)[count] = NULL; |
| 178 | |
| 179 | return count; |
| 180 | } |
| 181 | |
| 182 | const char *split_cmdline_strerror(int split_cmdline_errno) |
| 183 | { |
no outgoing calls
no test coverage detected