mirror of https://github.com/yasm/yasm.git
dependency. svn path=/trunk/yasm/; revision=11030.4
parent
def825542c
commit
52b1e848dd
3 changed files with 147 additions and 57 deletions
@ -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; |
||||
} |
@ -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); |
Loading…
Reference in new issue