diff options
author | Cyrill Gorcunov <gorcunov@gmail.com> | 2012-05-07 11:34:27 +0400 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2012-05-07 11:34:27 +0400 |
commit | b5e8fec848c8264c5486d36ee096a1005ccfbe88 (patch) | |
tree | d908d756a36b74979c20da60dc79832e6673d45b | |
parent | 0b78bff510e7365ab3334ae7e3daa4650db8ff0f (diff) | |
download | nasm-b5e8fec848c8264c5486d36ee096a1005ccfbe88.tar.gz nasm-b5e8fec848c8264c5486d36ee096a1005ccfbe88.tar.bz2 nasm-b5e8fec848c8264c5486d36ee096a1005ccfbe88.zip |
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.in | 5 | ||||
-rw-r--r-- | Mkfiles/msvc.mak | 5 | ||||
-rw-r--r-- | Mkfiles/netware.mak | 5 | ||||
-rw-r--r-- | Mkfiles/openwcom.mak | 5 | ||||
-rw-r--r-- | Mkfiles/owlinux.mak | 5 | ||||
-rw-r--r-- | nasm.c | 148 | ||||
-rw-r--r-- | nasm.h | 1 | ||||
-rw-r--r-- | preproc-nop.c | 184 |
8 files changed, 206 insertions, 152 deletions
diff --git a/Makefile.in b/Makefile.in index 2a465eb..d7b4e22 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 2a9ee82..65efd6c 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 fb33c23..aa9532e 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 2f1a2cf..f70e59b 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 5e4a793..b655f9c 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 @@ -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")) @@ -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 0000000..b43bd80 --- /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 +}; |