// Copyright 2016 The Fuchsia Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "option.h" #include "util.h" #pragma GCC visibility push(hidden) #include #pragma GCC visibility pop #define OPTION_DEFAULT(option) \ case OPTION_##option: value = OPTION_##option##_DEFAULT; break static void initialize_options(struct options* o) { for (enum option i = 0; i < OPTION_MAX; ++i) { const char* value = NULL; switch (i) { OPTION_DEFAULT(FILENAME); OPTION_DEFAULT(SHUTDOWN); OPTION_DEFAULT(REBOOT); case OPTION_MAX: __builtin_unreachable(); } o->value[i] = value; } } #define OPTION_STRING(option) \ case OPTION_##option: \ string = OPTION_##option##_STRING; \ string_len = sizeof(OPTION_##option##_STRING) - 1; \ break static void apply_option(struct options* o, const char* arg) { size_t len = strlen(arg); for (enum option i = 0; i < OPTION_MAX; ++i) { const char* string = NULL; size_t string_len = 0; switch (i) { OPTION_STRING(FILENAME); OPTION_STRING(SHUTDOWN); OPTION_STRING(REBOOT); case OPTION_MAX: __builtin_unreachable(); } if (len > string_len && arg[string_len] == '=' && !strncmp(arg, string, string_len)) { o->value[i] = &arg[string_len + 1]; } } } void parse_options(zx_handle_t log, struct options *o, char** strings) { initialize_options(o); for (char** sp = strings; *sp != NULL; ++sp) { const char* arg = *sp; printl(log, "option \"%s\"", arg); apply_option(o, arg); } }