all repos — cgit @ 76827d8679d1d2bd46e8cddf7da2ce4178e1d676

a hyperfast web frontend for git written in c

config.c (view raw)

 1/* config.c: parsing of config files
 2 *
 3 * Copyright (C) 2006 Lars Hjemli
 4 *
 5 * Licensed under GNU General Public License v2
 6 *   (see COPYING for full license text)
 7 */
 8
 9#include "cgit.h"
10
11int next_char(FILE *f)
12{
13	int c = fgetc(f);
14	if (c=='\r') {
15		c = fgetc(f);
16		if (c!='\n') {
17			ungetc(c, f);
18			c = '\r';
19		}
20	}
21	return c;
22}
23
24void skip_line(FILE *f)
25{
26	int c;
27
28	while((c=next_char(f)) && c!='\n' && c!=EOF)
29		;
30}
31
32int read_config_line(FILE *f, char *line, const char **value, int bufsize)
33{
34	int i = 0, isname = 0;
35
36	*value = NULL;
37	while(i<bufsize-1) {
38		int c = next_char(f);
39		if (!isname && (c=='#' || c==';')) {
40			skip_line(f);
41			continue;
42		}
43		if (!isname && isspace(c))
44			continue;
45
46		if (c=='=' && !*value) {
47			line[i] = 0;
48			*value = &line[i+1];
49		} else if (c=='\n' && !isname) {
50			i = 0;
51			continue;
52		} else if (c=='\n' || c==EOF) {
53			line[i] = 0;
54			break;
55		} else {
56			line[i]=c;
57		}
58		isname = 1;
59		i++;
60	}
61	line[i+1] = 0;
62	return i;
63}
64
65int cgit_read_config(const char *filename, configfn fn)
66{
67	int ret = 0, len;
68	char line[256];
69	const char *value;
70	FILE *f = fopen(filename, "r");
71
72	if (!f)
73		return -1;
74
75	while((len = read_config_line(f, line, &value, sizeof(line))) > 0)
76		(*fn)(line, value);
77
78	fclose(f);
79	return ret;
80}
81