X-Git-Url: https://git.deb.at/w?a=blobdiff_plain;f=database.c;h=1577966471f4e7e2ab2636562c8cd81ad3f603ce;hb=173dbfc5de56d2bf7d5ff2e01f7e54cfbebcff21;hp=2bcda3de5583af412c73dd145df5c9b473e805d4;hpb=5f686aabd6d8d5183bb391cf6103a334aef29268;p=pkg%2Fabook.git diff --git a/database.c b/database.c index 2bcda3d..1577966 100644 --- a/database.c +++ b/database.c @@ -139,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"); @@ -149,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= 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 +424,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; +}