mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
5.2 KiB
145 lines
5.2 KiB
// Scanner data structures
|
|
//---------------------------------------------------------------------------
|
|
#define MAXSYMLEN 250 // Max symbol length
|
|
#define MAXSF 32 // Max source files in single compilation
|
|
#define MAXINC 6 // Max include file depth
|
|
#define MAXLINE 512 // Max line length
|
|
|
|
#define SCN_OSS 0 // Out of symbol table space
|
|
#define SCN_TOODEEP 1 // Too many nested '$IFs
|
|
#define SCN_UNXPELSE 2 // Unexpected '$ELSE
|
|
#define SCN_LOGIC 3 // AND, OR, or NOT expected
|
|
#define SCN_UNXPENDIF 4 // Unexpected '$ENDIF
|
|
#define SCN_ENDIFEXP 5 // '$ENDIF expected
|
|
#define SCN_PAREN 6 // ')' expected
|
|
#define SCN_INCERR 7 // '$INCLUDE syntax error
|
|
#define SCN_INCFILE 8 // Can't open '$INCLUDE file
|
|
#define SCN_INCMEM 9 // OOM for '$INCLUDE file
|
|
#define SCN_INCDEEP 10 // Too many '$INCLUDE files
|
|
#define SCN_TOOLONG 11 // Line too long
|
|
#define SCN_SYMEXP 12 // Symbol expected
|
|
#define SCN_LONGSYM 13 // Symbol too long
|
|
#define SCN_SYNTAX 14 // Syntax error
|
|
#define SCN_METAERR 15 // Metacommand error
|
|
#define SCN_USERBRK 16 // Terminated by user
|
|
|
|
// Metacommand constants
|
|
//---------------------------------------------------------------------------
|
|
#define MC_DEFINE 0
|
|
#define MC_IFDEF 1
|
|
#define MC_IFNDEF 2
|
|
#define MC_ELSEIFDEF 3
|
|
#define MC_ELSEIFNDEF 4
|
|
#define MC_ELSE 5
|
|
#define MC_ENDIF 6
|
|
#define MC_INCLUDE 7
|
|
#define MC_COMMENT 8
|
|
#define MC_UNDEF 9
|
|
|
|
#define ER_SCAN 1540 // Scan-time error
|
|
|
|
typedef struct tagIFREC
|
|
{
|
|
BOOL state; // TRUE = copying, FALSE = not copying
|
|
BOOL elseseen; // TRUE = '$ELSE directive seen
|
|
BOOL blkcopied; // TRUE = conditional block copied
|
|
struct tagIFREC *next; // Pointer to rest of IFDEF stack
|
|
} IFREC;
|
|
|
|
typedef struct tagFILEINFO
|
|
{
|
|
LPSTR lpText; // Current text pointer into file memory
|
|
UINT nLineNo; // Current line number
|
|
IFREC *pIfStack; // Base of IFREC stack for this file
|
|
UINT nParent; // Index of parent file
|
|
UINT nDepth; // Depth of this file (cbloader ID value)
|
|
BOOL fLoaded; // TRUE -> file is "loaded"
|
|
CHAR szName[_MAX_PATH]; // Full name of file
|
|
} FILEINFO;
|
|
|
|
typedef struct tagSYMNODE
|
|
{
|
|
BOOL fDef; // Defined flag
|
|
struct tagSYMNODE *left; // left child
|
|
struct tagSYMNODE *right; // right child
|
|
CHAR szSym[1]; // Symbol name, variable length
|
|
} SYMNODE;
|
|
|
|
typedef LPSTR (*CBLOADER)(LPSTR,UINT,UINT,BOOL,LPSTR);
|
|
|
|
// These macros make the code a little more readable
|
|
//---------------------------------------------------------------------------
|
|
#define CUR_FILE (*lpCurFI)
|
|
#define AVAIL_FILE lpFI[nFileAvail]
|
|
#define CUR_STATE pIfStack->state
|
|
#define LAST_STATE pIfStack->next->state
|
|
#define CUR_ELSESEEN pIfStack->elseseen
|
|
#define CUR_BLKCOPIED pIfStack->blkcopied
|
|
|
|
#define LptrAlloc(b) LocalAlloc(LMEM_FIXED,b)
|
|
#define LmemAlloc(b) LocalAlloc(LMEM_MOVEABLE,b)
|
|
#define LmemFree(h) LocalFree(h)
|
|
#define LmemLock(h) LocalLock(h)
|
|
#define LmemUnlock(h) LocalUnlock(h)
|
|
#define GmemAlloc(b) GlobalAlloc(GHND,b)
|
|
#define GmemLock(h) GlobalLock(h)
|
|
#define GmemUnlock(h) GlobalUnlock(h)
|
|
#define GmemFree(h) GlobalFree(h)
|
|
|
|
extern VOID ScriptError (INT, INT, INT, INT, INT, LPSTR);
|
|
|
|
BOOL BeginScan (LPSTR, CBLOADER, UINT, PSTR *);
|
|
VOID EndScan (VOID);
|
|
LPSTR GetScriptFileName (UINT);
|
|
VOID NEAR LoadIncludeFile (VOID);
|
|
VOID ScanError (INT);
|
|
BOOL NEAR PushState (INT, INT, INT);
|
|
BOOL NEAR PopState (VOID);
|
|
INT NEAR ParseCommentLine (VOID);
|
|
CHAR * NEAR NextToken (VOID);
|
|
BOOL NEAR PopScannerStatus (VOID);
|
|
BOOL NEAR GetRawLine (LPSTR);
|
|
INT FetchLine (LPSTR, UINT FAR *, UINT FAR *);
|
|
BOOL NEAR SymbolExpression (VOID);
|
|
BOOL NEAR SymExpA (VOID);
|
|
BOOL NEAR SymExpB (VOID);
|
|
BOOL NEAR SymExpC (VOID);
|
|
SYMNODE * NEAR NewSymNode (LPSTR);
|
|
BOOL NEAR AddSymbol (SYMNODE *, LPSTR);
|
|
SYMNODE * NEAR FindSymbol (SYMNODE *, LPSTR);
|
|
VOID NEAR RemoveSymbol (SYMNODE *, LPSTR);
|
|
BOOL NEAR IsDefined (SYMNODE *, LPSTR);
|
|
VOID NEAR FreeSymbolTree (SYMNODE *);
|
|
|
|
extern BOOL UpdateCompDlg (INT, LPSTR, UINT, UINT);
|
|
extern BOOL fDoCmpDlg;
|
|
|
|
|
|
// Scanner error messages
|
|
//---------------------------------------------------------------------------
|
|
CHAR *scanerrs[] = {
|
|
"Out of symbol table space",
|
|
"Too many nested '$IFx directives",
|
|
"Unexpected '$ELSE directive",
|
|
"\"AND\", \"OR\", or \"NOT\" expected",
|
|
"Unexpected '$ENDIF directive",
|
|
"EOF reached, '$ENDIF expected",
|
|
"\")\" expected",
|
|
"Syntax error in '$INCLUDE statement",
|
|
"Cannot open '$INCLUDE file",
|
|
"Out of memory for '$INCLUDE file",
|
|
"Too many nested '$INCLUDE files",
|
|
"Line too long",
|
|
"Symbol expected",
|
|
"Symbol too long",
|
|
"Syntax error",
|
|
"Metacommand error",
|
|
"Terminated by user"};
|
|
|
|
#ifdef WIN16
|
|
#define VersionStr "WINDOWS"
|
|
#else
|
|
#define VersionStr "NT"
|
|
#endif
|
|
|
|
#define RelVer "_TEST20"
|