]> git.deb.at Git - pkg/abook.git/blobdiff - database.c
use strcoll instead of strcmp for sorting entries
[pkg/abook.git] / database.c
index e324810eab04c0394a3476da1c3b5ab5d4dedb75..f1ebdf7d47f368bbe1b0282b7c04c90bd12a1a0f 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * $Id$
  *
- * by JH <jheinonen@bigfoot.com>
+ * by JH <jheinonen@users.sourceforge.net>
  *
  * Copyright (C) Jaakko Heinonen
  */
@@ -58,6 +58,7 @@ struct abook_field abook_fields[ITEM_FIELDS] = {
        {"Name",        "name",         TAB_CONTACT},/* NAME */
        {"E-mails",     "email",        TAB_CONTACT},/* EMAIL */
        {"Address",     "address",      TAB_ADDRESS},/* ADDRESS */
+       {"Address2",    "address2",     TAB_ADDRESS},/* ADDRESS2 */   
        {"City",        "city",         TAB_ADDRESS},/* CITY */
        {"State/Province","state",      TAB_ADDRESS},/* STATE */
        {"ZIP/Postal Code","zip",       TAB_ADDRESS},/* ZIP */
@@ -107,9 +108,12 @@ parse_database(FILE *in)
                } else if((tmp = strchr(line, '=') ) && sec ) {
                        *tmp++ = '\0';
                        for(i=0; i<ITEM_FIELDS; i++)
-                               if( !strcmp(abook_fields[i].key, line) )
+                               if( !strcmp(abook_fields[i].key, line) ) {
                                        item[i] = strdup(tmp);
+                                       goto next;
+                               }
                }
+next:
                free(line);
        }
 
@@ -144,15 +148,17 @@ write_database(FILE *out, struct db_enumerator e)
        int j;
        int i = 0;
 
-       fprintf(out, "# abook addressbook file\n\n");
-       fprintf(out, "[format]\n");
-       fprintf(out, "program=" PACKAGE "\n");
-       fprintf(out, "version=" VERSION "\n");
-       fprintf(out, "\n\n");
+       fprintf(out,
+               "# abook addressbook file\n\n"
+               "[format]\n"
+               "program=" PACKAGE "\n"
+               "version=" VERSION "\n"
+               "\n\n"
+       );
 
        db_enumerate_items(e) {
                fprintf(out, "[%d]\n", i);
-               for(j=0; j<ITEM_FIELDS; j++) {
+               for(j = 0; j < ITEM_FIELDS; j++) {
                        if( database[e.item][j] != NULL &&
                                        *database[e.item][j] )
                                fprintf(out, "%s=%s\n",
@@ -226,7 +232,7 @@ close_database()
 
 #define _MAX_FIELD_LEN(X)      (X == EMAIL ? MAX_EMAILSTR_LEN:MAX_FIELD_LEN)
 
-inline static void
+static void
 validate_item(list_item item)
 {
        int i;
@@ -345,8 +351,8 @@ surnamecmp(const void *i1, const void *i2)
        s1 = get_surname(a[NAME]);
        s2 = get_surname(b[NAME]);
 
-       if( !(ret = safe_strcmp(s1, s2)) )
-               ret = safe_strcmp(a[NAME], b[NAME]);
+       if( !(ret = safe_strcoll(s1, s2)) )
+               ret = safe_strcoll(a[NAME], b[NAME]);
 
        free(s1);
        free(s2);
@@ -362,7 +368,7 @@ namecmp(const void *i1, const void *i2)
        itemcpy(a, i1);
        itemcpy(b, i2);
        
-       return safe_strcmp( a[NAME], b[NAME] );
+       return safe_strcoll( a[NAME], b[NAME] );
 }
 
 void
@@ -386,26 +392,30 @@ sort_surname()
 }
 
 int
-find_item(char *str, int start)
+find_item(char *str, int start, int search_fields[])
 {
        int i;
        char *findstr = NULL;
        char *tmp = NULL;
        int ret = -1; /* not found */
+       struct db_enumerator e = init_db_enumerator(ENUM_ALL);
 
-       if(items < 1 || start < 0 || start >= LAST_ITEM)
+       if(list_is_empty() || !is_valid_item(start))
                return -2; /* error */
 
        findstr = strdup(str);
        findstr = strupper(findstr);
 
-       for( i = start; i < items; i++ ) {
-               tmp = strdup(database[i][NAME]);
-               if( strstr(strupper(tmp), findstr) != NULL ) {
-                       ret = i;
-                       goto out;
+       e.item = start - 1; /* must be "real start" - 1 */
+       db_enumerate_items(e) {
+               for( i = 0; search_fields[i] >= 0; i++ ) {
+                       tmp = safe_strdup(database[e.item][search_fields[i]]);
+                       if( tmp && strstr(strupper(tmp), findstr) ) {
+                               ret = e.item;
+                               goto out;
+                       }
+                       my_free(tmp);
                }
-               my_free(tmp);
        }
 
 out:
@@ -421,6 +431,12 @@ is_selected(int item)
        return selected[item];
 }
 
+int
+is_valid_item(int item)
+{
+       return item <= LAST_ITEM && item >= 0;
+}
+
 int
 real_db_enumerate_items(struct db_enumerator e)
 {