Author: marvin
Date: Fri Jun 15 15:54:48 2012
New Revision: 1350667

URL: http://svn.apache.org/viewvc?rev=1350667&view=rev
Log:
Factor ConfWriterC out of ConfWriter.

Move all code which is specific to writing the C header config format
into ConfWriterC, transforming ConfWriter into a generic dispatcher.

Added:
    lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c
      - copied, changed from r1350647, 
lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c
    lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h
      - copied, changed from r1350647, 
lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.h
Modified:
    lucy/trunk/charmonizer/buildbin/meld.pl
    lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c

Modified: lucy/trunk/charmonizer/buildbin/meld.pl
URL: 
http://svn.apache.org/viewvc/lucy/trunk/charmonizer/buildbin/meld.pl?rev=1350667&r1=1350666&r2=1350667&view=diff
==============================================================================
--- lucy/trunk/charmonizer/buildbin/meld.pl (original)
+++ lucy/trunk/charmonizer/buildbin/meld.pl Fri Jun 15 15:54:48 2012
@@ -61,8 +61,17 @@ if ( !@probes ) {
     @probes = map { $_ =~ s/\.c$//; $_ } grep {/\.c$/} readdir $dh;
 }
 
+my @core = qw(
+    Compiler
+    ConfWriter
+    ConfWriterC
+    HeaderChecker
+    OperatingSystem
+    Util
+);
+
 # Add Core headers.
-for (qw( Defines Compiler ConfWriter HeaderChecker OperatingSystem Util )) {
+for ( 'Defines', @core ) {
     push @charm_files, catfile( qw( src Charmonizer Core ), "$_.h" );
 }
 push @charm_files, catfile(qw( src Charmonizer Probe.h ));
@@ -73,7 +82,7 @@ for ( sort @probes ) {
 }
 
 # Add Core implementation files.
-for (qw( Compiler ConfWriter HeaderChecker OperatingSystem Util )) {
+for (@core) {
     push @charm_files, catfile( qw( src Charmonizer Core ), "$_.c" );
 }
 push @charm_files, catfile(qw( src Charmonizer Probe.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=1350667&r1=1350666&r2=1350667&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c Fri Jun 15 
15:54:48 2012
@@ -18,167 +18,48 @@
 
 #include "Charmonizer/Core/Util.h"
 #include "Charmonizer/Core/ConfWriter.h"
-#include "Charmonizer/Core/OperatingSystem.h"
-#include "Charmonizer/Core/Compiler.h"
-#include <errno.h>
+#include "Charmonizer/Core/ConfWriterC.h"
 #include <stdarg.h>
 #include <stdio.h>
-#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;
-
-/* Open the charmony.h file handle.  Print supplied text to it, if non-null.
- * Print an explanatory comment and open the include guard.
- */
-static void
-S_open_charmony_h(const char *charmony_start);
-
-/* 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) {
-    S_open_charmony_h(NULL);
+    ConfWriterC_enable();
     return;
 }
 
-static void
-S_open_charmony_h(const char *charmony_start) {
-    /* Open the filehandle. */
-    charmony_fh = fopen("charmony.h", "w+");
-    if (charmony_fh == NULL) {
-        Util_die("Can't open 'charmony.h': %s", strerror(errno));
-    }
-
-    /* Print supplied text (if any) along with warning, open include guard. */
-    if (charmony_start != NULL) {
-        fwrite(charmony_start, sizeof(char), strlen(charmony_start),
-               charmony_fh);
-    }
-    fprintf(charmony_fh,
-            "/* Header file auto-generated by Charmonizer. \n"
-            " * DO NOT EDIT THIS FILE!!\n"
-            " */\n\n"
-            "#ifndef H_CHARMONY\n"
-            "#define H_CHARMONY 1\n\n"
-           );
-}
-
 void
 ConfWriter_clean_up(void) {
-    /* Write the last bit of charmony.h and close. */
-    fprintf(charmony_fh, "#endif /* H_CHARMONY */\n\n");
-    if (fclose(charmony_fh)) {
-        Util_die("Couldn't close 'charmony.h': %s", strerror(errno));
-    }
+    ConfWriterC_clean_up();
 }
 
 void
 ConfWriter_append_conf(const char *fmt, ...) {
     va_list args;
-
+    
     va_start(args, fmt);
-    vfprintf(charmony_fh, fmt, args);
+    ConfWriterC_vappend_conf(fmt, args);
     va_end(args);
 }
 
-static int
-S_sym_is_uppercase(const char *sym) {
-    unsigned i;
-    for (i = 0; sym[i] != 0; i++) {
-        if (!isupper(sym[i])) {
-            if (islower(sym[i])) {
-                return false;
-            }
-            else if (sym[i] != '_') {
-                return true;
-            }
-        }
-    }
-    return true;
-}
-
 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);
-        }
-        else {
-            fprintf(charmony_fh, "#define chy_%s %s\n", sym, value);
-        }
-    }
-    else {
-        if (S_sym_is_uppercase(sym)) {
-            fprintf(charmony_fh, "#define CHY_%s\n", sym);
-        }
-        else {
-            fprintf(charmony_fh, "#define chy_%s\n", sym);
-        }
-    }
+    ConfWriterC_add_def(sym, value);
 }
 
 void
 ConfWriter_add_typedef(const char *type, const char *alias) {
-    S_push_def_list_item(alias, type, 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);
-    }
-    else {
-        fprintf(charmony_fh, "typedef %s chy_%s;\n", type, alias);
-    }
+    ConfWriterC_add_typedef(type, alias);
 }
 
 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);
+    ConfWriterC_add_sys_include(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);
+    ConfWriterC_add_local_include(header);
 }
 
 void
@@ -186,90 +67,11 @@ ConfWriter_start_module(const char *modu
     if (chaz_Util_verbosity > 0) {
         printf("Running %s module...\n", module_name);
     }
-    ConfWriter_append_conf("\n/* %s */\n", module_name);
+    ConfWriterC_start_module(module_name);
 }
 
 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].str2, defs[i].str1);
-                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);
-        }
-    }
-
-    /* Write out short names. */
-    ConfWriter_append_conf(
-        "\n#if defined(CHY_USE_SHORT_NAMES) "
-        "|| defined(CHAZ_USE_SHORT_NAMES)\n"
-    );
-    for (i = 0; i < def_count; i++) {
-        switch (defs[i].type) {
-            case CONFELEM_DEF: 
-            case CONFELEM_TYPEDEF:
-                {
-                    const char *sym = defs[i].str1;
-                    const char *value = defs[i].str2;
-                    if (!value || strcmp(sym, value) != 0) {
-                        const char *prefix = S_sym_is_uppercase(sym)
-                                             ? "CHY_" : "chy_";
-                        ConfWriter_append_conf("  #define %s %s%s\n", sym,
-                                               prefix, sym);
-                    }
-                }
-                break;
-            case CONFELEM_SYS_INCLUDE:
-            case CONFELEM_LOCAL_INCLUDE:
-                /* no-op */
-                break;
-            default:
-                Util_die("Internal error: bad element type %d",
-                         (int)defs[i].type);
-        }
-    }
-
-    ConfWriter_append_conf("#endif /* USE_SHORT_NAMES */\n");
-    ConfWriter_append_conf("\n");
-
-    S_clear_def_list();
-}
-
-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;
+    ConfWriterC_end_module();
 }
 

Copied: lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c (from 
r1350647, lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c)
URL: 
http://svn.apache.org/viewvc/lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c?p2=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c&p1=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c&r1=1350647&r2=1350667&rev=1350667&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.c (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c Fri Jun 15 
15:54:48 2012
@@ -17,7 +17,7 @@
 #define CHAZ_USE_SHORT_NAMES
 
 #include "Charmonizer/Core/Util.h"
-#include "Charmonizer/Core/ConfWriter.h"
+#include "Charmonizer/Core/ConfWriterC.h"
 #include "Charmonizer/Core/OperatingSystem.h"
 #include "Charmonizer/Core/Compiler.h"
 #include <errno.h>
@@ -60,7 +60,7 @@ static void
 S_clear_def_list(void);
 
 void
-ConfWriter_init(void) {
+ConfWriterC_enable(void) {
     S_open_charmony_h(NULL);
     return;
 }
@@ -88,7 +88,7 @@ S_open_charmony_h(const char *charmony_s
 }
 
 void
-ConfWriter_clean_up(void) {
+ConfWriterC_clean_up(void) {
     /* Write the last bit of charmony.h and close. */
     fprintf(charmony_fh, "#endif /* H_CHARMONY */\n\n");
     if (fclose(charmony_fh)) {
@@ -97,14 +97,19 @@ ConfWriter_clean_up(void) {
 }
 
 void
-ConfWriter_append_conf(const char *fmt, ...) {
+ConfWriterC_append_conf(const char *fmt, ...) {
     va_list args;
 
     va_start(args, fmt);
-    vfprintf(charmony_fh, fmt, args);
+    ConfWriterC_vappend_conf(fmt, args);
     va_end(args);
 }
 
+void
+ConfWriterC_vappend_conf(const char *fmt, va_list args) {
+    vfprintf(charmony_fh, fmt, args);
+}
+
 static int
 S_sym_is_uppercase(const char *sym) {
     unsigned i;
@@ -122,7 +127,7 @@ S_sym_is_uppercase(const char *sym) {
 }
 
 void
-ConfWriter_add_def(const char *sym, const char *value) {
+ConfWriterC_add_def(const char *sym, const char *value) {
     S_push_def_list_item(sym, value, CONFELEM_DEF);
 }
 
@@ -147,7 +152,7 @@ S_append_def_to_conf(const char *sym, co
 }
 
 void
-ConfWriter_add_typedef(const char *type, const char *alias) {
+ConfWriterC_add_typedef(const char *type, const char *alias) {
     S_push_def_list_item(alias, type, CONFELEM_TYPEDEF);
 }
 
@@ -162,7 +167,7 @@ S_append_typedef_to_conf(const char *typ
 }
 
 void
-ConfWriter_add_sys_include(const char *header) {
+ConfWriterC_add_sys_include(const char *header) {
     S_push_def_list_item(header, NULL, CONFELEM_SYS_INCLUDE);
 }
 
@@ -172,7 +177,7 @@ S_append_sys_include_to_conf(const char 
 }
 
 void
-ConfWriter_add_local_include(const char *header) {
+ConfWriterC_add_local_include(const char *header) {
     S_push_def_list_item(header, NULL, CONFELEM_LOCAL_INCLUDE);
 }
 
@@ -182,15 +187,12 @@ S_append_local_include_to_conf(const cha
 }
 
 void
-ConfWriter_start_module(const char *module_name) {
-    if (chaz_Util_verbosity > 0) {
-        printf("Running %s module...\n", module_name);
-    }
-    ConfWriter_append_conf("\n/* %s */\n", module_name);
+ConfWriterC_start_module(const char *module_name) {
+    ConfWriterC_append_conf("\n/* %s */\n", module_name);
 }
 
 void
-ConfWriter_end_module(void) {
+ConfWriterC_end_module(void) {
     size_t i;
     for (i = 0; i < def_count; i++) {
         switch (defs[i].type) {
@@ -213,7 +215,7 @@ ConfWriter_end_module(void) {
     }
 
     /* Write out short names. */
-    ConfWriter_append_conf(
+    ConfWriterC_append_conf(
         "\n#if defined(CHY_USE_SHORT_NAMES) "
         "|| defined(CHAZ_USE_SHORT_NAMES)\n"
     );
@@ -227,7 +229,7 @@ ConfWriter_end_module(void) {
                     if (!value || strcmp(sym, value) != 0) {
                         const char *prefix = S_sym_is_uppercase(sym)
                                              ? "CHY_" : "chy_";
-                        ConfWriter_append_conf("  #define %s %s%s\n", sym,
+                        ConfWriterC_append_conf("  #define %s %s%s\n", sym,
                                                prefix, sym);
                     }
                 }
@@ -242,8 +244,8 @@ ConfWriter_end_module(void) {
         }
     }
 
-    ConfWriter_append_conf("#endif /* USE_SHORT_NAMES */\n");
-    ConfWriter_append_conf("\n");
+    ConfWriterC_append_conf("#endif /* USE_SHORT_NAMES */\n");
+    ConfWriterC_append_conf("\n");
 
     S_clear_def_list();
 }

Copied: lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h (from 
r1350647, lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.h)
URL: 
http://svn.apache.org/viewvc/lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h?p2=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h&p1=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.h&r1=1350647&r2=1350667&rev=1350667&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriter.h (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h Fri Jun 15 
15:54:48 2012
@@ -14,83 +14,86 @@
  * limitations under the License.
  */
 
-/* Charmonizer/Core/ConfWriter.h -- Write to a config file.
+/* Charmonizer/Core/ConfWriterC.h -- Write to a C header file.
  */
 
-#ifndef H_CHAZ_CONFWRITER
-#define H_CHAZ_CONFWRITER 1
+#ifndef H_CHAZ_CONFWRITERC
+#define H_CHAZ_CONFWRITERC 1
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
 #include <stddef.h>
+#include <stdarg.h>
 #include "Charmonizer/Core/Defines.h"
 
-/* Initialize elements needed by ConfWriter.  Must be called before anything
- * else, but after os and compiler are initialized.
+/* Enable writing config to a C header file.
  */
 void
-chaz_ConfWriter_init(void);
+chaz_ConfWriterC_enable(void);
 
 /* Close the include guard on charmony.h, then close the file.  Delete temp
  * files and perform any other needed cleanup.
  */
 void
-chaz_ConfWriter_clean_up(void);
+chaz_ConfWriterC_clean_up(void);
 
 /* Print output to charmony.h.
  */
 void
-chaz_ConfWriter_append_conf(const char *fmt, ...);
+chaz_ConfWriterC_append_conf(const char *fmt, ...);
+
+void
+chaz_ConfWriterC_vappend_conf(const char *fmt, va_list args);
 
 /* Add a pound-define.
  */
 void
-chaz_ConfWriter_add_def(const char *sym, const char *value);
+chaz_ConfWriterC_add_def(const char *sym, const char *value);
 
 /* Add a typedef.
  */
 void
-chaz_ConfWriter_add_typedef(const char *type, const char *alias);
+chaz_ConfWriterC_add_typedef(const char *type, const char *alias);
 
 /* Pound-include a system header (within angle brackets).
  */
 void
-chaz_ConfWriter_add_sys_include(const char *header);
+chaz_ConfWriterC_add_sys_include(const char *header);
 
 /* Pound-include a locally created header (within quotes).
  */
 void
-chaz_ConfWriter_add_local_include(const char *header);
+chaz_ConfWriterC_add_local_include(const char *header);
 
 /* Print a "chapter heading" comment in the conf file when starting a module.
  */
 void
-chaz_ConfWriter_start_module(const char *module_name);
+chaz_ConfWriterC_start_module(const char *module_name);
 
 /* Leave a little whitespace at the end of each module.
  */
 void
-chaz_ConfWriter_end_module(void);
+chaz_ConfWriterC_end_module(void);
 
 #ifdef   CHAZ_USE_SHORT_NAMES
-  #define ConfWriter_init                   chaz_ConfWriter_init
-  #define ConfWriter_clean_up               chaz_ConfWriter_clean_up
-  #define ConfWriter_build_charm_run        chaz_ConfWriter_build_charm_run
-  #define ConfWriter_start_module           chaz_ConfWriter_start_module
-  #define ConfWriter_end_module             chaz_ConfWriter_end_module
-  #define ConfWriter_append_conf            chaz_ConfWriter_append_conf
-  #define ConfWriter_add_def                chaz_ConfWriter_add_def
-  #define ConfWriter_add_typedef            chaz_ConfWriter_add_typedef
-  #define ConfWriter_add_sys_include        chaz_ConfWriter_add_sys_include
-  #define ConfWriter_add_local_include      chaz_ConfWriter_add_local_include
+  #define ConfWriterC_enable                 chaz_ConfWriterC_enable
+  #define ConfWriterC_clean_up               chaz_ConfWriterC_clean_up
+  #define ConfWriterC_start_module           chaz_ConfWriterC_start_module
+  #define ConfWriterC_end_module             chaz_ConfWriterC_end_module
+  #define ConfWriterC_append_conf            chaz_ConfWriterC_append_conf
+  #define ConfWriterC_vappend_conf           chaz_ConfWriterC_vappend_conf
+  #define ConfWriterC_add_def                chaz_ConfWriterC_add_def
+  #define ConfWriterC_add_typedef            chaz_ConfWriterC_add_typedef
+  #define ConfWriterC_add_sys_include        chaz_ConfWriterC_add_sys_include
+  #define ConfWriterC_add_local_include      chaz_ConfWriterC_add_local_include
 #endif
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* H_CHAZ_CONFWRITER */
+#endif /* H_CHAZ_CONFWRITERC */
 
 


Reply via email to