]> granicus.if.org Git - yasm/commitdiff
Convert NASM preproc macros.pl to genmacro.c, to remove a Perl
authorPeter Johnson <peter@tortall.net>
Mon, 15 Mar 2004 00:27:06 +0000 (00:27 -0000)
committerPeter Johnson <peter@tortall.net>
Mon, 15 Mar 2004 00:27:06 +0000 (00:27 -0000)
dependency.

svn path=/trunk/yasm/; revision=1103

modules/preprocs/nasm/Makefile.inc
modules/preprocs/nasm/genmacro.c [new file with mode: 0644]
modules/preprocs/nasm/macros.pl [deleted file]

index e7b4bb69f251e19cf053df7b4f192b6b63778a2a..23ec7034f694bfba768f5d42f88bd0a8d63ba582 100644 (file)
@@ -17,13 +17,16 @@ YASM_MODULES += -dlopen preproc_nasm.la
 
 $(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
 
diff --git a/modules/preprocs/nasm/genmacro.c b/modules/preprocs/nasm/genmacro.c
new file mode 100644 (file)
index 0000000..f66995b
--- /dev/null
@@ -0,0 +1,141 @@
+/* $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;
+}
diff --git a/modules/preprocs/nasm/macros.pl b/modules/preprocs/nasm/macros.pl
deleted file mode 100644 (file)
index 9f0a30f..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/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);