diff options
Diffstat (limited to '')
| -rw-r--r-- | cgitrc.5.txt | 9 | ||||
| -rw-r--r-- | filter.c | 33 | 
2 files changed, 40 insertions, 2 deletions
| diff --git a/cgitrc.5.txt b/cgitrc.5.txt index 52caed0..60159f6 100644 --- a/cgitrc.5.txt +++ b/cgitrc.5.txt @@ -557,6 +557,15 @@ config files, e.g. "repo.desc" becomes "desc".  FILTER API  ---------- +By default, filters are separate processes that are executed each time they +are needed.  Alternative technologies may be used by prefixing the filter +specification with the relevant string; available values are: + +'exec:':: +	The default "one process per filter" mode. + +Parameters are provided to filters as follows. +  about filter::  	This filter is given a single parameter: the filename of the source  	file to filter. The filter can use the filename to determine (for @@ -64,7 +64,7 @@ done:  static void fprintf_exec_filter(struct cgit_filter *base, FILE *f, const char *prefix)  {  	struct cgit_exec_filter *filter = (struct cgit_exec_filter *) base; -	fprintf(f, "%s%s\n", prefix, filter->cmd); +	fprintf(f, "%sexec:%s\n", prefix, filter->cmd);  }  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  	return &f->base;  } +static const struct { +	const char *prefix; +	struct cgit_filter *(*ctor)(const char *cmd, filter_type filtertype); +} filter_specs[] = { +	{ "exec", new_exec_filter }, +}; +  struct cgit_filter *cgit_new_filter(const char *cmd, filter_type filtertype)  { +	char *colon; +	int i; +	size_t len;  	if (!cmd || !cmd[0])  		return NULL; -	return new_exec_filter(cmd, filtertype); +	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; + +	/* If no prefix is given, exec filter is the default. */ +	if (!colon) +		return new_exec_filter(cmd, filtertype); + +	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, filtertype); +	} + +	die("Invalid filter type: %.*s", (int) len, cmd);  } | 
