diff options
author | Peter Johnson <peter@tortall.net> | 2008-05-09 07:08:17 +0000 |
---|---|---|
committer | Peter Johnson <peter@tortall.net> | 2008-05-09 07:08:17 +0000 |
commit | deffd98d53c850665c8179fd22235ed789811986 (patch) | |
tree | cc37f17a1aba17dd94f5701bb923cbf5de6a8448 /tools | |
parent | a1cd884de8f3b198b849d924ce0163ffc93773a4 (diff) | |
download | yasm-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.inc | 2 | ||||
-rw-r--r-- | tools/genmacro/Makefile.inc | 15 | ||||
-rw-r--r-- | tools/genmacro/genmacro.c | 134 |
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; +} |