diff --git a/Makefile.in b/Makefile.in
index f8f336141..d6b6544e2 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -114,9 +114,10 @@ version.sed: version version.pl
# This source file is generated from the standard macros file
# `standard.mac' by another Perl script. Again, it's part of the
# standard distribution.
-macros.c: macros.pl pptok.ph standard.mac version.mac $(srcdir)/macros/*.mac
+macros.c: macros.pl pptok.ph standard.mac version.mac \
+ $(srcdir)/macros/*.mac $(srcdir)/output/*.mac
$(PERL) $(srcdir)/macros.pl $(srcdir)/standard.mac version.mac \
- $(srcdir)/macros/*.mac
+ $(srcdir)/macros/*.mac $(srcdir)/output/*.mac
# These source files are generated from regs.dat by yet another
# perl script.
diff --git a/macros.pl b/macros.pl
index 5429a5eae..18c775969 100755
--- a/macros.pl
+++ b/macros.pl
@@ -34,25 +34,41 @@ print OUT "const char * const nasm_stdmac[] = {";
my $npkg = 0;
my @pkg_list = ();
my %pkg_number = ();
-my %pkg_index = ();
my $pkg;
+my @out_list = ();
+my $outfmt;
+my $lastname;
foreach $fname ( @ARGV ) {
open(INPUT,$fname) or die "unable to open $fname\n";
- print OUT "\n /* From $fname */\n";
while () {
$line++;
chomp;
if (m/^\s*\*END\*TASM\*MACROS\*\s*$/) {
$tasm_count = $index;
print OUT " /* End of TASM macros */\n";
+ } elsif (m/^OUT:\s*(.*\S)\s*$/) {
+ undef $pkg;
+ my @out_alias = split(/\s+/, $1);
+ printf OUT " /* %4d */ NULL\n", $index++;
+ print OUT "};\n";
+ $index = 0;
+ printf OUT "const char * const %s_stdmac[] = {\n", $out_alias[0];
+ print OUT " /* From $fname */\n";
+ $lastname = $fname;
+ push(@out_list, $out_alias[0]);
+ $out_index{$out_alias[0]} = $index;
} elsif (m/^USE:\s*(\S+)\s*$/) {
$pkg = $1;
if (defined($pkg_number{$pkg})) {
die "$0: $fname: duplicate package: $pkg\n";
}
printf OUT " /* %4d */ NULL,\n", $index++;
- print OUT " /* %use $pkg */\n";
+ print OUT "};\n";
+ $index = 0;
+ printf OUT "static const char * const nasm_stdmac_%s[] = {\n", $pkg;
+ print OUT " /* From $fname */\n";
+ $lastname = $fname;
push(@pkg_list, $pkg);
$pkg_number{$pkg} = $npkg++;
$pkg_index{$pkg} = $index;
@@ -79,6 +95,10 @@ foreach $fname ( @ARGV ) {
}
$s2 .= $s1;
if (length($s2) > 0) {
+ if ($lastname ne $fname) {
+ print OUT "\n /* From $fname */\n";
+ $lastname = $fname;
+ }
printf OUT " /* %4d */ \"%s\",\n", $index++, $s2;
}
} else {
@@ -107,8 +127,8 @@ print OUT " const char *package;\n";
print OUT " const char * const *macros;\n";
print OUT " } packages[$npkg] = {\n";
foreach $pkg (@pkg_list) {
- printf OUT " { \"%s\", nasm_stdmac+%d },\n",
- $pkg, $pkg_index{$pkg};
+ printf OUT " { \"%s\", nasm_stdmac_%s },\n",
+ $pkg, $pkg;
}
print OUT " };\n";
diff --git a/nasm.h b/nasm.h
index ec44f1649..203750e5d 100644
--- a/nasm.h
+++ b/nasm.h
@@ -17,6 +17,7 @@
#include
#include "version.h" /* generated NASM version macros */
#include "nasmlib.h"
+#include "preproc.h"
#include "insnsi.h" /* For enum opcode */
#define NO_SEG -1L /* null segment value */
@@ -750,7 +751,7 @@ struct ofmt {
* and user-level equivalents for any format-specific
* directives).
*/
- const char **stdmac;
+ const macros_t *stdmac;
/*
* This procedure is called at the start of an output session.
diff --git a/output/outaout.c b/output/outaout.c
index 20658acd6..f374b9e01 100644
--- a/output/outaout.c
+++ b/output/outaout.c
@@ -905,12 +905,7 @@ static void aout_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".o", error);
}
-static const char *aout_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t aout_stdmac[];
static int aout_set_info(enum geninfo type, char **val)
{
diff --git a/output/outaout.mac b/output/outaout.mac
new file mode 100644
index 000000000..ef049a284
--- /dev/null
+++ b/output/outaout.mac
@@ -0,0 +1,4 @@
+OUT: aout
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outas86.c b/output/outas86.c
index 9eb684735..b59fe6b31 100644
--- a/output/outas86.c
+++ b/output/outas86.c
@@ -603,12 +603,7 @@ static void as86_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".o", error);
}
-static const char *as86_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t as86_stdmac[];
static int as86_set_info(enum geninfo type, char **val)
{
diff --git a/output/outas86.mac b/output/outas86.mac
new file mode 100644
index 000000000..1edf908ce
--- /dev/null
+++ b/output/outas86.mac
@@ -0,0 +1,4 @@
+OUT: as86
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outbin.c b/output/outbin.c
index d2b574267..e71a60eb6 100644
--- a/output/outbin.c
+++ b/output/outbin.c
@@ -139,15 +139,7 @@ static int origin_defined;
static int map_control = 0;
static char *infile, *outfile;
-static const char *bin_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%imacro org 1+.nolist",
- "[org %1]",
- "%endmacro",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t bin_stdmac[];
static void add_reloc(struct Section *s, int32_t bytes, int32_t secref,
int32_t secrel)
diff --git a/output/outbin.mac b/output/outbin.mac
new file mode 100644
index 000000000..d0ae2a3d5
--- /dev/null
+++ b/output/outbin.mac
@@ -0,0 +1,7 @@
+OUT: bin
+%define __SECT__ [section .text]
+%imacro org 1+.nolist
+[org %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outcoff.c b/output/outcoff.c
index bbd0b5770..d8d1d3dfd 100644
--- a/output/outcoff.c
+++ b/output/outcoff.c
@@ -963,18 +963,7 @@ static void coff_win32_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".obj", error);
}
-static const char *coff_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- "%imacro export 1+.nolist",
- "[export %1]",
- "%endmacro",
- "%imacro safeseh 1.nolist",
- "[safeseh %1]",
- "%endmacro",
- NULL
-};
+extern macros_t coff_stdmac[];
static int coff_set_info(enum geninfo type, char **val)
{
diff --git a/output/outcoff.mac b/output/outcoff.mac
new file mode 100644
index 000000000..c9ecb54c1
--- /dev/null
+++ b/output/outcoff.mac
@@ -0,0 +1,10 @@
+OUT: coff
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
+%imacro export 1+.nolist
+[export %1]
+%endmacro
+%imacro safeseh 1.nolist
+[safeseh %1]
+%endmacro
diff --git a/output/outelf.mac b/output/outelf.mac
new file mode 100644
index 000000000..bd6f82e43
--- /dev/null
+++ b/output/outelf.mac
@@ -0,0 +1,8 @@
+OUT: elf elf32 elf64
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%define $_%1 $%1
+%endmacro
+%macro osabi 1+.nolist
+[osabi %1]
+%endmacro
diff --git a/output/outelf32.c b/output/outelf32.c
index ec4e83838..f97a53c3f 100644
--- a/output/outelf32.c
+++ b/output/outelf32.c
@@ -1480,16 +1480,8 @@ static void elf_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".o", error);
}
-static const char *elf_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%define $_%1 $%1",
- "%endmacro",
- "%macro osabi 1+.nolist",
- "[osabi %1]",
- "%endmacro",
- NULL
-};
+extern macros_t elf_stdmac[];
+
static int elf_set_info(enum geninfo type, char **val)
{
(void)type;
diff --git a/output/outelf64.c b/output/outelf64.c
index 9393e7af2..3980cda85 100644
--- a/output/outelf64.c
+++ b/output/outelf64.c
@@ -1511,16 +1511,8 @@ static void elf_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".o", error);
}
-static const char *elf_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%define $_%1 $%1",
- "%endmacro",
- "%macro osabi 1+.nolist",
- "[osabi %1]",
- "%endmacro",
- NULL
-};
+extern macros_t elf_stdmac[];
+
static int elf_set_info(enum geninfo type, char **val)
{
(void)type;
diff --git a/output/outmacho.c b/output/outmacho.c
index 5ac2878e0..5e9ad8e15 100644
--- a/output/outmacho.c
+++ b/output/outmacho.c
@@ -717,12 +717,7 @@ static void macho_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".o", error);
}
-static const char *macho_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t macho_stdmac[];
/* Comparison function for qsort symbol layout. */
static int layout_compare (const struct symbol **s1,
diff --git a/output/outmacho.mac b/output/outmacho.mac
new file mode 100644
index 000000000..c135bf436
--- /dev/null
+++ b/output/outmacho.mac
@@ -0,0 +1,4 @@
+OUT: macho win32 win64
+%define __SECT__ [section .text]
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outobj.c b/output/outobj.c
index c0736f763..74eb38e6b 100644
--- a/output/outobj.c
+++ b/output/outobj.c
@@ -2292,24 +2292,7 @@ static void obj_fwrite(ObjRecord * orp)
fputc((-cksum) & 0xFF, ofp);
}
-static const char *obj_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%imacro group 1+.nolist",
- "[group %1]",
- "%endmacro",
- "%imacro uppercase 0+.nolist",
- "[uppercase %1]",
- "%endmacro",
- "%imacro export 1+.nolist",
- "[export %1]",
- "%endmacro",
- "%imacro import 1+.nolist",
- "[import %1]",
- "%endmacro",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t obj_stdmac[];
void dbgbi_init(struct ofmt *of, void *id, FILE * fp, efunc error)
{
diff --git a/output/outobj.mac b/output/outobj.mac
new file mode 100644
index 000000000..ef60638a1
--- /dev/null
+++ b/output/outobj.mac
@@ -0,0 +1,16 @@
+OUT: obj
+%define __SECT__ [section .text]
+%imacro group 1+.nolist
+[group %1]
+%endmacro
+%imacro uppercase 0+.nolist
+[uppercase %1]
+%endmacro
+%imacro export 1+.nolist
+[export %1]
+%endmacro
+%imacro import 1+.nolist
+[import %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outrdf.c b/output/outrdf.c
index a6de475ca..8c5b2396c 100644
--- a/output/outrdf.c
+++ b/output/outrdf.c
@@ -509,15 +509,7 @@ static void rdf_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".rdf", error);
}
-static char *rdf_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%imacro library 1+.nolist",
- "[library %1]",
- "%endmacro",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t rdf_stdmac[];
static int rdf_set_info(enum geninfo type, char **val)
{
diff --git a/output/outrdf.mac b/output/outrdf.mac
new file mode 100644
index 000000000..f0c41557a
--- /dev/null
+++ b/output/outrdf.mac
@@ -0,0 +1,7 @@
+OUT: rdf
+%define __SECT__ [section .text]
+%imacro library 1+.nolist
+[library %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/output/outrdf2.c b/output/outrdf2.c
index 05c7ce1b9..b00ad43ea 100644
--- a/output/outrdf2.c
+++ b/output/outrdf2.c
@@ -746,18 +746,7 @@ static void rdf2_filename(char *inname, char *outname, efunc error)
standard_extension(inname, outname, ".rdf", error);
}
-static const char *rdf2_stdmac[] = {
- "%define __SECT__ [section .text]",
- "%imacro library 1+.nolist",
- "[library %1]",
- "%endmacro",
- "%imacro module 1+.nolist",
- "[module %1]",
- "%endmacro",
- "%macro __NASM_CDecl__ 1",
- "%endmacro",
- NULL
-};
+extern macros_t rdf2_stdmac[];
static int rdf2_set_info(enum geninfo type, char **val)
{
diff --git a/output/outrdf2.mac b/output/outrdf2.mac
new file mode 100644
index 000000000..a48cbfb68
--- /dev/null
+++ b/output/outrdf2.mac
@@ -0,0 +1,10 @@
+OUT: rdf2
+%define __SECT__ [section .text]
+%imacro library 1+.nolist
+[library %1]
+%endmacro
+%imacro module 1+.nolist
+[module %1]
+%endmacro
+%macro __NASM_CDecl__ 1
+%endmacro
diff --git a/preproc.c b/preproc.c
index db808e91f..f42c0d0be 100644
--- a/preproc.c
+++ b/preproc.c
@@ -369,7 +369,7 @@ static const char * const *stdmacpos;
* any.
*/
static const char * const *extrastdmac = NULL;
-bool any_extrastdmac;
+static bool any_extrastdmac;
/*
* Tokens are allocated in blocks to improve speed
@@ -4345,7 +4345,7 @@ void pp_runtime(char *definition)
}
-void pp_extra_stdmac(const char **macros)
+void pp_extra_stdmac(const macros_t *macros)
{
extrastdmac = macros;
}
diff --git a/preproc.h b/preproc.h
index bd1210b20..a79ae2775 100644
--- a/preproc.h
+++ b/preproc.h
@@ -14,12 +14,15 @@
extern const char * const pp_directives[];
extern const int pp_directives_len[];
+/* Pointer to a macro chain */
+typedef const char * const macros_t;
+
enum preproc_token pp_token_hash(const char *token);
void pp_include_path(char *);
void pp_pre_include(char *);
void pp_pre_define(char *);
void pp_pre_undefine(char *);
void pp_runtime(char *);
-void pp_extra_stdmac(const char **);
+void pp_extra_stdmac(const macros_t *);
#endif