diff options
Diffstat (limited to 'src/blogc-git-receiver/pre-receive-parser.c')
-rw-r--r-- | src/blogc-git-receiver/pre-receive-parser.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/blogc-git-receiver/pre-receive-parser.c b/src/blogc-git-receiver/pre-receive-parser.c new file mode 100644 index 0000000..a842a9d --- /dev/null +++ b/src/blogc-git-receiver/pre-receive-parser.c @@ -0,0 +1,77 @@ +/* + * blogc: A blog compiler. + * Copyright (C) 2015-2016 Rafael G. Martins <rafael@rafaelmartins.eng.br> + * + * This program can be distributed under the terms of the BSD License. + * See the file LICENSE. + */ + +#include <stdlib.h> +#include <string.h> +#include "../common/utils.h" +#include "pre-receive-parser.h" + +typedef enum { + START_OLD = 1, + OLD, + START_NEW, + NEW, + START_REF, + REF +} input_state_t; + + +char* +bgr_pre_receive_parse(const char *input) +{ + input_state_t state = START_OLD; + size_t start = 0; + size_t start_new = 0; + size_t input_len = strlen(input); + + for (size_t current = 0; current < input_len; current++) { + + char c = input[current]; + + switch (state) { + case START_OLD: + start = current; + state = OLD; + break; + case OLD: + if (c != ' ') + break; + // no need to store old + state = START_NEW; + break; + case START_NEW: + start = current; + state = NEW; + break; + case NEW: + if (c != ' ') + break; + state = START_REF; + start_new = start; + break; + case START_REF: + start = current; + state = REF; + break; + case REF: + if (c != '\n') + break; + state = START_OLD; + // we just care about a ref (refs/heads/master), everything + // else is disposable :) + if ((current - start == 17) && + (0 == strncmp("refs/heads/master", input + start, 17))) + { + return bc_strndup(input + start_new, start - 1 - start_new); + } + break; + } + } + + return NULL; +} |