aboutsummaryrefslogtreecommitdiffstats
path: root/config.c
blob: c55d63ca87c8eb245348cb24e13014056f82cf3e (plain)
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
#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;
}