diff options
author | Lars Hjemli <hjemli@gmail.com> | 2006-12-09 17:18:17 +0300 |
---|---|---|
committer | Lars Hjemli <hjemli@gmail.com> | 2006-12-09 17:18:17 +0300 |
commit | 0d169ada2ba81210ab1191a5f2212662e90db77e (patch) | |
tree | 402b54583db269323ebb28e5fbf2075c4c1b3d85 /config.c |
Import cgit prototype from git tree
This enables basic cgit functionality, using libgit.a and xdiff/lib.a from
git + a custom "git.h" + openssl for sha1 routines.
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'config.c')
-rw-r--r-- | config.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/config.c b/config.c new file mode 100644 index 0000000..858ab69 --- /dev/null +++ b/config.c @@ -0,0 +1,73 @@ +#include "cgit.h" + +int next_char(FILE *f) +{ + int c = fgetc(f); + if (c=='\r') { + c = fgetc(f); + if (c!='\n') { + ungetc(c, f); + c = '\r'; + } + } + return c; +} + +void skip_line(FILE *f) +{ + int c; + + while((c=next_char(f)) && c!='\n' && c!=EOF) + ; +} + +int read_config_line(FILE *f, char *line, const char **value, int bufsize) +{ + int i = 0, isname = 0; + + *value = NULL; + while(i<bufsize-1) { + int c = next_char(f); + if (!isname && (c=='#' || c==';')) { + skip_line(f); + continue; + } + if (!isname && isblank(c)) + continue; + + if (c=='=' && !*value) { + line[i] = 0; + *value = &line[i+1]; + } else if (c=='\n' && !isname) { + i = 0; + continue; + } else if (c=='\n' || c==EOF) { + line[i] = 0; + break; + } else { + line[i]=c; + } + isname = 1; + i++; + } + line[i+1] = 0; + return i; +} + +int cgit_read_config(const char *filename, configfn fn) +{ + int ret = 0, len; + char line[256]; + const char *value; + FILE *f = fopen(filename, "r"); + + if (!f) + return -1; + + while(len = read_config_line(f, line, &value, sizeof(line))) + (*fn)(line, value); + + fclose(f); + return ret; +} + |