]> gitweb.ps.run Git - ps-cgit/blob - configfile.c
ui-repolist: add support for sorting any column
[ps-cgit] / configfile.c
1 /* configfile.c: parsing of config files
2  *
3  * Copyright (C) 2008 Lars Hjemli
4  *
5  * Licensed under GNU General Public License v2
6  *   (see COPYING for full license text)
7  */
8
9 #include <ctype.h>
10 #include <stdio.h>
11 #include "configfile.h"
12
13 int next_char(FILE *f)
14 {
15         int c = fgetc(f);
16         if (c=='\r') {
17                 c = fgetc(f);
18                 if (c!='\n') {
19                         ungetc(c, f);
20                         c = '\r';
21                 }
22         }
23         return c;
24 }
25
26 void skip_line(FILE *f)
27 {
28         int c;
29
30         while((c=next_char(f)) && c!='\n' && c!=EOF)
31                 ;
32 }
33
34 int read_config_line(FILE *f, char *line, const char **value, int bufsize)
35 {
36         int i = 0, isname = 0;
37
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;
44                 }
45                 if (!isname && isspace(c))
46                         continue;
47
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;
59                 }
60                 isname = 1;
61                 i++;
62         }
63         line[i+1] = 0;
64         return i;
65 }
66
67 int parse_configfile(const char *filename, configfile_value_fn fn)
68 {
69         static int nesting;
70         int len;
71         char line[256];
72         const char *value;
73         FILE *f;
74
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;
86 }
87