--- /dev/null
+<html><head><title>/</title></head>
+<body>
+<h2>/</h2>
+<ul>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/.travis.yml'>.travis.yml</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/EXTENSIONS'>EXTENSIONS</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/LICENSE'>LICENSE</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/Makefile'>Makefile</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/README.md'>README.md</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/STANDARD'>STANDARD</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/arch_amd64.h'>arch_amd64.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/arch_dummy.h'>arch_dummy.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/ast.c'>ast.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/ast.h'>ast.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/conv.c'>conv.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/conv.h'>conv.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/decl.c'>decl.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/gen.c'>gen.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/gen.h'>gen.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/gen_amd64.c'>gen_amd64.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/include/'>include</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/init.c'>init.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/init.h'>init.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/lexer.c'>lexer.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/lexer.h'>lexer.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/lice.c'>lice.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/lice.h'>lice.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/list.c'>list.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/list.h'>list.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/misc/'>misc</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/opt.c'>opt.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/opt.h'>opt.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/parse.c'>parse.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/parse.h'>parse.h</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/test.c'>test.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/testrun.c'>testrun.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/'>tests</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/util.c'>util.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/util.h'>util.h</a></li>
+ </ul>
+</body></html>
--- /dev/null
+<html><head><title>/tests/</title></head>
+<body>
+<h2>/tests/</h2>
+<ul>
+<li><a href='/cgit/cgit.cgi/LICE.git/plain/'>../</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/_Bool.c'>_Bool.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/alignof.c'>alignof.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/args.c'>args.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/arithmetic.c'>arithmetic.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/array.c'>array.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/bitwise.c'>bitwise.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/cast.c'>cast.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/cgoto.c'>cgoto.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/compare.c'>compare.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/compound.c'>compound.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/control.c'>control.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/dl.c'>dl.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/enum.c'>enum.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/es.c'>es.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/extern.c'>extern.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/float.c'>float.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/function.c'>function.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/global.c'>global.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/init.c'>init.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/int.c'>int.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/kandr.c'>kandr.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/line.c'>line.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/literal.c'>literal.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/number.c'>number.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/offsetof.c'>offsetof.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/pointer.c'>pointer.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/returnaddr.c'>returnaddr.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/scope.c'>scope.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/sizeof.c'>sizeof.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/statica.c'>statica.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/struct.c'>struct.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/typeof.c'>typeof.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/types.c'>types.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/union.c'>union.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/varargs.c'>varargs.c</a></li>
+ <li><a href='/cgit/cgit.cgi/LICE.git/plain/tests/void.c'>void.c</a></li>
+ </ul>
+</body></html>
--- /dev/null
+#ifndef GMCC_UTIL_HDR
+#define GMCC_UTIL_HDR
+#include <stdbool.h>
+#include <stdio.h>
+
+#include "list.h"
+
+/*
+ * Type: string_t
+ * A type capable of representing a self-resizing string with
+ * O(1) strlen.
+ */
+typedef struct string_s string_t;
+
+/*
+ * Function: string_create
+ * Create a string object
+ */
+string_t *string_create(void);
+
+/*
+ * Function: string_buffer
+ * Return the raw buffer of a string object
+ */
+char *string_buffer(string_t *string);
+
+/*
+ * Function: string_cat
+ * Append a character to a string object
+ */
+void string_cat(string_t *string, char ch);
+
+/*
+ * Function: string_catf
+ * Append a formatted string to a string object
+ */
+void string_catf(string_t *string, const char *fmt, ...);
+
+/*
+ * Function: string_quote
+ * Escape a string's quotes
+ */
+char *string_quote(char *p);
+
+/*
+ * Function: string_length
+ * Get the length of the given string
+ */
+size_t string_length(string_t *string);
+
+/*
+ * Type: table_t
+ * A key value associative table
+ */
+typedef struct table_s table_t;
+
+struct table_s {
+ list_t *list;
+ table_t *parent;
+};
+
+/*
+ * Function: table_create
+ * Creates a table_t object
+ */
+void *table_create(void *parent);
+
+/*
+ * Funciton: table_find
+ * Searches for a given value in the table based on the
+ * key associated with it.
+ */
+void *table_find(table_t *table, const char *key);
+
+/*
+ * Function: table_insert
+ * Inserts a value for the given key as an entry in the
+ * table.
+ */
+void table_insert(table_t *table, char *key, void *value);
+
+/*
+ * Function: table_parent
+ * Returns the parent opaque object for the given table to
+ * be used as the argument to a new table.
+ */
+void *table_parent(table_t *table);
+
+/*
+ * Function: table_values
+ * Generates a list of all the values in the table, useful for
+ * iterating over the values.
+ */
+list_t *table_values(table_t *table);
+
+/*
+ * Function: table_keys
+ * Generate a list of all the keys in the table, useful for
+ * iteration over the keys.
+ */
+list_t *table_keys(table_t *table);
+
+/*
+ * Macro: SENTINEL_TABLE
+ * Initialize an empty table in place
+ */
+#define SENTINEL_TABLE ((table_t) { \
+ .list = &SENTINEL_LIST, \
+ .parent = NULL \
+})
+
+
+#define MIN(A, B) (((A) < (B)) ? (A) : (B))
+#define MAX(A, B) (((A) > (B)) ? (A) : (B))
+
+/*
+ * Function: memory_allocate
+ * Allocate some memory
+ */
+void *memory_allocate(size_t bytes);
+
+/*
+ * Structure: pair_t
+ * A class container describing a pair
+ */
+typedef struct {
+ /* Variable: first */
+ void *first;
+ /* Variable: second */
+ void *second;
+} pair_t;
+
+/*
+ * Function: pair_create
+ * Used to create a <pair_t>.
+ *
+ * Parameters:
+ * first - Pointer to first object
+ * second - Pointer to second object
+ *
+ * Returns:
+ * A pointer to a constructed <pair_t> containing first and last
+ * pointers which point to the same address as the ones supplied
+ * as parameters to this function.
+ */
+pair_t *pair_create(void *first, void *last);
+
+/* String utilities */
+int strcasecmp(const char *s1, const char *s2);
+int strncasecmp(const char *s1, const char *s2, size_t n);
+size_t getline(char **line, size_t *n, FILE *stream);
+
+/*
+ * Macro: bool_stringa
+ * Returns a "true" or "false" for an expression that evaluates to a
+ * boolean representation enforced with cast-to-bool `!!`
+ */
+#define bool_string(BOOL) \
+ ((!!(BOOL)) ? "true" : "false")
+
+#endif