static struct userdiff_driver *parse_driver(const char *var, const char *value, const char *type) { struct userdiff_driver *drv; const char *dot; const char *name; int namelen; if (prefixcmp(var, "diff.")) return NULL; dot = strrchr(var, '.'); if (dot == var + 4) return NULL; if (strcmp(type, dot+1)) return NULL; name = var + 5; namelen = dot - name; drv = userdiff_find_by_namelen(name, namelen); if (!drv) { ALLOC_GROW(drivers, ndrivers+1, drivers_alloc); drv = &drivers[ndrivers++]; memset(drv, 0, sizeof(*drv)); drv->name = xmemdupz(name, namelen); drv->binary = -1; } return drv; }
int userdiff_config(const char *k, const char *v) { struct userdiff_driver *drv; const char *name, *type; int namelen; if (parse_config_key(k, "diff", &name, &namelen, &type) || !name) return 0; drv = userdiff_find_by_namelen(name, namelen); if (!drv) { ALLOC_GROW(drivers, ndrivers+1, drivers_alloc); drv = &drivers[ndrivers++]; memset(drv, 0, sizeof(*drv)); drv->name = xmemdupz(name, namelen); drv->binary = -1; } if (!strcmp(type, "funcname")) return parse_funcname(&drv->funcname, k, v, 0); if (!strcmp(type, "xfuncname")) return parse_funcname(&drv->funcname, k, v, REG_EXTENDED); if (!strcmp(type, "binary")) return parse_tristate(&drv->binary, k, v); if (!strcmp(type, "command")) return git_config_string(&drv->external, k, v); if (!strcmp(type, "textconv")) return git_config_string(&drv->textconv, k, v); if (!strcmp(type, "cachetextconv")) return parse_bool(&drv->textconv_want_cache, k, v); if (!strcmp(type, "wordregex")) return git_config_string(&drv->word_regex, k, v); return 0; }
struct userdiff_driver *userdiff_find_by_name(const char *name) { int len = strlen(name); return userdiff_find_by_namelen(name, len); }