]> git.deb.at Git - pkg/abook.git/blobdiff - database.c
filter updates
[pkg/abook.git] / database.c
index a2c396dedb3a676033f85f870b842fc3dbf67112..17aaf2fac0fef6722ff13bffc9773f259f1a739c 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * $Id$
  *
- * by JH <jheinonen@bigfoot.com>
+ * by JH <jheinonen@users.sourceforge.net>
  *
  * Copyright (C) Jaakko Heinonen
  */
@@ -107,9 +107,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);
        }
 
@@ -139,24 +142,31 @@ load_database(char *filename)
 }
 
 int
-write_database(FILE *out)
+write_database(FILE *out, struct db_enumerator e)
 {
-       int i,j;
-
-       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");
-
-       for( i = 0; i < items; i++ ) {
+       int j;
+       int i = 0;
+
+       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++) {
-                       if( database[i][j] != NULL && *database[i][j] )
+               for(j = 0; j < ITEM_FIELDS; j++) {
+                       if( database[e.item][j] != NULL &&
+                                       *database[e.item][j] )
                                fprintf(out, "%s=%s\n",
-                                       abook_fields[j].key, database[i][j]);
+                                       abook_fields[j].key,
+                                       database[e.item][j]
+                                       );
                }
                fputc('\n', out);
+               i++;
        }
 
        return 0;
@@ -166,18 +176,19 @@ int
 save_database()
 {
        FILE *out;
+       struct db_enumerator e = init_db_enumerator(ENUM_ALL);
 
        if( (out = abook_fopen(datafile, "w")) == NULL )
                return -1;
 
-       if( items < 1 ) {
+       if( list_is_empty() ) {
                fclose(out);
                unlink(datafile);
                return 1;
        }
 
        
-       write_database(out);
+       write_database(out, e);
        
        fclose(out);
        
@@ -280,7 +291,7 @@ remove_selected_items()
 {
        int i, j;
 
-       if( items < 1 || curitem < 0 )
+       if( list_is_empty() )
                return;
 
        if( ! selected_items() )
@@ -380,26 +391,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:
@@ -414,3 +429,51 @@ 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)
+{
+       int item = max(0, e.item + 1);
+       int i;
+       
+       switch(e.mode) {
+#ifdef DEBUG
+               case ENUM_ALL:
+                       break;
+#endif
+               case ENUM_SELECTED:
+                       for(i = item; i < items; i++) {
+                               if(is_selected(i)) {
+                                       item = i;
+                                       goto out;
+                               }
+                       }
+                       return -1;
+#ifdef DEBUG
+               default:
+                       fprintf(stderr, "real_db_enumerate_items() "
+                                       "BUG: unknown db_enumerator mode: %d\n",
+                                       e.mode);
+                       break;
+#endif
+       }
+out:
+       return (item > LAST_ITEM || item < 0) ? -1 : item;
+}
+
+struct db_enumerator
+init_db_enumerator(int mode)
+{
+       struct db_enumerator new;
+
+       new.item = -1; /* important - means "start from beginning" */
+       new.mode = mode;
+
+       return new;
+}