diff lwcc/cpp.h @ 495:5b8871fd7503

Merged previous lwcc development branch into mainline.
author William Astle <lost@l-w.ca>
date Mon, 05 Aug 2019 21:27:09 -0600
parents 670ea8f90212
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lwcc/cpp.h	Mon Aug 05 21:27:09 2019 -0600
@@ -0,0 +1,90 @@
+/*
+lwcc/cpp.h
+
+Copyright © 2013 William Astle
+
+This file is part of LWTOOLS.
+
+LWTOOLS is free software: you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the Free Software
+Foundation, either version 3 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+more details.
+
+You should have received a copy of the GNU General Public License along with
+this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef cpp_h_seen___
+#define cpp_h_seen___
+
+#include <stdio.h>
+
+#include <lw_stringlist.h>
+
+//#include "symbol.h"
+#include "token.h"
+
+#define TOKBUFSIZE 32
+
+struct expand_e
+{
+	struct expand_e *next;
+	struct symtab_e *s;		// symbol table entry of the expanding symbol
+};
+
+struct preproc_info
+{
+	const char *fn;
+	FILE *fp;
+	struct token *tokqueue;
+	struct token *curtok;
+	void (*errorcb)(const char *);
+	void (*warningcb)(const char *);
+	int eolstate;			// internal for use in handling newlines
+	int lineno;				// the current input line number
+	int column;				// the current input column
+	int trigraphs;			// nonzero if we're going to handle trigraphs
+	int ra;
+	int qseen;
+	int ungetbufl;
+	int ungetbufs;
+	int *ungetbuf;
+	int unget;
+	int eolseen;
+	int nlseen;
+	int ppeolseen;			// nonzero if we've seen only whitespace (or nothing) since a newline
+	int skip_level;			// nonzero if we're in a false conditional
+	int found_level;		// nonzero if we're in a true conditional
+	int else_level;			// for counting #else directives
+	int else_skip_level;	// ditto
+	struct symtab_e *sh;	// the preprocessor's symbol table
+	struct token *sourcelist;	// for expanding a list of tokens
+	struct expand_e *expand_list;	// record of which macros are currently being expanded
+	char *lexstr;			// for lexing a string (token pasting)
+	int lexstrloc;			// ditto
+	struct preproc_info *n;	// next in file stack
+	struct preproc_info *filestack;	// stack of saved files during include
+	struct lw_strpool *strpool;
+	lw_stringlist_t quotelist;
+	lw_stringlist_t inclist;
+};
+
+extern struct preproc_info *preproc_init(const char *);
+extern struct token *preproc_next_token(struct preproc_info *);
+extern struct token *preproc_next_processed_token(struct preproc_info *);
+extern void preproc_finish(struct preproc_info *);
+extern void preproc_register_error_callback(struct preproc_info *, void (*)(const char *));
+extern void preproc_register_warning_callback(struct preproc_info *, void (*)(const char *));
+extern void preproc_throw_error(struct preproc_info *, const char *, ...);
+extern void preproc_throw_warning(struct preproc_info *, const char *, ...);
+extern void preproc_unget_token(struct preproc_info *, struct token *);
+extern void preproc_add_include(struct preproc_info *, char *, int);
+extern void preproc_add_macro(struct preproc_info *, char *);
+extern struct token *preproc_next(struct preproc_info *);
+
+#endif // cpp_h_seen___