5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
27 #define UL (unsigned long)
46 static struct option abook_vars[] = {
47 { "autosave", OT_BOOL, BOOL_AUTOSAVE, TRUE },
49 { "show_all_emails", OT_BOOL, BOOL_SHOW_ALL_EMAILS, TRUE },
50 { "emailpos", OT_INT, INT_EMAILPOS, 25 },
51 { "extra_column", OT_STR, STR_EXTRA_COLUMN, UL "phone" },
52 { "extra_alternative", OT_STR, STR_EXTRA_ALTERNATIVE, UL "-1" },
53 { "extrapos", OT_INT, INT_EXTRAPOS, 65 },
55 { "mutt_command", OT_STR, STR_MUTT_COMMAND, UL "mutt" },
56 { "mutt_return_all_emails", OT_BOOL, BOOL_MUTT_RETURN_ALL_EMAILS,
59 { "print_command", OT_STR, STR_PRINT_COMMAND, UL "lpr" },
61 { "www_command", OT_STR, STR_WWW_COMMAND, UL "lynx" },
63 { "address_style", OT_STR, STR_ADDRESS_STYLE, UL "eu" },
65 { "use_ascii_only", OT_BOOL, BOOL_USE_ASCII_ONLY, FALSE },
70 static unsigned char bool_opts[BOOL_MAX];
71 static int int_opts[INT_MAX];
72 static char *str_opts[STR_MAX];
75 set_int(enum int_opts opt, int value)
77 assert(opt >= 0 && opt < INT_MAX);
79 int_opts[opt] = value;
83 set_bool(enum bool_opts opt, bool value)
85 assert(opt >= 0 && opt < BOOL_MAX);
87 bool_opts[opt] = value;
91 set_str(enum str_opts opt, char *value)
93 assert(opt >= 0 && opt < STR_MAX);
98 str_opts[opt] = strdup(value);
102 opt_get_int(enum int_opts opt)
104 assert(opt >= 0 && opt < INT_MAX);
106 return int_opts[opt];
110 opt_get_bool(enum bool_opts opt)
112 assert(opt >= 0 && opt < STR_MAX);
114 return bool_opts[opt];
118 opt_get_str(enum str_opts opt)
120 assert(opt >= 0 && opt < STR_MAX);
122 return str_opts[opt];
126 restore_default(struct option *p)
130 set_bool(p -> data, (bool)p -> init);
133 set_int(p -> data, (int)p -> init);
137 set_str(p -> data, (char *) p -> init);
149 for(i = 0; abook_vars[i].option; i++)
150 restore_default(&abook_vars[i]);
159 * only strings need to be freed
161 for(i = 0; i < STR_MAX; i++) {
172 opt_line_remove_comments(char *p)
174 bool in_quote = FALSE;
183 in_quote = !in_quote;
202 get_token_start(char *p)
206 for(; ISSPACE(*p); p++);
212 get_token_end(char *p)
216 for(p = get_token_start(p); *p; p++) {
226 opt_set_set_option(char *var, char *p, struct option *opt)
234 if(p[len - 1] == '\"' && *p == '\"') {
236 return "invalid value";
241 switch(opt -> type) {
243 set_str(opt -> data, p);
246 set_int(opt -> data, safe_atoi(p));
249 if(!strcasecmp(p, "true") || !strcasecmp(p, "on"))
250 set_bool(opt -> data, TRUE);
251 else if(!strcasecmp(p, "false") ||
252 !strcasecmp(p, "off"))
253 set_bool(opt -> data, FALSE);
255 return "invalid value";
263 opt_parse_set(char *p)
268 var = get_token_start(p);
269 if((p = strchr(var, '=')))
272 return "invalid value assignment";
276 for(i = 0;abook_vars[i].option; i++)
277 if(!strcmp(abook_vars[i].option, var))
278 return opt_set_set_option(var, p, &abook_vars[i]);
280 return "unknown option";
286 char * (*func) (char *line);
288 { "set", opt_parse_set },
293 opt_parse_line(char *line, int n, char *fn)
301 line = get_token_start(line);
302 p = get_token_end(line);
311 for(i = 0; opt_parsers[i].token; i++)
312 if(!strcmp(opt_parsers[i].token, line)) {
313 if(!(err = opt_parsers[i].func(p)))
318 fprintf(stderr, "%s: parse error at line %d: ", fn, n);
320 fprintf(stderr, "%s\n", err);
322 fprintf(stderr, "unknown token %s\n", line);
328 load_opts(char *filename)
335 if((in = fopen(filename, "r")) == NULL)
339 for(n = 1;!feof(in); n++) {
346 opt_line_remove_comments(line);
348 err = opt_parse_line(line, n, filename);
357 printf("Press any key to continue...\n");