X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=database.c;h=c17adae62b7da64a6d4e19d83040b05729b83ae2;hb=28b7c8bdd6dc85f7412233d99e5526e148f81d81;hp=2a5ce8be107f8479ec7e07784259f51cf008c35b;hpb=3cea3c8809447c5d6658671b78b9af7137fd9b0d;p=pkg%2Fabook.git diff --git a/database.c b/database.c index 2a5ce8b..c17adae 100644 --- a/database.c +++ b/database.c @@ -13,6 +13,7 @@ #include #include #include "abook.h" +#include #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; }