diff options
Diffstat (limited to 'filter.c')
-rw-r--r-- | filter.c | 33 |
1 files changed, 31 insertions, 2 deletions
@@ -64,7 +64,7 @@ done: | |||
64 | static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix) | 64 | static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix) |
65 | { | 65 | { |
66 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; | 66 | struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; |
67 | fprintf(f, "%s%s\n", prefix, filter->cmd); | 67 | fprintf(f, "%sexec:%s\n", prefix, filter->cmd); |
68 | } | 68 | } |
69 | 69 | ||
70 | int cgit_open_filter(struct cgit_filter *filter, ...) | 70 | int cgit_open_filter(struct cgit_filter *filter, ...) |
@@ -125,10 +125,39 @@ static struct cgit_filter *new_exec_filter(const char *cmd, filter_type filterty | |||
125 | return &f->base; | 125 | return &f->base; |
126 | } | 126 | } |
127 | 127 | ||
128 | static const struct { | ||
129 | const char *prefix; | ||
130 | struct cgit_filter *(*ctor)(const char *cmd, filter_type filtertype); | ||
131 | } filter_specs[] = { | ||
132 | { "exec", new_exec_filter }, | ||
133 | }; | ||
134 | |||
128 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) | 135 | struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype) |
129 | { | 136 | { |
137 | char *colon; | ||
138 | int i; | ||
139 | size_t len; | ||
130 | if (!cmd || !cmd[0]) | 140 | if (!cmd || !cmd[0]) |
131 | return NULL; | 141 | return NULL; |
132 | 142 | ||
133 | return new_exec_filter(cmd, filtertype); | 143 | colon = strchr(cmd, ':'); |
144 | len = colon - cmd; | ||
145 | /* | ||
146 | * In case we're running on Windows, don't allow a single letter before | ||
147 | * the colon. | ||
148 | */ | ||
149 | if (len == 1) | ||
150 | colon = NULL; | ||
151 | |||
152 | /* If no prefix is given, exec filter is the default. */ | ||
153 | if (!colon) | ||
154 | return new_exec_filter(cmd, filtertype); | ||
155 | |||
156 | for (i = 0; i < ARRAY_SIZE(filter_specs); i++) { | ||
157 | if (len == strlen(filter_specs[i].prefix) && | ||
158 | !strncmp(filter_specs[i].prefix, cmd, len)) | ||
159 | return filter_specs[i].ctor(colon + 1, filtertype); | ||
160 | } | ||
161 | |||
162 | die("Invalid filter type: %.*s", (int) len, cmd); | ||
134 | } | 163 | } |