mcabber/src/parsecfg.c
author mikael
Sun, 24 Apr 2005 17:38:48 +0000
changeset 112 edb5591e2e64
parent 28 0cd8025eebee
child 155 8a54d46e889a
permissions -rw-r--r--
[/trunk] Changeset 126 by mikael * Fix keepalive.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     1
#include <stdio.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     2
#include <stdlib.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     3
#include <unistd.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     4
#include <ctype.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     5
#include <string.h>
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     6
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     7
#include "list.h"
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     8
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
     9
#define MAX_LENGHT_INPUT 1024
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    10
#define cfg_entry(n) list_entry(n, cfg_entry_t, list)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    11
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    12
typedef struct _cfg_entry_t {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    13
  char *key;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    14
  char *value;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    15
  struct list_head list;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    16
} cfg_entry_t;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    17
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    18
static LIST_HEAD(cfg_list);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    19
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    20
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    21
void push_in_list(char *key, char *value)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    22
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    23
  cfg_entry_t *new_entry = calloc(1, sizeof(cfg_entry_t));
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    24
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    25
  new_entry->key = (char *) calloc(1, strlen(key) + 1);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    26
  new_entry->value = (char *) calloc(1, strlen(value) + 1);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    27
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    28
  strcpy(new_entry->key, key);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    29
  strcpy(new_entry->value, value);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    30
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    31
  list_add(&new_entry->list, &cfg_list);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    32
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    33
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    34
int cfg_file(char *filename)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    35
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    36
  FILE *fp;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    37
  char *buf;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    38
  char *line;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    39
  char *value;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    40
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    41
  buf = malloc(255);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    42
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    43
  if ((fp = fopen(filename, "r")) == NULL) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    44
    perror("fopen (parsecfg.c:46)");
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    45
    exit(EXIT_FAILURE);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    46
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    47
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    48
  while (fgets(buf, 255, fp) != NULL) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    49
    line = buf;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    50
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    51
    while (isspace((int) *line))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    52
      line++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    53
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    54
    while ((strlen(line) > 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    55
	   && isspace((int) line[strlen(line) - 1]))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    56
      line[strlen(line) - 1] = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    57
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    58
    if ((*line == '\n') || (*line == '\0') || (*line == '#'))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    59
      continue;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    60
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    61
    if ((strchr(line, '=') != NULL)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    62
      value = strchr(line, '=');
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    63
      *value = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    64
      value++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    65
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    66
      while (isspace((int) *value))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    67
	value++;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    68
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    69
      while ((strlen(line) > 0)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    70
	     && isspace((int) line[strlen(line) - 1]))
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    71
	line[strlen(line) - 1] = '\0';
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    72
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    73
      push_in_list(line, value);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    74
      continue;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    75
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    76
    fprintf(stderr, "CFG: orphaned line \"%s\"\n", line);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    77
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    78
  return 1;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    79
}
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    80
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    81
char *cfg_read(char *key)
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    82
{
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    83
  struct list_head *n, *pos;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    84
  cfg_entry_t *search_entry = NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    85
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    86
  list_for_each_safe(pos, n, &cfg_list) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    87
    search_entry = cfg_entry(pos);
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    88
    if (search_entry->key) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    89
      if (!strcasecmp(search_entry->key, key)) {
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    90
	return search_entry->value;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    91
      }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    92
    }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    93
  }
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    94
  return NULL;
e88b15cbf2de [/trunk] Changeset 40 by mikael
mikael
parents:
diff changeset
    95
}