/** * \brief Parse command line style overrides (--ass-force-style option) * \param track track to apply overrides to * The format for overrides is [StyleName.]Field=Value */ void ass_process_force_style(ASS_Track *track) { char **fs, *eq, *dt, *style, *tname, *token; ASS_Style *target; int sid; char **list = track->library->style_overrides; if (!list) return; for (fs = list; *fs; ++fs) { eq = strrchr(*fs, '='); if (!eq) continue; *eq = '\0'; token = eq + 1; if (!strcasecmp(*fs, "PlayResX")) track->PlayResX = atoi(token); else if (!strcasecmp(*fs, "PlayResY")) track->PlayResY = atoi(token); else if (!strcasecmp(*fs, "Timer")) track->Timer = ass_atof(token); else if (!strcasecmp(*fs, "WrapStyle")) track->WrapStyle = atoi(token); else if (!strcasecmp(*fs, "ScaledBorderAndShadow")) track->ScaledBorderAndShadow = parse_bool(token); else if (!strcasecmp(*fs, "Kerning")) track->Kerning = parse_bool(token); dt = strrchr(*fs, '.'); if (dt) { *dt = '\0'; style = *fs; tname = dt + 1; } else { style = NULL; tname = *fs; } for (sid = 0; sid < track->n_styles; ++sid) { if (style == NULL || strcasecmp(track->styles[sid].Name, style) == 0) { target = track->styles + sid; if (0) { STRVAL(FontName) COLORVAL(PrimaryColour) COLORVAL(SecondaryColour) COLORVAL(OutlineColour) COLORVAL(BackColour) FPVAL(FontSize) INTVAL(Bold) INTVAL(Italic) INTVAL(Underline) INTVAL(StrikeOut) FPVAL(Spacing) INTVAL(Angle) INTVAL(BorderStyle) INTVAL(Alignment) INTVAL(MarginL) INTVAL(MarginR) INTVAL(MarginV) INTVAL(Encoding) FPVAL(ScaleX) FPVAL(ScaleY) FPVAL(Outline) FPVAL(Shadow) } } } *eq = '='; if (dt) *dt = '.'; }
std::istringstream is(str); bool b; is >> (str.size() > 1 ? std::boolalpha : std::noboolalpha) >> b; return b; } static void from_str(const String& str, int type, void* dst) { std::stringstream ss(str.c_str()); if( type == Param::INT ) ss >> *(int*)dst; else if( type == Param::BOOLEAN ) { std::string temp; ss >> temp; *(bool*) dst = parse_bool(temp); } else if( type == Param::UNSIGNED_INT ) ss >> *(unsigned*)dst; else if( type == Param::UINT64 ) ss >> *(uint64*)dst; else if( type == Param::FLOAT ) ss >> *(float*)dst; else if( type == Param::REAL ) ss >> *(double*)dst; else if( type == Param::STRING ) *(String*)dst = str; else if( type == Param::SCALAR) { Scalar& scalar = *(Scalar*)dst; for (int i = 0; i < 4 && !ss.eof(); ++i)
static bool setup_from_config(lwan_t *lwan, const char *path) { config_t conf; config_line_t line; bool has_listener = false; char path_buf[PATH_MAX]; if (!path) path = get_config_path(path_buf); lwan_status_info("Loading configuration file: %s", path); if (!lwan_trie_init(&lwan->url_map_trie, destroy_urlmap)) return false; if (!config_open(&conf, path)) return false; while (config_read_line(&conf, &line)) { switch (line.type) { case CONFIG_LINE_TYPE_LINE: if (!strcmp(line.line.key, "keep_alive_timeout")) lwan->config.keep_alive_timeout = (unsigned short)parse_long(line.line.value, default_config.keep_alive_timeout); else if (!strcmp(line.line.key, "quiet")) lwan->config.quiet = parse_bool(line.line.value, default_config.quiet); else if (!strcmp(line.line.key, "reuse_port")) lwan->config.reuse_port = parse_bool(line.line.value, default_config.reuse_port); else if (!strcmp(line.line.key, "proxy_protocol")) lwan->config.proxy_protocol = parse_bool(line.line.value, default_config.proxy_protocol); else if (!strcmp(line.line.key, "expires")) lwan->config.expires = parse_time_period(line.line.value, default_config.expires); else if (!strcmp(line.line.key, "error_template")) { free(lwan->config.error_template); lwan->config.error_template = strdup(line.line.value); } else if (!strcmp(line.line.key, "threads")) { long n_threads = parse_long(line.line.value, default_config.n_threads); if (n_threads < 0) config_error(&conf, "Invalid number of threads: %d", n_threads); lwan->config.n_threads = (unsigned short int)n_threads; } else config_error(&conf, "Unknown config key: %s", line.line.key); break; case CONFIG_LINE_TYPE_SECTION: if (!strcmp(line.section.name, "listener")) { if (!has_listener) { parse_listener(&conf, &line, lwan); has_listener = true; } else { config_error(&conf, "Only one listener supported"); } } else if (!strcmp(line.section.name, "straitjacket")) { lwan_straitjacket_enforce(&conf, &line); } else { config_error(&conf, "Unknown section type: %s", line.section.name); } break; case CONFIG_LINE_TYPE_SECTION_END: config_error(&conf, "Unexpected section end"); } } if (conf.error_message) { lwan_status_critical("Error on config file \"%s\", line %d: %s", path, conf.line, conf.error_message); } config_close(&conf); return true; }
void __init cmdline_parse(const char *cmdline) { char opt[100], *optval, *optkey, *q; const char *p = cmdline; struct kernel_param *param; int bool_assert; if ( cmdline == NULL ) return; safe_strcpy(saved_cmdline, cmdline); for ( ; ; ) { /* Skip whitespace. */ while ( *p == ' ' ) p++; if ( *p == '\0' ) break; /* Grab the next whitespace-delimited option. */ q = optkey = opt; while ( (*p != ' ') && (*p != '\0') ) { if ( (q-opt) < (sizeof(opt)-1) ) /* avoid overflow */ *q++ = *p; p++; } *q = '\0'; /* Search for value part of a key=value option. */ optval = strchr(opt, '='); if ( optval != NULL ) { *optval++ = '\0'; /* nul-terminate the option value */ q = strpbrk(opt, "([{<"); } else { optval = q; /* default option value is empty string */ q = NULL; } /* Boolean parameters can be inverted with 'no-' prefix. */ bool_assert = !!strncmp("no-", optkey, 3); if ( !bool_assert ) optkey += 3; for ( param = &__setup_start; param < &__setup_end; param++ ) { if ( strcmp(param->name, optkey) ) { if ( param->type == OPT_CUSTOM && q && strlen(param->name) == q + 1 - opt && !strncmp(param->name, opt, q + 1 - opt) ) { optval[-1] = '='; ((void (*)(const char *))param->var)(q); optval[-1] = '\0'; } continue; } switch ( param->type ) { case OPT_STR: strlcpy(param->var, optval, param->len); break; case OPT_UINT: assign_integer_param( param, simple_strtoll(optval, NULL, 0)); break; case OPT_BOOL: case OPT_INVBOOL: if ( !parse_bool(optval) ) bool_assert = !bool_assert; assign_integer_param( param, (param->type == OPT_BOOL) == bool_assert); break; case OPT_SIZE: assign_integer_param( param, parse_size_and_unit(optval, NULL)); break; case OPT_CUSTOM: ((void (*)(const char *))param->var)(optval); break; default: BUG(); break; } } } }
/* Wants: name = value */ static enum status_code option_set_command(int argc, const char *argv[]) { if (argc < 3) return ERROR_WRONG_NUMBER_OF_ARGUMENTS; if (strcmp(argv[1], "=")) return ERROR_NO_VALUE_ASSIGNED; if (!strcmp(argv[0], "blame-options")) return parse_args(&opt_blame_options, argv + 2); if (!strcmp(argv[0], "diff-options")) return parse_args(&opt_diff_options, argv + 2); if (argc != 3) return ERROR_WRONG_NUMBER_OF_ARGUMENTS; if (!strcmp(argv[0], "show-author")) return parse_enum(&opt_show_author, argv[2], author_map); if (!strcmp(argv[0], "show-date")) return parse_enum(&opt_show_date, argv[2], date_map); if (!strcmp(argv[0], "show-rev-graph")) return parse_bool(&opt_show_rev_graph, argv[2]); if (!strcmp(argv[0], "show-refs")) return parse_bool(&opt_show_refs, argv[2]); if (!strcmp(argv[0], "show-changes")) return parse_bool(&opt_show_changes, argv[2]); if (!strcmp(argv[0], "show-notes")) { bool matched = FALSE; enum status_code res = parse_bool_matched(&opt_show_notes, argv[2], &matched); if (res == SUCCESS && matched) { update_notes_arg(); return res; } opt_show_notes = TRUE; strcpy(opt_notes_arg, "--show-notes="); res = parse_string(opt_notes_arg + 8, argv[2], sizeof(opt_notes_arg) - 8); if (res == SUCCESS && opt_notes_arg[8] == '\0') opt_notes_arg[7] = '\0'; return res; } if (!strcmp(argv[0], "show-line-numbers")) return parse_bool(&opt_show_line_numbers, argv[2]); if (!strcmp(argv[0], "line-graphics")) return parse_enum(&opt_line_graphics, argv[2], graphic_map); if (!strcmp(argv[0], "line-number-interval")) return parse_int(&opt_line_number_interval, argv[2], 1, 1024); if (!strcmp(argv[0], "author-width")) return parse_int(&opt_author_width, argv[2], 0, 1024); if (!strcmp(argv[0], "filename-width")) return parse_int(&opt_show_filename_width, argv[2], 0, 1024); if (!strcmp(argv[0], "show-filename")) return parse_enum(&opt_show_filename, argv[2], filename_map); if (!strcmp(argv[0], "show-file-size")) return parse_enum(&opt_show_file_size, argv[2], file_size_map); if (!strcmp(argv[0], "horizontal-scroll")) return parse_step(&opt_horizontal_scroll, argv[2]); if (!strcmp(argv[0], "split-view-height")) return parse_step(&opt_split_view_height, argv[2]); if (!strcmp(argv[0], "vertical-split")) return parse_enum(&opt_vertical_split, argv[2], vertical_split_map); if (!strcmp(argv[0], "tab-size")) return parse_int(&opt_tab_size, argv[2], 1, 1024); if (!strcmp(argv[0], "diff-context") && !*opt_diff_context_arg) { enum status_code code = parse_int(&opt_diff_context, argv[2], 0, 999999); if (code == SUCCESS) update_diff_context_arg(opt_diff_context); return code; } if (!strcmp(argv[0], "ignore-space") && !*opt_ignore_space_arg) { enum status_code code = parse_enum(&opt_ignore_space, argv[2], ignore_space_map); if (code == SUCCESS) update_ignore_space_arg(); return code; } if (!strcmp(argv[0], "commit-order") && !*opt_commit_order_arg) { enum status_code code = parse_enum(&opt_commit_order, argv[2], commit_order_map); if (code == SUCCESS) update_commit_order_arg(); return code; } if (!strcmp(argv[0], "status-untracked-dirs")) return parse_bool(&opt_status_untracked_dirs, argv[2]); if (!strcmp(argv[0], "read-git-colors")) return parse_bool(&opt_read_git_colors, argv[2]); if (!strcmp(argv[0], "ignore-case")) return parse_bool(&opt_ignore_case, argv[2]); if (!strcmp(argv[0], "focus-child")) return parse_bool(&opt_focus_child, argv[2]); if (!strcmp(argv[0], "wrap-lines")) return parse_bool(&opt_wrap_lines, argv[2]); if (!strcmp(argv[0], "show-id")) return parse_bool(&opt_show_id, argv[2]); if (!strcmp(argv[0], "id-width")) return parse_id(&opt_id_width, argv[2]); if (!strcmp(argv[0], "title-overflow")) { bool enabled = FALSE; bool matched; enum status_code code; /* * "title-overflow" is considered a boolint. * We try to parse it as a boolean (and set the value to 50 if true), * otherwise we parse it as an integer and use the given value. */ code = parse_bool_matched(&enabled, argv[2], &matched); if (code == SUCCESS && matched) { if (enabled) opt_title_overflow = 50; } else { code = parse_int(&opt_title_overflow, argv[2], 2, 1024); if (code != SUCCESS) opt_title_overflow = 50; } return code; } if (!strcmp(argv[0], "editor-line-number")) return parse_bool(&opt_editor_line_number, argv[2]); if (!strcmp(argv[0], "mouse")) return parse_bool(&opt_mouse, argv[2]); if (!strcmp(argv[0], "mouse-scroll")) return parse_int(&opt_mouse_scroll, argv[2], 0, 1024); return ERROR_UNKNOWN_VARIABLE_NAME; }
void cmdline_parse(const char *cmdline, cmdline_opt_t* cmdline_opt) { int i; #ifdef DEBUG /* initialise to default */ for (i = 0; i < CONFIG_MAX_NUM_NODES; i++) { cmdline_opt->console_port[i] = 0; cmdline_opt->debug_port[i] = 0; } cmdline_opt->console_port[0] = 0x3f8; cmdline_opt->debug_port[0] = 0x3f8; if (parse_opt(cmdline, "console_port", cmdline_val, MAX_CMDLINE_VAL_LEN) != -1) { parse_uint16_array(cmdline_val, cmdline_opt->console_port, CONFIG_MAX_NUM_NODES); } /* initialise console ports to enable debug output */ for (i = 0; i < CONFIG_MAX_NUM_NODES; i++) { if (cmdline_opt->console_port[i]) { serial_init(cmdline_opt->console_port[i]); } } /* only start printing here after having parsed/set/initialised the console_port */ printf("\nBoot config: parsing cmdline '%s'\n", cmdline); for (i = 0; i < CONFIG_MAX_NUM_NODES; i++) if (cmdline_opt->console_port[i]) { printf("Boot config: console_port of node #%d = 0x%x\n", i, cmdline_opt->console_port[i]); } if (parse_opt(cmdline, "debug_port", cmdline_val, MAX_CMDLINE_VAL_LEN) != -1) { parse_uint16_array(cmdline_val, cmdline_opt->debug_port, CONFIG_MAX_NUM_NODES); } /* initialise debug ports */ for (i = 0; i < CONFIG_MAX_NUM_NODES; i++) { if (cmdline_opt->debug_port[i]) { serial_init(cmdline_opt->debug_port[i]); printf("Boot config: debug_port of node #%d = 0x%x\n", i, cmdline_opt->debug_port[i]); } } #endif #ifdef CONFIG_IOMMU cmdline_opt->disable_iommu = parse_bool(cmdline, cmdline_str_disable_iommu); printf("Boot config: disable_iommu = %s\n", cmdline_opt->disable_iommu ? "true" : "false"); #endif /* parse max_num_nodes option */ cmdline_opt->max_num_nodes = 1; /* default */ if (parse_opt(cmdline, cmdline_str_max_num_nodes, cmdline_val, MAX_CMDLINE_VAL_LEN) != -1) { i = str_to_int(cmdline_val); if (i > 0 && i <= CONFIG_MAX_NUM_NODES) { cmdline_opt->max_num_nodes = i; } } printf("Boot config: max_num_nodes = %d\n", cmdline_opt->max_num_nodes); /* parse num_sh_frames option */ cmdline_opt->num_sh_frames = 0; /* default */ if (parse_opt(cmdline, cmdline_str_num_sh_frames, cmdline_val, MAX_CMDLINE_VAL_LEN) != -1) { i = str_to_int(cmdline_val); if (i >= 0 && i < BIT(32 - PAGE_BITS)) { cmdline_opt->num_sh_frames = i; } } printf("Boot config: num_sh_frames = 0x%x\n", cmdline_opt->num_sh_frames); }
int CSkinAdvanced::Parse(MIOFILE& in) { char buf[256]; std::string strBuffer; while (in.fgets(buf, 256)) { if (match_tag(buf, "</advanced>")) break; else if (parse_bool(buf, "is_branded", m_bIsBranded)) continue; else if (parse_str(buf, "<application_name>", strBuffer)) { m_strApplicationName = wxString(strBuffer.c_str(), wxConvUTF8); continue; } else if (parse_str(buf, "<application_short_name>", strBuffer)) { m_strApplicationShortName = wxString(strBuffer.c_str(), wxConvUTF8); continue; } else if (match_tag(buf, "<application_icon>")) { m_iconApplicationIcon.Parse(in); continue; } else if (match_tag(buf, "<application_icon32>")) { m_iconApplicationIcon.Parse32(in); continue; } else if (match_tag(buf, "<application_disconnected_icon>")) { m_iconApplicationDisconnectedIcon.Parse(in); continue; } else if (match_tag(buf, "<application_snooze_icon>")) { m_iconApplicationSnoozeIcon.Parse(in); continue; } else if (parse_str(buf, "<application_logo>", strBuffer)) { if(strBuffer.length()) { wxString str = wxString( wxGetApp().GetSkinManager()->ConstructSkinPath() + wxString(strBuffer.c_str(), wxConvUTF8) ); if (boinc_file_exists(str.c_str())) { wxImage img = wxImage(str.c_str(), wxBITMAP_TYPE_ANY); if (img.IsOk()) { #ifdef __WXMSW__ // TODO: Choose from multiple size images if provided, else resize the closest one if ((GetXDPIScaling() > 1.05) || (GetYDPIScaling() > 1.05)) { img.Rescale((int) (img.GetWidth()*GetXDPIScaling()), (int) (img.GetHeight()*GetYDPIScaling()), wxIMAGE_QUALITY_BILINEAR ); } #endif m_bitmapApplicationLogo = wxBitmap(img); } } } continue; } else if (parse_str(buf, "<organization_name>", strBuffer)) { m_strOrganizationName = wxString(strBuffer.c_str(), wxConvUTF8); continue; } else if (parse_str(buf, "<organization_website>", strBuffer)) { m_strOrganizationWebsite = wxString(strBuffer.c_str(), wxConvUTF8); continue; } else if (parse_str(buf, "<organization_help_url>", strBuffer)) { m_strOrganizationHelpUrl = wxString(strBuffer.c_str(), wxConvUTF8); continue; } else if (parse_int(buf, "<open_tab>", m_iDefaultTab)) { m_bDefaultTabSpecified = true; continue; } else if (parse_str(buf, "<exit_message>", strBuffer)) { m_strExitMessage = wxString(strBuffer.c_str(), wxConvUTF8); continue; } } InitializeDelayedValidation(); return 0; }
bool load_preferences (void) { FILE* fs; int endline = 0; char* buf = 0; size_t bufsize = 0; firstline = 0; reinit_preferences (); dmsg (D_FILE, "reading option from %s", preferences_file ()); fs = fopen (preferences_file (), "rb"); if (fs == NULL) { /* Don't warn, the file doesn't exists the first time. */ dmsg (D_FILE, "cannot open preferences file %s", preferences_file ()); dperror ("fopen"); return true; } XFREE0 (ignored_lines); while (getshline_numbered (&firstline, &endline, &buf, &bufsize, fs) != -1) { char* token; char* line = xstrdup (buf); token = strtok (buf, " \t.:"); if (!strcasecmp ("heroes", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("screen", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("display_radar", token)) { token = strtok (0, "\n"); opt.radar_map = parse_bool (token, false, true); } else if (!strcasecmp ("display_infos", token)) { token = strtok (0, "\n"); opt.display_infos = parse_bool (token, false, true); } else if (!strcasecmp ("gamma", token)) { token = strtok (0, "\n"); opt.luminance = parse_unsigned (token, 0, 12); } else if (!strcasecmp ("inertia", token)) { token = strtok (0, "\n"); opt.inertia = parse_bool (token, false, true); } else { append_ignored (line); } } else if (!strcasecmp ("sound", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("music_enable", token)) { token = strtok (0, "\n"); opt.music = parse_bool (token, false, true); } else if (!strcasecmp ("music_volume", token)) { token = strtok (0, "\n"); opt.music_volume = parse_unsigned (token, 0, 12); } else if (!strcasecmp ("sfx_enable", token)) { token = strtok (0, "\n"); opt.sfx = parse_bool (token, false, true); } else if (!strcasecmp ("sfx_volume", token)) { token = strtok (0, "\n"); opt.sfx_volume = parse_unsigned (token, 0, 12); } else { append_ignored (line); } } else if (!strcasecmp ("control", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("player1", token)) { token = strtok (0, "\n"); opt.ctrl_one = parse_unsigned (token, 0, 1); } else if (!strcasecmp ("autopilot1", token)) { token = strtok (0, "\n"); opt.autopilot_one = parse_bool (token, false, true); } else if (!strcasecmp ("player2", token)) { token = strtok (0, "\n"); opt.ctrl_two = parse_unsigned (token, 0, 1); } else if (!strcasecmp ("autopilot2", token)) { token = strtok (0, "\n"); opt.autopilot_two = parse_bool (token, false, true); } else { append_ignored (line); } } else if (!strcasecmp ("game", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("speed", token)) { token = strtok (0, "\n"); opt.speed = parse_unsigned (token, 0, 2); } else if (!strcasecmp ("gamerounds", token)) { token = strtok (0, "\n"); opt.gamerounds = parse_unsigned (token, 0, 15); } else if (!strcasecmp ("player_colors", token)) { token = strtok (0, " \t"); opt.player_color[0] = parse_unsigned (token, 0, 4); token = strtok (0, " \t"); opt.player_color[1] = parse_unsigned (token, 0, 4); token = strtok (0, " \t"); opt.player_color[2] = parse_unsigned (token, 0, 4); token = strtok (0, " \t"); opt.player_color[3] = parse_unsigned (token, 0, 4); } else { append_ignored (line); } } else if (!strcasecmp ("extras", token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("mode", token)) { token = strtok (0, "\n"); opt.extras = parse_unsigned (token, 0, 2); } else { append_ignored (line); } } else if (!strcasecmp (keys_pref_group (), token)) { token = strtok (0, " \t.:"); if (!strcasecmp ("player1_keys", token)) { token = strtok (0, " \t"); opt.player_keys[0][0] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[0][1] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[0][2] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[0][3] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[0][4] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[0][5] = parse_unsigned (token, 0, HKEYCODE_MAX); } else if (!strcasecmp ("player2_keys", token)) { token = strtok (0, " \t"); opt.player_keys[1][0] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[1][1] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[1][2] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[1][3] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[1][4] = parse_unsigned (token, 0, HKEYCODE_MAX); token = strtok (0, " \t"); opt.player_keys[1][5] = parse_unsigned (token, 0, HKEYCODE_MAX); } else { append_ignored (line); } } else { append_ignored (line); } } else { append_ignored (line); } free (line); } free (buf); fclose (fs); return false; }
/* * Accumulate a new datum for one AO storage option. */ static void accumAOStorageOpt(char *name, char *value, ArrayBuildState *astate, bool *foundAO, bool *aovalue) { text *t; bool boolval; int intval; StringInfoData buf; Assert(astate); initStringInfo(&buf); if (pg_strcasecmp(SOPT_APPENDONLY, name) == 0) { if (!parse_bool(value, &boolval)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid bool value \"%s\" for storage option \"%s\"", value, name))); /* "appendonly" option is explicitly specified. */ if (foundAO != NULL) *foundAO = true; if (aovalue != NULL) *aovalue = boolval; /* * Record value of "appendonly" option as true always. Return * the value specified by user in aovalue. Setting * appendonly=true always in the array of datums enables us to * reuse default_reloptions() and * validateAppendOnlyRelOptions(). If validations are * successful, we keep the user specified value for * appendonly. */ appendStringInfo(&buf, "%s=%s", SOPT_APPENDONLY, "true"); } else if (pg_strcasecmp(SOPT_BLOCKSIZE, name) == 0) { if (!parse_int(value, &intval, 0 /* unit flags */, NULL /* hint message */)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid integer value \"%s\" for storage option \"%s\"", value, name))); appendStringInfo(&buf, "%s=%d", SOPT_BLOCKSIZE, intval); } else if (pg_strcasecmp(SOPT_COMPTYPE, name) == 0) { appendStringInfo(&buf, "%s=%s", SOPT_COMPTYPE, value); } else if (pg_strcasecmp(SOPT_COMPLEVEL, name) == 0) { if (!parse_int(value, &intval, 0 /* unit flags */, NULL /* hint message */)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid integer value \"%s\" for storage option \"%s\"", value, name))); appendStringInfo(&buf, "%s=%d", SOPT_COMPLEVEL, intval); } else if (pg_strcasecmp(SOPT_CHECKSUM, name) == 0) { if (!parse_bool(value, &boolval)) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid bool value \"%s\" for storage option \"%s\"", value, name))); appendStringInfo(&buf, "%s=%s", SOPT_CHECKSUM, boolval ? "true" : "false"); } else if (pg_strcasecmp(SOPT_ORIENTATION, name) == 0) { if ((pg_strcasecmp(value, "row") != 0) && (pg_strcasecmp(value, "column") != 0)) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid value \"%s\" for storage option \"%s\"", value, name))); } appendStringInfo(&buf, "%s=%s", SOPT_ORIENTATION, value); } else { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("invalid storage option \"%s\"", name))); } t = cstring_to_text(buf.data); accumArrayResult(astate, PointerGetDatum(t), /* disnull */ false, TEXTOID, CurrentMemoryContext); pfree(t); pfree(buf.data); }
void pgut_setopt(pgut_option *opt, const char *optarg, pgut_optsrc src) { const char *message; if (opt == NULL) { fprintf(stderr, "Try \"%s --help\" for more information.\n", PROGRAM_NAME); exit(EINVAL); } if (opt->source > src) { /* high prior value has been set already. */ return; } else if (src >= SOURCE_CMDLINE && opt->source >= src) { /* duplicated option in command line */ message = "specified only once"; } else { /* can be overwritten if non-command line source */ opt->source = src; switch (opt->type) { case 'b': case 'B': if (optarg == NULL) { *((bool *) opt->var) = (opt->type == 'b'); return; } else if (parse_bool(optarg, (bool *) opt->var)) { return; } message = "a boolean"; break; case 'f': ((pgut_optfn) opt->var)(opt, optarg); return; case 'i': if (parse_int32(optarg, opt->var)) return; message = "a 32bit signed integer"; break; case 'u': if (parse_uint32(optarg, opt->var)) return; message = "a 32bit unsigned integer"; break; case 'I': if (parse_int64(optarg, opt->var)) return; message = "a 64bit signed integer"; break; case 'U': if (parse_uint64(optarg, opt->var)) return; message = "a 64bit unsigned integer"; break; case 's': if (opt->source != SOURCE_DEFAULT) free(*(char **) opt->var); *(char **) opt->var = pgut_strdup(optarg); return; case 't': if (parse_time(optarg, opt->var)) return; message = "a time"; break; case 'y': case 'Y': if (optarg == NULL) { *(YesNo *) opt->var = (opt->type == 'y' ? YES : NO); return; } else { bool value; if (parse_bool(optarg, &value)) { *(YesNo *) opt->var = (value ? YES : NO); return; } } message = "a boolean"; break; default: ereport(ERROR, (errcode(EINVAL), errmsg("invalid option type: %c", opt->type))); return; /* keep compiler quiet */ } } if (isprint(opt->sname)) ereport(ERROR, (errcode(EINVAL), errmsg("option -%c, --%s should be %s: '%s'", opt->sname, opt->lname, message, optarg))); else ereport(ERROR, (errcode(EINVAL), errmsg("option --%s should be %s: '%s'", opt->lname, message, optarg))); }