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/18 06:28:47 UTC

[lucy-commits] svn commit: r1351205 - in /lucy/trunk/charmonizer: buildbin/meld.pl charmonize.c src/Charmonizer/Core/ConfWriterPerl.c src/Charmonizer/Core/ConfWriterPerl.h

Author: marvin
Date: Mon Jun 18 04:28:46 2012
New Revision: 1351205

URL: http://svn.apache.org/viewvc?rev=1351205&view=rev
Log:
Generate Perl module output from Charmonizer.

Start writing to Charmony.pm in addition to charmony.h.  Only include
pound-defines -- ignore typedefs pound-included headers, etc.

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

Modified: lucy/trunk/charmonizer/buildbin/meld.pl
URL: http://svn.apache.org/viewvc/lucy/trunk/charmonizer/buildbin/meld.pl?rev=1351205&r1=1351204&r2=1351205&view=diff
==============================================================================
--- lucy/trunk/charmonizer/buildbin/meld.pl (original)
+++ lucy/trunk/charmonizer/buildbin/meld.pl Mon Jun 18 04:28:46 2012
@@ -65,6 +65,7 @@ my @core = qw(
     Compiler
     ConfWriter
     ConfWriterC
+    ConfWriterPerl
     HeaderChecker
     OperatingSystem
     Util

Modified: lucy/trunk/charmonizer/charmonize.c
URL: http://svn.apache.org/viewvc/lucy/trunk/charmonizer/charmonize.c?rev=1351205&r1=1351204&r2=1351205&view=diff
==============================================================================
--- lucy/trunk/charmonizer/charmonize.c (original)
+++ lucy/trunk/charmonizer/charmonize.c Mon Jun 18 04:28:46 2012
@@ -35,6 +35,7 @@
 #include "Charmonizer/Core/HeaderChecker.h"
 #include "Charmonizer/Core/ConfWriter.h"
 #include "Charmonizer/Core/ConfWriterC.h"
+#include "Charmonizer/Core/ConfWriterPerl.h"
 
 int main(int argc, char **argv) {
     /* Parse and process arguments. */
@@ -48,6 +49,7 @@ int main(int argc, char **argv) {
         char *cc_flags   = argv[2];
         chaz_Probe_init(cc_command, cc_flags);
         chaz_ConfWriterC_enable();
+        chaz_ConfWriterPerl_enable();
     }
 
     /* Run probe modules. */

Copied: lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.c (from r1351204, lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c)
URL: http://svn.apache.org/viewvc/lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.c?p2=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.c&p1=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c&r1=1351204&r2=1351205&rev=1351205&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.c (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.c Mon Jun 18 04:28:46 2012
@@ -17,279 +17,190 @@
 #define CHAZ_USE_SHORT_NAMES
 
 #include "Charmonizer/Core/Util.h"
-#include "Charmonizer/Core/ConfWriterC.h"
-#include "Charmonizer/Core/OperatingSystem.h"
-#include "Charmonizer/Core/Compiler.h"
+#include "Charmonizer/Core/ConfWriterPerl.h"
 #include <errno.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;
-static ConfWriter CWC_conf_writer;
+static FILE *config_pm_fh  = NULL;
+static ConfWriter CWPerl_conf_writer;
 
-/* Open the charmony.h file handle.  Print supplied text to it, if non-null.
- * Print an explanatory comment and open the include guard.
+/* Open the Charmony.pm file handle.
  */
 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);
+S_open_config_pm(void);
 
-/* Free the def list. */
 static void
-S_clear_def_list(void);
-
-static void
-S_ConfWriterC_clean_up(void);
+S_ConfWriterPerl_clean_up(void);
 static void
-S_ConfWriterC_vappend_conf(const char *fmt, va_list args);
+S_ConfWriterPerl_vappend_conf(const char *fmt, va_list args);
 static void
-S_ConfWriterC_add_def(const char *sym, const char *value);
+S_ConfWriterPerl_add_def(const char *sym, const char *value);
 static void
-S_ConfWriterC_add_typedef(const char *type, const char *alias);
+S_ConfWriterPerl_add_typedef(const char *type, const char *alias);
 static void
-S_ConfWriterC_add_sys_include(const char *header);
+S_ConfWriterPerl_add_sys_include(const char *header);
 static void
-S_ConfWriterC_add_local_include(const char *header);
+S_ConfWriterPerl_add_local_include(const char *header);
 static void
-S_ConfWriterC_start_module(const char *module_name);
+S_ConfWriterPerl_start_module(const char *module_name);
 static void
-S_ConfWriterC_end_module(void);
+S_ConfWriterPerl_end_module(void);
 
 void
-ConfWriterC_enable(void) {
-    CWC_conf_writer.clean_up          = S_ConfWriterC_clean_up;
-    CWC_conf_writer.vappend_conf      = S_ConfWriterC_vappend_conf;
-    CWC_conf_writer.add_def           = S_ConfWriterC_add_def;
-    CWC_conf_writer.add_typedef       = S_ConfWriterC_add_typedef;
-    CWC_conf_writer.add_sys_include   = S_ConfWriterC_add_sys_include;
-    CWC_conf_writer.add_local_include = S_ConfWriterC_add_local_include;
-    CWC_conf_writer.start_module      = S_ConfWriterC_start_module;
-    CWC_conf_writer.end_module        = S_ConfWriterC_end_module;
-    S_open_charmony_h(NULL);
-    ConfWriter_add_writer(&CWC_conf_writer);
+ConfWriterPerl_enable(void) {
+    CWPerl_conf_writer.clean_up          = S_ConfWriterPerl_clean_up;
+    CWPerl_conf_writer.vappend_conf      = S_ConfWriterPerl_vappend_conf;
+    CWPerl_conf_writer.add_def           = S_ConfWriterPerl_add_def;
+    CWPerl_conf_writer.add_typedef       = S_ConfWriterPerl_add_typedef;
+    CWPerl_conf_writer.add_sys_include   = S_ConfWriterPerl_add_sys_include;
+    CWPerl_conf_writer.add_local_include = S_ConfWriterPerl_add_local_include;
+    CWPerl_conf_writer.start_module      = S_ConfWriterPerl_start_module;
+    CWPerl_conf_writer.end_module        = S_ConfWriterPerl_end_module;
+    S_open_config_pm();
+    ConfWriter_add_writer(&CWPerl_conf_writer);
     return;
 }
 
 static void
-S_open_charmony_h(const char *charmony_start) {
+S_open_config_pm(void) {
     /* 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"
+    config_pm_fh = fopen("Charmony.pm", "w+");
+    if (config_pm_fh == NULL) {
+        Util_die("Can't open 'Charmony.pm': %s", strerror(errno));
+    }
+
+    /* Start the module. */
+    fprintf(config_pm_fh,
+            "# Auto-generated by Charmonizer. \n"
+            "# DO NOT EDIT THIS FILE!!\n"
+            "\n"
+            "package Charmony;\n"
+            "use strict;\n"
+            "use warnings;\n"
+            "\n"
+            "my %%defs;\n"
+            "\n"
+            "sub config { \\%%defs }\n"
+            "\n"
            );
 }
 
 static void
-S_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)) {
-        Util_die("Couldn't close 'charmony.h': %s", strerror(errno));
+S_ConfWriterPerl_clean_up(void) {
+    /* Write the last bit of Charmony.pm and close. */
+    fprintf(config_pm_fh, "\n1;\n\n");
+    if (fclose(config_pm_fh)) {
+        Util_die("Couldn't close 'Charmony.pm': %s", strerror(errno));
     }
 }
 
 static void
-S_ConfWriterC_vappend_conf(const char *fmt, va_list args) {
-    vfprintf(charmony_fh, fmt, args);
+S_ConfWriterPerl_vappend_conf(const char *fmt, va_list args) {
+    (void)fmt;
+    (void)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;
-}
+static char*
+S_ConfWriterPerl_quotify(const char *string, char *buf, size_t buf_size) {
+    char *quoted = buf;
 
-static void
-S_ConfWriterC_add_def(const char *sym, const char *value) {
-    S_push_def_list_item(sym, value, CONFELEM_DEF);
-}
+    /* Don't bother with undef values here. */
+    if (!string) {
+        return NULL;
+    }
 
-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);
+    /* Allocate memory if necessary. */
+    {
+        const char *ptr;
+        size_t space = 3; /* Quotes plus NUL termination. */
+        for (ptr = string; *ptr; ptr++) {
+            if (*ptr == '\'' || *ptr == '\\') {
+                space += 2;
+            }
+            else {
+                space += 1;
+            }
         }
-        else {
-            fprintf(charmony_fh, "#define chy_%s %s\n", sym, value);
+        if (space > buf_size) {
+            quoted = (char*)malloc(space);
         }
     }
-    else {
-        if (S_sym_is_uppercase(sym)) {
-            fprintf(charmony_fh, "#define CHY_%s\n", sym);
-        }
-        else {
-            fprintf(charmony_fh, "#define chy_%s\n", sym);
+
+    /* Perform copying and escaping */
+    {
+        const char *ptr;
+        size_t pos = 0;
+        quoted[pos++] = '\'';
+        for (ptr = string; *ptr; ptr++) {
+            if (*ptr == '\'' || *ptr == '\\') {
+                quoted[pos++] = '\\';
+            }
+            quoted[pos++] = *ptr;
         }
+        quoted[pos++] = '\'';
+        quoted[pos++] = '\0';
     }
-}
 
-static void
-S_ConfWriterC_add_typedef(const char *type, const char *alias) {
-    S_push_def_list_item(alias, type, CONFELEM_TYPEDEF);
+    return quoted;
 }
 
+#define CFPERL_MAX_BUF 100
 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);
+S_ConfWriterPerl_add_def(const char *sym, const char *value) {
+    char sym_buf[CFPERL_MAX_BUF + 1];
+    char value_buf[CFPERL_MAX_BUF + 1];
+    char *quoted_sym;
+    char *quoted_value;
+
+    /* Quote key. */
+    if (!sym) {
+        Util_die("Can't handle NULL key");
+    }
+    quoted_sym = S_ConfWriterPerl_quotify(sym, sym_buf, CFPERL_MAX_BUF);
+
+    /* Quote value or use "undef". */
+    if (!value) {
+        strcpy(value_buf, "undef");
+        quoted_value = value_buf;
     }
     else {
-        fprintf(charmony_fh, "typedef %s chy_%s;\n", type, alias);
+        quoted_value = S_ConfWriterPerl_quotify(value, value_buf,
+                                                CFPERL_MAX_BUF);
     }
-}
 
-static void
-S_ConfWriterC_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);
-}
+    fprintf(config_pm_fh, "$defs{%s} = %s;\n", quoted_sym, quoted_value);
 
-static void
-S_ConfWriterC_add_local_include(const char *header) {
-    S_push_def_list_item(header, NULL, CONFELEM_LOCAL_INCLUDE);
+    if (quoted_sym   != sym_buf)   { free(quoted_sym);   }
+    if (quoted_value != value_buf) { free(quoted_value); }
 }
 
 static void
-S_append_local_include_to_conf(const char *header) {
-    fprintf(charmony_fh, "#include \"%s\"\n", header);
+S_ConfWriterPerl_add_typedef(const char *type, const char *alias) {
+    (void)type;
+    (void)alias;
 }
 
 static void
-S_ConfWriterC_start_module(const char *module_name) {
-    fprintf(charmony_fh, "\n/* %s */\n", module_name);
+S_ConfWriterPerl_add_sys_include(const char *header) {
+    (void)header;
 }
 
 static void
-S_ConfWriterC_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. */
-    fprintf(charmony_fh,
-        "\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_";
-                        fprintf(charmony_fh, "  #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);
-        }
-    }
-
-    fprintf(charmony_fh, "#endif /* USE_SHORT_NAMES */\n");
-    fprintf(charmony_fh, "\n");
-
-    S_clear_def_list();
+S_ConfWriterPerl_add_local_include(const char *header) {
+    (void)header;
 }
 
 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++;
+S_ConfWriterPerl_start_module(const char *module_name) {
+    fprintf(config_pm_fh, "# %s\n", module_name);
 }
 
 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;
+S_ConfWriterPerl_end_module(void) {
+    fprintf(config_pm_fh, "\n");
 }
 

Copied: lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.h (from r1351204, lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h)
URL: http://svn.apache.org/viewvc/lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.h?p2=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.h&p1=lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h&r1=1351204&r2=1351205&rev=1351205&view=diff
==============================================================================
--- lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterC.h (original)
+++ lucy/trunk/charmonizer/src/Charmonizer/Core/ConfWriterPerl.h Mon Jun 18 04:28:46 2012
@@ -14,29 +14,28 @@
  * limitations under the License.
  */
 
-/* Charmonizer/Core/ConfWriterC.h -- Write to a C header file.
+/* Charmonizer/Core/ConfWriterPerl.h -- Write to a Perl module file.
  */
 
-#ifndef H_CHAZ_CONFWRITERC
-#define H_CHAZ_CONFWRITERC 1
+#ifndef H_CHAZ_CONFWRITERPERL
+#define H_CHAZ_CONFWRITERPERL 1
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-/* Enable writing config to a C header file.
+/* Enable writing config to a Perl module file.
  */
 void
-chaz_ConfWriterC_enable(void);
+chaz_ConfWriterPerl_enable(void);
 
 #ifdef   CHAZ_USE_SHORT_NAMES
-  #define ConfWriterC_enable                 chaz_ConfWriterC_enable
+  #define ConfWriterPerl_enable   chaz_ConfWriterPerl_enable
 #endif
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* H_CHAZ_CONFWRITERC */
-
+#endif /* H_CHAZ_CONFWRITERPERL */