]> git.deb.at Git - pkg/abook.git/blobdiff - options.c
- i18n support
[pkg/abook.git] / options.c
index 2f6d0bbea61630782a972d2a2cff12516a15c124..8a0f7e9db71cccf22d879f29cac0d8bb537776cc 100644 (file)
--- a/options.c
+++ b/options.c
@@ -15,7 +15,9 @@
 #include <assert.h>
 #include "options.h"
 #include "abook.h"
+#include "gettext.h"
 #include "misc.h"
+#include "xmalloc.h"
 
 #ifndef FALSE
 #      define FALSE    0
@@ -55,26 +57,30 @@ static struct option abook_vars[] = {
        { "mutt_command", OT_STR, STR_MUTT_COMMAND, UL "mutt" },
        { "mutt_return_all_emails", OT_BOOL, BOOL_MUTT_RETURN_ALL_EMAILS,
                TRUE },
-       
+
        { "print_command", OT_STR, STR_PRINT_COMMAND, UL "lpr" },
 
        { "www_command", OT_STR, STR_WWW_COMMAND, UL "lynx" },
-       
+
        { "address_style", OT_STR, STR_ADDRESS_STYLE, UL "eu" },
 
        { "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" },
+       { "show_cursor", OT_BOOL, BOOL_SHOW_CURSOR, FALSE },
+
        { 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;
 }
@@ -95,13 +101,13 @@ set_str(enum str_opts opt, char *value)
        if(str_opts[opt])
                free(str_opts[opt]);
 
-       str_opts[opt] = strdup(value);
+       str_opts[opt] = xstrdup(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 +115,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 +174,10 @@ free_opts()
  * file parsing
  */
 
+typedef struct {
+       char *data, *ptr;
+} buffer;
+
 static void
 opt_line_remove_comments(char *p)
 {
@@ -198,42 +208,38 @@ opt_line_remove_comments(char *p)
        }
 }
 
-static char *
-get_token_start(char *p)
+void
+find_token_start(buffer *b)
 {
-       assert(p);
-       
-       for(; ISSPACE(*p); p++);
+       assert(b);
 
-       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 *
 opt_set_set_option(char *var, char *p, struct option *opt)
 {
        int len;
-       
+
        strtrim(p);
 
        len = strlen(p);
 
        if(p[len - 1] == '\"' && *p == '\"') {
                if(len < 3)
-                       return "invalid value";
+                       return _("invalid value");
                p[len - 1] = 0;
                p++;
        }
@@ -252,40 +258,69 @@ opt_set_set_option(char *var, char *p, struct option *opt)
                                        !strcasecmp(p, "off"))
                                set_bool(opt -> data, FALSE);
                        else
-                               return "invalid value";
+                               return _("invalid value");
                        break;
+               default:
+                       assert(0);
        }
-       
+
        return NULL;
 }
 
 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);
+               return _("invalid value assignment");
+
+       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]);
-       
-       return "unknown option";
+               if(!strcmp(abook_vars[i].option, b -> ptr))
+                       return opt_set_set_option(b -> ptr, p, &abook_vars[i]);
+
+       return _("unknown option");
 }
 
+#include "database.h" /* needed for change_custom_field_name */
+
+static char *
+opt_parse_customfield(buffer *b)
+{
+       char *p, num[5];
+       int n;
+       size_t len;
+
+       find_token_start(b);
+       p = b -> ptr;
+       find_token_end(b);
+
+       memset(num, 0, sizeof(num));
+
+       len = (b -> ptr - p);
+       strncpy(num, p, min(sizeof(num) - 1, len));
+       n = safe_atoi(num);
+
+       find_token_start(b);
+
+       if(change_custom_field_name(b->ptr, n) == -1)
+               return _("invalid custom field number");
+
+       return NULL;
+}
 
 static struct {
        char *token;
-       char * (*func) (char *line);
+       char * (*func) (buffer *line);
 } opt_parsers[] = {
        { "set", opt_parse_set },
+       { "customfield", opt_parse_customfield },
        { NULL }
 };
 
@@ -293,33 +328,40 @@ 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;
                }
-       
-       fprintf(stderr, "%s: parse error at line %d: ", fn, n);
+
+       fprintf(stderr, _("%s: parse error at line %d: "), fn, n);
        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,12 +372,12 @@ 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;
 
-       
+
        for(n = 1;!feof(in); n++) {
                line = getaline(in);
 
@@ -345,19 +387,15 @@ 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);
+               free(line);
+               line = NULL;
        }
 
        free(line);
 
-       if(err) {
-               printf("Press any key to continue...\n");
-               fgetc(stdin);
-       }
-       
        return err;
 }