/*
 * Copyright (c) 1999
 * Silicon Graphics Computer Systems, Inc.
 *
 * Copyright (c) 1999 
 * Boris Fomitchev
 *
 * This material is provided "as is", with absolutely no warranty expressed
 * or implied. Any use is at your own risk.
 *
 * Permission to use or copy this software for any purpose is hereby granted 
 * without fee, provided the above notices are retained on all copies.
 * Permission to modify the code and to distribute modified code is granted,
 * provided the above notices are retained, and a notice that the code was
 * modified is included with the above copyright notice.
 *
 */ 


#ifndef _STLP_C_LOCALE_H
# define _STLP_C_LOCALE_H

/*
 * Implementation dependent definitions
 */
#ifdef __cplusplus
#  include <stl/_config.h>
#endif

#if defined(__sgi) 
# if defined(ROOT_65) /* IRIX 6.5.x */
#  include <sgidefs.h>
#  include <standards.h>
#  include <wchar.h>
#  include <ctype.h>

# else
                  /* IRIX pre-6.5 */
#  include <sgidefs.h>
#  include <standards.h>

#  if !defined(_SIZE_T) && !defined(_SIZE_T_)
#   define _SIZE_T
#    if (_MIPS_SZLONG == 32)
typedef unsigned int    size_t;
#    endif
#    if (_MIPS_SZLONG == 64)
typedef unsigned long   size_t;
#    endif
#   endif

#   ifndef _WCHAR_T
#    define _WCHAR_T
#     if (_MIPS_SZLONG == 32)
typedef long wchar_t;
#     endif
#     if (_MIPS_SZLONG == 64)
typedef __int32_t wchar_t;
#     endif
#    endif /* _WCHAR_T */

#    ifndef _WINT_T
#     define _WINT_T
#     if (_MIPS_SZLONG == 32)
        typedef long    wint_t;
#     endif
#     if (_MIPS_SZLONG == 64)
        typedef __int32_t wint_t;
#     endif
#    endif /* _WINT_T */

#    ifndef _MBSTATE_T
#    define _MBSTATE_T
#    ifdef _MSC_VER
		typedef int		mbstate_t;
#    else
        typedef char    mbstate_t;
#    endif
#    endif /* _MBSTATE_T */

#   endif /* ROOT65 */ 

#  else /* __sgi */

# ifdef __cplusplus
# ifndef _STLP_CSTDDEF
#  include <cstddef>
# endif
# ifndef _STLP_CWCHAR_H
#  include <stl/_cwchar.h>
# endif
# ifndef _STLP_CCTYPE
#  include <cctype>
# endif
# else
#  include <stddef.h>
#  include <wchar.h>
#  include <ctype.h>
# endif

#endif /* __sgi */

/*
 * GENERAL FRAMEWORK
 */

struct _Locale_ctype;
struct _Locale_numeric;
struct _Locale_time;
struct _Locale_collate;
struct _Locale_monetary;
struct _Locale_messages;

/*
  Bitmask macros.  
*/

/*
 * For narrow characters, we expose the lookup table interface.
 */

/* Internal bitmask macros, os-specific. */

#if defined(__sgi)              /* IRIX */

#define _Locale_S      0x00000008      /* Spacing character */
#define _Locale_A      0x00004000      /* Alphabetical characters only */
#define _Locale_B      0x00000040      /* Obsolete: was space char only */
#define _Locale_PR     0x00008000      /* Printable characters only */
#define _Locale_G      0x40000000      /* Graphic characters only */
#define _Locale_BL     0x80000000      /* The blank character class */

/* Public bitmask macros, must be defined for every OS. These values, of
 * course, are specific to IRIX. */

#define _Locale_CNTRL  0x00000020      /* Control character */
#define _Locale_UPPER  0x00000001      /* Upper case */
#define _Locale_LOWER  0x00000002      /* Lower case */
#define _Locale_DIGIT  0x00000004      /* Numeral (digit) */
#define _Locale_XDIGIT 0x00000080      /* heXadecimal digit */
#define _Locale_PUNCT  0x00000010      /* Punctuation */
#define _Locale_SPACE  (_Locale_S | _Locale_BL)
#define _Locale_PRINT  (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
                        _Locale_DIGIT | _Locale_A | _Locale_XDIGIT | \
                        _Locale_PR)
#define _Locale_ALPHA  _Locale_A

/*
* All of these except for graph and blank are from the C standard;
* graph and blank are XPG4.  (graph in XPG4 doesn't mean quite the
* same thing as graph in the C++ library)
*/

#endif /* IRIX */


#if defined( __Lynx__ )
 /* azov: On Lynx isalpha defined as (_U | _L), which gives us a mask 
  * unusable in ctype_table. So we have to redefine it and use hard-coded 
  * numbers (to avoid potential clashes if system headers change).
  *
  * P.S. Actually, I see no reason in using platform-specific masks - 
  * having just one set of masks for all platforms should work just as
  * well - we only use them internally and they don't have to be equal 
  * to whatever defined in local ctype.h
  *
  */ 
#   define _Locale_CNTRL  040     /* _C, Control character */
#   define _Locale_UPPER  01      /* _U, Upper case */
#   define _Locale_LOWER  02      /* _L, Lower case */
#   define _Locale_DIGIT  04      /* _N, Numeral (digit) */
#   define _Locale_XDIGIT 0200    /* _X, heXadecimal digit */
#   define _Locale_PUNCT  020     /* _P, Punctuation */
#   define _Locale_SPACE  010     /* _S, Spacing */
#   define _Locale_ALPHA  040000  /* none, Alphanumerical */
#   define _Locale_PRINT  (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
                           _Locale_DIGIT | _Locale_ALPHA | _Locale_XDIGIT |\
                           _Locale_SPACE ) /* Printable */
# endif /* __Lynx__ */

#if defined(__GNUC__) || defined (__BORLANDC__) || defined (__COMO__)

# if defined (__CYGWIN__)

#  define _Locale_CNTRL  040
#  define _Locale_UPPER  02
#  define _Locale_LOWER  01
#  define _Locale_DIGIT  04
#  define _Locale_XDIGIT ( 0100 | _Locale_DIGIT )
#  define _Locale_PUNCT  020
#  define _Locale_SPACE  010
#  define _Locale_ALPHA  (_Locale_UPPER | _Locale_LOWER)
#  define _Locale_PRINT  (_Locale_ALPHA | _Locale_DIGIT | _Locale_PUNCT | 0200 )

# elif defined (__FreeBSD__)

# define _Locale_CNTRL _CTYPE_C
# define _Locale_UPPER _CTYPE_U
# define _Locale_LOWER _CTYPE_L
# define _Locale_DIGIT _CTYPE_D
# define _Locale_XDIGIT _CTYPE_X
# define _Locale_PUNCT _CTYPE_P
# define _Locale_SPACE _CTYPE_S
# define _Locale_PRINT _CTYPE_R
# define _Locale_ALPHA _CTYPE_A

# elif defined (__NetBSD__) || defined (__amigaos__)
 
#  define _Locale_CNTRL _C
#  define _Locale_UPPER _U
#  define _Locale_LOWER _L
#  define _Locale_DIGIT _N
#  define _Locale_XDIGIT (_N|_X)
#  define _Locale_PUNCT _P
#  define _Locale_SPACE _S
#  define _Locale_PRINT (_P|_U|_L|_N|_B)
#  define _Locale_ALPHA (_U|_L)
# elif defined(__EMX__) /* OS/2 with emx runtime */
#  define _Locale_CNTRL _CNTRL
#  define _Locale_UPPER _UPPER
#  define _Locale_LOWER _LOWER
#  define _Locale_DIGIT _DIGIT
#  define _Locale_XDIGIT _XDIGIT
#  define _Locale_PUNCT _PUNCT
#  define _Locale_SPACE _SPACE
#  define _Locale_PRINT _PRINT
#  define _Locale_ALPHA (_UPPER|_LOWER)

# elif defined(_STLP_USE_GLIBC) /* linux, using the gnu compiler */

/* This section uses macros defined in the gnu libc ctype.h header */

#  define _Locale_CNTRL  _IScntrl
#  define _Locale_UPPER  _ISupper
#  define _Locale_LOWER  _ISlower
#  define _Locale_DIGIT  _ISdigit
#  define _Locale_XDIGIT _ISxdigit
#  define _Locale_PUNCT  _ISpunct
#  define _Locale_SPACE  _ISspace
#  define _Locale_PRINT  _ISprint
#  define _Locale_ALPHA  _ISalpha

#  endif /* GLIBC */

#endif /* gnu */

#if ( defined(__sun) && defined (__SVR4) ) \
    || (defined (__digital__) && defined (__unix__)) \
    || defined(_AIX)
/* fbp : condition from AT&T code*/
#if !(defined(__XPG4_CHAR_CLASS__) || defined(_XPG4_2) || \
    (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 == 4))) && ! defined (_ISCNTRL)
  /* fbp : on 2.5.1, the defines are different ;( */
  // # if ( defined (__sun) && defined (__SVR4) && ! defined (_ISCNTRL) )
#   define _ISCNTRL _C
#   define _ISUPPER _U
#   define _ISLOWER _L
#   define _ISDIGIT _N
#   define _ISXDIGIT _X
#   define _ISPUNCT _P
#   define _ISSPACE _S
#   define _ISPRINT (_P | _U | _L | _N | _B)
#   define _ISALPHA (_U | _L)
#  endif 

#  define _Locale_CNTRL  _ISCNTRL
#  define _Locale_UPPER  _ISUPPER
#  define _Locale_LOWER  _ISLOWER
#  define _Locale_DIGIT  _ISDIGIT
#  define _Locale_XDIGIT _ISXDIGIT
#  define _Locale_PUNCT  _ISPUNCT
#  define _Locale_SPACE  _ISSPACE
#  define _Locale_PRINT  _ISPRINT
#  define _Locale_ALPHA  _ISALPHA
#elif defined (__MWERKS__)
#  define _Locale_CNTRL  __control_char
#  define _Locale_UPPER  __upper_case
#  define _Locale_LOWER  __lower_case
#  define _Locale_DIGIT  __digit
#  define _Locale_XDIGIT __hex_digit
#  define _Locale_PUNCT  __punctuation
#  define _Locale_SPACE  __space_char
#  define _Locale_PRINT  __printable
#  define _Locale_ALPHA  __alphanumeric
#elif defined (__BORLANDC__)
#  define _Locale_CNTRL  _IS_CTL
#  define _Locale_UPPER  _IS_UPP
#  define _Locale_LOWER  _IS_LOW
#  define _Locale_DIGIT  _IS_DIG
#  define _Locale_XDIGIT _IS_HEX
#  define _Locale_PUNCT  _IS_PUN
#  define _Locale_SPACE  _IS_SP
#  define _Locale_PRINT  (_IS_SP|_IS_PUN|_IS_UPP|_IS_LOW|_IS_DIG)
#  define _Locale_ALPHA  _IS_ALPHA
#elif defined (_MSC_VER) || defined (__MINGW32__)
#  define _Locale_CNTRL  _CONTROL
#  define _Locale_UPPER  _UPPER
#  define _Locale_LOWER  _LOWER
#  define _Locale_DIGIT  _DIGIT
#  define _Locale_XDIGIT _HEX
#  define _Locale_PUNCT  _PUNCT
#  define _Locale_SPACE  _SPACE
#  define _Locale_PRINT  (_ALPHA | _DIGIT | _BLANK | _PUNCT)
// is this one has to be so complex ?  
#  define _Locale_ALPHA  ( _ALPHA & ~ (_UPPER | _LOWER )) 
#elif defined(__MRC__) || defined(__SC__)		//*TY 02/24/2000 - added support for MPW
#  define _Locale_CNTRL  _CTL
#  define _Locale_UPPER  _UPP
#  define _Locale_LOWER  _LOW
#  define _Locale_DIGIT  _DIG
#  define _Locale_XDIGIT _HEX
#  define _Locale_PUNCT  _PUN
#  define _Locale_SPACE  _BLA
#  define _Locale_PRINT  (_UPP | _LOW | _DIG | _PUN | _BLA)
#  define _Locale_ALPHA  (_UPP | _LOW)
#elif defined(__MLCCPP__)
#  define _Locale_CNTRL    1
#  define _Locale_UPPER    2
#  define _Locale_LOWER    4
#  define _Locale_DIGIT    8
#  define _Locale_XDIGIT  16
#  define _Locale_PUNCT   32
#  define _Locale_SPACE   64
#  define _Locale_PRINT  128
#  define _Locale_ALPHA  256

# elif defined (__GNUC__) && defined (__APPLE__)
 
# define _Locale_CNTRL _C
# define _Locale_UPPER _U
# define _Locale_LOWER _L
# define _Locale_DIGIT _D
# define _Locale_XDIGIT _X
# define _Locale_PUNCT _P
# define _Locale_SPACE _S
# define _Locale_PRINT _R
# define _Locale_ALPHA _A

# elif defined (__hpux) || defined (__osf__)
 
#   if defined(__HP_aCC) && !defined(_INCLUDE_HPUX_SOURCE)
#     define _ISALPHA      0x001
#     define _ISALNUM      0x002
#     define _ISBLANK      0x004
#     define _ISCNTRL      0x008
#     define _ISDIGIT      0x010
#     define _ISGRAPH      0x020
#     define _ISLOWER      0x040
#     define _ISPRINT      0x080
#     define _ISPUNCT      0x100
#     define _ISSPACE      0x200
#     define _ISUPPER      0x400
#     define _ISXDIGIT     0x800
#  endif
#  define _Locale_CNTRL  _ISCNTRL
#  define _Locale_UPPER  _ISUPPER
#  define _Locale_LOWER  _ISLOWER
#  define _Locale_DIGIT  _ISDIGIT
#  define _Locale_XDIGIT _ISXDIGIT
#  define _Locale_PUNCT  _ISPUNCT
#  define _Locale_SPACE  _ISSPACE
#  define _Locale_PRINT  _ISPRINT
#  define _Locale_ALPHA  _ISALPHA
# elif defined (__MVS__) || defined(__OS400__)
#  define _Locale_CNTRL __ISCNTRL
#  define _Locale_UPPER __ISUPPER
#  define _Locale_LOWER __ISLOWER
#  define _Locale_DIGIT __ISDIGIT
#  define _Locale_XDIGIT __ISXDIGIT
#  define _Locale_PUNCT __ISPUNCT
#  define _Locale_SPACE __ISSPACE
#  define _Locale_PRINT __ISPRINT
#  define _Locale_ALPHA __ISALPHA
# elif defined (__QNXNTO__)  || defined (__WATCOMC__)
# define _Locale_CNTRL _CNTRL
# define _Locale_UPPER _UPPER
# define _Locale_LOWER _LOWER
# define _Locale_DIGIT _DIGIT
# define _Locale_XDIGIT _XDIGT
# define _Locale_PUNCT _PUNCT
# define _Locale_SPACE _SPACE
# define _Locale_PRINT _PRINT
# define _Locale_ALPHA (_UPPER | _LOWER)
#elif defined (__DJGPP)
#  define _Locale_CNTRL  __dj_ISCNTRL
#  define _Locale_UPPER  __dj_ISUPPER
#  define _Locale_LOWER  __dj_ISLOWER
#  define _Locale_DIGIT  __dj_ISDIGIT
#  define _Locale_XDIGIT __dj_ISXDIGIT
#  define _Locale_PUNCT  __dj_ISPUNCT
#  define _Locale_SPACE  __dj_ISSPACE
#  define _Locale_PRINT  __dj_ISPRINT
#  define _Locale_ALPHA  __dj_ISALPHA
#elif defined (_STLP_SCO_OPENSERVER)
#  define _Locale_CNTRL _C
#  define _Locale_UPPER _U
#  define _Locale_LOWER _L
#  define _Locale_DIGIT _N
#  define _Locale_XDIGIT _X
#  define _Locale_PUNCT _P
#  define _Locale_SPACE _S
#  define _Locale_PRINT _R
#  define _Locale_ALPHA _A
#elif defined (__NCR_SVR)
#  define _Locale_CNTRL _C
#  define _Locale_UPPER _U
#  define _Locale_LOWER _L
#  define _Locale_DIGIT _N
#  define _Locale_XDIGIT _X
#  define _Locale_PUNCT _P
#  define _Locale_SPACE _S
#  define _Locale_PRINT (_P | _U | _L | _N | _B)
#  define _Locale_ALPHA (_U | _L)
#elif defined (_CRAY)
#  define _Locale_CNTRL  _CNTRL
#  define _Locale_UPPER  _UPPER
#  define _Locale_LOWER  _LOWER
#  define _Locale_DIGIT  _DIGIT
#  define _Locale_XDIGIT _XDIGIT
#  define _Locale_PUNCT  _PUNCT
#  define _Locale_SPACE  _SPACE
#  define _Locale_PRINT  _PRINT
#  define _Locale_ALPHA  _ALPHA
#endif

# endif /* _STLP_C_LOCALE_H */
