home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / stlpt453.zip / STLport-4.5.3 / src / c_locale.h < prev    next >
C/C++ Source or Header  |  2001-11-14  |  13KB  |  404 lines

  1. /*
  2.  * Copyright (c) 1999
  3.  * Silicon Graphics Computer Systems, Inc.
  4.  *
  5.  * Copyright (c) 1999 
  6.  * Boris Fomitchev
  7.  *
  8.  * This material is provided "as is", with absolutely no warranty expressed
  9.  * or implied. Any use is at your own risk.
  10.  *
  11.  * Permission to use or copy this software for any purpose is hereby granted 
  12.  * without fee, provided the above notices are retained on all copies.
  13.  * Permission to modify the code and to distribute modified code is granted,
  14.  * provided the above notices are retained, and a notice that the code was
  15.  * modified is included with the above copyright notice.
  16.  *
  17.  */ 
  18.  
  19. /*
  20.  * It is impossible to write the C++ locale library in terms of locales
  21.  * as defined in the C standard.  Instead, we write the C++ locale and I/O
  22.  * library in terms of a low level C-like interface.  This file defines
  23.  * that interface.
  24.  *
  25.  * The low-level locale interface can't be written portably; there
  26.  * must be a version of it for each platform that the C++ library
  27.  * is ported to.  On many systems this interface may be a thin wrapper
  28.  * for existing functionality.
  29.  */
  30.  
  31. #ifndef _STLP_C_LOCALE_IMPL_H
  32. # define _STLP_C_LOCALE_IMPL_H
  33.  
  34. # include <stl/c_locale.h>
  35. // # include <wchar.h>
  36. # include <stl/_cwchar.h>
  37.  
  38. #define _Locale_MAX_SIMPLE_NAME 256
  39.  
  40. /*
  41.  * A number: the maximum length of a simple locale name.
  42.  * (i.e. a name like like en_US, as opposed to a name like
  43.  * en_US/de_AT/de_AT/es_MX/en_US/en_US) */
  44. #define _Locale_MAX_COMPOSITE_NAME 6*(_Locale_MAX_SIMPLE_NAME+3)
  45.  
  46. /*
  47.  * Maximum length of a composite locale.
  48.  */
  49.  
  50. #ifdef __cplusplus
  51. _STLP_BEGIN_NAMESPACE
  52. extern "C" {
  53. #endif
  54.  
  55. /*
  56.  * Typedefs:
  57.  */
  58.  
  59. #if defined (__GNUC__) || defined (_KCC)
  60. typedef unsigned short int _Locale_mask_t;
  61. #else
  62. typedef unsigned int _Locale_mask_t;
  63. #endif
  64.  
  65. void * _Locale_ctype_create(const char *);
  66. void * _Locale_numeric_create(const char *);
  67. void * _Locale_time_create(const char *);
  68. void * _Locale_collate_create(const char *);
  69. void * _Locale_monetary_create(const char *);
  70. void * _Locale_messages_create(const char *);
  71.  
  72. /*
  73.  * The char* argument is a simple locale name.
  74.  * These functions return NULL to indicate failure.
  75.  * The char* argument is a simple locale name, which may not
  76.  * be "".  These functions return NULL to indicate failure.
  77.  */
  78.  
  79. const char * _Locale_ctype_default(char * __buf);
  80. const char * _Locale_numeric_default(char * __buf);
  81. const char * _Locale_time_default(char * __buf);
  82. const char * _Locale_collate_default(char * __buf);
  83. const char * _Locale_monetary_default(char * __buf);
  84. const char * _Locale_messages_default(char * __buf);
  85.  
  86. /*
  87.  * Returns the name of the user's default locale in each
  88.  * category, as a null-terminated string.  A NULL value
  89.  * means the default "C" locale.
  90.  */
  91.  
  92. char * _Locale_ctype_name(const void *, char *);
  93. char * _Locale_numeric_name(const void *, char *);
  94. char * _Locale_time_name(const void *, char *);
  95. char * _Locale_collate_name(const void *, char *);
  96. char * _Locale_monetary_name(const void *, char *);
  97. char * _Locale_messages_name(const void *, char *);
  98.  
  99. /*
  100.  * __buf points to a buffer that can hold at least _Locale_MAX_SIMPLE_NAME
  101.  * characters.  These functions store the name, as a null-terminated
  102.  * string, in __buf.
  103.  */
  104.  
  105. void _Locale_ctype_destroy(void *);
  106. void _Locale_numeric_destroy(void *);
  107. void _Locale_time_destroy(void *);
  108. void _Locale_collate_destroy(void *);
  109. void _Locale_monetary_destroy(void *);
  110. void _Locale_messages_destroy(void *);
  111.  
  112. char * _Locale_extract_ctype_name(const char *cname, char *__buf);
  113. char * _Locale_extract_numeric_name(const char *cname, char *__buf);
  114. char * _Locale_extract_time_name(const char *cname, char *__buf);
  115. char * _Locale_extract_collate_name(const char *cname, char *__buf);
  116. char * _Locale_extract_monetary_name(const char *cname, char *__buf);
  117. char * _Locale_extract_messages_name(const char *cname, char *__buf);
  118.  
  119. /*
  120.  * cname is a (possibly composite) locale name---i.e. a name that can
  121.  * be passed to setlocale.  _buf points to an array large enough to
  122.  * store at least _Locale_MAX_SIMPLE_NAME characters, and each of these
  123.  * functions extracts the name of a single category, stores it in buf
  124.  * as a null-terminated string, and returns buf.
  125.  */
  126.  
  127. char * _Locale_compose_name(char *__buf,
  128.                             const char *__Ctype, const char *__Numeric,
  129.                             const char *__Time, const char *__Collate,
  130.                             const char *__Monetary, const char *__Messages);
  131.  
  132. /*
  133.  * The inputs to this function are six null-terminated strings: the
  134.  * names of a locale's six categories.  __buf is a pointer to an array
  135.  * large enough to store at least _Locale_MAX_COMPOSITE_NAME characters.
  136.  * This function constructs a (possibly composite) name describing the
  137.  * locale as a whole, stores that name in buf as a null-terminated
  138.  * string, and returns buf.
  139.  */
  140.  
  141. /*
  142.  * FUNCTIONS THAT USE CTYPE
  143.  */
  144.  
  145. /*
  146.  * Narrow character functions:
  147.  */
  148.  
  149. _Locale_mask_t * _Locale_ctype_table(struct _Locale_ctype *);
  150.  
  151. /*
  152.  * Returns a pointer to the beginning of the ctype table.  The table is
  153.  * at least 257 bytes long; if p is the pointer returned by this
  154.  * function, then p[c] is valid if c is EOF or if p is any value of
  155.  * type unsigned char.
  156.  */
  157.  
  158. int _Locale_toupper(struct _Locale_ctype *, int);
  159. int _Locale_tolower(struct _Locale_ctype *, int);
  160.  
  161. /*
  162.  * c is either EOF, or an unsigned char value.
  163.  */
  164.  
  165. # ifndef _STLP_NO_WCHAR_T
  166. /*
  167.  * Wide character functions:
  168.  */
  169. _Locale_mask_t _Locale_wchar_ctype(struct _Locale_ctype *, wint_t);
  170. wint_t _Locale_wchar_tolower(struct _Locale_ctype *, wint_t);
  171. wint_t _Locale_wchar_toupper(struct _Locale_ctype *, wint_t);
  172. # endif
  173.  
  174. # if !defined ( _STLP_NO_MBSTATE_T )
  175.  
  176. /*
  177.  * Multibyte functions:
  178.  */
  179.  
  180. int _Locale_mb_cur_max (struct _Locale_ctype *);
  181. /*
  182.  * Returns the number of bytes of the longest allowed multibyte
  183.  * character in the current encoding.
  184.  */
  185.  
  186. int _Locale_mb_cur_min (struct _Locale_ctype *);
  187. /*
  188.  * Returns the number of bytes of the shortest allowed multibyte
  189.  * character in the current encoding.
  190.  */
  191.  
  192. int _Locale_is_stateless (struct _Locale_ctype *);
  193. /*
  194.  * Returns 1 if the current multibyte encoding is stateless
  195.  * and does not require the use of an mbstate_t value.
  196.  */
  197.  
  198. # ifndef _STLP_NO_WCHAR_T
  199. wint_t _Locale_btowc(struct _Locale_ctype *, int);
  200. int _Locale_wctob(struct _Locale_ctype *, wint_t);
  201.  
  202. /*
  203.  * Just like btowc and wctob, from 4.6.5.1 of the C standard, Normative
  204.  * Addendum 1.  (And just like widen/narrow, from clause 22 of the C++
  205.  * standard.)
  206.  */
  207.  
  208. size_t _Locale_mbtowc(struct _Locale_ctype *,
  209.                       wchar_t *,
  210.                       const char *, size_t,
  211.                       mbstate_t *);
  212.  
  213. /*
  214.  * Almost identical to mbrtowc, from 4.6.5.3.2 of NA1.  The only
  215.  * important difference is that mbrtowc treats null wide characters
  216.  * as special, and we don't.  Specifically: examines the characters
  217.  * in [from, from + n), extracts a single wide character, and stores
  218.  * it in *to.  Modifies shift_state if appropriate.  The return value,
  219.  * which is always positive, is the number of characters extracted from
  220.  * the input sequence.  Return value is (size_t) -1 if there was an
  221.  * encoding error in the input sequence, and (size_t) -2 if
  222.  * [from, from + n) is correct but not complete.  None of the pointer
  223.  * arguments may be null pointers.
  224.  */
  225.  
  226. size_t _Locale_wctomb(struct _Locale_ctype *,
  227.                       char *, size_t,
  228.                       const wchar_t,
  229.                       mbstate_t *);
  230.  
  231. /*
  232.  * Again, very similar to wcrtomb.  The differences are that (1) it
  233.  * doesn't treat null characters as special; and (2) it stores at most
  234.  * n characters.  Converts c to a multibyte sequence, stores that
  235.  * sequence in the array 'to', and returns the length of the sequence.
  236.  * Modifies shift_state if appropriate.  The return value is (size_t) -1
  237.  * if c is not a valid wide character, and (size_t) -2 if the length of
  238.  * the multibyte character sequence is greater than n.
  239.  */
  240. # endif
  241.  
  242. size_t _Locale_unshift(struct _Locale_ctype *,
  243.                        mbstate_t *,
  244.                        char *, size_t, char **);
  245.  
  246. /*
  247.  * Inserts whatever characters are necessary to restore st to an
  248.  * initial shift state.  Sets *next to buf + m, where m is the number
  249.  * of characters inserted.  (0 <= m <= n.)  Returns m to indicate
  250.  * success, (size_t) -1 to indicate error, (size_t) -2 to indicate
  251.  * partial success (more than n characters needed).  For success or partial
  252.  * success, sets *next to buf + m.
  253.  */
  254.  
  255. # endif /*  _STLP_NO_MBSTATE_T */
  256.  
  257. /*
  258.  * FUNCTIONS THAT USE COLLATE
  259.  */
  260.  
  261. int _Locale_strcmp(struct _Locale_collate *,
  262.                    const char *, size_t,
  263.                    const char *, size_t);
  264. # ifndef _STLP_NO_WCHAR_T
  265. int _Locale_strwcmp(struct _Locale_collate *,
  266.                     const wchar_t *, size_t,
  267.                     const wchar_t *, size_t);
  268. # endif
  269. /*
  270.  * Compares the two sequences [s1, s1 + n1) and [s2, s2 + n2).  Neither
  271.  * sequence is assumed to be null-terminated, and null characters
  272.  * aren't special.  If the two sequences are the same up through
  273.  * min(n1, n2), then the sequence that compares less is whichever one
  274.  * is shorter.
  275.  */
  276.  
  277. size_t _Locale_strxfrm(struct _Locale_collate *,
  278.                        char *, size_t,
  279.                        const char *, size_t);
  280.  
  281. # ifndef _STLP_NO_WCHAR_T
  282. size_t _Locale_strwxfrm(struct _Locale_collate *,
  283.                         wchar_t *, size_t,
  284.                         const wchar_t *, size_t);
  285. # endif
  286.  
  287. /*
  288.  * Creates a transformed version of the string [s2, s2 + n2).  The
  289.  * string may contain embedded null characters; nulls aren't special.
  290.  * The transformed string begins at s1, and contains at most n1
  291.  * characters.  The return value is the length of the transformed
  292.  * string.  If the return value is greater than n1 then this is an
  293.  * error condition: it indicates that there wasn't enough space.  In
  294.  * that case, the contents of [s1, s1 + n1) is unspecified.
  295. */
  296.  
  297. /*
  298.  * FUNCTIONS THAT USE NUMERIC
  299.  */
  300.  
  301. char _Locale_decimal_point(struct _Locale_numeric *);
  302. char _Locale_thousands_sep(struct _Locale_numeric *);
  303. const char * _Locale_grouping(struct _Locale_numeric *);
  304.  
  305. /*
  306.  * Equivalent to the first three fields in struct lconv.  (C standard,
  307.  * section 7.4.)
  308.  */
  309.  
  310. const char * _Locale_true(struct _Locale_numeric *);
  311. const char * _Locale_false(struct _Locale_numeric *);
  312.  
  313. /*
  314.  * Return "true" and "false" in English locales, and something
  315.  * appropriate in non-English locales.
  316.  */
  317.  
  318. /*
  319.  * FUNCTIONS THAT USE MONETARY
  320.  */
  321.  
  322. const char * _Locale_int_curr_symbol(struct _Locale_monetary *);
  323. const char * _Locale_currency_symbol(struct _Locale_monetary *);
  324. char         _Locale_mon_decimal_point(struct _Locale_monetary *);
  325. char         _Locale_mon_thousands_sep(struct _Locale_monetary *);
  326. const char * _Locale_mon_grouping(struct _Locale_monetary *);
  327. const char * _Locale_positive_sign(struct _Locale_monetary *);
  328. const char * _Locale_negative_sign(struct _Locale_monetary *);
  329. char         _Locale_int_frac_digits(struct _Locale_monetary *);
  330. char         _Locale_frac_digits(struct _Locale_monetary *);
  331. int          _Locale_p_cs_precedes(struct _Locale_monetary *);
  332. int          _Locale_p_sep_by_space(struct _Locale_monetary *);
  333. int          _Locale_p_sign_posn(struct _Locale_monetary *);
  334. int          _Locale_n_cs_precedes(struct _Locale_monetary *);
  335. int          _Locale_n_sep_by_space(struct _Locale_monetary *);
  336. int          _Locale_n_sign_posn(struct _Locale_monetary *);
  337.  
  338. /*
  339.  * Return the obvious fields of struct lconv.
  340.  */
  341.  
  342. /*
  343.  * FUNCTIONS THAT USE TIME
  344.  */
  345.  
  346. const char ** _Locale_full_monthname(struct _Locale_time *);
  347. const char ** _Locale_abbrev_monthname(struct _Locale_time *);
  348.  
  349. /*
  350.  * month is in the range [0, 12).
  351.  */
  352.  
  353. const char ** _Locale_full_dayofweek(struct _Locale_time *);
  354. const char ** _Locale_abbrev_dayofweek(struct _Locale_time *);
  355.  
  356. /*
  357.  * day is in the range [0, 7).  Sunday is 0.
  358.  */
  359.  
  360. const char * _Locale_d_t_fmt(struct _Locale_time *);
  361. const char * _Locale_d_fmt(struct _Locale_time *);
  362. const char * _Locale_t_fmt(struct _Locale_time *);
  363. const char * _Locale_long_d_t_fmt(struct _Locale_time*);
  364. const char * _Locale_long_d_fmt(struct _Locale_time*);
  365.  
  366. const char * _Locale_am_str(struct _Locale_time *);
  367. const char * _Locale_pm_str(struct _Locale_time *);
  368. const char * _Locale_t_fmt_ampm(struct _Locale_time *);
  369.  
  370.  
  371. /*
  372.  * FUNCTIONS THAT USE MESSAGES
  373.  */
  374.  
  375. int _Locale_catopen(struct _Locale_messages*, const char*);
  376.  
  377. /*
  378.  * Very similar to catopen, except that it uses L to determine
  379.  * which catalog to open.
  380.  */
  381.  
  382. void _Locale_catclose(struct _Locale_messages*, int);
  383.  
  384. /*
  385.  * catalog is a value that was returned by a previous call to
  386.  * _Locale_catopen
  387.  */
  388.  
  389. const char * _Locale_catgets(struct _Locale_messages *, int,
  390.                              int, int,const char *);
  391.  
  392. /*
  393.  * Returns a string, identified by a set index and a message index,
  394.  * from an opened message catalog.  Returns default if no such
  395.  * string exists.
  396.  */
  397.  
  398. # ifdef __cplusplus
  399. }
  400. _STLP_END_NAMESPACE
  401. # endif
  402.  
  403. # endif /* _STLP_C_LOCALE_IMPL_H */
  404.