/* * Copyright 1998 Bertho A. Stultiens (BS) * Copyright 2002 Alexandre Julliard * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __WINE_WPP_PRIVATE_H #define __WINE_WPP_PRIVATE_H #ifndef __WINE_CONFIG_H # error You must include config.h to use this header #endif #include #include struct pp_entry; /* forward */ /* * Include logic * A stack of files which are already included and * are protected in the #ifndef/#endif way. */ typedef struct includelogicentry { struct includelogicentry *next; struct includelogicentry *prev; struct pp_entry *ppp; /* The define which protects the file */ char *filename; /* The filename of the include */ } includelogicentry_t; /* * The arguments of a macrodefinition */ typedef enum { arg_single, arg_list } def_arg_t; typedef struct marg { def_arg_t type; /* Normal or ... argument */ char *arg; /* The textual argument */ int nnl; /* Number of newlines in the text to subst */ } marg_t; /* * The expansiontext of a macro */ typedef enum { exp_text, /* Simple text substitution */ exp_concat, /* Concat (##) operator requested */ exp_stringize, /* Stringize (#) operator requested */ exp_subst /* Substitute argument */ } def_exp_t; typedef struct mtext { struct mtext *next; struct mtext *prev; def_exp_t type; union { char *text; int argidx; /* For exp_subst and exp_stringize reference */ } subst; } mtext_t; /* * The define descriptor */ typedef enum { def_none, /* Not-a-define; used as return value */ def_define, /* Simple defines */ def_macro, /* Macro defines */ def_special /* Special expansions like __LINE__ and __FILE__ */ } def_type_t; typedef struct pp_entry { struct pp_entry *next; struct pp_entry *prev; def_type_t type; /* Define or macro */ char *ident; /* The key */ marg_t **margs; /* Macro arguments array or NULL if none */ int nargs; union { mtext_t *mtext; /* The substitution sequence or NULL if none */ char *text; } subst; int expanding; /* Set when feeding substitution into the input */ char *filename; /* Filename where it was defined */ int linenumber; /* Linenumber where it was defined */ includelogicentry_t *iep; /* Points to the include it protects */ } pp_entry_t; /* * If logic */ #define MAXIFSTACK 64 /* If this isn't enough you should alter the source... */ typedef enum { if_false, if_true, if_elif, if_elsefalse, if_elsetrue, if_ignore, if_error } pp_if_state_t; /* * Trace the include files to prevent double reading. * This save 20..30% of processing time for most stuff * that uses complex includes. * States: * -1 Don't track or seen junk * 0 New include, waiting for "#ifndef __xxx_h" * 1 Seen #ifndef, waiting for "#define __xxx_h ..." * 2 Seen #endif, waiting for EOF */ typedef struct { int state; char *ppp; /* The define to be set from the #ifndef */ int ifdepth; /* The level of ifs at the #ifdef */ int seen_junk; /* Set when junk is seen */ } include_state_t; /* * If the configure says we have long long then we can use it. Presumably * if we have long long then we have strtoull and strtoll too. If that is * not the case we will need to add to the configure tests. * If we do not have long long , then we revert to a simple 'long' for now. * This should prevent most unexpected things with other compilers than * gcc and egcs for now. * In the future it should be possible to use another way, like a * structure, so that we can emulate the MS compiler. */ #ifdef HAVE_LONG_LONG typedef long long wrc_sll_t; typedef unsigned long long wrc_ull_t; #else typedef long wrc_sll_t; typedef unsigned long wrc_ull_t; #endif #define SIZE_CHAR 1 #define SIZE_SHORT 2 #define SIZE_INT 3 #define SIZE_LONG 4 #define SIZE_LONGLONG 5 #define SIZE_MASK 0x00ff #define FLAG_SIGNED 0x0100 typedef enum { #if 0 cv_schar = SIZE_CHAR + FLAG_SIGNED, cv_uchar = SIZE_CHAR, cv_sshort = SIZE_SHORT + FLAG_SIGNED, cv_ushort = SIZE_SHORT, #endif cv_sint = SIZE_INT + FLAG_SIGNED, cv_uint = SIZE_INT, cv_slong = SIZE_LONG + FLAG_SIGNED, cv_ulong = SIZE_LONG, cv_sll = SIZE_LONGLONG + FLAG_SIGNED, cv_ull = SIZE_LONGLONG } ctype_t; typedef struct cval { ctype_t type; union { #if 0 signed char sc; /* Explicitly signed because compilers are stupid */ unsigned char uc; short ss; unsigned short us; #endif int si; unsigned int ui; long sl; unsigned long ul; wrc_sll_t sll; wrc_ull_t ull; } val; } cval_t; void *pp_xmalloc(size_t); void *pp_xrealloc(void *, size_t); char *pp_xstrdup(const char *str); pp_entry_t *pplookup(const char *ident); int pp_push_define_state(void); void pp_pop_define_state(void); pp_entry_t *pp_add_define(char *def, char *text); pp_entry_t *pp_add_macro(char *ident, marg_t *args[], int nargs, mtext_t *exp); void pp_del_define(const char *name); FILE *pp_open_include(const char *name, const char *parent_name, char **newpath); void pp_push_if(pp_if_state_t s); void pp_next_if_state(int); pp_if_state_t pp_pop_if(void); pp_if_state_t pp_if_state(void); int pp_get_if_depth(void); #ifndef __GNUC__ #define __attribute__(x) /*nothing*/ #endif extern const struct wpp_callbacks *wpp_callbacks; int ppy_error(const char *s, ...) __attribute__((format (printf, 1, 2))); int ppy_warning(const char *s, ...) __attribute__((format (printf, 1, 2))); void pp_internal_error(const char *file, int line, const char *s, ...) __attribute__((format (printf, 3, 4))); /* current preprocessor state */ /* everything is in this structure to avoid polluting the global symbol space */ struct pp_status { const char *input; /* current input file name */ int line_number; /* current line number */ int char_number; /* current char number in line */ int state; /* current error state */ int pedantic; /* pedantic option */ int debug; /* debug messages flag */ }; extern struct pp_status pp_status; extern include_state_t pp_incl_state; extern includelogicentry_t *pp_includelogiclist; /* * From ppl.l */ extern FILE *ppy_in; extern FILE *ppy_out; extern char *ppy_text; extern int pp_flex_debug; int ppy_lex(void); void pp_do_include(char *fname, int type); void pp_push_ignore_state(void); void pp_pop_ignore_state(void); /* * From ppy.y */ int ppy_parse(void); extern int ppy_debug; #endif /* __WINE_WPP_PRIVATE_H */