mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-12-26 20:30:16 +00:00
c787df0348
BSAVE ["Filename"], addr, len .12 Fixed BLOAD syntax parsing BLOAD ["Filename"], addr[, len] .11 Fixed Go syntax parsing G StopAddress [SkipAddress,Length] .10 Changed internal parsing of comma operator. It is now left in the command arguments.
241 lines
6.0 KiB
C
241 lines
6.0 KiB
C
#ifndef DEBUGGER_PARSER_H
|
|
#define DEBUGGER_PARSER_H
|
|
|
|
#define CHAR_LF '\x0D'
|
|
#define CHAR_CR '\x0A'
|
|
#define CHAR_SPACE ' '
|
|
#define CHAR_TAB '\t'
|
|
#define CHAR_QUOTE_DOUBLE '"'
|
|
#define CHAR_QUOTE_SINGLE '\''
|
|
#define CHAR_ESCAPE '\x1B'
|
|
|
|
// Globals __________________________________________________________________
|
|
|
|
extern int g_nArgRaw;
|
|
extern Arg_t g_aArgRaw[ MAX_ARGS ]; // pre-processing
|
|
extern Arg_t g_aArgs [ MAX_ARGS ]; // post-processing
|
|
|
|
extern const TCHAR * g_pConsoleFirstArg; // = 0; // points to first arg
|
|
|
|
extern const TokenTable_t g_aTokens[ NUM_TOKENS ];
|
|
|
|
extern const TCHAR TCHAR_LF ;//= 0x0D;
|
|
extern const TCHAR TCHAR_CR ;//= 0x0A;
|
|
extern const TCHAR TCHAR_SPACE ;//= TEXT(' ');
|
|
extern const TCHAR TCHAR_TAB ;//= TEXT('\t');
|
|
extern const TCHAR TCHAR_QUOTE_DOUBLE;
|
|
extern const TCHAR TCHAR_QUOTE_SINGLE;
|
|
|
|
// Prototypes _______________________________________________________________
|
|
|
|
// Arg - Command Processing
|
|
Update_t Help_Arg_1( int iCommandHelp );
|
|
int _Arg_1 ( int nValue );
|
|
int _Arg_1 ( LPTSTR pName );
|
|
int _Arg_Shift ( int iSrc, int iEnd, int iDst = 0 );
|
|
int _Args_Insert( int iSrc, int iEnd, int nLen );
|
|
void ArgsClear ();
|
|
|
|
bool ArgsGetValue ( Arg_t *pArg, WORD * pAddressValue_, const int nBase = 16 );
|
|
bool ArgsGetImmediateValue ( Arg_t *pArg, WORD * pAddressValue_ );
|
|
int ArgsGet ( TCHAR * pInput );
|
|
bool ArgsGetRegisterValue ( Arg_t *pArg, WORD * pAddressValue_ );
|
|
void ArgsRawParse ( void );
|
|
int ArgsCook ( const int nArgs, const int bProcessMask ); // ArgsRawCook
|
|
|
|
// Token
|
|
const char * ParserFindToken( const char *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e * pToken_ );
|
|
|
|
// Text Util
|
|
/*
|
|
inline const char* SkipEOL ( const char *pSrc )
|
|
{
|
|
while (pSrc && ((*pSrc == CHAR_LF) || (*pSrc == CHAR_CR)))
|
|
if (pSrc)
|
|
{
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
*/
|
|
|
|
inline const char* EatEOL ( const char *pSrc )
|
|
{
|
|
if (pSrc)
|
|
{
|
|
if (*pSrc == CHAR_LF)
|
|
pSrc++;
|
|
|
|
if (*pSrc == CHAR_CR)
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipWhiteSpace ( const char *pSrc )
|
|
{
|
|
while (pSrc && ((*pSrc == CHAR_SPACE) || (*pSrc == CHAR_TAB)))
|
|
{
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipWhiteSpaceReverse ( const char *pSrc, const char *pStart )
|
|
{
|
|
while (pSrc && ((*pSrc == CHAR_SPACE) || (*pSrc == CHAR_TAB)) && (pSrc > pStart))
|
|
{
|
|
pSrc--;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilChar ( const char *pSrc, const char nDelim )
|
|
{
|
|
while (pSrc && (*pSrc))
|
|
{
|
|
if (*pSrc == nDelim)
|
|
break;
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilEOL ( const char *pSrc )
|
|
{
|
|
// EOL delims: NULL, LF, CR
|
|
while (pSrc && (*pSrc))
|
|
{
|
|
if ((*pSrc == CHAR_LF) || (*pSrc == CHAR_CR))
|
|
{
|
|
break;
|
|
}
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilTab ( const char *pSrc)
|
|
{
|
|
while (pSrc && (*pSrc))
|
|
{
|
|
if (*pSrc == CHAR_TAB)
|
|
{
|
|
break;
|
|
}
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilToken ( const char *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e *pToken_ )
|
|
{
|
|
if ( pToken_)
|
|
*pToken_ = NO_TOKEN;
|
|
|
|
while (pSrc && (*pSrc))
|
|
{
|
|
if (ParserFindToken( pSrc, aTokens, nTokens, pToken_ ))
|
|
return pSrc;
|
|
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilWhiteSpace ( const char *pSrc )
|
|
{
|
|
while (pSrc && (*pSrc))
|
|
{
|
|
if ((*pSrc == CHAR_SPACE) || (*pSrc == CHAR_TAB))
|
|
{
|
|
break;
|
|
}
|
|
pSrc++;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
inline const char* SkipUntilWhiteSpaceReverse ( const char *pSrc, const char *pStart )
|
|
{
|
|
while (pSrc && (pSrc > pStart))
|
|
{
|
|
if ((*pSrc == CHAR_SPACE) || (*pSrc == CHAR_TAB))
|
|
{
|
|
break;
|
|
}
|
|
pSrc--;
|
|
}
|
|
return pSrc;
|
|
}
|
|
|
|
|
|
/*
|
|
const TCHAR* SkipEOL ( const TCHAR *pSrc );
|
|
const TCHAR* SkipWhiteSpace ( const TCHAR *pSrc );
|
|
const TCHAR* SkipWhiteSpaceReverse ( const TCHAR *pSrc, const TCHAR *pStart );
|
|
const TCHAR* SkipUntilChar ( const TCHAR *pSrc, const TCHAR nDelim );
|
|
const TCHAR* SkipUntilEOL ( const TCHAR *pSrc );
|
|
const TCHAR* SkipUntilToken ( const TCHAR *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e *pToken_ );
|
|
const TCHAR* SkipUntilWhiteSpace ( const TCHAR *pSrc );
|
|
const TCHAR* SkipUntilWhiteSpaceReverse ( const TCHAR *pSrc, const TCHAR *pStart );
|
|
const TCHAR* SkipUntilTab ( const TCHAR *pSrc);
|
|
*/
|
|
|
|
const TCHAR * FindTokenOrAlphaNumeric ( const TCHAR *pSrc, const TokenTable_t *aTokens, const int nTokens, ArgToken_e * pToken_ );
|
|
// TextRemoveWhiteSpaceReverse
|
|
int RemoveWhiteSpaceReverse ( char *pSrc );
|
|
// TextExpandTabsToSpaces
|
|
void TextConvertTabsToSpaces( TCHAR *pDeTabified_, LPCTSTR pText, const int nDstSize, int nTabStop = 0 );
|
|
|
|
|
|
/** Assumes text are valid hex digits!
|
|
//=========================================================================== */
|
|
inline BYTE TextConvert2CharsToByte ( char *pText )
|
|
{
|
|
BYTE n = ((pText[0] <= '@') ? (pText[0] - '0') : (pText[0] - 'A' + 10)) << 4;
|
|
n += ((pText[1] <= '@') ? (pText[1] - '0') : (pText[1] - 'A' + 10)) << 0;
|
|
return n;
|
|
}
|
|
|
|
//===========================================================================
|
|
inline bool TextIsHexChar( char nChar )
|
|
{
|
|
if ((nChar >= '0') && (nChar <= '9'))
|
|
return true;
|
|
|
|
if ((nChar >= 'A') && (nChar <= 'F'))
|
|
return true;
|
|
|
|
if ((nChar >= 'a') && (nChar <= 'f'))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
|
|
//===========================================================================
|
|
inline bool TextIsHexByte( char *pText )
|
|
{
|
|
if (TextIsHexChar( pText[0] ) &&
|
|
TextIsHexChar( pText[1] ))
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
//===========================================================================
|
|
inline bool TextIsHexString ( LPCSTR pText )
|
|
{
|
|
while (*pText)
|
|
{
|
|
if (! TextIsHexChar( *pText ))
|
|
return false;
|
|
|
|
pText++;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
#endif
|