00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027 #include <errno.h>
00028
00029 #include "../include/cupl.h"
00030 #include "../include/cfg.h"
00031
00032 extern int errno;
00033
00034 static int parse_config_file(cfg_data *cfg);
00035 static void add_cfg_array(cfg_data *cfg, char *var, char *val);
00036 static void release_cfg_array(cfg_array *head);
00037
00038
00039 extern cfg_data *cupl_init_cfg(char *path)
00040 {
00041 cfg_data *cfg;
00042
00043 if ((cfg = (cfg_data *) malloc(sizeof(cfg_data))) == NULL) {
00044 fprintf(stderr, "%s: %d: malloc(): %s.\n", __FILE__, __LINE__,
00045 strerror(errno));
00046 return NULL;
00047 }
00048
00049 if ((cfg->cfd = fopen(path, "r")) == NULL) {
00050 fprintf(stderr, "%s: %d: fopen(): %s.\n", __FILE__, __LINE__,
00051 strerror(errno));
00052 return NULL;
00053 }
00054
00055 cfg->vars = NULL;
00056 cfg->nov = 0;
00057
00058 if (parse_config_file(cfg) == -1)
00059 return NULL;
00060
00061 return cfg;
00062 }
00063
00064
00065 extern int cupl_release_cfg(cfg_data *cfg)
00066 {
00067 if (cfg == NULL) return 0;
00068
00069 fclose(cfg->cfd);
00070
00071 if (cfg->vars) release_cfg_array(cfg->vars);
00072
00073 free(cfg);
00074
00075 return 1;
00076 }
00077
00078
00079 static void release_cfg_array(cfg_array *head)
00080 {
00081 cfg_array *prev = head;
00082 cfg_array *next = head->next;
00083
00084 while (prev != NULL) {
00085
00086 next = prev->next;
00087
00088 free(prev);
00089
00090
00091 prev = next;
00092 if (prev) next = prev->next;
00093 }
00094
00095 return;
00096 }
00097
00098
00099 static int parse_config_file(cfg_data *cfg)
00100 {
00101 int i, j;
00102 int lcnt = 0;
00103 int blen;
00104 char buf[CFG_VAL_LEN];
00105 char val[CFG_VAL_LEN];
00106 char var[CFG_VAR_LEN];
00107 char ch;
00108
00109 memset(buf, 0, CFG_VAL_LEN);
00110
00111 while (fgets(buf, CFG_VAL_LEN, cfg->cfd)) {
00112 lcnt++;
00113 ch = buf[0];
00114 blen = strlen(buf) - 1;
00115
00116
00117 if (USELESS_LINE) {
00118 goto loop_end;
00119 }
00120
00121
00122 if (INVALID) {
00123 fprintf(stderr, "parse_config_file: Invalid character at line %d.\n", lcnt);
00124 goto loop_end;
00125 }
00126
00127 if (IDENTIFIER) {
00128 fprintf(stderr, "parse_config_file: Variables must start with a char, line: %d.\n", lcnt);
00129 goto loop_end;
00130 }
00131
00132
00133
00134
00135 memset(var, 0, CFG_VAR_LEN);
00136 for (i=0;i<blen;i++) {
00137 ch = buf[i];
00138 if (END_OF_LINE) {
00139 fprintf(stderr, "parse_config_file: Syntax error at line %d.\n", lcnt);
00140 goto loop_end;
00141 }
00142 if (INVALID) {
00143 fprintf(stderr, "parse_config_file: Invalid character at line %d.\n", lcnt);
00144 goto loop_end;
00145 }
00146 if (SEPERATOR) {
00147 break;
00148 }
00149 if (i < CFG_VAR_LEN - 1)
00150 var[i] = ch;
00151 else {
00152 fprintf(stderr, "parse_config_file: Too long variable name at line %d.\n", lcnt);
00153 goto loop_end;
00154 }
00155 }
00156
00157 i++;
00158
00159
00160 for(j=i;j<blen;j++) {
00161 ch = buf[j];
00162 if (SEPERATOR)
00163 continue;
00164 else
00165 break;
00166 }
00167
00168 i = j;
00169
00170
00171 memset(val, 0, CFG_VAL_LEN);
00172 for (j=i;j<blen;j++) {
00173 ch = buf[j];
00174 if (END_OF_LINE) {
00175 break;
00176 }
00177 if (INVALID) {
00178 fprintf(stderr, "parse_config_file: Invalid character at line %d.\n", lcnt);
00179 goto loop_end;
00180 }
00181 if ((j - i) < (CFG_VAL_LEN - 1))
00182 val[j-i] = ch;
00183 else {
00184 fprintf(stderr, "parse_config_file: Too long value at line %d.\n", lcnt);
00185 goto loop_end;
00186 }
00187 }
00188
00189 add_cfg_array(cfg, var, val);
00190
00191 cfg->nov = cfg->nov + 1;
00192
00193 loop_end:
00194 memset(buf, 0, CFG_VAL_LEN);
00195 }
00196
00197 return 1;
00198 }
00199
00200
00201 static void add_cfg_array(cfg_data *cfg, char *var, char *val)
00202 {
00203 cfg_array *tail;
00204 cfg_array *cfgp;
00205
00206 tail = cfg->vars;
00207
00208 if (tail != NULL)
00209 while (tail->next != NULL)
00210 tail = tail->next;
00211
00212 if ((cfgp = (cfg_array *) malloc(sizeof(cfg_array))) == NULL) {
00213 fprintf(stderr, "%s: %d: malloc(): %s.\n", __FILE__, __LINE__, strerror(errno));
00214 return;
00215 }
00216
00217 strncpy(cfgp->var, var, CFG_VAR_LEN-1);
00218 strncpy(cfgp->val, val, CFG_VAL_LEN-1);
00219 cfgp->next = NULL;
00220
00221 if (cfg->vars == NULL) {
00222 cfg->vars = cfgp;
00223 }
00224 else {
00225 tail->next = cfgp;
00226 }
00227
00228
00229 return;
00230 }
00231
00232
00233 extern void cupl_print_items(cfg_data *cfg)
00234 {
00235 cfg_array *tmp;
00236
00237 if (cfg == NULL) return;
00238
00239 printf("Number of items parsed: %d\n\n", cfg->nov);
00240 printf("Items:\n");
00241
00242 tmp = cfg->vars;
00243
00244 while (tmp != NULL) {
00245 printf("%s: %s\n", tmp->var, tmp->val);
00246 tmp = tmp->next;
00247 }
00248
00249 return;
00250 }
00251
00252
00253 extern char *cupl_get_var(char *var, cfg_data *cfg)
00254 {
00255 cfg_array *tmp = cfg->vars;
00256
00257 if (cfg == NULL) return NULL;
00258
00259 while (tmp != NULL) {
00260 if (strncmp(tmp->var, var, sizeof(tmp->var)) == 0)
00261 return tmp->val;
00262 tmp = tmp->next;
00263 }
00264
00265 return NULL;
00266 }
00267
00268
00269
00270