Simplify get_name_value()

pull/48/head
Soner Tari 3 years ago
parent 42fecffb70
commit 37f82aa84e

@ -3755,76 +3755,46 @@ leave:
/* /*
* Separator param is needed for command line options only. * Separator param is needed for command line options only.
* Conf file option separator is ' '. * Conf file option separator is ' '.
* Do not modify the name param, the caller may try to free it causing signal 6 crash.
* Allows multiple separators between name and value.
*/ */
int int
get_name_value(char **name, char **value, const char sep, int line_num) get_name_value(char **name, char **value, const char sep, int line_num)
{ {
char *n, *v, *value_end; size_t len = strlen(*name);
int retval = -1;
/* Skip to the end of option name and terminate it with '\0' */ // Find end of and null-terminate name
for (n = *name;; n++) { char *n = *name;
/* White spaces possible around separator, while (*n != ' ' && *n != '\t' && *n != '\r' && *n != '\n' && *n != sep)
* if the command line option is passed between the quotes */ n++;
if (*n == ' ' || *n == '\t' || *n == sep) { *n = '\0';
*n = '\0';
n++;
break;
}
if (*n == '\r' || *n == '\n') {
// No value, just name, e.g. "}"
*n = '\0';
*value = NULL;
goto leave2;
}
if (*n == '\0') {
n = NULL;
break;
}
}
/* No option name */ if (!*name) {
if (n == NULL) {
fprintf(stderr, "Error in option: No option name on line %d\n", line_num); fprintf(stderr, "Error in option: No option name on line %d\n", line_num);
goto leave; return -1;
} }
/* White spaces possible before value and around separator, size_t name_len = strlen(*name);
* if the command line option is passed between the quotes */ if (len == name_len) {
while (*n == ' ' || *n == '\t' || *n == sep) { fprintf(stderr, "Error in option: No option value on line %d\n", line_num);
n++; // Return empty value
*value = *name + name_len;
return -1;
} }
*value = n; // Trim left of value (skip white space and sep until value)
do n++;
while (*n == ' ' || *n == '\t' || *n == '\r' || *n == '\n' || *n == sep);
/* Find end of value and terminate it with '\0' *value = n;
* Find first occurrence of trailing white space */
value_end = NULL;
for (v = *value;; v++) {
if (*v == '\0') {
break;
}
if (*v == '\r' || *v == '\n') {
*v = '\0';
break;
}
if (*v == ' ' || *v == '\t') {
if (!value_end) {
value_end = v;
}
} else {
value_end = NULL;
}
}
if (value_end) { // Trim right of value
*value_end = '\0'; n = *value + strlen(*value) - 1;
} while (*n == ' ' || *n == '\t' || *n == '\r' || *n == '\n' || *n == sep)
n--;
*(n + 1) = '\0';
leave2: return 0;
retval = 0;
leave:
return retval;
} }
#define MAX_TOKENS 10 #define MAX_TOKENS 10

@ -914,7 +914,8 @@ START_TEST(opts_get_name_value_01)
fail_unless(retval == 0, "failed parsing name value"); fail_unless(retval == 0, "failed parsing name value");
free(name); free(name);
// Leading white space is handled elsewhere, so we don't have a test for " Name Value", and similar // Leading white space must be handled by the caller,
// so we don't have a test for " Name Value", or similar
name = strdup("Name Value "); name = strdup("Name Value ");
retval = get_name_value(&name, &value, ' ', 0); retval = get_name_value(&name, &value, ' ', 0);

Loading…
Cancel
Save