Include data structures for assembler
diff --git a/as/map.c b/as/map.c
new file mode 100644
index 0000000..e990af9
--- /dev/null
+++ b/as/map.c
@@ -0,0 +1,208 @@
+#include "map.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+
+#ifdef MAP_DEBUG
+#define MAP_DEBUG_PRINTF printf
+#else
+#define MAP_DEBUG_PRINTF // nothing
+#endif
+
+map_t *new_map_sized(uint64_t size)
+{
+	map_t *m = malloc(sizeof(map_t));
+
+	/*
+	 * Calloc zeroes the memory, which is what we want.
+	 */
+
+	map_node empty = EMPTY_NODE;
+
+	m->items = calloc(size, sizeof(map_node));
+	m->len = MAP_ALLOC_SIZE;
+	m->full = 0;
+
+	for (int i = 0; i < m->len; i++)
+	{
+		m->items[i] = empty;
+	}
+
+	return m;
+}
+
+map_t *new_map()
+{
+	return new_map_sized(MAP_ALLOC_SIZE);
+}
+
+void free_map(map_t *m)
+{
+	free(m->items);
+	free(m);
+}
+
+void free_map_items(map_t *m)
+{
+	for (int i = 0; i < m->len; i++)
+	{
+		if (m->items[i].key != NULL)
+		{
+			free(m->items[i].key);
+			free(m->items[i].val);
+		}
+	}
+	free(m->items);
+	free(m);
+}
+
+void map_set(map_t *m, char *k, void *v)
+{
+	uint64_t h = hash(k);
+	uint32_t i = h % m->len;
+
+	MAP_DEBUG_PRINTF("hash %u i %u\n", h, i);
+
+	m->count++;
+
+	if (m->full++ < m->len)
+	{
+		map_node val =
+				{
+						malloc(strlen(k)),
+						v,
+						1,
+						h,
+				};
+
+		strcpy(val.key, k);
+
+		uint32_t current = i;
+
+		while (MAP_USED_AT(m->items, current))
+		{
+			if (current == m->len - 1)
+			{
+				current = 0;
+			}
+			else
+			{
+				current++;
+			}
+		}
+
+		MAP_DEBUG_PRINTF("Current %d\n", current);
+
+		m->items[current] = val;
+
+		MAP_DEBUG_PRINTF("val %d\n", *(int *) m->items[current].val);
+	}
+	else
+	{
+		/* resize map */
+		map_t *n_m = new_map_sized(m->len * 2);
+
+		for (uint64_t j = 0; j < m->len; j++)
+		{
+			if (!MAP_USED_AT(m->items, j))
+			{
+				continue;
+			}
+
+			uint32_t current = m->items[j].h;
+
+			while (MAP_USED_AT(m->items, current))
+			{
+				if (current == m->len - 1)
+				{
+					current = 0;
+				}
+				else
+				{
+					current++;
+				}
+			}
+
+			n_m->items[current] = m->items[j];
+		}
+
+		free_map(m);
+		m = n_m;
+	}
+}
+
+int map_exists(map_t *m, char *k)
+{
+	uint64_t h = hash(k);
+	uint32_t i = h % m->len;
+
+	uint32_t current = i;
+
+	while (m->items[current].used)
+	{
+		if (strcmp(m->items[current].key, k) == 0)
+		{
+			return 1;
+		}
+
+		if (current >= m->len - 1)
+		{
+			current = 0;
+			MAP_DEBUG_PRINTF("Current reset to 0\n");
+		}
+		else
+		{
+			current++;
+			MAP_DEBUG_PRINTF("Incrementing current\n");
+		}
+	}
+
+	return 0;
+}
+
+void *map_get(map_t *m, char *k)
+{
+	uint64_t h = hash(k);
+	uint32_t i = h % m->len;
+
+	uint32_t current = i;
+
+	MAP_DEBUG_PRINTF("%s should be %s\n", m->items[current].key, k);
+	MAP_DEBUG_PRINTF("streq %d\n", strcmp(m->items[current].key, k));
+
+	MAP_DEBUG_PRINTF("Current get %d\n", current);
+
+	while (strcmp(m->items[current].key, k) != 0)
+	{
+		MAP_DEBUG_PRINTF("While at %d\n", current);
+		if (current >= m->len - 1)
+		{
+			current = 0;
+			MAP_DEBUG_PRINTF("Current reset to 0\n");
+		}
+		else
+		{
+			current++;
+			MAP_DEBUG_PRINTF("Incrementing current\n");
+		}
+	}
+
+	MAP_DEBUG_PRINTF("val %d\n", *(int *) m->items[current].val);
+
+	return m->items[current].val;
+
+	//return 1;
+}
+
+void map_debug(map_t *m)
+{
+	for (int i = 0; i < m->len; i++)
+	{
+		if (m->items[i].val != NULL)
+		{
+			MAP_DEBUG_PRINTF("i = %d, k = %s, v = %d\n",
+							 i, m->items[i].key, *(int *) m->items[i].val);
+		}
+	}
+}