Main Page | Data Structures | Directories | File List | Data Fields | Globals

cfg.c

Go to the documentation of this file.
00001 /*
00002  *  Copyright (C) 2006  Baris Simsek, http://www.enderunix.org/simsek
00003  *  
00004  *  This library is free software; you can redistribute it and/or
00005  *  modify it under the terms of the GNU Lesser General Public
00006  *  License as published by the Free Software Foundation; either
00007  *  version 2.1 of the License, or (at your option) any later version.
00008  *  
00009  *  This library is distributed in the hope that it will be useful,
00010  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  *  Lesser General Public License for more details.
00013  *  
00014  *  You should have received a copy of the GNU Lesser General Public
00015  *  License along with this library; if not, write to the Free Software
00016  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00017  *  
00018  *  $Id: cfg_8c-source.html,v 1.4 2006/08/26 09:35:02 simsek Exp $
00019  *  
00020  *  Common Config Parser
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 /* To alloc cfg_data object and open config file. */
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 /* To free cfg_data object and close config file. */
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 /* To release cfg_array linked list. */
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         /* Save coming chain */
00086         next = prev->next;
00087 
00088         free(prev);
00089 
00090         /* Move next */
00091         prev = next;
00092         if (prev) next = prev->next;
00093     }
00094     
00095     return;
00096 }
00097 
00098 /* Parse the config file. */
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         /* Comments or spaces. Skip. */
00117         if (USELESS_LINE) {
00118             goto loop_end;
00119         }
00120 
00121         /* Invalid chars. Report and skip. */
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         /* Valid identifier. */
00133 
00134         /* Get variable */
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         /* Skip extra seperators. */
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         /* Get value */
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 /* Add new item to cfg_array linked list. */
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 /* To print all the parsed items */
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 /* To get a variable from cfg_data object */
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 

Generated on Sat Aug 26 12:34:54 2006 for CUPL (Common UNIX Programming Library) by  doxygen 1.3.9.1