X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=options.c;h=fe75878abb225b056e950f0c2a34cceaba7f9d72;hb=c4d2f4ab3d5166b75f8fc1bf9e2be776014d391d;hp=82aae49cef02ae9566945f4559608d54e061a2e4;hpb=c38bc4bc5254bd5925d8567e7ff1554a7844b8c7;p=pkg%2Fabook.git diff --git a/options.c b/options.c index 82aae49..fe75878 100644 --- a/options.c +++ b/options.c @@ -64,17 +64,20 @@ static struct option abook_vars[] = { { "use_ascii_only", OT_BOOL, BOOL_USE_ASCII_ONLY, FALSE }, + { "add_email_prevent_duplicates", OT_BOOL, BOOL_ADD_EMAIL_PREVENT_DUPLICATES, FALSE }, + { "sort_field", OT_STR, STR_SORT_FIELD, UL "nick" }, + { NULL } }; static unsigned char bool_opts[BOOL_MAX]; -static int int_opts[INT_MAX]; +static int int_opts[INT_MAXIMUM]; static char *str_opts[STR_MAX]; static void set_int(enum int_opts opt, int value) { - assert(opt >= 0 && opt < INT_MAX); + assert(opt >= 0 && opt < INT_MAXIMUM); int_opts[opt] = value; } @@ -101,7 +104,7 @@ set_str(enum str_opts opt, char *value) int opt_get_int(enum int_opts opt) { - assert(opt >= 0 && opt < INT_MAX); + assert(opt >= 0 && opt < INT_MAXIMUM); return int_opts[opt]; } @@ -109,7 +112,7 @@ opt_get_int(enum int_opts opt) bool opt_get_bool(enum bool_opts opt) { - assert(opt >= 0 && opt < STR_MAX); + assert(opt >= 0 && opt < BOOL_MAX); return bool_opts[opt]; } @@ -168,6 +171,10 @@ free_opts() * file parsing */ +typedef struct { + char *data, *ptr; +} buffer; + static void opt_line_remove_comments(char *p) { @@ -198,28 +205,24 @@ opt_line_remove_comments(char *p) } } -static char * -get_token_start(char *p) +void +find_token_start(buffer *b) { - assert(p); + assert(b); - for(; ISSPACE(*p); p++); - - return p; + for(; ISSPACE(*b -> ptr); b -> ptr ++); } -static char * -get_token_end(char *p) +void +find_token_end(buffer *b) { - assert(p); + assert(b); - for(p = get_token_start(p); *p; p++) { - if(ISSPACE(*p)) { + for(find_token_start(b); *(b -> ptr); b -> ptr ++) { + if(ISSPACE(*(b -> ptr))) { break; } } - - return p; } static char * @@ -246,9 +249,9 @@ opt_set_set_option(char *var, char *p, struct option *opt) set_int(opt -> data, safe_atoi(p)); break; case OT_BOOL: - if(!strcasecmp(p, "true") && !strcasecmp(p, "on")) + if(!strcasecmp(p, "true") || !strcasecmp(p, "on")) set_bool(opt -> data, TRUE); - else if(!strcasecmp(p, "false") && + else if(!strcasecmp(p, "false") || !strcasecmp(p, "off")) set_bool(opt -> data, FALSE); else @@ -260,22 +263,22 @@ opt_set_set_option(char *var, char *p, struct option *opt) } static char * -opt_parse_set(char *p) +opt_parse_set(buffer *b) { - char *var; int i; + char *p; - var = get_token_start(p); - if((p = strchr(var, '='))) + find_token_start(b); + if((p = strchr(b -> ptr, '='))) *p++ = 0; else return "invalid value assignment"; - strtrim(var); + strtrim(b -> ptr); for(i = 0;abook_vars[i].option; i++) - if(!strcmp(abook_vars[i].option, var)) - return opt_set_set_option(var, p, &abook_vars[i]); + if(!strcmp(abook_vars[i].option, b -> ptr)) + return opt_set_set_option(b -> ptr, p, &abook_vars[i]); return "unknown option"; } @@ -283,7 +286,7 @@ opt_parse_set(char *p) static struct { char *token; - char * (*func) (char *line); + char * (*func) (buffer *line); } opt_parsers[] = { { "set", opt_parse_set }, { NULL } @@ -293,24 +296,31 @@ static bool opt_parse_line(char *line, int n, char *fn) { int i; - char *p; char *err = NULL; + char *token; + buffer b; assert(line && fn); - line = get_token_start(line); - p = get_token_end(line); - *p++ = 0; + b.ptr = line; + + find_token_start(&b); + b.data = b.ptr; + find_token_end(&b); + *b.ptr++ = 0; if(!*line) return FALSE; - strtrim(line); - strtrim(p); + strtrim(b.data); + strtrim(b.ptr); + + token = b.data; + b.data = b.ptr = b.ptr; for(i = 0; opt_parsers[i].token; i++) - if(!strcmp(opt_parsers[i].token, line)) { - if(!(err = opt_parsers[i].func(p))) + if(!strcmp(opt_parsers[i].token, token)) { + if(!(err = opt_parsers[i].func(&b))) return FALSE; break; } @@ -319,7 +329,7 @@ opt_parse_line(char *line, int n, char *fn) if(err) fprintf(stderr, "%s\n", err); else - fprintf(stderr, "unknown token %s\n", line); + fprintf(stderr, "unknown token %s\n", token); return TRUE; } @@ -330,7 +340,7 @@ load_opts(char *filename) FILE *in; char *line = NULL; int n; - bool err = FALSE; + int err = 0; if((in = fopen(filename, "r")) == NULL) return -1; @@ -345,7 +355,7 @@ load_opts(char *filename) if(line && *line) { opt_line_remove_comments(line); if(*line) - err = opt_parse_line(line, n, filename); + err += opt_parse_line(line, n, filename) ? 1:0; } my_free(line); @@ -353,11 +363,6 @@ load_opts(char *filename) free(line); - if(err) { - printf("Press any key to continue...\n"); - fgetc(stdin); - } - return err; }