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>
This commit is contained in:
parent
0b78bff510
commit
b5e8fec848
8 changed files with 206 additions and 152 deletions
|
@ -81,7 +81,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
||||||
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
||||||
ilog2.$(O) \
|
ilog2.$(O) \
|
||||||
lib/strlcpy.$(O)
|
lib/strlcpy.$(O) \
|
||||||
|
preproc-nop.$(O)
|
||||||
|
|
||||||
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(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
|
stdscan.h tables.h tokens.h
|
||||||
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h \
|
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h \
|
||||||
preproc.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 \
|
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 \
|
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h \
|
||||||
stdscan.h tables.h tokens.h
|
stdscan.h tables.h tokens.h
|
||||||
|
|
|
@ -50,7 +50,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
||||||
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
||||||
ilog2.$(O) \
|
ilog2.$(O) \
|
||||||
lib/strlcpy.$(O)
|
lib/strlcpy.$(O) \
|
||||||
|
preproc-nop.$(O)
|
||||||
|
|
||||||
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(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 \
|
nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h stdscan.h \
|
||||||
tables.h tokens.h
|
tables.h tokens.h
|
||||||
pptok.$(O): pptok.c compiler.h hashtbl.h nasmlib.h pptok.h preproc.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 \
|
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 \
|
nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h stdscan.h \
|
||||||
tables.h tokens.h
|
tables.h tokens.h
|
||||||
|
|
|
@ -46,7 +46,8 @@ NASM = nasm.o nasmlib.o ver.o \
|
||||||
macros.o listing.o eval.o exprlib.o stdscan.o \
|
macros.o listing.o eval.o exprlib.o stdscan.o \
|
||||||
strfunc.o tokhash.o regvals.o regflags.o \
|
strfunc.o tokhash.o regvals.o regflags.o \
|
||||||
ilog2.o \
|
ilog2.o \
|
||||||
strlcpy.o
|
strlcpy.o \
|
||||||
|
preproc-nop.o
|
||||||
|
|
||||||
NDISASM = ndisasm.o disasm.o sync.o nasmlib.o ver.o \
|
NDISASM = ndisasm.o disasm.o sync.o nasmlib.o ver.o \
|
||||||
insnsd.o insnsb.o insnsn.o regs.o regdis.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 \
|
insnsi.h nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h \
|
||||||
stdscan.h tables.h tokens.h
|
stdscan.h tables.h tokens.h
|
||||||
pptok.o: pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h preproc.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 \
|
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 \
|
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h \
|
||||||
stdscan.h tables.h tokens.h
|
stdscan.h tables.h tokens.h
|
||||||
|
|
|
@ -62,7 +62,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) &
|
||||||
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) &
|
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) &
|
||||||
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) &
|
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) &
|
||||||
ilog2.$(O) &
|
ilog2.$(O) &
|
||||||
lib/strlcpy.$(O)
|
lib/strlcpy.$(O) &
|
||||||
|
preproc-nop.$(O)
|
||||||
|
|
||||||
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) &
|
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) &
|
||||||
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(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
|
stdscan.h tables.h tokens.h
|
||||||
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h &
|
pptok.$(O): pptok.c compiler.h config.h hashtbl.h nasmlib.h pptok.h &
|
||||||
preproc.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 &
|
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 &
|
insnsi.h nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h &
|
||||||
stdscan.h tables.h tokens.h
|
stdscan.h tables.h tokens.h
|
||||||
|
|
|
@ -73,7 +73,8 @@ NASM = nasm.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
macros.$(O) listing.$(O) eval.$(O) exprlib.$(O) stdscan.$(O) \
|
||||||
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
strfunc.$(O) tokhash.$(O) regvals.$(O) regflags.$(O) \
|
||||||
ilog2.$(O) \
|
ilog2.$(O) \
|
||||||
lib/strlcpy.$(O)
|
lib/strlcpy.$(O) \
|
||||||
|
preproc-nop.$(O)
|
||||||
|
|
||||||
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
NDISASM = ndisasm.$(O) disasm.$(O) sync.$(O) nasmlib.$(O) ver.$(O) \
|
||||||
insnsd.$(O) insnsb.$(O) insnsn.$(O) regs.$(O) regdis.$(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 \
|
nasm.h nasmlib.h opflags.h parser.h pptok.h preproc.h regs.h stdscan.h \
|
||||||
tables.h tokens.h
|
tables.h tokens.h
|
||||||
pptok.$(O): pptok.c compiler.h hashtbl.h nasmlib.h pptok.h preproc.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 \
|
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 \
|
nasm.h nasmlib.h opflags.h pptok.h preproc.h quote.h regs.h stdscan.h \
|
||||||
tables.h tokens.h
|
tables.h tokens.h
|
||||||
|
|
148
nasm.c
148
nasm.c
|
@ -165,32 +165,6 @@ static const struct warning {
|
||||||
{"hle", "invalid hle prefixes", true},
|
{"hle", "invalid hle prefixes", true},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* 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...
|
* get/set current offset...
|
||||||
*/
|
*/
|
||||||
|
@ -859,7 +833,7 @@ static bool process_arg(char *p, char *q)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'a': /* assemble only - don't preprocess */
|
case 'a': /* assemble only - don't preprocess */
|
||||||
preproc = &no_pp;
|
preproc = &preproc_nop;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'W':
|
case 'W':
|
||||||
|
@ -2024,126 +1998,6 @@ static void usage(void)
|
||||||
fputs("type `nasm -h' for help\n", error_file);
|
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)
|
static uint32_t get_cpu(char *value)
|
||||||
{
|
{
|
||||||
if (!strcmp(value, "8086"))
|
if (!strcmp(value, "8086"))
|
||||||
|
|
1
nasm.h
1
nasm.h
|
@ -394,6 +394,7 @@ struct preproc_ops {
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct preproc_ops nasmpp;
|
extern struct preproc_ops nasmpp;
|
||||||
|
extern struct preproc_ops preproc_nop;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some lexical properties of the NASM source language, included
|
* Some lexical properties of the NASM source language, included
|
||||||
|
|
184
preproc-nop.c
Normal file
184
preproc-nop.c
Normal file
|
@ -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
|
||||||
|
};
|
Loading…
Reference in a new issue