127 lines
5.1 KiB
C
127 lines
5.1 KiB
C
|
/************************************************************************/
|
||
|
/* */
|
||
|
/* RCPP - Resource Compiler Pre-Processor for NT system */
|
||
|
/* */
|
||
|
/* P0DEFS.H - Defintions for PreProcessor parsing code */
|
||
|
/* */
|
||
|
/* 06-Dec-90 w-BrianM Update for NT from PM SDK RCPP */
|
||
|
/* */
|
||
|
/************************************************************************/
|
||
|
|
||
|
struct s_defn {
|
||
|
pdefn_t defn_next; /* pointer to next ident */
|
||
|
PWCHAR defn_ident; /* pointer to name */
|
||
|
PWCHAR defn_text; /* definition substitution string */
|
||
|
char defn_nformals; /*number of formal arguments - can be <0*/
|
||
|
char defn_expanding; /* are we already expanding this one? */
|
||
|
};
|
||
|
|
||
|
#define DEFN_IDENT(P) ((P)->defn_ident)
|
||
|
#define DEFN_NAME(P) (DEFN_IDENT(P))
|
||
|
#define DEFN_NEXT(P) ((P)->defn_next)
|
||
|
#define DEFN_TEXT(P) ((P)->defn_text)
|
||
|
#define DEFN_NFORMALS(P) ((P)->defn_nformals)
|
||
|
#define DEFN_EXPANDING(P) ((P)->defn_expanding)
|
||
|
|
||
|
#define FILE_EOS 0x01L
|
||
|
#define ACTUAL_EOS 0x02L
|
||
|
#define DEFINITION_EOS 0x04L
|
||
|
#define RESCAN_EOS 0x08L
|
||
|
#define BACKSLASH_EOS 0x10L
|
||
|
#define ANY_EOS ( FILE_EOS | ACTUAL_EOS | DEFINITION_EOS \
|
||
|
| RESCAN_EOS | BACKSLASH_EOS )
|
||
|
|
||
|
/*
|
||
|
** arbitrarily chosen characters that get special treatment when found
|
||
|
** after EOS in handle_eos()
|
||
|
*/
|
||
|
#define EOS_ACTUAL L'A'
|
||
|
#define EOS_DEFINITION L'D'
|
||
|
#define EOS_RESCAN L'R'
|
||
|
#define EOS_PAD L'P'
|
||
|
|
||
|
#define FROM_COMMAND -2
|
||
|
#define PRE_DEFINED(P) (DEFN_NFORMALS(P) < FROM_COMMAND)
|
||
|
|
||
|
typedef struct s_expstr {
|
||
|
ptext_t exp_string; /* ptr to next character in stream aft macro */
|
||
|
WCHAR *exp_actuals; /* ptr to start of actuals linked list */
|
||
|
ptext_t exp_text; /* ptr to expanded text for this macro */
|
||
|
pdefn_t exp_macro; /* ptr to macro defn */
|
||
|
UCHAR exp_nactuals; /* number of actuals */
|
||
|
UCHAR exp_nactsexpanded;/* number of expanded actuals for handle_eos*/
|
||
|
} expansion_t;
|
||
|
|
||
|
/*
|
||
|
** note that CURRENT_STRING usually points into an area in the macro
|
||
|
** expansion buffer, but the first item used (Macro_depth equals 1) points
|
||
|
** to text read from a file. In some versions, the heap is reshuffled
|
||
|
** and this pointer must be updated for the first item.
|
||
|
*/
|
||
|
#define CURRENT_STRING Macro_expansion[Macro_depth].exp_string
|
||
|
#define CURRENT_ACTUALS Macro_expansion[Macro_depth].exp_actuals
|
||
|
#define CURRENT_TEXT Macro_expansion[Macro_depth].exp_text
|
||
|
#define CURRENT_MACRO Macro_expansion[Macro_depth].exp_macro
|
||
|
#define CURRENT_NACTUALS Macro_expansion[Macro_depth].exp_nactuals
|
||
|
#define CURRENT_NACTSEXPANDED Macro_expansion[Macro_depth].exp_nactsexpanded
|
||
|
|
||
|
/*
|
||
|
** finds address after last element in an array. Used to check for
|
||
|
** buffer overflows.
|
||
|
*/
|
||
|
#define LIMIT(a) &(a)[sizeof(a) / sizeof(*a)]
|
||
|
|
||
|
#define IS_CHAR(c,uc) (towupper(c) == (uc))
|
||
|
#define IS_B(c) IS_CHAR(c, L'B')
|
||
|
#define IS_D(c) IS_CHAR(c, L'D')
|
||
|
#define IS_E(c) IS_CHAR(c, L'E')
|
||
|
#define IS_F(c) IS_CHAR(c, L'F')
|
||
|
#define IS_H(c) IS_CHAR(c, L'H')
|
||
|
#define IS_EL(c) IS_CHAR(c, L'L')
|
||
|
#define IS_O(c) IS_CHAR(c, L'O')
|
||
|
#define IS_Q(c) IS_CHAR(c, L'Q')
|
||
|
#define IS_U(c) IS_CHAR(c, L'U')
|
||
|
#define IS_X(c) IS_CHAR(c, L'X')
|
||
|
#define IS_DOT(c) (c == L'.')
|
||
|
#define IS_SIGN(c) ((c == L'+') || (c ==L'-'))
|
||
|
|
||
|
#define P0_IF 0
|
||
|
#define P0_ELIF 1
|
||
|
#define P0_ELSE 2
|
||
|
#define P0_ENDIF 3
|
||
|
#define P0_IFDEF 4
|
||
|
#define P0_IFNDEF 5
|
||
|
#define P0_DEFINE 6
|
||
|
#define P0_INCLUDE 7
|
||
|
#define P0_PRAGMA 8
|
||
|
#define P0_UNDEF 9
|
||
|
#define P0_LINE 10
|
||
|
#define P0_NOTOKEN 11
|
||
|
#define P0_ERROR 12
|
||
|
#define P0_IDENT 13
|
||
|
|
||
|
|
||
|
#define HLN_NAME(s) ((s).hln_name)
|
||
|
#define HLN_HASH(s) ((s).hln_hash)
|
||
|
#define HLN_LENGTH(s) ((s).hln_length)
|
||
|
#define HLN_IDENT_HASH(p) (HLN_HASH(*(p)))
|
||
|
#define HLN_IDENT_LENGTH(p) (HLN_LENGTH(*(p)))
|
||
|
#define HLN_IDENTP_NAME(p) (HLN_NAME(*(p)))
|
||
|
#define HLN_TO_NAME(S) ((PWCHAR)pstrndup(HLN_IDENTP_NAME(S),HLN_IDENT_LENGTH(S)))
|
||
|
|
||
|
#define HASH_MASK 0x5f
|
||
|
|
||
|
#define LIMIT_ID_LENGTH 31
|
||
|
#define LIMIT_NESTED_INCLUDES 1024
|
||
|
#define LIMIT_MACRO_DEPTH 64
|
||
|
#define LIMIT_STRING_LENGTH 2043
|
||
|
#define LEVEL_0 0xffL
|
||
|
|
||
|
#define MUST_OPEN 1
|
||
|
#define MAY_OPEN 0
|
||
|
|
||
|
/*** The following are defined to use on the Token Table ***/
|
||
|
|
||
|
#define TS_STR(idx) (Tokstrings[idx-L_NOTOKEN].k_text)
|
||
|
#define TS_VALUE(idx) (Tokstrings[idx-L_NOTOKEN].k_token)
|