summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@gmail.com>2012-05-07 11:34:27 +0400
committerCyrill Gorcunov <gorcunov@gmail.com>2012-05-07 11:34:27 +0400
commitb5e8fec848c8264c5486d36ee096a1005ccfbe88 (patch)
treed908d756a36b74979c20da60dc79832e6673d45b
parent0b78bff510e7365ab3334ae7e3daa4650db8ff0f (diff)
downloadnasm-b5e8fec848c8264c5486d36ee096a1005ccfbe88.tar.gz
preproc: Move NOP preprocessor into separate file
No need to carry it in nasm.c, let it be more modular. Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r--Makefile.in5
-rw-r--r--Mkfiles/msvc.mak5
-rw-r--r--Mkfiles/netware.mak5
-rw-r--r--Mkfiles/openwcom.mak5
-rw-r--r--Mkfiles/owlinux.mak5
-rw-r--r--nasm.c148
-rw-r--r--nasm.h1
-rw-r--r--preproc-nop.c184
8 files changed, 206 insertions, 152 deletions
diff --git a/Makefile.in b/Makefile.in
index 2a465eb9..d7b4e224 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -81,7 +81,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
ilog2.$(O) \
- lib/strlcpy.$(O)
+ lib/strlcpy.$(O) \
+ preproc-nop.$(O)
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
@@ -379,6 +380,8 @@ parser.$(O): parser.c compiler.h config.h directiv.h eval.h float.h insns.h \
stdscan.h tables.h tokens.h
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h \
preproc.h
+preproc-nop.$(O): preproc-nop.c compiler.h config.h directiv.h insnsi.h \
+ nasm.h nasmlib.h opflags.h pptok.h preproc.h regs.h
preproc.$(O): preproc.c compiler.h config.h directiv.h eval.h hashtbl.h \
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h \
stdscan.h tables.h tokens.h
diff --git a/Mkfiles/msvc.mak b/Mkfiles/msvc.mak
index 2a9ee827..65efd6c9 100644
--- a/Mkfiles/msvc.mak
+++ b/Mkfiles/msvc.mak
@@ -50,7 +50,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
ilog2.$(O) \
- lib/strlcpy.$(O)
+ lib/strlcpy.$(O) \
+ preproc-nop.$(O)
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
@@ -286,6 +287,8 @@ parser.$(O): parser.c compiler.h directiv.h eval.h float.h insns.h insnsi.h \
nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h stdscan.h \
tables.h tokens.h
pptok.$(O): pptok.c compiler.h hashtbl.h nasmlib.h pptok.h preproc.h
+preproc-nop.$(O): preproc-nop.c compiler.h directiv.h insnsi.h nasm.h \
+ nasmlib.h opflags.h pptok.h preproc.h regs.h
preproc.$(O): preproc.c compiler.h directiv.h eval.h hashtbl.h insnsi.h \
nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h stdscan.h \
tables.h tokens.h
diff --git a/Mkfiles/netware.mak b/Mkfiles/netware.mak
index fb33c230..aa9532e1 100644
--- a/Mkfiles/netware.mak
+++ b/Mkfiles/netware.mak
@@ -46,7 +46,8 @@ NASM = nasm.o nasmlib.o ver.o \
macros.o listing.o eval.o exprlib.o stdscan.o \
strfunc.o tokhash.o regvals.o regflags.o \
ilog2.o \
- strlcpy.o
+ strlcpy.o \
+ preproc-nop.o
NDISASM = ndisasm.o disasm.o sync.o nasmlib.o ver.o \
insnsd.o insnsb.o insnsn.o regs.o regdis.o
@@ -216,6 +217,8 @@ parser.o: parser.c compiler.h config.h directiv.h eval.h float.h insns.h \
insnsi.h nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h \
stdscan.h tables.h tokens.h
pptok.o: pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h preproc.h
+preproc-nop.o: preproc-nop.c compiler.h config.h directiv.h insnsi.h nasm.h \
+ nasmlib.h opflags.h pptok.h preproc.h regs.h
preproc.o: preproc.c compiler.h config.h directiv.h eval.h hashtbl.h \
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h \
stdscan.h tables.h tokens.h
diff --git a/Mkfiles/openwcom.mak b/Mkfiles/openwcom.mak
index 2f1a2cfe..f70e59b4 100644
--- a/Mkfiles/openwcom.mak
+++ b/Mkfiles/openwcom.mak
@@ -62,7 +62,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) &
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) &
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) &
ilog2.$(O) &
- lib/strlcpy.$(O)
+ lib/strlcpy.$(O) &
+ preproc-nop.$(O)
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) &
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
@@ -362,6 +363,8 @@ parser.$(O): parser.c compiler.h config.h directiv.h eval.h float.h insns.h &
stdscan.h tables.h tokens.h
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h &
preproc.h
+preproc-nop.$(O): preproc-nop.c compiler.h config.h directiv.h insnsi.h &
+ nasm.h nasmlib.h opflags.h pptok.h preproc.h regs.h
preproc.$(O): preproc.c compiler.h config.h directiv.h eval.h hashtbl.h &
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h &
stdscan.h tables.h tokens.h
diff --git a/Mkfiles/owlinux.mak b/Mkfiles/owlinux.mak
index 5e4a7933..b655f9c7 100644
--- a/Mkfiles/owlinux.mak
+++ b/Mkfiles/owlinux.mak
@@ -73,7 +73,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
ilog2.$(O) \
- lib/strlcpy.$(O)
+ lib/strlcpy.$(O) \
+ preproc-nop.$(O)
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(O)
@@ -325,6 +326,8 @@ parser.$(O): parser.c compiler.h directiv.h eval.h float.h insns.h insnsi.h \
nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h stdscan.h \
tables.h tokens.h
pptok.$(O): pptok.c compiler.h hashtbl.h nasmlib.h pptok.h preproc.h
+preproc-nop.$(O): preproc-nop.c compiler.h directiv.h insnsi.h nasm.h \
+ nasmlib.h opflags.h pptok.h preproc.h regs.h
preproc.$(O): preproc.c compiler.h directiv.h eval.h hashtbl.h insnsi.h \
nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h stdscan.h \
tables.h tokens.h
diff --git a/nasm.c b/nasm.c
index 21f7139e..63e73e7f 100644
--- a/nasm.c
+++ b/nasm.c
@@ -166,32 +166,6 @@ static const struct warning {
};
/*
- * This is a null preprocessor which just copies lines from input
- * to output. It's used when someone explicitly requests that NASM
- * not preprocess their source file.
- */
-
-static void no_pp_reset(char *file, int pass, ListGen *listgen, StrList **deplist);
-static char *no_pp_getline(void);
-static void no_pp_cleanup(int pass);
-static void no_pp_extra_stdmac(macros_t *macros);
-static void no_pp_pre_define(char *definition);
-static void no_pp_pre_undefine(char *definition);
-static void no_pp_pre_include(char *fname);
-static void no_pp_include_path(char *path);
-
-static struct preproc_ops no_pp = {
- no_pp_reset,
- no_pp_getline,
- no_pp_cleanup,
- no_pp_extra_stdmac,
- no_pp_pre_define,
- no_pp_pre_undefine,
- no_pp_pre_include,
- no_pp_include_path
-};
-
-/*
* get/set current offset...
*/
#define GET_CURR_OFFS (in_abs_seg?abs_offset:\
@@ -859,7 +833,7 @@ static bool process_arg(char *p, char *q)
break;
case 'a': /* assemble only - don't preprocess */
- preproc = &no_pp;
+ preproc = &preproc_nop;
break;
case 'W':
@@ -2024,126 +1998,6 @@ static void usage(void)
fputs("type `nasm -h' for help\n", error_file);
}
-#define BUF_DELTA 512
-
-static FILE *no_pp_fp;
-static ListGen *no_pp_list;
-static int32_t no_pp_lineinc;
-
-static void no_pp_reset(char *file, int pass, ListGen * listgen,
- StrList **deplist)
-{
- src_set_fname(nasm_strdup(file));
- src_set_linnum(0);
- no_pp_lineinc = 1;
- no_pp_fp = fopen(file, "r");
- if (!no_pp_fp)
- nasm_error(ERR_FATAL | ERR_NOFILE,
- "unable to open input file `%s'", file);
- no_pp_list = listgen;
- (void)pass; /* placate compilers */
-
- if (deplist) {
- StrList *sl = nasm_malloc(strlen(file)+1+sizeof sl->next);
- sl->next = NULL;
- strcpy(sl->str, file);
- *deplist = sl;
- }
-}
-
-static char *no_pp_getline(void)
-{
- char *buffer, *p, *q;
- int bufsize;
-
- bufsize = BUF_DELTA;
- buffer = nasm_malloc(BUF_DELTA);
- src_set_linnum(src_get_linnum() + no_pp_lineinc);
-
- while (1) { /* Loop to handle %line */
-
- p = buffer;
- while (1) { /* Loop to handle long lines */
- q = fgets(p, bufsize - (p - buffer), no_pp_fp);
- if (!q)
- break;
- p += strlen(p);
- if (p > buffer && p[-1] == '\n')
- break;
- if (p - buffer > bufsize - 10) {
- int offset;
- offset = p - buffer;
- bufsize += BUF_DELTA;
- buffer = nasm_realloc(buffer, bufsize);
- p = buffer + offset;
- }
- }
-
- if (!q && p == buffer) {
- nasm_free(buffer);
- return NULL;
- }
-
- /*
- * Play safe: remove CRs, LFs and any spurious ^Zs, if any of
- * them are present at the end of the line.
- */
- buffer[strcspn(buffer, "\r\n\032")] = '\0';
-
- if (!nasm_strnicmp(buffer, "%line", 5)) {
- int32_t ln;
- int li;
- char *nm = nasm_malloc(strlen(buffer));
- if (sscanf(buffer + 5, "%"PRId32"+%d %s", &ln, &li, nm) == 3) {
- nasm_free(src_set_fname(nm));
- src_set_linnum(ln);
- no_pp_lineinc = li;
- continue;
- }
- nasm_free(nm);
- }
- break;
- }
-
- no_pp_list->line(LIST_READ, buffer);
-
- return buffer;
-}
-
-static void no_pp_cleanup(int pass)
-{
- (void)pass; /* placate GCC */
- if (no_pp_fp) {
- fclose(no_pp_fp);
- no_pp_fp = NULL;
- }
-}
-
-static void no_pp_extra_stdmac(macros_t *macros)
-{
- (void)macros;
-}
-
-static void no_pp_pre_define(char *definition)
-{
- (void)definition;
-}
-
-static void no_pp_pre_undefine(char *definition)
-{
- (void)definition;
-}
-
-static void no_pp_pre_include(char *fname)
-{
- (void)fname;
-}
-
-static void no_pp_include_path(char *path)
-{
- (void)path;
-}
-
static uint32_t get_cpu(char *value)
{
if (!strcmp(value, "8086"))
diff --git a/nasm.h b/nasm.h
index 48887f21..f7dd0600 100644
--- a/nasm.h
+++ b/nasm.h
@@ -394,6 +394,7 @@ struct preproc_ops {
};
extern struct preproc_ops nasmpp;
+extern struct preproc_ops preproc_nop;
/*
* Some lexical properties of the NASM source language, included
diff --git a/preproc-nop.c b/preproc-nop.c
new file mode 100644
index 00000000..b43bd809
--- /dev/null
+++ b/preproc-nop.c
@@ -0,0 +1,184 @@
+/* ----------------------------------------------------------------------- *
+ *
+ * Copyright 1996-2012 The NASM Authors - All Rights Reserved
+ * See the file AUTHORS included with the NASM distribution for
+ * the specific copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * 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 COPYRIGHT HOLDERS AND
+ * 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 COPYRIGHT OWNER OR
+ * 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.
+ *
+ * ----------------------------------------------------------------------- */
+
+/*
+ * This is a null preprocessor which just copies lines from input
+ * to output. It's used when someone explicitly requests that NASM
+ * not preprocess their source file.
+ */
+
+#include "compiler.h"
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <inttypes.h>
+#include <limits.h>
+#include <time.h>
+
+#include "nasm.h"
+#include "nasmlib.h"
+#include "preproc.h"
+
+#define BUF_DELTA 512
+
+static FILE *nop_fp;
+static ListGen *nop_list;
+static int32_t nop_lineinc;
+
+static void nop_reset(char *file, int pass, ListGen *listgen, StrList **deplist)
+{
+ src_set_fname(nasm_strdup(file));
+ src_set_linnum(0);
+ nop_lineinc = 1;
+ nop_fp = fopen(file, "r");
+
+ if (!nop_fp)
+ nasm_error(ERR_FATAL | ERR_NOFILE,
+ "unable to open input file `%s'", file);
+ nop_list = listgen;
+ (void)pass; /* placate compilers */
+
+ if (deplist) {
+ StrList *sl = nasm_malloc(strlen(file)+1+sizeof sl->next);
+ sl->next = NULL;
+ strcpy(sl->str, file);
+ *deplist = sl;
+ }
+}
+
+static char *nop_getline(void)
+{
+ char *buffer, *p, *q;
+ int bufsize;
+
+ bufsize = BUF_DELTA;
+ buffer = nasm_malloc(BUF_DELTA);
+ src_set_linnum(src_get_linnum() + nop_lineinc);
+
+ while (1) { /* Loop to handle %line */
+
+ p = buffer;
+ while (1) { /* Loop to handle long lines */
+ q = fgets(p, bufsize - (p - buffer), nop_fp);
+ if (!q)
+ break;
+ p += strlen(p);
+ if (p > buffer && p[-1] == '\n')
+ break;
+ if (p - buffer > bufsize - 10) {
+ int offset;
+ offset = p - buffer;
+ bufsize += BUF_DELTA;
+ buffer = nasm_realloc(buffer, bufsize);
+ p = buffer + offset;
+ }
+ }
+
+ if (!q && p == buffer) {
+ nasm_free(buffer);
+ return NULL;
+ }
+
+ /*
+ * Play safe: remove CRs, LFs and any spurious ^Zs, if any of
+ * them are present at the end of the line.
+ */
+ buffer[strcspn(buffer, "\r\n\032")] = '\0';
+
+ if (!nasm_strnicmp(buffer, "%line", 5)) {
+ int32_t ln;
+ int li;
+ char *nm = nasm_malloc(strlen(buffer));
+ if (sscanf(buffer + 5, "%"PRId32"+%d %s", &ln, &li, nm) == 3) {
+ nasm_free(src_set_fname(nm));
+ src_set_linnum(ln);
+ nop_lineinc = li;
+ continue;
+ }
+ nasm_free(nm);
+ }
+ break;
+ }
+
+ nop_list->line(LIST_READ, buffer);
+
+ return buffer;
+}
+
+static void nop_cleanup(int pass)
+{
+ (void)pass; /* placate GCC */
+ if (nop_fp) {
+ fclose(nop_fp);
+ nop_fp = NULL;
+ }
+}
+
+static void nop_extra_stdmac(macros_t *macros)
+{
+ (void)macros;
+}
+
+static void nop_pre_define(char *definition)
+{
+ (void)definition;
+}
+
+static void nop_pre_undefine(char *definition)
+{
+ (void)definition;
+}
+
+static void nop_pre_include(char *fname)
+{
+ (void)fname;
+}
+
+static void nop_include_path(char *path)
+{
+ (void)path;
+}
+
+struct preproc_ops preproc_nop = {
+ nop_reset,
+ nop_getline,
+ nop_cleanup,
+ nop_extra_stdmac,
+ nop_pre_define,
+ nop_pre_undefine,
+ nop_pre_include,
+ nop_include_path
+};