summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fleischer <calcurse@cryptocrack.de>2012-04-05 23:46:07 +0200
committerLukas Fleischer <calcurse@cryptocrack.de>2012-04-05 23:47:14 +0200
commitd0b0ed3c202c3212a65ba628026a53d9663fc2d7 (patch)
tree6fccc12c52159c462d8ae23ee3ca0a9f91ca5374
parent50be1a1772e3627fc4851d46912bd2164e3afe52 (diff)
downloadcalcurse-d0b0ed3c202c3212a65ba628026a53d9663fc2d7.zip
src/keys.c: Use generic list implementation
Be consistent and replace the custom linked list implementation we used here by the generic list implementation we use everywhere else. This reduces code complexity, while slightly improving memory overhead. Signed-off-by: Lukas Fleischer <calcurse@cryptocrack.de>
-rw-r--r--src/keys.c113
1 files changed, 36 insertions, 77 deletions
diff --git a/src/keys.c b/src/keys.c
index c35cbeb..a218d6e 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -46,13 +46,7 @@ struct keydef_s {
char *binding;
};
-struct key_str_s {
- char *str;
- struct key_str_s *next;
-};
-
-static struct key_str_s *keys[NBKEYS];
-
+static llist_t keys[NBKEYS];
static enum key actions[MAXKEYVAL];
static struct keydef_s keydef[NBKEYS] = {
@@ -135,28 +129,25 @@ keys_init (void)
for (i = 0; i < MAXKEYVAL; i++)
actions[i] = KEY_UNDEF;
- memset (keys, 0, NBKEYS);
+ for (i = 0; i < NBKEYS; i++)
+ LLIST_INIT (&keys[i]);
+}
+
+static void
+key_free (char *s)
+{
+ mem_free (s);
}
void
keys_free (void)
{
- struct key_str_s *o, **i;
- int key;
+ int i;
- for (key = 0; key < NBKEYS; key++)
+ for (i = 0; i < NBKEYS; i++)
{
- if (keys[key] == NULL)
- continue;
-
- i = &keys[key];
- while (*i)
- {
- o = *i;
- *i = o->next;
- mem_free (o->str);
- mem_free (o);
- }
+ LLIST_FREE_INNER (&keys[i], key_free);
+ LLIST_FREE (&keys[i]);
}
}
@@ -226,29 +217,10 @@ keys_getch (WINDOW *win, int *count)
static void
add_key_str (enum key action, int key)
{
- struct key_str_s *new, **i;
-
if (action < 0 || action > NBKEYS)
return;
- new = mem_malloc (sizeof (struct key_str_s));
- new->str = mem_strdup (keys_int2str (key));
- new->next = NULL;
- i = &keys[action];
- for (;;)
- {
- if (*i == NULL)
- {
- *i = new;
- break;
- }
- else if ((*i)->next == NULL)
- {
- (*i)->next = new;
- break;
- }
- i = &(*i)->next;
- }
+ LLIST_ADD (&keys[action], mem_strdup (keys_int2str (key)));
}
int
@@ -268,22 +240,20 @@ keys_assign_binding (int key, enum key action)
static void
del_key_str (enum key action, int key)
{
- struct key_str_s *old, **i;
+ llist_item_t *i;
char oldstr[BUFSIZ];
if (action < 0 || action > NBKEYS)
return;
strncpy (oldstr, keys_int2str (key), BUFSIZ);
- for (i = &keys[action]; *i; i = &(*i)->next)
+
+ LLIST_FOREACH (&keys[action], i)
{
- if (!strcmp ((*i)->str, oldstr))
+ if (strcmp (LLIST_GET_DATA (i), oldstr) == 0)
{
- old = *i;
- *i = old->next;
- mem_free (old->str);
- mem_free (old);
- break;
+ LLIST_REMOVE (&keys[action], i);
+ return;
}
}
}
@@ -291,9 +261,7 @@ del_key_str (enum key action, int key)
void
keys_remove_binding (int key, enum key action)
{
- if (key < 0 || key > MAXKEYVAL)
- return;
- else
+ if (key >= 0 && key <= MAXKEYVAL)
{
actions[key] = KEY_UNDEF;
del_key_str (action, key);
@@ -378,52 +346,43 @@ keys_int2str (int key)
int
keys_action_count_keys (enum key action)
{
- struct key_str_s *key;
- int i;
+ llist_item_t *i;
+ int n = 0;
- i = 0;
- for (key = keys[action]; key; key = key->next)
- i++;
+ LLIST_FOREACH (&keys[action], i)
+ n++;
- return i;
+ return n;
}
char *
keys_action_firstkey (enum key action)
{
- return (keys[action] != NULL) ? keys[action]->str : "XXX";
+ char *s = LLIST_GET_DATA (LLIST_FIRST (&keys[action]));
+ return (s != NULL) ? s : "XXX";
}
char *
keys_action_nkey (enum key action, int keynum)
{
- struct key_str_s *key;
- int i;
-
- i = 0;
- for (key = keys[action]; key; key = key->next)
- {
- if (i == keynum)
- return key->str;
- i++;
- }
- return NULL;
+ return LLIST_GET_DATA (LLIST_NTH (&keys[action], keynum));
}
char *
keys_action_allkeys (enum key action)
{
+ llist_item_t *i;
static char keystr[BUFSIZ];
- struct key_str_s *i;
const char *CHAR_SPACE = " ";
- if (keys[action] == NULL)
+ if (!LLIST_FIRST (&keys[action]))
return NULL;
+
keystr[0] = '\0';
- for (i = keys[action]; i; i = i->next)
+ LLIST_FOREACH (&keys[action], i)
{
const int MAXLEN = sizeof (keystr) - 1 - strlen (keystr);
- strncat (keystr, i->str, MAXLEN - 1);
+ strncat (keystr, LLIST_GET_DATA (i), MAXLEN - 1);
strncat (keystr, CHAR_SPACE, 1);
}
@@ -624,7 +583,7 @@ keys_check_missing_bindings (void)
for (i = 0; i < NBKEYS; i++)
{
- if (keys[i] == NULL)
+ if (!LLIST_FIRST (&keys[i]))
return 1;
}
return 0;
@@ -637,7 +596,7 @@ keys_fill_missing (void)
for (i = 0; i < NBKEYS; i++)
{
- if (keys[i] == NULL)
+ if (!LLIST_FIRST (&keys[i]))
{
char *p, tmpbuf[BUFSIZ];