#ifndef GPIB_PARSER_VALIDATORS_H #define GPIB_PARSER_VALIDATORS_H #include // isalpha, isdigit #include "gpib_parser_casts.h" #include "gpib_parser_validators_numbers.h" // Validators for numbers #include "gpib_parser_chars.h" // Service characters definitions //-------------------------------------------------------------------------- #define IsCorrectPointer(ptr) ( NULL != (ptr) ) #define IsCodePointer(ptr) IsCorrectPointer(ptr) // not to check for flash-memory pointer, mbrrrrrr. //-------------------------------------------------------------------------- typedef enum { eqmNone=0, // eqmSingle=1, // Single-quote mode eqmDouble=2 // Double-quote mode } eQuoteMode_t; // Defines the mode of quoting //-------------------------------------------------------------------------- // IsCharacter: // Checks whether @ch is an alphabetic letter. static inline BOOL IsCharacter( const char ch ) { return MAKE_BOOL( isalpha(ch) ); /* return MAKE_BOOL(((character) & 0xDF)<='Z' && ((character) & 0xDF)>='A') */ } //-------------------------------------------------------------------------- // IsOptionalHeader: // Checks if the command header relates to the optional command, or not static inline BOOL IsOptionalHeader( const char * headerString ) { (void)headerString; // skip the checking for NULL pointer // Optional header starts with the the GPIB_CHAR_OPTIONALHEADER_SIGN sign return MAKE_BOOL( GPIB_CHAR_OPTIONALHEADER_SIGN == headerString[0] ); } //-------------------------------------------------------------------------- // IsValid_GPIBHeaderBodyChar: // Checks the character in order to validate the GPIB header body. // @IsValid_GPIBHeaderBodyChar returns TRUE if the character is a valid for GPIB // header body. // Note: the GPIB_CHAR_MANDATORY_IEEE488_SIGN character is not a body character, // so it is not valid character for this function. static inline BOOL IsValid_GPIBHeaderBodyChar( const char ch ) { return ( IsCharacter(ch) // Allow a CHARACTER || isdigit(ch) // Allow a NUMBER || (GPIB_CHAR_UNDERLINE_SIGN == ch ) // Allow a UNDERLINE sign || (GPIB_CHAR_REQUEST_SIGN == ch ) // Allow a REQUEST sign ); } //-------------------------------------------------------------------------- // IsEndOfLine: // Checks if the @ch is a end-of-line character static inline BOOL IsEndOfLine( const char ch ) { return MAKE_BOOL( GPIB_CHAR_ENDLINE_SIGN == ch ); /* #define IsEND(character) (( (character)==0x0A )?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsEndOfString: // Checks if the @ch is a end-of-string character static inline BOOL IsEndOfString( const char ch ) { return MAKE_BOOL( '\0' == ch ); /* #define IsEND(character) (( (character)==0x0A )?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsCtrlChar: // Checks if the @ch is a "control" character ( ASCII code less 31 ) static inline BOOL IsCtrlChar( const char ch ) { return MAKE_BOOL( ch <= 0x1F ); } //-------------------------------------------------------------------------- // IsWhiteChar: // Checks if the @ch is a "white" character. // The character is "white" for this function if: // - it is a GPIB_CHAR_WHITE_SIGN; // - it is any control character ( @IsCtrlChar() ) static inline BOOL IsWhiteChar( const char ch ) { return MAKE_BOOL( GPIB_CHAR_WHITE_SIGN == ch // "White" if a GPIB_CHAR_WHITE_SIGN character || IsCtrlChar(ch) // "White" if it is a control character ); /* #define IsWHITE(character) (( (character)<=0x20 && (character)!=0x0A && BigZero(character) )?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsWhiteOrEndChar: // Checks if the @ch is a "white" or end-of-line character. static inline BOOL IsWhiteOrEndChar( const char ch ) { return MAKE_BOOL( IsWhiteChar(ch) || IsEndOfLine(ch) ); /* #define IsWHITEorEND(character) (( (character)<=0x20 && BigZero(character) )?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsArgSeparatorChar: // Checks if the @ch is an argument separator character. static inline BOOL IsArgSeparatorChar( const char ch ) { return MAKE_BOOL( ch == GPIB_CHAR_ARGSEPARATOR_SIGN ); // Allow argument separator character /* #define IsWHITEorEND(character) (( (character)<=0x20 && BigZero(character) )?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsEndOfNumber: // Checks if the @ch is a end-of-number character static inline BOOL IsEndOfNumber( const char ch ) { return MAKE_BOOL( IsArgSeparatorChar(ch) // is an argument separator || IsWhiteOrEndChar(ch) // is a white character or end-of-line character ); /* #define IsWHITEorENDorCOMMA(character) (( ((character)<=0x20 && BigZero(character)) || ((character)==','))?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsSingleQuote: // Checks if the @ch is a single quote character static inline BOOL IsSingleQuote( const char ch ) { return MAKE_BOOL( GPIB_CHAR_SINGLEQUOTE_SIGN == ch ); /* #define IsSQUOTE(character) ((character=='\'')?TRUE:FALSE) */ } // IsDoubleQuote: // Checks if the @ch is a double quote character static inline BOOL IsDoubleQuote( const char ch ) { return MAKE_BOOL( GPIB_CHAR_DOUBLEQUOTE_SIGN == ch ); /* #define IsDQUOTE(character) ((character=='\"')?TRUE:FALSE) */ } //-------------------------------------------------------------------------- // IsQuote: // Checks if the @ch is a quote character depending on the quote mode static inline BOOL IsQuote( const char ch, const eQuoteMode_t qMode ) { return TernaryOperator( (qMode == eqmDouble), // If @qMode is a double-quote mode IsDoubleQuote(ch), // Check if the @ch is a double quote character IsSingleQuote(ch) ); // Otherwise, check if the @ch is a signle quote character /* #define IsQUOTE(character,mode) (( mode==eqmSingle && (IsSQUOTE(character))) || (mode==eqmDouble && (IsDQUOTE(character)))) */ } //-------------------------------------------------------------------------- // IsDataTable - // Ôîðìàò òàáëèö äàííûõ: #N // # - ñïåöèôèêàòîð // N - êîëè÷åñòâî ñëåäóþùèõ çà N ñèìâîëîâ ZX (Z0...Z9) // Z0..Z9 - äåñßòè÷íîå ÷èñëî, îïðåäåëßþùåå êîëè÷åñòâî áàéò ïîñëå ïîñëåäíåãî Z, êîëè÷åñòâî B // // ¾îèäåå äëèííà ñòðîêè length íå äîëæíà áûòü ìåíüøå, ÷åì çàäàííîå â Z0..Z9 ïëþñ 2 ( ñèìâîëû # è N ) // #define IsDataTable( string, length ) MAKE_BOOL( (*string=='#') && IsDemicalChar( *(string+1)) && ( DecCharToNum( *(string+1) )+2 <= length) ) #endif