You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by ma...@apache.org on 2012/06/14 02:37:50 UTC

[lucy-commits] svn commit: r1350066 - /lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c

Author: marvin
Date: Thu Jun 14 00:37:50 2012
New Revision: 1350066

URL: http://svn.apache.org/viewvc?rev=1350066&view=rev
Log:
Register conf additions rather than add directly.

Add conf elements such as pound-defines, typedefs, etc to a registry,
then write them all out in a bunch at the end of each module.

Modified:
    lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c

Modified: lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c
URL: http://svn.apache.org/viewvc/lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c?rev=1350066&r1=1350065&r2=1350066&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c Thu Jun 14 00:37:50 2012
@@ -26,8 +26,32 @@
 #include <stdlib.h>
 #include <string.h>
 
+typedef enum ConfElemType {
+    CONFELEM_DEF,
+    CONFELEM_TYPEDEF,
+    CONFELEM_SYS_INCLUDE,
+    CONFELEM_LOCAL_INCLUDE
+} ConfElemType;
+
+typedef struct ConfElem {
+    char *str1;
+    char *str2;
+    ConfElemType type;
+} ConfElem;
+
 /* Static vars. */
 static FILE *charmony_fh  = NULL;
+static ConfElem *defs      = NULL;
+static size_t    def_cap   = 0;
+static size_t    def_count = 0;
+
+/* Push a new elem onto the def list. */
+static void
+S_push_def_list_item(const char *str1, const char *str2, ConfElemType type);
+
+/* Free the def list. */
+static void
+S_clear_def_list(void);
 
 void
 ConfWriter_init(void) {
@@ -97,6 +121,11 @@ S_sym_is_uppercase(const char *sym) {
 
 void
 ConfWriter_add_def(const char *sym, const char *value) {
+    S_push_def_list_item(sym, value, CONFELEM_DEF);
+}
+
+static void
+S_append_def_to_conf(const char *sym, const char *value) {
     if (value) {
         if (S_sym_is_uppercase(sym)) {
             fprintf(charmony_fh, "#define CHY_%s %s\n", sym, value);
@@ -117,6 +146,11 @@ ConfWriter_add_def(const char *sym, cons
 
 void
 ConfWriter_add_typedef(const char *type, const char *alias) {
+    S_push_def_list_item(type, alias, CONFELEM_TYPEDEF);
+}
+
+static void
+S_append_typedef_to_conf(const char *type, const char *alias) {
     if (S_sym_is_uppercase(alias)) {
         fprintf(charmony_fh, "typedef %s CHY_%s;\n", type, alias);
     }
@@ -127,11 +161,21 @@ ConfWriter_add_typedef(const char *type,
 
 void
 ConfWriter_add_sys_include(const char *header) {
+    S_push_def_list_item(header, NULL, CONFELEM_SYS_INCLUDE);
+}
+
+static void
+S_append_sys_include_to_conf(const char *header) {
     fprintf(charmony_fh, "#include <%s>\n", header);
 }
 
 void
 ConfWriter_add_local_include(const char *header) {
+    S_push_def_list_item(header, NULL, CONFELEM_LOCAL_INCLUDE);
+}
+
+static void
+S_append_local_include_to_conf(const char *header) {
     fprintf(charmony_fh, "#include \"%s\"\n", header);
 }
 
@@ -158,6 +202,27 @@ ConfWriter_start_module(const char *modu
 
 void
 ConfWriter_end_module(void) {
+    size_t i;
+    for (i = 0; i < def_count; i++) {
+        switch (defs[i].type) {
+            case CONFELEM_DEF:
+                S_append_def_to_conf(defs[i].str1, defs[i].str2);
+                break;
+            case CONFELEM_TYPEDEF:
+                S_append_typedef_to_conf(defs[i].str1, defs[i].str2);
+                break;
+            case CONFELEM_SYS_INCLUDE:
+                S_append_sys_include_to_conf(defs[i].str1);
+                break;
+            case CONFELEM_LOCAL_INCLUDE:
+                S_append_local_include_to_conf(defs[i].str1);
+                break;
+            default:
+                Util_die("Internal error: bad element type %d",
+                         (int)defs[i].type);
+        }
+    }
+    S_clear_def_list();
     ConfWriter_append_conf("\n");
 }
 
@@ -176,4 +241,28 @@ ConfWriter_shorten_function(const char *
     ConfWriter_append_conf("  #define %s chy_%s\n", sym, sym);
 }
 
+static void
+S_push_def_list_item(const char *str1, const char *str2, ConfElemType type) {
+    if (def_count >= def_cap) {
+        def_cap += 10;
+        defs = (ConfElem*)realloc(defs, def_cap * sizeof(ConfElem));
+    }
+    defs[def_count].str1 = str1 ? Util_strdup(str1) : NULL;
+    defs[def_count].str2 = str2 ? Util_strdup(str2) : NULL;
+    defs[def_count].type = type;
+    def_count++;
+}
+
+static void
+S_clear_def_list(void) {
+    size_t i;
+    for (i = 0; i < def_count; i++) {
+        free(defs[i].str1);
+        free(defs[i].str2);
+    }
+    free(defs);
+    defs      = NULL;
+    def_cap   = 0;
+    def_count = 0;
+}