]> git.deb.at Git - pkg/abook.git/blobdiff - database.c
added duplicate item command
[pkg/abook.git] / database.c
index 2a5ce8be107f8479ec7e07784259f51cf008c35b..c17adae62b7da64a6d4e19d83040b05729b83ae2 100644 (file)
@@ -13,6 +13,7 @@
 #include <unistd.h>
 #include <fcntl.h>
 #include "abook.h"
+#include <assert.h>
 #include "database.h"
 #include "list.h"
 #include "misc.h"
@@ -136,10 +137,7 @@ load_database(char *filename)
        
        parse_database(in);
 
-       if ( items == 0 )
-               return 2;
-
-       return 0;
+       return (items == 0) ? 2 : 0;
 }
 
 int
@@ -321,21 +319,14 @@ remove_selected_items()
 char *
 get_surname(char *s)
 {
-       int i, a;
-       int len = strlen(s);
-       char *name = strdup(s);
-
-       for( a = 0, i = len - 1; i >= 0; i--, a++ ) {
-               name[a] = s[i];
-               if(name[a] == ' ')
-                       break;
-       }
+       char *p = s + strlen(s);
 
-       name[ a ] = 0;
+       assert(s != NULL);
 
-       revstr(name);
+       while(p > s && *(p - 1) != ' ')
+               p--;
 
-       return name;
+       return strdup(p);
 }
 
 static int
@@ -360,21 +351,53 @@ surnamecmp(const void *i1, const void *i2)
        return ret;
 }
 
+static int sort_field = -1;
+
 static int
 namecmp(const void *i1, const void *i2)
 {
        list_item a, b;
 
+       assert(sort_field >= 0 && sort_field <= LAST_FIELD);
+
        itemcpy(a, i1);
        itemcpy(b, i2);
        
-       return safe_strcoll( a[NAME], b[NAME] );
+       return safe_strcoll( a[sort_field], b[sort_field] );
+}
+
+static int
+name2field(char *name)
+{
+       int i, ret = -1;
+
+       for(i = 0; i < ITEM_FIELDS; i++) {
+               if(!strcasecmp(name, abook_fields[i].key)) {
+                       ret = i;
+                       break;
+               }
+       }
+
+       return ret;
 }
 
 void
-sort_database()
+sort_by_field(int field)
 {
        select_none();
+
+       assert(field <= LAST_FIELD);
+
+       if(field < 0) {
+               field = name2field(opt_get_str(STR_SORT_FIELD));
+               if(field < 0) {
+                       statusline_msg("Not valid field value defined "
+                               "in configuration");
+                       return;
+               }
+       }
+
+       sort_field = field;
        
        qsort((void *)database, items, sizeof(list_item), namecmp);
 
@@ -404,13 +427,13 @@ find_item(char *str, int start, int search_fields[])
                return -2; /* error */
 
        findstr = strdup(str);
-       findstr = strupper(findstr);
+       findstr = strlower(findstr);
 
        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) ) {
+                       if( tmp && strstr(strlower(tmp), findstr) ) {
                                ret = e.item;
                                goto out;
                        }