]> git.deb.at Git - pkg/abook.git/blobdiff - database.h
Upload 0.6.1-2 to unstable
[pkg/abook.git] / database.h
index 0c47fd49bda38a7e37df61504f0493024e972ba3..23ee2943f9e3c5fbd7140c9f12ec12a1da65f186 100644 (file)
@@ -1,16 +1,16 @@
 #ifndef _DATABASE_H
 #define _DATABASE_H
 
-
-#define MAX_EMAILS             4
+#define MAX_LIST_ITEMS         9
 #define MAX_EMAIL_LEN          80
-#define MAX_EMAILSTR_LEN       (MAX_EMAILS*MAX_EMAIL_LEN + MAX_EMAILS + 1)
+#define MAX_EMAILSTR_LEN       (MAX_LIST_ITEMS * (MAX_EMAIL_LEN + 1) + 1)
 #define MAX_FIELD_LEN          81
 
-enum {
-       NAME,
+enum field_types {
+       NAME = 0, /* important */
        EMAIL,
        ADDRESS,
+        ADDRESS2,
        CITY,
        STATE,
        ZIP,
@@ -21,55 +21,120 @@ enum {
        MOBILEPHONE,
        NICK,
        URL,
-       NOTES
+       NOTES,
+       ANNIVERSARY,
+       GROUPS,
+       ITEM_FIELDS /* this is the last */
 };
 
-#define LAST_FIELD             NOTES
+typedef struct {
+       char *key;
+       char *name;
+       int type;
+} abook_field;
 
-#define ITEM_FIELDS            (LAST_FIELD+1)
+typedef struct abook_field_list_t {
+       abook_field *field;
+       struct abook_field_list_t *next;
+} abook_field_list;
 
-typedef char * list_item[ITEM_FIELDS];
+typedef char **list_item;
 
-struct abook_field {
-       char *name;
-       char *key;
-       int tab;
+enum {
+       FIELD_STRING = 1,
+       FIELD_EMAILS,
+       FIELD_LIST,
+       FIELD_DATE,
+};
+
+enum {
+       ENUM_ALL,
+       ENUM_SELECTED
+};
+
+struct db_enumerator {
+       int item;
+       int mode; /* warning: read only */
 };
 
-int            parse_database(FILE *in);
-int            write_database(FILE *out);
-int            load_database(char *filename);
-int            save_database();
-void           close_database();
-int            add_item2database(list_item item);
-void           free_list_item(list_item item);
-void           remove_selected_items();
-void           sort_surname();
-void           sort_database();
-char           *get_surname(char *s);
-int            find_item(char *str, int start);
-int            is_selected(int item);
-
-
-#define LAST_ITEM      (items - 1)
-
-#define itemcpy(dest, src)     memmove(dest, src, sizeof(list_item))
-
-#define split_emailstr(item, emails) do {\
-       int _i,_j,_k,len; \
-       memset(&emails, 0, sizeof(emails) ); \
-       len = strlen(database[item][EMAIL]); \
-       for( _i=0,_j=0, _k=0; _i < len && _j < 4; _i++ ) { \
-               if( database[item][EMAIL][_i] ==',' ) { \
-                       _j++; \
-                       _k = 0; \
-               } else \
-                       if( _k < MAX_EMAIL_LEN -1 ) \
-                               emails[_j][_k++] = database[item][EMAIL][_i]; \
-       } \
-} while(0)
-
-#define have_multiple_emails(item) \
-       strchr(database[item][EMAIL], ',')
-
-#endif
+
+/*
+ * Field operations
+ */
+inline int field_id(int i);
+abook_field *find_standard_field(char *key, int do_declare);
+abook_field *real_find_field(char *key, abook_field_list *list, int *nb);
+#define find_field(key, list)          real_find_field(key, list, NULL)
+#define find_field_number(key, pt_nb)  real_find_field(key, NULL, pt_nb)
+#define find_declared_field(key)       find_field(key,NULL)
+void get_field_info(int i, char **key, char **name, int *type);
+void add_field(abook_field_list **list, abook_field *f);
+char *declare_new_field(char *key, char *name, char *type, int accept_standard);
+void init_standard_fields();
+
+/*
+ * Various database operations
+ */
+void prepare_database_internals();
+int parse_database(FILE *in);
+int load_database(char *filename);
+int write_database(FILE *out, struct db_enumerator e);
+int save_database();
+void remove_selected_items();
+void merge_selected_items();
+void remove_duplicates();
+void sort_surname();
+void sort_by_field(char *field);
+void close_database();
+int add_item2database(list_item item);
+char *get_surname(char *s);
+int find_item(char *str, int start, int search_fields[]);
+int is_selected(int item);
+int is_valid_item(int item);
+int last_item();
+int db_n_items();
+
+int real_db_enumerate_items(struct db_enumerator e);
+struct db_enumerator init_db_enumerator(int mode);
+#define db_enumerate_items(e) \
+       while( -1 != (e.item = real_db_enumerate_items(e)))
+
+/*
+ * item manipulation
+ */
+list_item item_create();
+void item_empty(list_item item);
+void item_free(list_item *item);
+void item_copy(list_item dest, list_item src);
+void item_duplicate(list_item dest, list_item src);
+void item_merge(list_item dest, list_item src);
+
+int item_fput(list_item item, int i, char *val);
+char *item_fget(list_item item, int i);
+
+/*
+ * database field read
+ */
+char *real_db_field_get(int item, int i, int std);
+#define db_fget(item, i)               real_db_field_get(item, i, 1)
+#define db_fget_byid(item, i)          real_db_field_get(item, i, 0)
+#define db_name_get(item)              db_fget(item, NAME)
+char *db_email_get(int item); /* memory has to be freed by the caller */
+
+/*
+ * database field write
+ */
+int real_db_field_put(int item, int i, int std, char *val);
+#define db_fput(item, i, val) \
+                       real_db_field_put(item, i, 1, val)
+#define db_fput_byid(item, i, val) \
+                       real_db_field_put(item, i, 0, val)
+
+/*
+ * database item read
+ */
+list_item db_item_get(int i);
+
+
+#endif /* _DATABASE_H */
+