mirror of
https://git.zx2c4.com/cgit
synced 2025-01-26 00:00:00 +00:00
filter: refactor cgit_new_filter()
Use prefixcmp() as a preparation for using strip_prefix() later. Also, interpret the command as a file name if it contains a colon but none of the filter prefixes matches instead of bailing out and adding a special check for Windows. Signed-off-by: Lukas Fleischer <cgit@cryptocrack.de>
This commit is contained in:
parent
3488d12405
commit
80f87c1003
30
filter.c
30
filter.c
@ -379,31 +379,19 @@ static const struct {
|
||||
const char *prefix;
|
||||
struct cgit_filter *(*ctor)(const char *cmd, int argument_count);
|
||||
} filter_specs[] = {
|
||||
{ "exec", new_exec_filter },
|
||||
{ "exec:", new_exec_filter },
|
||||
#ifndef NO_LUA
|
||||
{ "lua", new_lua_filter },
|
||||
{ "lua:", new_lua_filter },
|
||||
#endif
|
||||
};
|
||||
|
||||
struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
|
||||
{
|
||||
char *colon;
|
||||
int i;
|
||||
size_t len;
|
||||
int argument_count;
|
||||
int argument_count, i;
|
||||
|
||||
if (!cmd || !cmd[0])
|
||||
return NULL;
|
||||
|
||||
colon = strchr(cmd, ':');
|
||||
len = colon - cmd;
|
||||
/*
|
||||
* In case we're running on Windows, don't allow a single letter before
|
||||
* the colon.
|
||||
*/
|
||||
if (len == 1)
|
||||
colon = NULL;
|
||||
|
||||
switch (filtertype) {
|
||||
case EMAIL:
|
||||
argument_count = 2;
|
||||
@ -420,15 +408,11 @@ struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)
|
||||
break;
|
||||
}
|
||||
|
||||
/* If no prefix is given, exec filter is the default. */
|
||||
if (!colon)
|
||||
return new_exec_filter(cmd, argument_count);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(filter_specs); i++) {
|
||||
if (len == strlen(filter_specs[i].prefix) &&
|
||||
!strncmp(filter_specs[i].prefix, cmd, len))
|
||||
return filter_specs[i].ctor(colon + 1, argument_count);
|
||||
if (!prefixcmp(cmd, filter_specs[i].prefix))
|
||||
return filter_specs[i].ctor(strchr(cmd, ':') + 1, argument_count);
|
||||
}
|
||||
|
||||
die("Invalid filter type: %.*s", (int) len, cmd);
|
||||
/* If no valid prefix is given, exec filter is the default. */
|
||||
return new_exec_filter(cmd, argument_count);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user