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
127
|
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <ctype.h>
#include "confparser.h"
const char* const configFilename = ".ckrc";
void conf_values_initialize(Conf *c) {
c->SCRT_dir = NULL;
c->VC_dir = NULL;
}
int remove_newline(char buff[]) {
int initLength = strlen(buff);
for (int i = 0; i < initLength; i++) {
if (buff[i] == '\n') {
buff[i] = ' ';
}
}
return strlen(buff);
}
char* read_next_line(FILE *f) {
char nextLine[200];
char *line;
if (fgets(nextLine, 200, f) == NULL) {
return NULL;
}
line = malloc(remove_newline(nextLine));
strcpy(line, nextLine);
return line;
}
int is_empty(const char *s) {
while (*s != '\0') {
if (!isspace((unsigned char)*s))
return 0;
s++;
}
return 1;
}
ConfVar match_variables(char *line, char matched[]) {
if (line[0] == '#' || is_empty(line)) {
return CV_NO_VAL_OR_COMMENT;
}
#define X(var, str, name) \
if (sscanf(line, str, matched) == 1) { \
return CV_##var; \
}
CONFIG_VARIABLES_TABLE
#undef X
return -1;
}
int is_dir(char *path) {
DIR *dir;
dir = opendir(path);
if (!dir) {
return 0;
}
closedir(dir);
return 1;
}
ConfigParserResult parse(Conf *conf) {
conf_values_initialize(conf);
FILE *confPtr;
if ((confPtr = fopen("/home/gramanas/.ck/ckrc", "r")) == NULL) {
return CPR_NO_CONFIG_FILE;
}
int flag = 1;
char *line = read_next_line(confPtr);
char matched[200];
while (line != NULL) {
switch(match_variables(line, matched)) {
#define X(var, str, name) \
case CV_##var: \
conf->var = malloc(strlen(matched)); \
strcpy(conf->var, matched); \
if (!is_dir(matched)) { \
return CPR_WRONG_##var; \
} \
break;
CONFIG_VARIABLES_TABLE
#undef X
case CV_NO_VAL_OR_COMMENT:
break;
default:
printf("%s:\n%s\n", "Config error in line", line);
}
free(line);
line=read_next_line(confPtr);
}
#define X(var, str) \
if (conf->var == NULL) { \
flag = 0; \
CONFIG_VARIABLES_TABLE
#undef X
if (flag) {
return CPR_OK;
}
return CPR_NO_CONFIG_FILE;
}
int config_file_parse(Conf *conf) {
switch (parse(conf)) {
#define X(var,str,name) \
case CPR_WRONG_##var: \
printf("Config error:\n" \
"%s: %s\n" \
"defined in config does not exist\n", name, conf->var); \
return 0; \
break;
CONFIG_VARIABLES_TABLE
#undef X
case CPR_NO_CONFIG_FILE:
printf("The config file specified could not be found\n");
return 0;
case CPR_WRONG_CONFIG:
printf("Config help\n");
case CPR_OK:
return 1;
}
}
|