annotate mcabber/src/parsecfg.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 0cd8025eebee
children 8a54d46e889a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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 }