gpib_parser_validators.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #ifndef GPIB_PARSER_VALIDATORS_H
  2. #define GPIB_PARSER_VALIDATORS_H
  3. #include <ctype.h> // isalpha, isdigit
  4. #include "gpib_parser_casts.h"
  5. #include "gpib_parser_validators_numbers.h" // Validators for numbers
  6. #include "gpib_parser_chars.h" // Service characters definitions
  7. //--------------------------------------------------------------------------
  8. #define IsCorrectPointer(ptr) ( NULL != (ptr) )
  9. #define IsCodePointer(ptr) IsCorrectPointer(ptr) // not to check for flash-memory pointer, mbrrrrrr.
  10. //--------------------------------------------------------------------------
  11. typedef enum
  12. {
  13. eqmNone=0, //
  14. eqmSingle=1, // Single-quote mode
  15. eqmDouble=2 // Double-quote mode
  16. }
  17. eQuoteMode_t; // Defines the mode of quoting
  18. //--------------------------------------------------------------------------
  19. // IsCharacter:
  20. // Checks whether @ch is an alphabetic letter.
  21. static inline BOOL IsCharacter( const char ch )
  22. {
  23. return MAKE_BOOL( isalpha(ch) ); /* return MAKE_BOOL(((character) & 0xDF)<='Z' && ((character) & 0xDF)>='A') */
  24. }
  25. //--------------------------------------------------------------------------
  26. // IsOptionalHeader:
  27. // Checks if the command header relates to the optional command, or not
  28. static inline BOOL IsOptionalHeader( const char * headerString )
  29. {
  30. (void)headerString; // skip the checking for NULL pointer
  31. // Optional header starts with the the GPIB_CHAR_OPTIONALHEADER_SIGN sign
  32. return MAKE_BOOL( GPIB_CHAR_OPTIONALHEADER_SIGN == headerString[0] );
  33. }
  34. //--------------------------------------------------------------------------
  35. // IsValid_GPIBHeaderBodyChar:
  36. // Checks the character in order to validate the GPIB header body.
  37. // @IsValid_GPIBHeaderBodyChar returns TRUE if the character is a valid for GPIB
  38. // header body.
  39. // Note: the GPIB_CHAR_MANDATORY_IEEE488_SIGN character is not a body character,
  40. // so it is not valid character for this function.
  41. static inline BOOL IsValid_GPIBHeaderBodyChar( const char ch )
  42. {
  43. return (
  44. IsCharacter(ch) // Allow a CHARACTER
  45. || isdigit(ch) // Allow a NUMBER
  46. || (GPIB_CHAR_UNDERLINE_SIGN == ch ) // Allow a UNDERLINE sign
  47. || (GPIB_CHAR_REQUEST_SIGN == ch ) // Allow a REQUEST sign
  48. );
  49. }
  50. //--------------------------------------------------------------------------
  51. // IsEndOfLine:
  52. // Checks if the @ch is a end-of-line character
  53. static inline BOOL IsEndOfLine( const char ch )
  54. {
  55. return MAKE_BOOL( GPIB_CHAR_ENDLINE_SIGN == ch );
  56. /* #define IsEND(character) (( (character)==0x0A )?TRUE:FALSE) */
  57. }
  58. //--------------------------------------------------------------------------
  59. // IsEndOfString:
  60. // Checks if the @ch is a end-of-string character
  61. static inline BOOL IsEndOfString( const char ch )
  62. {
  63. return MAKE_BOOL( '\0' == ch );
  64. /* #define IsEND(character) (( (character)==0x0A )?TRUE:FALSE) */
  65. }
  66. //--------------------------------------------------------------------------
  67. // IsCtrlChar:
  68. // Checks if the @ch is a "control" character ( ASCII code less 31 )
  69. static inline BOOL IsCtrlChar( const char ch )
  70. {
  71. return MAKE_BOOL( ch <= 0x1F );
  72. }
  73. //--------------------------------------------------------------------------
  74. // IsWhiteChar:
  75. // Checks if the @ch is a "white" character.
  76. // The character is "white" for this function if:
  77. // - it is a GPIB_CHAR_WHITE_SIGN;
  78. // - it is any control character ( @IsCtrlChar() )
  79. static inline BOOL IsWhiteChar( const char ch )
  80. {
  81. return MAKE_BOOL( GPIB_CHAR_WHITE_SIGN == ch // "White" if a GPIB_CHAR_WHITE_SIGN character
  82. || IsCtrlChar(ch) // "White" if it is a control character
  83. );
  84. /* #define IsWHITE(character) (( (character)<=0x20 && (character)!=0x0A && BigZero(character) )?TRUE:FALSE) */
  85. }
  86. //--------------------------------------------------------------------------
  87. // IsWhiteOrEndChar:
  88. // Checks if the @ch is a "white" or end-of-line character.
  89. static inline BOOL IsWhiteOrEndChar( const char ch )
  90. {
  91. return MAKE_BOOL( IsWhiteChar(ch)
  92. || IsEndOfLine(ch)
  93. );
  94. /* #define IsWHITEorEND(character) (( (character)<=0x20 && BigZero(character) )?TRUE:FALSE) */
  95. }
  96. //--------------------------------------------------------------------------
  97. // IsArgSeparatorChar:
  98. // Checks if the @ch is an argument separator character.
  99. static inline BOOL IsArgSeparatorChar( const char ch )
  100. {
  101. return MAKE_BOOL( ch == GPIB_CHAR_ARGSEPARATOR_SIGN ); // Allow argument separator character
  102. /* #define IsWHITEorEND(character) (( (character)<=0x20 && BigZero(character) )?TRUE:FALSE) */
  103. }
  104. //--------------------------------------------------------------------------
  105. // IsEndOfNumber:
  106. // Checks if the @ch is a end-of-number character
  107. static inline BOOL IsEndOfNumber( const char ch )
  108. {
  109. return MAKE_BOOL( IsArgSeparatorChar(ch) // is an argument separator
  110. || IsWhiteOrEndChar(ch) // is a white character or end-of-line character
  111. );
  112. /* #define IsWHITEorENDorCOMMA(character) (( ((character)<=0x20 && BigZero(character)) || ((character)==','))?TRUE:FALSE) */
  113. }
  114. //--------------------------------------------------------------------------
  115. // IsSingleQuote:
  116. // Checks if the @ch is a single quote character
  117. static inline BOOL IsSingleQuote( const char ch )
  118. {
  119. return MAKE_BOOL( GPIB_CHAR_SINGLEQUOTE_SIGN == ch );
  120. /* #define IsSQUOTE(character) ((character=='\'')?TRUE:FALSE) */
  121. }
  122. // IsDoubleQuote:
  123. // Checks if the @ch is a double quote character
  124. static inline BOOL IsDoubleQuote( const char ch )
  125. {
  126. return MAKE_BOOL( GPIB_CHAR_DOUBLEQUOTE_SIGN == ch );
  127. /* #define IsDQUOTE(character) ((character=='\"')?TRUE:FALSE) */
  128. }
  129. //--------------------------------------------------------------------------
  130. // IsQuote:
  131. // Checks if the @ch is a quote character depending on the quote mode
  132. static inline BOOL IsQuote( const char ch, const eQuoteMode_t qMode )
  133. {
  134. return TernaryOperator(
  135. (qMode == eqmDouble), // If @qMode is a double-quote mode
  136. IsDoubleQuote(ch), // Check if the @ch is a double quote character
  137. IsSingleQuote(ch) ); // Otherwise, check if the @ch is a signle quote character
  138. /* #define IsQUOTE(character,mode) (( mode==eqmSingle && (IsSQUOTE(character))) || (mode==eqmDouble && (IsDQUOTE(character)))) */
  139. }
  140. //--------------------------------------------------------------------------
  141. // IsDataTable -
  142. // Ôîðìàò òàáëèö äàííûõ: #N<Z0Z1.....Z9><BBBBBB....BB>
  143. // # - ñïåöèôèêàòîð
  144. // N - êîëè÷åñòâî ñëåäóþùèõ çà N ñèìâîëîâ ZX (Z0...Z9)
  145. // Z0..Z9 - äåñßòè÷íîå ÷èñëî, îïðåäåëßþùåå êîëè÷åñòâî áàéò ïîñëå ïîñëåäíåãî Z, êîëè÷åñòâî B
  146. //
  147. // ¾îèäåå äëèííà ñòðîêè length íå äîëæíà áûòü ìåíüøå, ÷åì çàäàííîå â Z0..Z9 ïëþñ 2 ( ñèìâîëû # è N )
  148. //
  149. #define IsDataTable( string, length ) MAKE_BOOL( (*string=='#') && IsDemicalChar( *(string+1)) && ( DecCharToNum( *(string+1) )+2 <= length) )
  150. #endif