diff options
Diffstat (limited to 'cgit-about-filter.c')
-rw-r--r-- | cgit-about-filter.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/cgit-about-filter.c b/cgit-about-filter.c new file mode 100644 index 0000000..68dfd9b --- /dev/null +++ b/cgit-about-filter.c @@ -0,0 +1,59 @@ +#define _POSIX_C_SOURCE 200809L + +#include <ctype.h> +#include <string.h> +#include <unistd.h> + +#define EXEC(args) execvp(args[0], args) + +static const char *extension(const char *filename); + +char *mandoc[] = { "mandoc", "-Thtml", "-Ofragment", NULL }; +char *lowdown[] = { "lowdown", "-Thtml", NULL }; + +int +main(int argc, char *argv[]) +{ + int opt; + while ((opt = getopt(argc, argv, "")) != -1) + return 1; + argc -= optind; + argv += optind; + + if (argc != 1) + return 1; + + const char *ext = extension(argv[0]); + if (ext == NULL) + return 1; + + if (strlen(ext) == 1 && isdigit(*ext)) { + EXEC(mandoc); + } else if (strcmp(ext, "md") == 0) { + EXEC(lowdown); + } + + return 1; +} + +static const char * +extension(const char *filename) +{ + const char *end = strrchr(filename, '.'); + + // no dot + if (end == NULL) + return NULL; + + // no extension + if (end == filename) + return NULL; + + const char *ext = end + 1; + + // extension is empty/name ends with dot + if (*ext == '\0') + return NULL; + + return ext; +} |