$(top_modulesdir)/src/preprocs/nasm/nasm-pp.c: nasm-macros.c
-nasm-macros.c: $(top_srcdir)/modules/preprocs/nasm/macros.pl $(top_srcdir)/modules/preprocs/nasm/standard.mac
- $(PERL) $(top_srcdir)/modules/preprocs/nasm/macros.pl $(top_srcdir)/modules/preprocs/nasm/standard.mac
+nasm-macros.c: $(top_srcdir)/modules/preprocs/nasm/standard.mac genmacro$(EXEEXT)
+ $(top_builddir)/genmacro$(EXEEXT) $(top_srcdir)/modules/preprocs/nasm/standard.mac
BUILT_SOURCES += nasm-macros.c
CLEANFILES += nasm-macros.c
-EXTRA_DIST += modules/preprocs/nasm/macros.pl
+noinst_PROGRAMS += genmacro
+
+genmacro_SOURCES = modules/preprocs/nasm/genmacro.c
+
EXTRA_DIST += modules/preprocs/nasm/standard.mac
EXTRA_DIST += modules/preprocs/nasm/tests/Makefile.inc
--- /dev/null
+/* $IdPath$
+ *
+ * C version of NASM's macros.pl
+ *
+ * Copyright (C) 2004 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 OUTPUT "nasm-macros.c"
+#define MAXLINE 1024
+
+int
+main(int argc, char *argv[])
+{
+ FILE *in, *out;
+ int i;
+ char str[MAXLINE];
+ char *strp;
+ char *charp;
+ int fline;
+ int line = 0;
+ int lindex = 0;
+ int tasm_count = -1;
+ size_t len;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s <file> [<file> ...]\n", argv[0]);
+ return EXIT_FAILURE;
+ }
+
+ out = fopen(OUTPUT, "wt");
+
+ if (!out) {
+ fprintf(stderr, "Could not open `%s'.\n", OUTPUT);
+ return EXIT_FAILURE;
+ }
+
+ 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 *stdmac[] = {\n");
+
+ for (i=1; i<argc; i++) {
+ in = fopen(argv[i], "rt");
+ if (!in) {
+ fprintf(stderr, "Could not open `%s'.\n", argv[i]);
+ fclose(out);
+ remove(OUTPUT);
+ 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(OUTPUT);
+ return EXIT_FAILURE;
+ }
+ charp++;
+ }
+
+ /* strip off leading and trailing whitespace */
+ while (*strp == ' ' || *strp == '\t')
+ strp++;
+ len = strlen(strp);
+ while (strp[len-1] == ' ' || strp[len-1] == '\t' ||
+ strp[len-1] == '\n') {
+ strp[len-1] = '\0';
+ len--;
+ }
+
+ /* skip blank lines */
+ if (len == 0)
+ continue;
+
+ /* check for special TASM ending token */
+ if (strcmp(strp, "*END*TASM*MACROS*") == 0) {
+ tasm_count = lindex;
+ 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");
+ if (tasm_count == -1)
+ tasm_count = lindex;
+ fprintf(out, "#define TASM_MACRO_COUNT %d\n", tasm_count);
+ fclose(out);
+
+ return EXIT_SUCCESS;
+}
+++ /dev/null
-#!/usr/bin/perl -w
-#
-# macros.pl produce macros.c from standard.mac
-#
-# The Netwide Assembler is copyright (C) 1996 Simon Tatham and
-# Julian Hall. All rights reserved. The software is
-# redistributable under the licence given in the file "Licence"
-# distributed in the NASM archive.
-
-use strict;
-
-my $fname;
-my $line = 0;
-my $index = 0;
-my $tasm_count;
-
-undef $tasm_count;
-
-open(OUTPUT,">nasm-macros.c") or die "unable to open nasm-macros.c\n";
-
-print OUTPUT "/* This file auto-generated from standard.mac by macros.pl" .
-" - don't edit it */\n\n#include <stddef.h>\n\nstatic const char *stdmac[] = {\n";
-
-foreach $fname ( @ARGV ) {
- if (not open(INPUT,$fname)) {
- close(OUTPUT);
- unlink("nasm-macros.c");
- die "unable to open $fname\n";
- }
- while (<INPUT>) {
- $line++;
- chomp;
- if (m/^\s*\*END\*TASM\*MACROS\*\s*$/) {
- $tasm_count = $index;
- } elsif (m/^\s*((\s*([^\"\';\s]+|\"[^\"]*\"|\'[^\']*\'))*)\s*(;.*)?$/) {
- $_ = $1;
- s/\\/\\\\/g;
- s/"/\\"/g;
- if (length > 0) {
- print OUTPUT " \"$_\",\n";
- $index++;
- }
- } else {
- close(OUTPUT);
- unlink("nasm-macros.c");
- die "$fname:$line: error unterminated quote";
- }
- }
- close(INPUT);
-}
-print OUTPUT " NULL\n};\n";
-$tasm_count = $index unless ( defined($tasm_count) );
-print OUTPUT "#define TASM_MACRO_COUNT $tasm_count\n";
-close(OUTPUT);