-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcfglib.c
126 lines (99 loc) · 2.01 KB
/
cfglib.c
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*
* cfglib.c
*
* Config file parsing routines
*
* (C)1999 Stefano Busti
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cfglib.h"
char *cfg_getvalue(const char *key, const char *src);
int cfg_readstr(const char *filename,
cfg_item_s *item,
const char *deflt)
{
char buf[BUFSIZ];
if (cfg_readbuf(filename, item->key, buf, sizeof(buf)) == NULL) {
item->val = strealloc(item->val, deflt);
return -1;
}
item->val = strealloc(item->val, buf);
return 0;
}
int cfg_readint(const char *filename,
cfg_item_i *item,
int deflt)
{
char buf[BUFSIZ], *perr;
if (cfg_readbuf(filename, item->key, buf, sizeof(buf)) == NULL) {
item->val = deflt;
return -1;
}
item->val = strtol(buf, &perr, 0);
if ((*perr != '\0') || (*buf == '\0')) {
item->val = deflt;
return -1;
}
return 0;
}
char *cfg_readbuf(const char *filename,
const char *key,
char *value,
size_t valuesiz)
{
char *ptr;
int len;
FILE *f = fopen(filename, "rt");
if (!f)
return NULL;
while (fgets(value, valuesiz, f))
{
len = strlen(value);
/* strip crs */
if ((len > 0) && (value[len - 1] == '\n')) {
value[len - 1] = '\0';
len--;
}
/* ignore blank lines and comments */
if ((len > 0) && (value[0] != '#')) {
if ((ptr = cfg_getvalue(key, value)) != NULL) {
memmove(value, ptr, strlen(ptr) + 1);
fclose(f);
return value;
}
}
}
fclose(f);
return NULL;
}
char *cfg_getvalue(const char *key, const char *src)
{
char *peql;
if ((peql = strchr(src, '=')) != NULL) {
int keylen = strlen(key);
if ((keylen == peql - src) && (strncmp(key, src, keylen) == 0))
return peql + 1;
}
return NULL;
}
char *strealloc(char *dest, const char *s)
{
/*
* Don't reallocate if source and destination
* point to the same string, otherwise s becomes invalid.
*/
if (dest == s)
return dest;
dest = realloc(dest, strlen(s) + 1);
if (dest == NULL)
return NULL;
strcpy(dest, s);
return dest;
}
void strdispose(char *dest)
{
free(dest);
}