--- a
+++ b/bindings.c
@@ -0,0 +1,51 @@
+/*
+ * bindings.c
+ *
+ * Heath Caldwell
+ * hncaldwell@gmail.com
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "bindings.h"
+
+struct binding *new_binding_set()
+{
+	struct binding *set;
+
+	set = malloc(sizeof(struct binding));
+	set->key = 0;
+
+	return set;
+}
+
+void add_binding(struct binding **set, int key, const char *command)
+{
+	struct binding *b;
+	int i;
+	
+	/* If a binding for this key already exists, replace it. */
+	for(b = *set; b->key; b++) {
+		if(b->key == key) {
+			b->command = (char *)command;
+			return;
+		}
+	}
+	
+	/* Keep size of set in i.  Include one for the terminating binding. */
+	for(b = *set, i = 1; b->key; b++, i++);
+
+	*set = realloc(*set, (i + 1) * sizeof(struct binding));
+	(b+1)->key = 0; /* Make last one be the terminating binding. */
+
+	/* Keep bindings sorted by command. */
+	for(b--; b >= *set && strcmp(command, b->command) < 0; b--) {
+		(b+1)->key = b->key;
+		(b+1)->command = b->command;
+	}
+
+	(b+1)->key = key;
+	(b+1)->command = (char *)command;
+}
+