summaryrefslogtreecommitdiff
path: root/preproc-nop.c
diff options
context:
space:
mode:
Diffstat (limited to 'preproc-nop.c')
-rw-r--r--preproc-nop.c184
1 files changed, 184 insertions, 0 deletions
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
+};