windows-nt/Source/XPSP1/NT/sdktools/rcdll/p0defs.h
2020-09-26 16:20:57 +08:00

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)