static void parse_initstr(void) { // struct cos_array *data; char *c; static int parsed = 0; if (parsed) return; parsed = 1; /* data = cos_argreg_alloc(sizeof(struct cos_array) + 52); */ /* assert(data); */ /* data->sz = 52; */ /* if (sched_comp_config_initstr(cos_spd_id(), data)) { */ /* printc("No initstr found.\n"); */ /* return; */ /* } */ /* //printc("%s\n", data->mem); */ /* c = data->mem; */ c = cos_init_args(); while ('\0' != *c) c = parse_step(c); // cos_argreg_free(data); }
int parse_initstr(void) { // struct cos_array *data; char *c; c = cos_init_args(); while ('\0' != *c) c = parse_step(c); /* data = cos_argreg_alloc(sizeof(struct cos_array) + 52); */ /* assert(data); */ /* data->sz = 52; */ /* if (sched_comp_config_initstr(cos_spd_id(), data)) { */ /* printc("No initstr found.\n"); */ /* return -1; */ /* } */ /* c = data->mem; */ /* while ('\0' != *c) c = parse_step(c); */ /* cos_argreg_free(data); */ return 0; }
/* 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; }
static enum status_code prompt_toggle_option(struct view *view, const char *argv[], const char *prefix, struct prompt_toggle *toggle, enum view_flag *flags) { char name[SIZEOF_STR]; if (!enum_name_prefixed(name, sizeof(name), prefix, toggle->name)) return error("Failed to toggle option %s", toggle->name); *flags = toggle->flags; if (!strcmp(toggle->type, "bool")) { bool *opt = toggle->opt; *opt = !*opt; if (opt == &opt_mouse) enable_mouse(*opt); return success("set %s = %s", name, *opt ? "yes" : "no"); } else if (!strncmp(toggle->type, "enum", 4)) { const char *type = toggle->type + STRING_SIZE("enum "); enum author *opt = toggle->opt; const struct enum_map *map = find_enum_map(type); *opt = (*opt + 1) % map->size; return success("set %s = %s", name, enum_name(map->entries[*opt].name)); } else if (!strcmp(toggle->type, "int")) { const char *arg = argv[2] ? argv[2] : "1"; int diff = atoi(arg); int *opt = toggle->opt; if (!diff) diff = *arg == '-' ? -1 : 1; if (opt == &opt_diff_context && *opt < 0) *opt = -*opt; if (opt == &opt_diff_context && diff < 0) { if (!*opt) return error("Diff context cannot be less than zero"); if (*opt < -diff) diff = -*opt; } if (strstr(name, "commit-title-overflow")) { *opt = *opt ? -*opt : 50; if (*opt < 0) return success("set %s = no", name); diff = 0; } *opt += diff; return success("set %s = %d", name, *opt); } else if (!strcmp(toggle->type, "double")) { const char *arg = argv[2] ? argv[2] : "1.0"; double *opt = toggle->opt; int sign = 1; double diff; if (*arg == '-') { sign = -1; arg++; } if (parse_step(&diff, arg) != SUCCESS) diff = strtod(arg, NULL); *opt += sign * diff; return success("set %s = %.2f", name, *opt); } else if (!strcmp(toggle->type, "const char **")) { const char ***opt = toggle->opt; bool found = TRUE; int i; if (argv_size(argv) <= 2) { argv_free(*opt); (*opt)[0] = NULL; return SUCCESS; } for (i = 2; argv[i]; i++) { if (!find_arg(*opt, argv[i])) { found = FALSE; break; } } if (found) { int next, pos; for (next = 0, pos = 0; (*opt)[pos]; pos++) { const char *arg = (*opt)[pos]; if (find_arg(argv + 2, arg)) { free((void *) arg); continue; } (*opt)[next++] = arg; } (*opt)[next] = NULL; } else if (!argv_copy(opt, argv + 2)) { return ERROR_OUT_OF_MEMORY; } return SUCCESS; } else { return error("Unsupported `:toggle %s` (%s)", name, toggle->type); } }
enum status_code parse_option(struct option_info *option, const char *prefix, const char *arg) { char name[SIZEOF_STR]; if (!enum_name_prefixed(name, sizeof(name), prefix, option->name)) return error("Failed to parse option"); if (!strcmp("show-notes", name)) { bool *value = option->value; enum status_code res; if (parse_bool(option->value, arg) == SUCCESS) return SUCCESS; *value = TRUE; string_copy(opt_notes_arg, NOTES_EQ_ARG); res = parse_string(opt_notes_arg + STRING_SIZE(NOTES_EQ_ARG), arg, sizeof(opt_notes_arg) - STRING_SIZE(NOTES_EQ_ARG)); if (res == SUCCESS && !opt_notes_arg[STRING_SIZE(NOTES_EQ_ARG)]) opt_notes_arg[STRING_SIZE(NOTES_ARG)] = 0; return res; } if (!strcmp(option->type, "bool")) return parse_bool(option->value, arg); if (!strcmp(option->type, "double")) return parse_step(option->value, arg); if (!strncmp(option->type, "enum", 4)) { const char *type = option->type + STRING_SIZE("enum "); const struct enum_map *map = find_enum_map(type); return parse_enum(name, option->value, arg, map); } if (!strcmp(option->type, "int")) { if (strstr(name, "title-overflow")) { bool enabled = FALSE; int *value = option->value; /* We try to parse it as a boolean (and set the * value to 0 if fale), otherwise we parse it as * an integer and use the given value. */ if (parse_bool(&enabled, arg) == SUCCESS) { if (!enabled) { *value = 0; return SUCCESS; } arg = "50"; } } if (!strcmp(name, "line-number-interval") || !strcmp(name, "tab-size")) return parse_int(option->value, arg, 1, 1024); else if (!strcmp(name, "id-width")) return parse_int(option->value, arg, 0, SIZEOF_REV - 1); else return parse_int(option->value, arg, 0, 1024); } return error("Unhandled option: %s", name); }
static enum view_flag prompt_toggle_option(struct view *view, const char *argv[], struct prompt_toggle *toggle, char msg[SIZEOF_STR]) { char name[SIZEOF_STR]; enum_name_copy(name, toggle->name, strlen(toggle->name)); if (!strcmp(toggle->type, "bool")) { bool *opt = toggle->opt; *opt = !*opt; string_format_size(msg, SIZEOF_STR, "set %s = %s", name, *opt ? "yes" : "no"); } else if (!strncmp(toggle->type, "enum", 4)) { const char *type = toggle->type + STRING_SIZE("enum "); enum author *opt = toggle->opt; const struct enum_map *map = find_enum_map(type); *opt = (*opt + 1) % map->size; string_format_size(msg, SIZEOF_STR, "set %s = %s", name, enum_name(map->entries[*opt])); } else if (!strcmp(toggle->type, "int")) { const char *arg = argv[2] ? argv[2] : "1"; int diff = atoi(arg); int *opt = toggle->opt; if (!diff) diff = *arg == '-' ? -1 : 1; if (opt == &opt_diff_context && diff < 0) { if (!*opt) { report("Diff context cannot be less than zero"); return VIEW_NO_FLAGS; } if (*opt < -diff) diff = -*opt; } if (opt == &opt_title_overflow) { *opt = *opt ? -*opt : 50; if (*opt < 0) { string_format_size(msg, SIZEOF_STR, "set %s = no", name); return toggle->flags; } } *opt += diff; string_format_size(msg, SIZEOF_STR, "set %s = %d", name, *opt); } else if (!strcmp(toggle->type, "double")) { const char *arg = argv[2] ? argv[2] : "1.0"; double *opt = toggle->opt; int sign = 1; double diff; if (*arg == '-') { sign = -1; arg++; } if (parse_step(&diff, arg) != SUCCESS) diff = strtod(arg, NULL); *opt += sign * diff; string_format_size(msg, SIZEOF_STR, "set %s = %.2f", name, *opt); } else if (!strcmp(toggle->type, "const char **")) { const char ***opt = toggle->opt; bool found = TRUE; int i; for (i = 2; argv[i]; i++) { if (!find_arg(*opt, argv[i])) { found = FALSE; break; } } if (found) { int next, pos; for (next = 0, pos = 0; (*opt)[pos]; pos++) { const char *arg = (*opt)[pos]; if (find_arg(argv + 2, arg)) { free((void *) arg); continue; } (*opt)[next++] = arg; } (*opt)[next] = NULL; } else if (!argv_copy(opt, argv + 2)) { report("Failed to append arguments"); return VIEW_NO_FLAGS; } } else { die("Unsupported `:toggle %s` (%s)", name, toggle->type); } return toggle->flags; }