2 * Insane tester of reading configuration files
4 * (c) 2006 Robert Spalek <robert@ucw.cz>
9 #include "lib/getopt.h"
10 #include "lib/clists.h"
11 #include "lib/fastbuf.h"
28 static struct sub_sect_1 sec1 = { {}, "Charlie", 0, "WBAFC", { 0, -1}, DARY_ALLOC(double, 3, 1e4, -1e-4, 8) };
31 init_sec_1(struct sub_sect_1 *s)
33 if (s == &sec1) { // this is a static variable; skip clearing
34 DARY_LEN(sec1.list) = 3; // XXX: fix for the bug in DARY_ALLOC()
41 // leave s->list==NULL
46 commit_sec_1(struct sub_sect_1 *s)
48 if (s->confidence[0] < 0 || s->confidence[0] > 10)
49 return "Well, this can't be";
54 time_parser(uns number, byte **pars, time_t *ptr)
56 *ptr = number ? atoi(pars[0]) : time(NULL);
60 static struct cf_section cf_sec_1 = {
61 CF_TYPE(struct sub_sect_1),
63 CF_COMMIT(commit_sec_1),
64 #define F(x) PTR_TO(struct sub_sect_1, x)
66 CF_STRING("name", F(name)),
67 //CF_PARSER("t", F(t), time_parser, 0),
68 CF_STRING("level", F(level)),
69 CF_INT_ARY("confidence", F(confidence[0]), 2), // XXX: the [0] is needed for the sake of type checking
70 CF_DOUBLE_DYN("list", F(list), 100),
77 static int *nrs1 = DARY_ALLOC(int, 5, 5, 4, 3, 2, 1);
79 static byte *str1 = "no worries";
80 static byte **str2 = DARY_ALLOC(byte *, 2, "Alice", "Bob");
81 static u64 u1 = 0xCafeBeefDeadC00ll;
82 static double d1 = -1.1;
86 static int *look = DARY_ALLOC(int, 2, 2, 1);
87 static u16 numbers[10] = { 2, 100, 1, 5 };
90 parse_u16(byte *string, u16 *ptr)
93 byte *msg = cf_parse_int(string, &a);
97 return "Come on, man, this doesn't fit to 16 bits";
103 dump_u16(struct fastbuf *fb, u16 *ptr)
105 bprintf(fb, "%d ", *ptr);
108 static struct cf_user_type u16_type = {
111 .parser = (cf_parser1*) parse_u16,
112 .dumper = (cf_dumper1*) dump_u16
116 init_top(void *ptr UNUSED)
118 for (uns i=0; i<5; i++)
120 struct sub_sect_1 *s = xmalloc(sizeof(struct sub_sect_1)); // XXX: cannot by cf_malloc(), because it's deleted when cf_reload()'ed
121 cf_init_section("slaves", &cf_sec_1, s, 1);
122 s->confidence[1] = i;
123 clist_add_tail(&secs, &s->n);
129 commit_top(void *ptr UNUSED)
132 return "Don't touch my variable!";
136 static byte *alphabet[] = { "alpha", "beta", "gamma", "delta", NULL };
137 static struct cf_section cf_top = {
139 CF_COMMIT(commit_top),
142 CF_INT_DYN("nrs1", &nrs1, 1000),
143 CF_INT_ARY("nrs2", nrs2, 5),
144 CF_STRING("str1", &str1),
145 CF_STRING_DYN("str2", &str2, 20),
147 CF_DOUBLE("d1", &d1),
148 CF_PARSER("FirstTime", &t1, time_parser, -1),
149 CF_PARSER("SecondTime", &t2, time_parser, 1),
150 CF_SECTION("master", &sec1, &cf_sec_1),
151 CF_LIST("slaves", &secs, &cf_sec_1),
153 CF_LOOKUP_DYN("look", &look, alphabet, 1000),
154 CF_USER_ARY("numbers", numbers, &u16_type, 10),
159 static byte short_opts[] = CF_SHORT_OPTS "v";
160 static struct option long_opts[] = {
162 {"verbose", 0, 0, 'v'},
166 static char *help = "\
167 Usage: conf-test <options>\n\
171 "-v\t\t\tBe verbose\n\
175 usage(byte *msg, ...)
180 vfprintf(stderr, msg, va);
186 main(int argc, char *argv[])
189 cf_declare_section("top", &cf_top, 0);
190 cf_def_file = "lib/conf-test.cf";
193 while ((opt = cf_getopt(argc, argv, short_opts, long_opts, NULL)) >= 0)
195 case 'v': verbose++; break;
196 default: usage("unknown option %c\n", opt);
199 usage("too many parameters (%d more)\n", argc-optind);
202 cf_load("non-existent file");
203 //cf_reload("non-existent file");
204 cf_load("non-existent file");
205 cf_set("top.d1 -1.1; top.master b");
208 struct fastbuf *out = bfdopen(1, 1<<14);
209 cf_dump_sections(out);