You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2012/12/28 22:34:30 UTC
[lucy-commits] [10/12] git commit: refs/heads/master - Regenerate charmonizer.c
Regenerate charmonizer.c
Project: http://git-wip-us.apache.org/repos/asf/lucy/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy/commit/3b1ae281
Tree: http://git-wip-us.apache.org/repos/asf/lucy/tree/3b1ae281
Diff: http://git-wip-us.apache.org/repos/asf/lucy/diff/3b1ae281
Branch: refs/heads/master
Commit: 3b1ae281bac3ed321cef54ecef7a3d489d4b374c
Parents: 35463f5
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Thu Dec 27 00:07:06 2012 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Fri Dec 28 22:23:11 2012 +0100
----------------------------------------------------------------------
clownfish/compiler/common/charmonizer.c | 559 ++++++++++++++++++++++++++
clownfish/runtime/common/charmonizer.c | 2 +
common/charmonizer.c | 2 +
3 files changed, 563 insertions(+), 0 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/lucy/blob/3b1ae281/clownfish/compiler/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/clownfish/compiler/common/charmonizer.c b/clownfish/compiler/common/charmonizer.c
index 84d8d71..3f11f13 100644
--- a/clownfish/compiler/common/charmonizer.c
+++ b/clownfish/compiler/common/charmonizer.c
@@ -461,6 +461,133 @@ chaz_Probe_clean_up(void);
/***************************************************************************/
+#line 21 "src/Charmonizer/Probe/DirManip.h"
+/* Charmonizer/Probe/DirManip.h
+ */
+
+#ifndef H_CHAZ_DIRMANIP
+#define H_CHAZ_DIRMANIP
+
+/* The DirManip module exports or aliases symbols related to directory and file
+ * manipulation.
+ *
+ * Defined if the header files dirent.h and direct.h are available, respectively:
+ *
+ * HAS_DIRENT_H
+ * HAS_DIRECT_H
+ *
+ * Defined if struct dirent has these members.
+ *
+ * HAS_DIRENT_D_NAMLEN
+ * HAS_DIRENT_D_TYPE
+ *
+ * The "makedir" macro will be aliased to the POSIX-specified two-argument
+ * "mkdir" interface:
+ *
+ * makedir
+ *
+ * On some systems, the second argument to makedir will be ignored, in which
+ * case this symbol will be true; otherwise, it will be false: (TODO: This
+ * isn't verified and may sometimes be incorrect.)
+ *
+ * MAKEDIR_MODE_IGNORED
+ *
+ * String representing the system's directory separator:
+ *
+ * DIR_SEP
+ *
+ * True if the remove() function removes directories, false otherwise:
+ *
+ * REMOVE_ZAPS_DIRS
+ */
+void chaz_DirManip_run(void);
+
+#endif /* H_CHAZ_DIR_SEP */
+
+
+
+
+/***************************************************************************/
+
+#line 20 "src/Charmonizer/Probe/Headers.h"
+/* Charmonizer/Probe/Headers.h
+ */
+
+#ifndef H_CHAZ_HEADERS
+#define H_CHAZ_HEADERS
+
+#include <stdio.h>
+/* #include "Charmonizer/Core/Defines.h" */
+
+/* Check whether a particular header file is available. The test-compile is
+ * only run the first time a given request is made.
+ */
+int
+chaz_Headers_check(const char *header_name);
+
+/* Run the Headers module.
+ *
+ * Exported symbols:
+ *
+ * If HAS_C89 is declared, this system has all the header files described in
+ * Ansi C 1989. HAS_C90 is a synonym. (It would be surprising if they are
+ * not defined, because Charmonizer itself assumes C89.)
+ *
+ * HAS_C89
+ * HAS_C90
+ *
+ * One symbol is exported for each C89 header file:
+ *
+ * HAS_ASSERT_H
+ * HAS_CTYPE_H
+ * HAS_ERRNO_H
+ * HAS_FLOAT_H
+ * HAS_LIMITS_H
+ * HAS_LOCALE_H
+ * HAS_MATH_H
+ * HAS_SETJMP_H
+ * HAS_SIGNAL_H
+ * HAS_STDARG_H
+ * HAS_STDDEF_H
+ * HAS_STDIO_H
+ * HAS_STDLIB_H
+ * HAS_STRING_H
+ * HAS_TIME_H
+ *
+ * One symbol is exported for every POSIX header present, and HAS_POSIX is
+ * exported if they're all there.
+ *
+ * HAS_POSIX
+ *
+ * HAS_CPIO_H
+ * HAS_DIRENT_H
+ * HAS_FCNTL_H
+ * HAS_GRP_H
+ * HAS_PWD_H
+ * HAS_SYS_STAT_H
+ * HAS_SYS_TIMES_H
+ * HAS_SYS_TYPES_H
+ * HAS_SYS_UTSNAME_H
+ * HAS_WAIT_H
+ * HAS_TAR_H
+ * HAS_TERMIOS_H
+ * HAS_UNISTD_H
+ * HAS_UTIME_H
+ *
+ * If pthread.h is available, this will be exported:
+ *
+ * HAS_PTHREAD_H
+ */
+void
+chaz_Headers_run(void);
+
+#endif /* H_CHAZ_HEADERS */
+
+
+
+
+/***************************************************************************/
+
#line 21 "src/Charmonizer/Probe/Integers.h"
/* Charmonizer/Probe/Integers.h -- info about integer types and sizes.
*
@@ -2347,6 +2474,436 @@ chaz_Probe_clean_up(void) {
/***************************************************************************/
+#line 17 "src/Charmonizer/Probe/DirManip.c"
+/* #include "Charmonizer/Core/ConfWriter.h" */
+/* #include "Charmonizer/Core/Compiler.h" */
+/* #include "Charmonizer/Core/OperatingSystem.h" */
+/* #include "Charmonizer/Core/Util.h" */
+/* #include "Charmonizer/Core/HeaderChecker.h" */
+/* #include "Charmonizer/Probe/DirManip.h" */
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+static struct {
+ int mkdir_num_args;
+ char mkdir_command[7];
+} chaz_DirManip = { 0, "" };
+
+/* Source code for rmdir. */
+static int
+chaz_DirManip_compile_posix_mkdir(const char *header) {
+ static const char posix_mkdir_code[] =
+ CHAZ_QUOTE( #include <%s> )
+ CHAZ_QUOTE( int main(int argc, char **argv) { )
+ CHAZ_QUOTE( if (argc != 2) { return 1; } )
+ CHAZ_QUOTE( if (mkdir(argv[1], 0777) != 0) { return 2; } )
+ CHAZ_QUOTE( return 0; )
+ CHAZ_QUOTE( } );
+ char code_buf[sizeof(posix_mkdir_code) + 30];
+ int mkdir_available;
+ if (strlen(header) > 25) {
+ chaz_Util_die("Header name too long: '%s'", header);
+ }
+
+ /* Attempt compilation. */
+ sprintf(code_buf, posix_mkdir_code, header);
+ mkdir_available = chaz_CC_test_compile(code_buf);
+
+ /* Set vars on success. */
+ if (mkdir_available) {
+ strcpy(chaz_DirManip.mkdir_command, "mkdir");
+ if (strcmp(header, "direct.h") == 0) {
+ chaz_DirManip.mkdir_num_args = 1;
+ }
+ else {
+ chaz_DirManip.mkdir_num_args = 2;
+ }
+ }
+
+ return mkdir_available;
+}
+
+static int
+chaz_DirManip_compile_win_mkdir(void) {
+ static const char win_mkdir_code[] =
+ CHAZ_QUOTE( #include <direct.h> )
+ CHAZ_QUOTE( int main(int argc, char **argv) { )
+ CHAZ_QUOTE( if (argc != 2) { return 1; } )
+ CHAZ_QUOTE( if (_mkdir(argv[1]) != 0) { return 2; } )
+ CHAZ_QUOTE( return 0; )
+ CHAZ_QUOTE( } );
+ int mkdir_available;
+
+ mkdir_available = chaz_CC_test_compile(win_mkdir_code);
+ if (mkdir_available) {
+ strcpy(chaz_DirManip.mkdir_command, "_mkdir");
+ chaz_DirManip.mkdir_num_args = 1;
+ }
+ return mkdir_available;
+}
+
+static void
+chaz_DirManip_try_mkdir(void) {
+ if (chaz_HeadCheck_check_header("windows.h")) {
+ if (chaz_DirManip_compile_win_mkdir()) { return; }
+ if (chaz_DirManip_compile_posix_mkdir("direct.h")) { return; }
+ }
+ if (chaz_DirManip_compile_posix_mkdir("sys/stat.h")) { return; }
+}
+
+static int
+chaz_DirManip_compile_rmdir(const char *header) {
+ static const char rmdir_code[] =
+ CHAZ_QUOTE( #include <%s> )
+ CHAZ_QUOTE( int main(int argc, char **argv) { )
+ CHAZ_QUOTE( if (argc != 2) { return 1; } )
+ CHAZ_QUOTE( if (rmdir(argv[1]) != 0) { return 2; } )
+ CHAZ_QUOTE( return 0; )
+ CHAZ_QUOTE( } );
+ char code_buf[sizeof(rmdir_code) + 30];
+ int rmdir_available;
+ if (strlen(header) > 25) {
+ chaz_Util_die("Header name too long: '%s'", header);
+ }
+ sprintf(code_buf, rmdir_code, header);
+ rmdir_available = chaz_CC_test_compile(code_buf);
+ return rmdir_available;
+}
+
+static void
+chaz_DirManip_try_rmdir(void) {
+ if (chaz_DirManip_compile_rmdir("unistd.h")) { return; }
+ if (chaz_DirManip_compile_rmdir("dirent.h")) { return; }
+ if (chaz_DirManip_compile_rmdir("direct.h")) { return; }
+}
+
+static int
+chaz_DirManip_is_cygwin(void) {
+ static int is_cygwin = -1;
+ static const char cygwin_code[] =
+ CHAZ_QUOTE(#ifndef __CYGWIN__ )
+ CHAZ_QUOTE( #error "Not Cygwin" )
+ CHAZ_QUOTE(#endif )
+ CHAZ_QUOTE(int main() { return 0; } );
+ if (is_cygwin == -1) {
+ is_cygwin = chaz_CC_test_compile(cygwin_code);
+ }
+ return is_cygwin;
+}
+
+void
+chaz_DirManip_run(void) {
+ char dir_sep[3];
+ int remove_zaps_dirs = false;
+ int has_dirent_h = chaz_HeadCheck_check_header("dirent.h");
+ int has_direct_h = chaz_HeadCheck_check_header("direct.h");
+ int has_dirent_d_namlen = false;
+ int has_dirent_d_type = false;
+
+ chaz_ConfWriter_start_module("DirManip");
+ chaz_DirManip_try_mkdir();
+ chaz_DirManip_try_rmdir();
+
+ /* Header checks. */
+ if (has_dirent_h) {
+ chaz_ConfWriter_add_def("HAS_DIRENT_H", NULL);
+ }
+ if (has_direct_h) {
+ chaz_ConfWriter_add_def("HAS_DIRECT_H", NULL);
+ }
+
+ /* Check for members in struct dirent. */
+ if (has_dirent_h) {
+ has_dirent_d_namlen = chaz_HeadCheck_contains_member(
+ "struct dirent", "d_namlen",
+ "#include <sys/types.h>\n#include <dirent.h>"
+ );
+ if (has_dirent_d_namlen) {
+ chaz_ConfWriter_add_def("HAS_DIRENT_D_NAMLEN", NULL);
+ }
+ has_dirent_d_type = chaz_HeadCheck_contains_member(
+ "struct dirent", "d_type",
+ "#include <sys/types.h>\n#include <dirent.h>"
+ );
+ if (has_dirent_d_type) {
+ chaz_ConfWriter_add_def("HAS_DIRENT_D_TYPE", NULL);
+ }
+ }
+
+ if (chaz_DirManip.mkdir_num_args == 2) {
+ /* It's two args, but the command isn't "mkdir". */
+ char scratch[50];
+ if (strlen(chaz_DirManip.mkdir_command) > 30) {
+ chaz_Util_die("Command too long: '%s'", chaz_DirManip.mkdir_command);
+ }
+ sprintf(scratch, "%s(_dir, _mode)", chaz_DirManip.mkdir_command);
+ chaz_ConfWriter_add_def("makedir(_dir, _mode)", scratch);
+ chaz_ConfWriter_add_def("MAKEDIR_MODE_IGNORED", "0");
+ }
+ else if (chaz_DirManip.mkdir_num_args == 1) {
+ /* It's one arg... mode arg will be ignored. */
+ char scratch[50];
+ if (strlen(chaz_DirManip.mkdir_command) > 30) {
+ chaz_Util_die("Command too long: '%s'", chaz_DirManip.mkdir_command);
+ }
+ sprintf(scratch, "%s(_dir)", chaz_DirManip.mkdir_command);
+ chaz_ConfWriter_add_def("makedir(_dir, _mode)", scratch);
+ chaz_ConfWriter_add_def("MAKEDIR_MODE_IGNORED", "1");
+ }
+
+ if (chaz_DirManip_is_cygwin()) {
+ strcpy(dir_sep, "/");
+ }
+ else if (chaz_HeadCheck_check_header("windows.h")) {
+ strcpy(dir_sep, "\\\\");
+ }
+ else {
+ strcpy(dir_sep, "/");
+ }
+
+ {
+ char scratch[5];
+ sprintf(scratch, "\"%s\"", dir_sep);
+ chaz_ConfWriter_add_def("DIR_SEP", scratch);
+ sprintf(scratch, "'%s'", dir_sep);
+ chaz_ConfWriter_add_def("DIR_SEP_CHAR", scratch);
+ }
+
+ /* See whether remove works on directories. */
+ chaz_OS_mkdir("_charm_test_remove_me");
+ if (0 == remove("_charm_test_remove_me")) {
+ remove_zaps_dirs = true;
+ chaz_ConfWriter_add_def("REMOVE_ZAPS_DIRS", NULL);
+ }
+ chaz_OS_rmdir("_charm_test_remove_me");
+
+ chaz_ConfWriter_end_module();
+}
+
+
+
+
+/***************************************************************************/
+
+#line 17 "src/Charmonizer/Probe/Headers.c"
+/* #include "Charmonizer/Core/HeaderChecker.h" */
+/* #include "Charmonizer/Core/ConfWriter.h" */
+/* #include "Charmonizer/Core/Util.h" */
+/* #include "Charmonizer/Probe/Headers.h" */
+#include <ctype.h>
+#include <string.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+#define CHAZ_HEADERS_MAX_KEEPERS 200
+
+static struct {
+ int keeper_count;
+ const char *keepers[CHAZ_HEADERS_MAX_KEEPERS + 1];
+} chaz_Headers = { 0, { NULL } };
+
+/* Add a header to the keepers array.
+ */
+static void
+chaz_Headers_keep(const char *header_name);
+
+/* Transform "header.h" into "CHY_HAS_HEADER_H, storing the result into
+ * `buffer`.
+ */
+static void
+chaz_Headers_encode_affirmation(const char *header_name, char *buffer,
+ size_t buf_size);
+
+/* Probe for all C89 headers. */
+static void
+chaz_Headers_probe_c89(void);
+
+/* Probe for all POSIX headers. */
+static void
+chaz_Headers_probe_posix(void);
+
+/* Prove for selected Windows headers. */
+static void
+chaz_Headers_probe_win(void);
+
+int
+chaz_Headers_check(const char *header_name) {
+ return chaz_HeadCheck_check_header(header_name);
+}
+
+void
+chaz_Headers_run(void) {
+ int i;
+
+ chaz_ConfWriter_start_module("Headers");
+
+ chaz_Headers_probe_posix();
+ chaz_Headers_probe_c89();
+ chaz_Headers_probe_win();
+
+ /* One-offs. */
+ if (chaz_HeadCheck_check_header("pthread.h")) {
+ chaz_Headers_keep("pthread.h");
+ }
+
+ /* Append the config with every header detected so far. */
+ for (i = 0; chaz_Headers.keepers[i] != NULL; i++) {
+ char aff_buf[200];
+ chaz_Headers_encode_affirmation(chaz_Headers.keepers[i], aff_buf, 200);
+ chaz_ConfWriter_add_def(aff_buf, NULL);
+ }
+
+ chaz_ConfWriter_end_module();
+}
+
+static void
+chaz_Headers_keep(const char *header_name) {
+ if (chaz_Headers.keeper_count >= CHAZ_HEADERS_MAX_KEEPERS) {
+ chaz_Util_die("Too many keepers -- increase MAX_KEEPER_COUNT");
+ }
+ chaz_Headers.keepers[chaz_Headers.keeper_count++] = header_name;
+ chaz_Headers.keepers[chaz_Headers.keeper_count] = NULL;
+}
+
+static void
+chaz_Headers_encode_affirmation(const char *header_name, char *buffer, size_t buf_size) {
+ char *buf, *buf_end;
+ size_t len = strlen(header_name) + sizeof("HAS_");
+ if (len + 1 > buf_size) {
+ chaz_Util_die("Buffer too small: %lu", (unsigned long)buf_size);
+ }
+
+ /* Start off with "HAS_". */
+ strcpy(buffer, "HAS_");
+
+ /* Transform one char at a time. */
+ for (buf = buffer + sizeof("HAS_") - 1, buf_end = buffer + len;
+ buf < buf_end;
+ header_name++, buf++
+ ) {
+ if (*header_name == '\0') {
+ *buf = '\0';
+ break;
+ }
+ else if (isalnum(*header_name)) {
+ *buf = toupper(*header_name);
+ }
+ else {
+ *buf = '_';
+ }
+ }
+}
+
+static void
+chaz_Headers_probe_c89(void) {
+ const char *c89_headers[] = {
+ "assert.h",
+ "ctype.h",
+ "errno.h",
+ "float.h",
+ "limits.h",
+ "locale.h",
+ "math.h",
+ "setjmp.h",
+ "signal.h",
+ "stdarg.h",
+ "stddef.h",
+ "stdio.h",
+ "stdlib.h",
+ "string.h",
+ "time.h",
+ NULL
+ };
+ int i;
+
+ /* Test for all c89 headers in one blast. */
+ if (chaz_HeadCheck_check_many_headers((const char**)c89_headers)) {
+ chaz_ConfWriter_add_def("HAS_C89", NULL);
+ chaz_ConfWriter_add_def("HAS_C90", NULL);
+ for (i = 0; c89_headers[i] != NULL; i++) {
+ chaz_Headers_keep(c89_headers[i]);
+ }
+ }
+ /* Test one-at-a-time. */
+ else {
+ for (i = 0; c89_headers[i] != NULL; i++) {
+ if (chaz_HeadCheck_check_header(c89_headers[i])) {
+ chaz_Headers_keep(c89_headers[i]);
+ }
+ }
+ }
+}
+
+static void
+chaz_Headers_probe_posix(void) {
+ const char *posix_headers[] = {
+ "cpio.h",
+ "dirent.h",
+ "fcntl.h",
+ "grp.h",
+ "pwd.h",
+ "sys/stat.h",
+ "sys/times.h",
+ "sys/types.h",
+ "sys/utsname.h",
+ "sys/wait.h",
+ "tar.h",
+ "termios.h",
+ "unistd.h",
+ "utime.h",
+ NULL
+ };
+ int i;
+
+ /* Try for all POSIX headers in one blast. */
+ if (chaz_HeadCheck_check_many_headers((const char**)posix_headers)) {
+ chaz_ConfWriter_add_def("HAS_POSIX", NULL);
+ for (i = 0; posix_headers[i] != NULL; i++) {
+ chaz_Headers_keep(posix_headers[i]);
+ }
+ }
+ /* Test one-at-a-time. */
+ else {
+ for (i = 0; posix_headers[i] != NULL; i++) {
+ if (chaz_HeadCheck_check_header(posix_headers[i])) {
+ chaz_Headers_keep(posix_headers[i]);
+ }
+ }
+ }
+}
+
+
+static void
+chaz_Headers_probe_win(void) {
+ const char *win_headers[] = {
+ "io.h",
+ "windows.h",
+ "process.h",
+ NULL
+ };
+ int i;
+
+ /* Test for all Windows headers in one blast */
+ if (chaz_HeadCheck_check_many_headers((const char**)win_headers)) {
+ for (i = 0; win_headers[i] != NULL; i++) {
+ chaz_Headers_keep(win_headers[i]);
+ }
+ }
+ /* Test one-at-a-time. */
+ else {
+ for (i = 0; win_headers[i] != NULL; i++) {
+ if (chaz_HeadCheck_check_header(win_headers[i])) {
+ chaz_Headers_keep(win_headers[i]);
+ }
+ }
+ }
+}
+
+
+/***************************************************************************/
+
#line 17 "src/Charmonizer/Probe/Integers.c"
/* #include "Charmonizer/Core/HeaderChecker.h" */
/* #include "Charmonizer/Core/Compiler.h" */
@@ -2922,6 +3479,8 @@ int main(int argc, char **argv) {
chaz_ConfWriterC_enable();
/* Run probe modules. */
+ chaz_DirManip_run();
+ chaz_Headers_run();
chaz_Integers_run();
chaz_Strings_run();
http://git-wip-us.apache.org/repos/asf/lucy/blob/3b1ae281/clownfish/runtime/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/clownfish/runtime/common/charmonizer.c b/clownfish/runtime/common/charmonizer.c
index 9eb7d19..1ef9e44 100644
--- a/clownfish/runtime/common/charmonizer.c
+++ b/clownfish/runtime/common/charmonizer.c
@@ -3039,6 +3039,8 @@ chaz_DirManip_run(void) {
char scratch[5];
sprintf(scratch, "\"%s\"", dir_sep);
chaz_ConfWriter_add_def("DIR_SEP", scratch);
+ sprintf(scratch, "'%s'", dir_sep);
+ chaz_ConfWriter_add_def("DIR_SEP_CHAR", scratch);
}
/* See whether remove works on directories. */
http://git-wip-us.apache.org/repos/asf/lucy/blob/3b1ae281/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/common/charmonizer.c b/common/charmonizer.c
index 8ed80ae..23492cc 100644
--- a/common/charmonizer.c
+++ b/common/charmonizer.c
@@ -3039,6 +3039,8 @@ chaz_DirManip_run(void) {
char scratch[5];
sprintf(scratch, "\"%s\"", dir_sep);
chaz_ConfWriter_add_def("DIR_SEP", scratch);
+ sprintf(scratch, "'%s'", dir_sep);
+ chaz_ConfWriter_add_def("DIR_SEP_CHAR", scratch);
}
/* See whether remove works on directories. */