5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
29 #define UL (unsigned long)
48 static struct option abook_vars[] = {
49 { "autosave", OT_BOOL, BOOL_AUTOSAVE, TRUE },
51 { "show_all_emails", OT_BOOL, BOOL_SHOW_ALL_EMAILS, TRUE },
52 { "emailpos", OT_INT, INT_EMAILPOS, 25 },
53 { "extra_column", OT_STR, STR_EXTRA_COLUMN, UL "phone" },
54 { "extra_alternative", OT_STR, STR_EXTRA_ALTERNATIVE, UL "-1" },
55 { "extrapos", OT_INT, INT_EXTRAPOS, 65 },
57 { "mutt_command", OT_STR, STR_MUTT_COMMAND, UL "mutt" },
58 { "mutt_return_all_emails", OT_BOOL, BOOL_MUTT_RETURN_ALL_EMAILS,
61 { "print_command", OT_STR, STR_PRINT_COMMAND, UL "lpr" },
63 { "www_command", OT_STR, STR_WWW_COMMAND, UL "lynx" },
65 { "address_style", OT_STR, STR_ADDRESS_STYLE, UL "eu" },
67 { "use_ascii_only", OT_BOOL, BOOL_USE_ASCII_ONLY, FALSE },
69 { "add_email_prevent_duplicates", OT_BOOL, BOOL_ADD_EMAIL_PREVENT_DUPLICATES, FALSE },
70 { "sort_field", OT_STR, STR_SORT_FIELD, UL "nick" },
71 { "show_cursor", OT_BOOL, BOOL_SHOW_CURSOR, FALSE },
76 static unsigned char bool_opts[BOOL_MAX];
77 static int int_opts[INT_MAXIMUM];
78 static char *str_opts[STR_MAX];
81 set_int(enum int_opts opt, int value)
83 assert(opt >= 0 && opt < INT_MAXIMUM);
85 int_opts[opt] = value;
89 set_bool(enum bool_opts opt, bool value)
91 assert(opt >= 0 && opt < BOOL_MAX);
93 bool_opts[opt] = value;
97 set_str(enum str_opts opt, char *value)
99 assert(opt >= 0 && opt < STR_MAX);
104 str_opts[opt] = xstrdup(value);
108 opt_get_int(enum int_opts opt)
110 assert(opt >= 0 && opt < INT_MAXIMUM);
112 return int_opts[opt];
116 opt_get_bool(enum bool_opts opt)
118 assert(opt >= 0 && opt < BOOL_MAX);
120 return bool_opts[opt];
124 opt_get_str(enum str_opts opt)
126 assert(opt >= 0 && opt < STR_MAX);
128 return str_opts[opt];
132 restore_default(struct option *p)
136 set_bool(p -> data, (bool)p -> init);
139 set_int(p -> data, (int)p -> init);
143 set_str(p -> data, (char *) p -> init);
155 for(i = 0; abook_vars[i].option; i++)
156 restore_default(&abook_vars[i]);
165 * only strings need to be freed
167 for(i = 0; i < STR_MAX; i++) {
182 opt_line_remove_comments(char *p)
184 bool in_quote = FALSE;
193 in_quote = !in_quote;
212 find_token_start(buffer *b)
216 for(; ISSPACE(*b -> ptr); b -> ptr ++);
220 find_token_end(buffer *b)
224 for(find_token_start(b); *(b -> ptr); b -> ptr ++) {
225 if(ISSPACE(*(b -> ptr))) {
232 opt_set_set_option(char *var, char *p, struct option *opt)
240 if(p[len - 1] == '\"' && *p == '\"') {
242 return _("invalid value");
247 switch(opt -> type) {
249 set_str(opt -> data, p);
252 set_int(opt -> data, safe_atoi(p));
255 if(!strcasecmp(p, "true") || !strcasecmp(p, "on"))
256 set_bool(opt -> data, TRUE);
257 else if(!strcasecmp(p, "false") ||
258 !strcasecmp(p, "off"))
259 set_bool(opt -> data, FALSE);
261 return _("invalid value");
271 opt_parse_set(buffer *b)
277 if((p = strchr(b -> ptr, '=')))
280 return _("invalid value assignment");
284 for(i = 0;abook_vars[i].option; i++)
285 if(!strcmp(abook_vars[i].option, b -> ptr))
286 return opt_set_set_option(b -> ptr, p, &abook_vars[i]);
288 return _("unknown option");
291 #include "database.h" /* needed for change_custom_field_name */
294 opt_parse_customfield(buffer *b)
304 memset(num, 0, sizeof(num));
306 len = (b -> ptr - p);
307 strncpy(num, p, min(sizeof(num) - 1, len));
312 if(change_custom_field_name(b->ptr, n) == -1)
313 return _("invalid custom field number");
320 char * (*func) (buffer *line);
322 { "set", opt_parse_set },
323 { "customfield", opt_parse_customfield },
328 opt_parse_line(char *line, int n, char *fn)
339 find_token_start(&b);
351 b.data = b.ptr = b.ptr;
353 for(i = 0; opt_parsers[i].token; i++)
354 if(!strcmp(opt_parsers[i].token, token)) {
355 if(!(err = opt_parsers[i].func(&b)))
360 fprintf(stderr, _("%s: parse error at line %d: "), fn, n);
362 fprintf(stderr, "%s\n", err);
364 fprintf(stderr, _("unknown token %s\n"), token);
370 load_opts(char *filename)
377 if((in = fopen(filename, "r")) == NULL)
381 for(n = 1;!feof(in); n++) {
388 opt_line_remove_comments(line);
390 err += opt_parse_line(line, n, filename) ? 1:0;