summaryrefslogtreecommitdiffabout
path: root/parsing.c
authorLars Hjemli <hjemli@gmail.com>2006-12-11 15:11:40 (UTC)
committer Lars Hjemli <hjemli@gmail.com>2006-12-11 15:11:40 (UTC)
commit51ada4fda2b47710351e6e4da8a95807d6d9f729 (patch) (unidiff)
tree48b543fd16b666db7024038506ffc4eadb0ca966 /parsing.c
parent318d106300102c19d114a4ea89265b0a4060d9cb (diff)
downloadcgit-51ada4fda2b47710351e6e4da8a95807d6d9f729.zip
cgit-51ada4fda2b47710351e6e4da8a95807d6d9f729.tar.gz
cgit-51ada4fda2b47710351e6e4da8a95807d6d9f729.tar.bz2
Rename config.c to parsing.c + move cgit_parse_query from cgit.c to parsing.c
Signed-off-by: Lars Hjemli <hjemli@gmail.com>
Diffstat (limited to 'parsing.c') (more/less context) (ignore whitespace changes)
-rw-r--r--parsing.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/parsing.c b/parsing.c
new file mode 100644
index 0000000..98b3243
--- a/dev/null
+++ b/parsing.c
@@ -0,0 +1,106 @@
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
82int cgit_parse_query(char *txt, configfn fn)
83{
84 char *t, *value = NULL, c;
85
86 if (!txt)
87 return 0;
88
89 t = txt = xstrdup(txt);
90
91 while((c=*t) != '\0') {
92 if (c=='=') {
93 *t = '\0';
94 value = t+1;
95 } else if (c=='&') {
96 *t = '\0';
97 (*fn)(txt, value);
98 txt = t+1;
99 value = NULL;
100 }
101 t++;
102 }
103 if (t!=txt)
104 (*fn)(txt, value);
105 return 0;
106}