aboutsummaryrefslogtreecommitdiffstats
path: root/config.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--config.c98
1 files changed, 98 insertions, 0 deletions
diff --git a/config.c b/config.c
new file mode 100644
index 0000000..c55d63c
--- /dev/null
+++ b/config.c
@@ -0,0 +1,98 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "config.h"
+
+typedef struct {
+ char *key;
+ char *val;
+} ENTRY;
+
+static ENTRY *Config=NULL;
+static int nConfig=0;
+
+static char *strip (char *s)
+{
+ char *p;
+
+ while (isblank(*s)) s++;
+ for (p=s; *p; p++) {
+ if (*p=='"') do p++; while (*p && *p!='\n' && *p!='"');
+ if (*p=='\'') do p++; while (*p && *p!='\n' && *p!='\'');
+ if (*p=='#' || *p=='\n') {
+ *p='\0';
+ break;
+ }
+ }
+ for (p--; p>s && isblank(*p); p--) *p='\0';
+ return s;
+}
+
+void set_cfg (char *key, char *val)
+{
+ int i;
+
+ for (i=0; i<nConfig; i++) {
+ if (strcasecmp(Config[i].key, key)==0) {
+ if (Config[i].val) free (Config[i].val);
+ Config[i].val=strdup(val);
+ return;
+ }
+ }
+ nConfig++;
+ Config=realloc(Config, nConfig*sizeof(ENTRY));
+ Config[i].key=strdup(key);
+ Config[i].val=strdup(val);
+}
+
+char *get_cfg (char *key)
+{
+ int i;
+
+ for (i=0; i<nConfig; i++) {
+ if (strcasecmp(Config[i].key, key)==0) {
+ return Config[i].val;
+ }
+ }
+ return NULL;
+}
+
+
+int read_cfg (char *file)
+{
+ FILE *stream;
+ char buffer[256];
+ char *line, *p, *s;
+
+ stream=fopen (file, "r");
+ if (stream==NULL) {
+ fprintf (stderr, "open(%s) failed: %s\n", file, strerror(errno));
+ return-1;
+ }
+ while ((line=fgets(buffer,256,stream))!=NULL) {
+ if (*(line=strip(line))=='\0') continue;
+ for (p=line; *p; p++) {
+ if (isblank(*p)) {
+ *p++='\0';
+ break;
+ }
+ }
+ p=strip(p);
+ if (*p) for (s=p; *(s+1); s++);
+ else s=p;
+ if (*p=='"' && *s=='"') {
+ *s='\0';
+ p++;
+ }
+ else if (*p=='\'' && *s=='\'') {
+ *s='\0';
+ p++;
+ }
+ set_cfg (line, p);
+ }
+ fclose (stream);
+ return 0;
+}
+