]> git.deb.at Git - pkg/abook.git/blobdiff - database.c
First attempt of the better interface for filters
[pkg/abook.git] / database.c
index 1b59311fe17c7a4472466beca077966263df940b..e324810eab04c0394a3476da1c3b5ab5d4dedb75 100644 (file)
@@ -12,7 +12,6 @@
 #include <string.h>
 #include <unistd.h>
 #include <fcntl.h>
-#include "abook_curses.h"
 #include "abook.h"
 #include "database.h"
 #include "list.h"
@@ -140,9 +139,10 @@ load_database(char *filename)
 }
 
 int
-write_database(FILE *out)
+write_database(FILE *out, struct db_enumerator e)
 {
-       int i,j;
+       int j;
+       int i = 0;
 
        fprintf(out, "# abook addressbook file\n\n");
        fprintf(out, "[format]\n");
@@ -150,14 +150,18 @@ write_database(FILE *out)
        fprintf(out, "version=" VERSION "\n");
        fprintf(out, "\n\n");
 
-       for( i = 0; i < items; i++ ) {
+       db_enumerate_items(e) {
                fprintf(out, "[%d]\n", i);
                for(j=0; j<ITEM_FIELDS; j++) {
-                       if( database[i][j] != NULL && *database[i][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;
@@ -167,18 +171,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);
        
@@ -277,23 +282,13 @@ add_item2database(list_item item)
 }
 
 void
-remove_items()
+remove_selected_items()
 {
        int i, j;
 
-       if( items < 1 || curitem < 0 )
+       if( list_is_empty() )
                return;
 
-       statusline_addstr("Remove selected item(s) (Y/n)");
-       switch( getch() ) {
-               case '\r':
-               case 'y':
-               case 'Y': break;
-               default:
-                         clear_statusline();
-                         return;
-       }
-
        if( ! selected_items() )
                selected[ curitem ] = 1;
        
@@ -315,8 +310,6 @@ remove_items()
        adjust_list_capacity();
 
        select_none();
-       clear_statusline();     
-       refresh_list();
 }
 
 char *
@@ -392,110 +385,80 @@ sort_surname()
        refresh_screen();
 }
 
-void
-clear_database()
-{
-
-       statusline_addstr("Clear WHOLE database (y/N)");
-       switch( getch() ) {
-               case 'y':
-               case 'Y': break;
-               default:
-                       clear_statusline();
-                       return;
-       }
-
-       close_database();
-
-       refresh_screen();
-}
-
-void
-find(int next)
+int
+find_item(char *str, int start)
 {
        int i;
-       static char findstr[81];
-       char tmp[81];
+       char *findstr = NULL;
+       char *tmp = NULL;
+       int ret = -1; /* not found */
 
-#ifdef DEBUG
-       fprintf(stderr, "find(): findstr = |%s|\n", findstr);
-#endif
-       
-       if(next) {
-               if( !*findstr )
-                       return;
-       } else {
-               clear_statusline();
-               statusline_addstr("/");
-               statusline_getnstr(findstr, 67, 0);
-               strupper(findstr);
-               clear_statusline();
-       }
+       if(items < 1 || start < 0 || start >= LAST_ITEM)
+               return -2; /* error */
 
-       if(items < 1)
-               return;
+       findstr = strdup(str);
+       findstr = strupper(findstr);
 
-       for( i = (curitem < LAST_ITEM) && next ? curitem+1 : curitem;
-                       i < items; i++ ) {
-               strcpy(tmp, database[i][NAME]);
+       for( i = start; i < items; i++ ) {
+               tmp = strdup(database[i][NAME]);
                if( strstr(strupper(tmp), findstr) != NULL ) {
-                       curitem = i;
-                       refresh_list();
-                       break;
+                       ret = i;
+                       goto out;
                }
+               my_free(tmp);
        }
+
+out:
+       free(findstr);
+       free(tmp);
+       return ret;
 }
 
 
-void
-print_number_of_items()
+int
+is_selected(int item)
 {
-       char *str = mkstr("     " "|%3d/%3d", selected_items(), items);
-
-       mvaddstr(0, COLS-strlen(str), str);
-
-       free(str);
+       return selected[item];
 }
 
-void
-read_database()
+int
+real_db_enumerate_items(struct db_enumerator e)
 {
-       if(items > 0) {
-               statusline_addstr("Your current data will be lost - Press 'y' to continue");
-               switch( getch() ) {
-                       case 'y':
-                       case 'Y': break;
-                       default: clear_statusline();
-                                return;
-               }
-               clear_statusline();
+       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
        }
-
-       load_database(datafile);
-       refresh_list();
+out:
+       return (item > LAST_ITEM || item < 0) ? -1 : item;
 }
 
-
-void
-print_database()
+struct db_enumerator
+init_db_enumerator(int mode)
 {
-       FILE *handle;
-       char *command = options_get_str("print_command");
+       struct db_enumerator new;
 
-       statusline_addstr("Print addressbook? (y/N)");
-       switch( getch() ) {
-               case 'y':
-               case 'Y':
-                       break;
-               default: clear_statusline(); return;
-       }
-       clear_statusline();
-
-       if( ! *command || (handle = popen(command, "w")) == NULL)
-               return;
+       new.item = -1; /* important - means "start from beginning" */
+       new.mode = mode;
 
-       fexport("text", handle);
-       
-       pclose(handle);
+       return new;
 }
-