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 */