#pragma once

#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'

// Text Util

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* 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;
		}



/** 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;
	}