summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorPeter Johnson <peter@tortall.net>2008-05-09 07:08:17 +0000
committerPeter Johnson <peter@tortall.net>2008-05-09 07:08:17 +0000
commitdeffd98d53c850665c8179fd22235ed789811986 (patch)
treecc37f17a1aba17dd94f5701bb923cbf5de6a8448 /tools
parenta1cd884de8f3b198b849d924ce0163ffc93773a4 (diff)
downloadyasm-deffd98d53c850665c8179fd22235ed789811986.tar.gz
Commit moved, updated genmacro script missed in [2082] commit.
svn path=/trunk/yasm/; revision=2084
Diffstat (limited to 'tools')
-rw-r--r--tools/Makefile.inc2
-rw-r--r--tools/genmacro/Makefile.inc15
-rw-r--r--tools/genmacro/genmacro.c134
3 files changed, 151 insertions, 0 deletions
diff --git a/tools/Makefile.inc b/tools/Makefile.inc
index 984578b9..0dd462c6 100644
--- a/tools/Makefile.inc
+++ b/tools/Makefile.inc
@@ -1,9 +1,11 @@
# $Id$
EXTRA_DIST += tools/re2c/Makefile.inc
+EXTRA_DIST += tools/genmacro/Makefile.inc
EXTRA_DIST += tools/genperf/Makefile.inc
EXTRA_DIST += tools/python-yasm/Makefile.inc
include tools/re2c/Makefile.inc
+include tools/genmacro/Makefile.inc
include tools/genperf/Makefile.inc
include tools/python-yasm/Makefile.inc
diff --git a/tools/genmacro/Makefile.inc b/tools/genmacro/Makefile.inc
new file mode 100644
index 00000000..6232b9c4
--- /dev/null
+++ b/tools/genmacro/Makefile.inc
@@ -0,0 +1,15 @@
+# $Id$
+
+# These utility programs have to be built for BUILD host in cross-build.
+# This makes things rather non-standard automake
+
+noinst_PROGRAMS += genmacro
+
+genmacro_SOURCES =
+EXTRA_DIST += tools/genmacro/genmacro.c
+genmacro_LDADD = genmacro.$(OBJEXT)
+genmacro_LINK = $(CCLD_FOR_BUILD) -o $@
+
+genmacro.$(OBJEXT): tools/genmacro/genmacro.c
+ $(CC_FOR_BUILD) $(DEFAULT_INCLUDES) $(INCLUDES) -c -o $@ `test -f tools/genmacro/genmacro.c || echo '$(srcdir)/'`tools/genmacro/genmacro.c
+
diff --git a/tools/genmacro/genmacro.c b/tools/genmacro/genmacro.c
new file mode 100644
index 00000000..d3f4200a
--- /dev/null
+++ b/tools/genmacro/genmacro.c
@@ -0,0 +1,134 @@
+/* $Id$
+ *
+ * C version of NASM's macros.pl
+ *
+ * Copyright (C) 2004-2008 Peter Johnson
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAXLINE 1024
+
+int
+main(int argc, char *argv[])
+{
+ FILE *in, *out;
+ int i;
+ char *str;
+ char *strp;
+ char *charp;
+ int fline;
+ int line = 0;
+ int lindex = 0;
+ size_t len;
+
+ if (argc < 4) {
+ fprintf(stderr, "Usage: %s <out> <var> <file> [<file> ...]\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ out = fopen(argv[1], "wt");
+
+ if (!out) {
+ fprintf(stderr, "Could not open `%s'.\n", argv[1]);
+ return EXIT_FAILURE;
+ }
+
+ str = malloc(MAXLINE);
+
+ fprintf(out, "/* This file auto-generated from standard.mac by genmacro.c"
+ " - don't edit it */\n\n#include <stddef.h>\n\n"
+ "static const char *%s[] = {\n", argv[2]);
+
+ for (i=3; i<argc; i++) {
+ in = fopen(argv[i], "rt");
+ if (!in) {
+ fprintf(stderr, "Could not open `%s'.\n", argv[i]);
+ fclose(out);
+ remove(argv[1]);
+ return EXIT_FAILURE;
+ }
+
+ fline = 0;
+
+ while (fgets(str, MAXLINE, in)) {
+ line++;
+ fline++;
+
+ strp = str;
+
+ /* check for unterminated quotes and delete comments */
+ charp = strp;
+ while ((charp = strpbrk(charp, "'\";"))) {
+ if (charp[0] == ';') {
+ *charp = '\0';
+ break;
+ }
+ if ((charp = strchr(charp+1, charp[0])) == NULL) {
+ fprintf(stderr, "%s:%d: error: unterminated quote\n",
+ argv[i], fline);
+ fclose(out);
+ remove(argv[1]);
+ return EXIT_FAILURE;
+ }
+ charp++;
+ }
+
+ /* strip off leading and trailing whitespace */
+ while (*strp == ' ' || *strp == '\t')
+ strp++;
+ len = strlen(strp);
+ while (len > 0 && (strp[len-1] == ' ' || strp[len-1] == '\t' ||
+ strp[len-1] == '\n')) {
+ strp[len-1] = '\0';
+ len--;
+ }
+
+ /* skip blank lines */
+ if (len == 0)
+ continue;
+
+ /* output as string to output file */
+ fprintf(out, " \"");
+ while (*strp != '\0') {
+ if (*strp == '\\' || *strp == '"')
+ fputc('\\', out);
+ fputc(*strp, out);
+ strp++;
+ }
+ fprintf(out, "\",\n");
+ lindex++;
+ }
+
+ fclose(in);
+ }
+
+ fprintf(out, " NULL\n};\n");
+ fclose(out);
+
+ free(str);
+
+ return EXIT_SUCCESS;
+}