#include <unistd.h>
#include <fcntl.h>
#include "abook.h"
+#include <assert.h>
#include "database.h"
#include "list.h"
#include "misc.h"
{"Nickname/Alias", "nick", TAB_OTHER},/* NICK */
{"URL", "url", TAB_OTHER},/* URL */
{"Notes", "notes", TAB_OTHER},/* NOTES */
+ {"Custom1", "custom1", TAB_CUSTOM},/* CUSTOM1 */
+ {"Custom2", "custom2", TAB_CUSTOM},/* CUSTOM2 */
+ {"Custom3", "custom3", TAB_CUSTOM},/* CUSTOM3 */
+ {"Custom4", "custom4", TAB_CUSTOM},/* CUSTOM4 */
+ {"Custom5", "custom5", TAB_CUSTOM},/* CUSTOM5 */
};
+int
+find_field(const char *field)
+{
+ int i;
+
+ for(i = 0; i < ITEM_FIELDS; i++)
+ if( !strcmp(abook_fields[i].key, field) )
+ return i;
+
+ return -1;
+}
+
int
parse_database(FILE *in)
{
parse_database(in);
- if ( items == 0 )
- return 2;
-
- return 0;
+ return (items == 0) ? 2 : 0;
}
int
item[EMAIL] = strdup("");
for(i=0; i<ITEM_FIELDS; i++)
- if( item[i] && (strlen(item[i]) > _MAX_FIELD_LEN(i) ) ) {
+ if( item[i] && ((int)strlen(item[i]) > _MAX_FIELD_LEN(i) ) ) {
tmp = item[i];
item[i][_MAX_FIELD_LEN(i)-1] = 0;
item[i] = strdup(item[i]);
else
return;
- database = abook_realloc(database,
+ database = (list_item *)abook_realloc(database,
sizeof(list_item) * list_capacity);
- selected = abook_realloc(selected, list_capacity);
+ selected = (char *)abook_realloc(selected, list_capacity);
}
int
char *
get_surname(char *s)
{
- int i, a;
- int len = strlen(s);
- char *name = strdup(s);
-
- for( a = 0, i = len - 1; i >= 0; i--, a++ ) {
- name[a] = s[i];
- if(name[a] == ' ')
- break;
- }
+ char *p = s + strlen(s);
- name[ a ] = 0;
+ assert(s != NULL);
- revstr(name);
+ while(p > s && *(p - 1) != ' ')
+ p--;
- return name;
+ return strdup(p);
}
static int
return ret;
}
+static int sort_field = -1;
+
static int
namecmp(const void *i1, const void *i2)
{
list_item a, b;
+ assert(sort_field >= 0 && sort_field <= LAST_FIELD);
+
itemcpy(a, i1);
itemcpy(b, i2);
- return safe_strcoll( a[NAME], b[NAME] );
+ return safe_strcoll( a[sort_field], b[sort_field] );
+}
+
+static int
+name2field(char *name)
+{
+ int i, ret = -1;
+
+ for(i = 0; i < ITEM_FIELDS; i++) {
+ if(!strcasecmp(name, abook_fields[i].key)) {
+ ret = i;
+ break;
+ }
+ }
+
+ return ret;
}
void
-sort_database()
+sort_by_field(int field)
{
select_none();
+
+ assert(field <= LAST_FIELD);
+
+ if(field < 0) {
+ field = name2field(opt_get_str(STR_SORT_FIELD));
+ if(field < 0) {
+ statusline_msg("Not valid field value defined "
+ "in configuration");
+ return;
+ }
+ }
+
+ sort_field = field;
qsort((void *)database, items, sizeof(list_item), namecmp);
return -2; /* error */
findstr = strdup(str);
- findstr = strupper(findstr);
+ findstr = strlower(findstr);
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) ) {
+ if( tmp && strstr(strlower(tmp), findstr) ) {
ret = e.item;
goto out;
}
struct db_enumerator
init_db_enumerator(int mode)
{
- struct db_enumerator new;
+ struct db_enumerator e;
- new.item = -1; /* important - means "start from beginning" */
- new.mode = mode;
+ e.item = -1; /* important - means "start from beginning" */
+ e.mode = mode;
- return new;
+ 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))
+ my_free(abook_fields[i].name);
+
+ s = abook_malloc(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;
+}
+