static enum status_code parse_ref_format_arg(struct ref_format **ref_formats, const char *arg, const struct enum_map *map) { size_t arglen = strlen(arg); const char *pos; for (pos = arg; *pos && arglen > 0; pos++, arglen--) { enum reference_type type; for (type = 0; type < map->size; type++) { const struct enum_map_entry *entry = &map->entries[type]; struct ref_format *format; if (arglen < entry->namelen || string_enum_compare(pos, entry->name, entry->namelen)) continue; format = malloc(sizeof(*format)); if (!format) return ERROR_OUT_OF_MEMORY; format->start = strndup(arg, pos - arg); format->end = strdup(pos + entry->namelen); if (!format->start || !format->end) { free((void *) format->start); free((void *) format->end); free(format); return ERROR_OUT_OF_MEMORY; } ref_formats[type] = format; return SUCCESS; } } return error("Unknown ref format: %s", arg); }
static void set_git_color_option(const char *name, char *value) { struct line_info parsed = {}; struct line_info *color = NULL; size_t namelen = strlen(name); int i; if (!opt_git_colors) return; for (i = 0; opt_git_colors[i]; i++) { struct line_rule rule = {}; const char *prefix = NULL; struct line_info *info; const char *alias = opt_git_colors[i]; const char *sep = strchr(alias, '='); if (!sep || namelen != sep - alias || string_enum_compare(name, alias, namelen)) continue; if (!color) { color = parse_git_color_option(&parsed, value); if (!color) return; } if (parse_color_name(sep + 1, &rule, &prefix) == SUCCESS && (info = add_line_rule(prefix, &rule))) { info->fg = parsed.fg; info->bg = parsed.bg; info->attr = parsed.attr; } } }