|
|
@ -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 */
|
|
|
|
|
|
|
|
if (*n == ' ' || *n == '\t' || *n == sep) {
|
|
|
|
|
|
|
|
*n = '\0';
|
|
|
|
|
|
|
|
n++;
|
|
|
|
n++;
|
|
|
|
break;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (*n == '\r' || *n == '\n') {
|
|
|
|
|
|
|
|
// No value, just name, e.g. "}"
|
|
|
|
|
|
|
|
*n = '\0';
|
|
|
|
*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
|
|
|
|