}
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");
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;
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);
{
int i, j;
- if( items < 1 || curitem < 0 )
+ if( list_is_empty() )
return;
if( ! selected_items() )
}
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:
{
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;
+}