about summary refs log tree commit diff
path: root/configfile.c
blob: d98989c4312aed59e9a6a45aee3b603c8ac1c48f (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/* 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"

static 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;
}

static void skip_line(FILE *f)
{
	int c;

	while ((c = next_char(f)) && c != '\n' && c != EOF)
		;
}

static 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;
}

=1'>Add nethackrcJune McEnroe 2017-07-23Remove useless setuid in briJune McEnroe Don't you think it would be better if the setuid bit only gave you permission to do it and didn't do it for you? 2017-07-23Clean up hnel a tiny bitJune McEnroe 2017-07-21Set window size in hnelJune McEnroe 2017-07-21Add hnelJune McEnroe 2017-07-19chmod 600 in dtchJune McEnroe