diff options
Diffstat (limited to 'refclock.c')
-rw-r--r-- | refclock.c | 64 |
1 files changed, 48 insertions, 16 deletions
@@ -325,25 +325,57 @@ RCL_GetDriverParameter(RCL_Instance instance) return instance->driver_parameter; } -char * -RCL_GetDriverOption(RCL_Instance instance, char *name) +static char * +get_next_driver_option(RCL_Instance instance, char *option) { - char *s, *e; - int n; + if (option == NULL) + option = instance->driver_parameter; - s = instance->driver_parameter; - e = s + instance->driver_parameter_length; - n = strlen(name); + option += strlen(option) + 1; - while (1) { - s += strlen(s) + 1; - if (s >= e) - break; - if (!strncmp(name, s, n)) { - if (s[n] == '=') - return s + n + 1; - if (s[n] == '\0') - return s + n; + if (option >= instance->driver_parameter + instance->driver_parameter_length) + return NULL; + + return option; +} + +void +RCL_CheckDriverOptions(RCL_Instance instance, const char **options) +{ + char *option; + int i, len; + + for (option = get_next_driver_option(instance, NULL); + option; + option = get_next_driver_option(instance, option)) { + for (i = 0; options && options[i]; i++) { + len = strlen(options[i]); + if (!strncmp(options[i], option, strlen(options[i])) && + (option[len] == '=' || option[len] == '\0')) + break; + } + + if (!options || !options[i]) + LOG_FATAL("Invalid refclock driver option %s", option); + } +} + +char * +RCL_GetDriverOption(RCL_Instance instance, char *name) +{ + char *option; + int len; + + len = strlen(name); + + for (option = get_next_driver_option(instance, NULL); + option; + option = get_next_driver_option(instance, option)) { + if (!strncmp(name, option, len)) { + if (option[len] == '=') + return option + len + 1; + if (option[len] == '\0') + return option + len; } } |