about summary refs log tree commit diff
path: root/configfile.c
blob: 4908058ce994d546b3280d1f0c300686a8b55fd7 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39Johan Herland <johan@herland.net>
2010-06-24 17:53:20 +0200
committerLars Hjemli <hjemli@gmail.com>2010-07-18 10:54:02 +0200
commit72ef913514288bd2aae23509581097bfd3edf8c4 (patch)
tree3a8b48aa0ebcc74a7e8b7f05f964432c6d577921 /cgitrc.5.txt
parentAdd URL parameter 'ignorews' for optionally ignoring whitespace in diffs (diff)
downloadcgit-pink-72ef913514288bd2aae23509581097bfd3edf8c4.tar.gz
cgit-pink-72ef913514288bd2aae23509581097bfd3edf/* configfile.c: parsing of config files * * Copyright (C) 2008 Lars Hjemli * * Licensed under GNU General Public License v2 * (see COPYING for full license text) */ #include <ctype.h> #include <stdio.h> #include "configfile.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 && isspace(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 parse_configfile(const char *filename, configfile_value_fn fn) { static int nesting; int len; char line[256]; const char *value; FILE *f; /* cancel deeply nested include-commands */ if (nesting > 8) return -1; if (!(f = fopen(filename, "r"))) return -1; nesting++; while((len = read_config_line(f, line, &value, sizeof(line))) > 0) fn(line, value); nesting--; fclose(f); return 0; }