+
+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 e;
+
+ e.item = -1; /* important - means "start from beginning" */
+ e.mode = mode;
+
+ 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))
+ xfree(abook_fields[i].name);
+
+ s = xmalloc_inc(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;
+}
+