Initial import

LoxiGen is the work of several developers, not just myself.
diff --git a/c_gen/templates/README b/c_gen/templates/README
new file mode 100644
index 0000000..71c4a48
--- /dev/null
+++ b/c_gen/templates/README
@@ -0,0 +1,73 @@
+Introduction
+============
+
+LOCI is the C language module of LOXI, the Logical OpenFlow Extensible
+Interface. It provides a framework for managing OpenFlow objects in
+an object oriented fashion.
+
+All files in LOCI, even this README, are generated by LOXI. Please make
+modifications to LOXI instead of to these files directly.
+
+Compilation
+===========
+
+It's expected that users of LOCI will want to integrate it into their own build
+system. As an example, here's a simple command line to create a shared library
+on Linux:
+
+    gcc -fPIC -shared -I inc src/*.c -o loci.so
+
+LOCI has no dependencies beyond the C standard library.
+
+Documentation
+=============
+
+A Doxygen configuration file is provided. Just run `doxygen` to generate HTML
+documentation pages. Each OpenFlow object is linked to under the "Modules"
+tab.
+
+Usage
+=====
+
+Currently the best example code for using LOCI is the switchlight-core
+repository.
+
+Here's example code that creates a flow mod:
+
+    /* Create the match */
+    of_match_t match;
+    memset(&match, 0, sizeof(match));
+    match.fields.in_port = 1;
+    OF_MATCH_MASK_IN_PORT_EXACT_SET(&match);
+    match.fields.eth_type = 0x8000;
+    OF_MATCH_MASK_ETH_TYPE_EXACT_SET(&match);
+
+    /* Create a flow mod */
+    of_flow_add_t *flow_add = of_flow_add_new(OF_VERSION_1_0);
+    of_flow_add_idle_timeout_set(flow_add, 5);
+    of_flow_add_cookie_set(flow_add, 42);
+    of_flow_add_priority_set(flow_add, 10000);
+    of_flow_add_buffer_id_set(flow_add, -1);
+    if (of_flow_add_match_set(flow_add, &match)) {
+        fprintf(stderr, "Failed to set the match field\n");
+        abort();
+    }
+
+    /* Populate the action list */
+    of_list_action_t actions;
+    of_flow_add_actions_bind(flow_add, &actions);
+    int i;
+    for (i = 1; i <= 4; i++) {
+        of_action_output_t action;
+        of_action_output_init(&action, flow_add->version, -1, 1);
+        of_list_action_append_bind(&actions, (of_action_t *)&action);
+        of_action_output_port_set(&action, i);
+    }
+
+    /* Use the underlying buffer */
+    void *buf = WBUF_BUF(OF_OBJECT_TO_WBUF(flow_add));
+    uint16_t len = flow_add->length;
+    /* ... */
+
+    /* Free the flow mod */
+    of_flow_add_delete(flow_add);