start working on screens
[clop-s-games:clop-s-games.git] / wicket2 / src / config.c
1
2 #include "wicket.h"
3 #include <fcntl.h>
4
5
6 int cfg_parse(Config* pConfig, const char* filename)
7 {
8     int fd;
9     char line[1024] = {0};
10     struct stat st;
11     char *string;
12
13     if (pConfig) {
14         if (filename) {
15             DEBUG_1("Parsing file '%s'", filename);
16             /* Open the file */
17             fd = open(filename, O_RDONLY);
18             if (fd < 0) {  /* Check if succesfully opened. */
19                 DEBUG_0("Error opening file");
20                 return 1;
21             }
22             /* Get its size in bytes */
23             if (fstat(fd, &st) < 0) {   /* Check if succesful. */
24                 DEBUG_0("Error getting file size");
25                 return 1;
26             }
27             string = malloc(st.st_size + 1);   /* 1 byte more */
28             if (string == NULL) {  /* Check we really got it. */
29                 DEBUG_0("Error: out of memory.");
30                 return 1;
31             }
32             /* Read the entire file into the string. No more, no less. */
33             if (read(fd, string, st.st_size) < 0) { /* Check for error */
34                 DEBUG_0("Error reading the file");
35                 return 1;
36             }
37             /* Make sure the string is terminated. */
38             string[st.st_size] = '\0';
39             close(fd);
40             pConfig->root = cJSON_Parse(string);
41             if (pConfig->root == NULL) {
42                 DEBUG_1("Failed to parse file %s.", filename);
43                 return 1;
44             }
45             DEBUG_0("File parsed.");
46         }
47         else {
48             DEBUG_0("No config file provided.");
49             return 1;
50         }
51     }
52     else {
53         DEBUG_0("No config object provided.");
54         return 1;
55     }
56     return 0;
57 }
58
59 void cfg_clean(Config* pConfig)
60 {
61     if (pConfig && pConfig->root) cJSON_Delete(pConfig->root);
62 }
63
64 cJSON* cfg_get_item(const char* name, cJSON *item)
65 {
66     cJSON *subitem = item->child;
67     while (subitem) {
68         if (strcmp(subitem->string, name) == 0) {
69              return subitem;
70         }
71
72         if (subitem->child) {
73             return cfg_get_item(name, subitem);
74         }
75
76         subitem = subitem->next;
77     }
78 }
79
80 int cfg_getInt(Config* pConfig, const char* name) 
81 {
82     cJSON* item = cfg_get_item(name, pConfig->root);
83     if (item) {
84         return item->valueint;
85     }
86     DEBUG_1("Can't find config %s", name);
87     return -1;
88 }
89
90 char* cfg_getString(Config* pConfig, const char* name) 
91 {
92     cJSON* profile = cfg_get_item(name, pConfig->root);
93     if (profile) {
94         return profile->valuestring;
95     }
96     DEBUG_1("Can't find config %s", name);
97     return NULL;
98 }
99
100 float cfg_getFloat(Config* pConfig, const char* name) 
101 {
102     cJSON* item = cfg_get_item(name, pConfig->root);
103     if (item) {
104         return item->valuedouble;
105     }
106     DEBUG_1("Can't find config %s", name);
107     return -1;
108 }
109