cgit.c: sync repo config printing with struct cgit_repo
[cgit.git] / configfile.c
blobd98989c4312aed59e9a6a45aee3b603c8ac1c48f
1 /* configfile.c: parsing of config files
3 * Copyright (C) 2008 Lars Hjemli
5 * Licensed under GNU General Public License v2
6 * (see COPYING for full license text)
7 */
9 #include <ctype.h>
10 #include <stdio.h>
11 #include "configfile.h"
13 static int next_char(FILE *f)
15 int c = fgetc(f);
16 if (c == '\r') {
17 c = fgetc(f);
18 if (c != '\n') {
19 ungetc(c, f);
20 c = '\r';
23 return c;
26 static void skip_line(FILE *f)
28 int c;
30 while ((c = next_char(f)) && c != '\n' && c != EOF)
34 static int read_config_line(FILE *f, char *line, const char **value, int bufsize)
36 int i = 0, isname = 0;
38 *value = NULL;
39 while (i < bufsize - 1) {
40 int c = next_char(f);
41 if (!isname && (c == '#' || c == ';')) {
42 skip_line(f);
43 continue;
45 if (!isname && isspace(c))
46 continue;
48 if (c == '=' && !*value) {
49 line[i] = 0;
50 *value = &line[i + 1];
51 } else if (c == '\n' && !isname) {
52 i = 0;
53 continue;
54 } else if (c == '\n' || c == EOF) {
55 line[i] = 0;
56 break;
57 } else {
58 line[i] = c;
60 isname = 1;
61 i++;
63 line[i + 1] = 0;
64 return i;
67 int parse_configfile(const char *filename, configfile_value_fn fn)
69 static int nesting;
70 int len;
71 char line[256];
72 const char *value;
73 FILE *f;
75 /* cancel deeply nested include-commands */
76 if (nesting > 8)
77 return -1;
78 if (!(f = fopen(filename, "r")))
79 return -1;
80 nesting++;
81 while ((len = read_config_line(f, line, &value, sizeof(line))) > 0)
82 fn(line, value);
83 nesting--;
84 fclose(f);
85 return 0;