/** @file
  Implementation specific support for Single-byte character classification and
  case conversion macros and function declarations.

  This file is intended to only be included by <ctype.h>.

  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
  This program and the accompanying materials are licensed and made available under
  the terms and conditions of the BSD License that accompanies this distribution.
  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _CTYPE_H
#error  This file, <sys/_ctype.h>, may only be included by <ctype.h>.
#endif

__BEGIN_DECLS
extern const UINT16 *_cClass;  ///< Locale independent pointer to Character Classification Table.
extern const UINT8  *_uConvT;  ///< Locale independent pointer to Lowercase to Uppercase Conversion Table.
extern const UINT8  *_lConvT;  ///< Locale independent pointer to Uppercase to Lowercase Conversion Table.

extern  int  __isCClass( int _c, unsigned int mask);   ///< Internal character classification function.
__END_DECLS


/** @{
Character Class bit masks.
**/
#define _CC   0x0001U     ///< Control Characters
#define _CW   0x0002U     ///< White Space
#define _CP   0x0004U     ///< Punctuation
#define _CD   0x0008U     ///< Digits [0-9]
#define _CU   0x0010U     ///< Uppercase Letter [A-Z]
#define _CL   0x0020U     ///< Lowercase Letter [a-z]
#define _CX   0x0040U     ///< Hexadecimal Digits [A-Fa-f]
#define _C0   0x0080U     ///< Path Separator Characters, '/' and '\\'
#define _CS   0x0100U     ///< Space Characters, ' ' in C locale
#define _CG   0x0200U     ///< Graphic Characters
#define _CB   0x0400U     ///< Blank Characters, ' ' and '\t' in C locale
#define _C4   0x0800U
#define _XA   0x1000U     ///< eXtra Alpha characters not in _CU or _CL
#define _C6   0x2000U
#define _C7   0x4000U
#define _C8   0x8000U
/// @}

#ifndef NO_CTYPE_MACROS
  #define __isCClass( _c, mask)   (((_c) < 0 || (_c) > 127) ? 0 : (_cClass[(_c)] & (mask)))
  #define __toLower( _c)          ((__isCClass( ((int)_c), (_CU))) ? _lConvT[(_c)] : (_c))
  #define __toUpper( _c)          ((__isCClass( ((int)_c), (_CL))) ? _uConvT[(_c)] : (_c))
#endif  /* NO_CTYPE_MACROS */

/* Macros used by implementation functions */
#define __isHexLetter(_c)         (__isCClass( (int)c, (_CX)))

#ifdef _CTYPE_PRIVATE
  #define _CTYPE_NUM_CHARS  (256)

  #define _CTYPE_ID   "BSDCTYPE"
  #define _CTYPE_REV    2

  extern const UINT16  _C_CharClassTable[];
  extern const UINT8   _C_ToUpperTable[];
  extern const UINT8   _C_ToLowerTable[];
#endif
