]> git.deb.at Git - pkg/abook.git/blobdiff - database.c
Imported Upstream version 0.5.3
[pkg/abook.git] / database.c
index 65d508209568094679c3d5adc6affeff5449ca47..e19d9469bf754b8c725168a50cd99dbda8a52ed4 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: database.c,v 1.14 2001/11/20 19:35:29 jheinonen Exp $
+ * $Id: database.c,v 1.20 2003/11/22 13:46:02 jheinonen Exp $
  *
  * by JH <jheinonen@users.sourceforge.net>
  *
@@ -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"
@@ -70,9 +71,26 @@ struct abook_field abook_fields[ITEM_FIELDS] = {
        {"Nickname/Alias", "nick",      TAB_OTHER},/* NICK */
        {"URL",         "url",          TAB_OTHER},/* URL */
        {"Notes",       "notes",        TAB_OTHER},/* NOTES */
+       {"Custom1",     "custom1",      TAB_CUSTOM},/* CUSTOM1 */
+       {"Custom2",     "custom2",      TAB_CUSTOM},/* CUSTOM2 */
+       {"Custom3",     "custom3",      TAB_CUSTOM},/* CUSTOM3 */
+       {"Custom4",     "custom4",      TAB_CUSTOM},/* CUSTOM4 */
+       {"Custom5",     "custom5",      TAB_CUSTOM},/* CUSTOM5 */
 };
 
 
+int
+find_field(const char *field)
+{
+       int i;
+
+       for(i = 0; i < ITEM_FIELDS; i++)
+               if( !strcmp(abook_fields[i].key, field) )
+                       return i;
+
+       return -1;
+}
+
 int
 parse_database(FILE *in)
 {
@@ -136,10 +154,7 @@ load_database(char *filename)
        
        parse_database(in);
 
-       if ( items == 0 )
-               return 2;
-
-       return 0;
+       return (items == 0) ? 2 : 0;
 }
 
 int
@@ -242,7 +257,7 @@ validate_item(list_item item)
                item[EMAIL] = strdup("");
 
        for(i=0; i<ITEM_FIELDS; i++)
-               if( item[i] && (strlen(item[i]) > _MAX_FIELD_LEN(i) ) ) {
+               if( item[i] && ((int)strlen(item[i]) > _MAX_FIELD_LEN(i) ) ) {
                        tmp = item[i];
                        item[i][_MAX_FIELD_LEN(i)-1] = 0;
                        item[i] = strdup(item[i]);
@@ -263,9 +278,9 @@ adjust_list_capacity()
        else
                return;
 
-       database = abook_realloc(database,
+       database = (list_item *)abook_realloc(database,
                        sizeof(list_item) * list_capacity);
-       selected = abook_realloc(selected, list_capacity);
+       selected = (char *)abook_realloc(selected, list_capacity);
 }
 
 int
@@ -321,21 +336,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 +368,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 +444,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;
                        }
@@ -471,10 +511,54 @@ out:
 struct db_enumerator
 init_db_enumerator(int mode)
 {
-       struct db_enumerator new;
+       struct db_enumerator e;
 
-       new.item = -1; /* important - means "start from beginning" */
-       new.mode = mode;
+       e.item = -1; /* important - means "start from beginning" */
+       e.mode = mode;
 
-       return new;
+       return e;
+}
+
+static int
+assign_fieldname(const char *name, int i)
+{
+       char *s;
+
+       assert(name);
+       assert(i >= 0 && i < ITEM_FIELDS);
+
+       if(strcasecmp(abook_fields[i].name, name)) { /* name differs */
+               /*
+                * check if we are overwriting statically allocated default
+                */
+               if(strcasecmp(abook_fields[i].name, abook_fields[i].key))
+                       my_free(abook_fields[i].name);
+               
+               s = abook_malloc(MAX_FIELDNAME_LEN + 1);
+               snprintf(s, MAX_FIELDNAME_LEN, "%s", name);
+               abook_fields[i].name = s;
+       }
+
+       return 0;
 }
+
+int
+change_custom_field_name(const char *name, int n)
+{
+       int i;
+       char keyname[21];
+
+       assert(name);
+
+       snprintf(keyname, sizeof(keyname), "custom%d", n);
+
+       for(i = CUSTOM_MIN; i <= CUSTOM_MAX; i++) {
+               if(!strcasecmp(abook_fields[i].key, keyname)) {
+                       assign_fieldname(name, i);
+                       return i;
+               }
+       }
+
+       return -1;
+}
+