35{
36 char buf[1024], keybuf[256];
37 char* p, *q;
38
40 top.key = NULL;
41
42
43
44
45 if (key3)
46 sprintf(keybuf, "%s.%s.%s", key1, key2, key3);
47 else if (key2)
48 sprintf(keybuf, "%s.%s", key1, key2);
49 else if (key1)
50 strcpy(keybuf, key1);
51 else
52 return NULL;
53
54
55 rewind(m_fd);
56 if (! top.key) {
57 int line = 0;
58 cur = ⊤
59 while (fgets(buf, sizeof(buf), m_fd)) {
60 line++;
61
62 p = strchr(buf, '\n');
63 if (! p) {
64 fprintf(stderr, "RFConf : line %d too long\n", line);
65 while (fgets(buf, sizeof(buf), m_fd) && !strchr(buf, '\n'))
66 ;
67 continue;
68 }
69 *p = 0;
70
71
72
73 char* keyp = nullptr;
74 char* delp = nullptr;
75 char* valp = nullptr;
76 for (p = buf; *p && *p != '#'; p++) {
77 if (! keyp) {
78 if (! isspace(*p)) keyp = p;
79 } else if (! delp) {
80 if (isspace(*p)) {
81 if (!isspace(*(p + 1)) && *(p + 1) != ':') {
82 fprintf(stderr, "RFConf : invalid key at line %d\n", line);
83 break;
84 }
85 *p = 0;
86 } else if (*p == ':') {
87 *(delp = p) = 0;
88 }
89 } else if (! valp) {
90 if (! isspace(*p)) {
91 valp = q = p;
92 q++;
93 }
94 } else if (! isspace(*p)) {
95 *q++ = *p;
96 } else if (! isspace(*(p + 1))) {
97 *q++ = ' ';
98 }
99 }
100 if (valp) {
101 for (*q-- = 0; isspace(*q); *q-- = 0)
102 ;
103 }
104 if (delp) {
105 cur->next = (
RFConf_t*)malloc(
sizeof(*cur));
106 cur = cur->next;
107 cur->next = 0;
108 cur->key = (char*)malloc(strlen(keyp) + 1);
109 strcpy(cur->key, keyp);
110 if (valp) {
111 cur->val = (char*)malloc(strlen(valp) + 1);
112 strcpy(cur->val, valp);
113 } else {
114 cur->val = 0;
115 }
116 }
117 }
118 } else if (! top.val) {
119 return NULL;
120 }
121
122 int nitem = 0;
123 for (cur = ⊤ cur; cur = cur->next) {
124 if (cur->key == NULL) continue;
125 if (strcmp(cur->key, keybuf) == 0) return cur->val;
126 nitem++;
127 }
128 printf("RFConf: Key %s not found\n", keybuf);
129 printf("nitem = %d, keybuf = %s\n", nitem, keybuf);
130 return NULL;
131}