os/ossrv/genericopenlibs/cppstdlib/stl/src/c_locale.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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 "stlport_prefix.h"
    35 #include <stl/c_locale.h>
    36 
    37 #ifdef _STLP_REAL_LOCALE_IMPLEMENTED
    38 #  if defined (_STLP_USE_GLIBC) && !defined (__CYGWIN__)
    39 #    include <nl_types.h>
    40 #  endif
    41 #endif
    42 
    43 /*
    44  * A number: the maximum length of a simple locale name.
    45  * (i.e. a name like like en_US, as opposed to a name like
    46  * en_US/de_AT/de_AT/es_MX/en_US/en_US) */
    47 #define _Locale_MAX_SIMPLE_NAME 256
    48 
    49 /*
    50  * Maximum length of a composite locale.
    51  */
    52 #define _Locale_MAX_COMPOSITE_NAME 6*(_Locale_MAX_SIMPLE_NAME+3)
    53 
    54 #ifdef __cplusplus
    55 extern "C" {
    56 #endif
    57 
    58 /*
    59  * Typedefs:
    60  */
    61 #if ((defined (__GNUC__) && !defined (__MINGW32__)) || defined (_KCC) || defined (__ICC)) && (!defined (__SYMBIAN32__))
    62 typedef unsigned short int _Locale_mask_t;
    63 #else
    64 typedef unsigned int _Locale_mask_t;
    65 #endif
    66 
    67 /* Function called during STLport library load phase. Might contain any
    68  * code necessary to the platform localization layer.
    69  */
    70 void _Locale_init();
    71 
    72 /* Function called during STLport library unload. Might contain any
    73  * code necessary to the platform localization layer.
    74  */
    75 void _Locale_final();
    76 
    77 /* Create a category of the locale with the given name.
    78  *
    79  * The char* argument is a simple (not a composite) locale name, which may
    80  * neither be an empty string nor a null pointer.
    81  *
    82  * These functions return NULL to indicate failure.
    83  *
    84  * Note These functions return a void* instead of the appropriate
    85  * _Locale_* struct because they are used with __acquire_category which
    86  * requires that all functions have the same signature.
    87  */
    88 void * _Locale_ctype_create(const char *, struct _Locale_name_hint*);
    89 void * _Locale_numeric_create(const char *, struct _Locale_name_hint*);
    90 void * _Locale_time_create(const char *, struct _Locale_name_hint*);
    91 void * _Locale_collate_create(const char *, struct _Locale_name_hint*);
    92 void * _Locale_monetary_create(const char *, struct _Locale_name_hint*);
    93 void * _Locale_messages_create(const char *, struct _Locale_name_hint*);
    94 
    95 
    96 /* Release a category of a locale
    97  *
    98  * These functions are used to release a category acquired with the
    99  * according _Locale_*_create() functions.
   100  *
   101  * Note: For the same reasons as for the *_create functions, these
   102  * take void* instead of the correct types so that they can be used
   103  * with __release_category.
   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 
   113 /*
   114  * Returns the name of the user's default locale in each
   115  * category, as a null-terminated string.  A NULL value
   116  * means the default "C" locale.
   117  */
   118 const char * _Locale_ctype_default(char * __buf);
   119 const char * _Locale_numeric_default(char * __buf);
   120 const char * _Locale_time_default(char * __buf);
   121 const char * _Locale_collate_default(char * __buf);
   122 const char * _Locale_monetary_default(char * __buf);
   123 const char * _Locale_messages_default(char * __buf);
   124 
   125 
   126 /* Retrieve the name of the given category
   127  *
   128  * __buf points to a buffer that can hold at least _Locale_MAX_SIMPLE_NAME
   129  * characters.  These functions store the name, as a null-terminated
   130  * string, in __buf.
   131  * TODO: can this fail? How is that signalled then?
   132  */
   133 char const* _Locale_ctype_name(const void *, char* __buf);
   134 char const* _Locale_numeric_name(const void *, char* __buf);
   135 char const* _Locale_time_name(const void *, char* __buf);
   136 char const* _Locale_collate_name(const void *, char*  __buf);
   137 char const* _Locale_monetary_name(const void *, char* __buf);
   138 char const* _Locale_messages_name(const void *, char* __buf);
   139 
   140 
   141 /*
   142  * cname is a (possibly composite) locale name---i.e. a name that can
   143  * be passed to setlocale. __buf points to an array large enough to
   144  * store at least _Locale_MAX_SIMPLE_NAME characters, and each of these
   145  * functions extracts the name of a single category, stores it in buf
   146  * as a null-terminated string, and returns buf.
   147  */
   148 char const* _Locale_extract_ctype_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   149 char const* _Locale_extract_numeric_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   150 char const* _Locale_extract_time_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   151 char const* _Locale_extract_collate_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   152 char const* _Locale_extract_monetary_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   153 char const* _Locale_extract_messages_name(const char *cname, char *__buf, struct _Locale_name_hint* __hint);
   154 
   155 /*
   156  * The inputs to this function are six null-terminated strings: the
   157  * names of a locale's six categories.  Locale names for non-standard
   158  * categories are taken from __DefaultName.
   159  * __buf is a pointer to an array large enough to store at least
   160  * _Locale_MAX_COMPOSITE_NAME characters.
   161  * This function constructs a (possibly composite) name describing the
   162  * locale as a whole, stores that name in buf as a null-terminated
   163  * string, and returns buf.
   164  */
   165 char const* _Locale_compose_name(char *__buf,
   166                                  const char *__Ctype, const char *__Numeric,
   167                                  const char *__Time, const char *__Collate,
   168                                  const char *__Monetary, const char *__Messages,
   169                                  const char *__DefaultName);
   170 
   171 /* Funstions to improve locale creation process. For some locale API (Win32)
   172  * you need to find a locale identification from the name which can be a
   173  * rather expensive operation especially if you do so for all facets of a
   174  * locale. Those functions can be used to extract from a API dependent facet
   175  * struct the information necessary to skip this lookup process for other
   176  * facets creation. If not supported those function should return NULL.
   177  */
   178 struct _Locale_name_hint* _Locale_get_ctype_hint(struct _Locale_ctype*);
   179 struct _Locale_name_hint* _Locale_get_numeric_hint(struct _Locale_numeric*);
   180 struct _Locale_name_hint* _Locale_get_time_hint(struct _Locale_time*);
   181 struct _Locale_name_hint* _Locale_get_collate_hint(struct _Locale_collate*);
   182 struct _Locale_name_hint* _Locale_get_monetary_hint(struct _Locale_monetary*);
   183 struct _Locale_name_hint* _Locale_get_messages_hint(struct _Locale_messages*);
   184 
   185 /*
   186  * FUNCTIONS THAT USE CTYPE
   187  */
   188 
   189 /*
   190  * Narrow character functions:
   191  */
   192 
   193 /*
   194  * Returns a pointer to the beginning of the ctype table.  The table is
   195  * at least 257 bytes long; if p is the pointer returned by this
   196  * function, then p[c] is valid if c is EOF or if p is any value of
   197  * type unsigned char.
   198  */
   199 const _Locale_mask_t * _Locale_ctype_table(struct _Locale_ctype *);
   200 
   201 /*
   202  * c is either EOF, or an unsigned char value.
   203  */
   204 int _Locale_toupper(struct _Locale_ctype *, int);
   205 int _Locale_tolower(struct _Locale_ctype *, int);
   206 
   207 
   208 # ifndef _STLP_NO_WCHAR_T
   209 /*
   210  * Wide character functions:
   211  */
   212 _Locale_mask_t _Locale_wchar_ctype(struct _Locale_ctype *, wint_t,
   213   _Locale_mask_t);
   214 wint_t _Locale_wchar_tolower(struct _Locale_ctype *, wint_t);
   215 wint_t _Locale_wchar_toupper(struct _Locale_ctype *, wint_t);
   216 # endif
   217 
   218 # if !defined ( _STLP_NO_MBSTATE_T )
   219 
   220 /*
   221  * Multibyte functions:
   222  */
   223 
   224 int _Locale_mb_cur_max (struct _Locale_ctype *);
   225 /*
   226  * Returns the number of bytes of the longest allowed multibyte
   227  * character in the current encoding.
   228  */
   229 
   230 int _Locale_mb_cur_min (struct _Locale_ctype *);
   231 /*
   232  * Returns the number of bytes of the shortest allowed multibyte
   233  * character in the current encoding.
   234  */
   235 
   236 int _Locale_is_stateless (struct _Locale_ctype *);
   237 /*
   238  * Returns 1 if the current multibyte encoding is stateless
   239  * and does not require the use of an mbstate_t value.
   240  */
   241 
   242 # ifndef _STLP_NO_WCHAR_T
   243 wint_t _Locale_btowc(struct _Locale_ctype *, int);
   244 int _Locale_wctob(struct _Locale_ctype *, wint_t);
   245 
   246 /*
   247  * Just like btowc and wctob, from 4.6.5.1 of the C standard, Normative
   248  * Addendum 1.  (And just like widen/narrow, from clause 22 of the C++
   249  * standard.)
   250  */
   251 
   252 size_t _Locale_mbtowc(struct _Locale_ctype *,
   253                       wchar_t *,
   254                       const char *, size_t,
   255                       mbstate_t *);
   256 
   257 /*
   258  * Almost identical to mbrtowc, from 4.6.5.3.2 of NA1.  The only
   259  * important difference is that mbrtowc treats null wide characters
   260  * as special, and we don't.  Specifically: examines the characters
   261  * in [from, from + n), extracts a single wide character, and stores
   262  * it in *to.  Modifies shift_state if appropriate.  The return value,
   263  * which is always positive, is the number of characters extracted from
   264  * the input sequence.  Return value is (size_t) -1 if there was an
   265  * encoding error in the input sequence, and (size_t) -2 if
   266  * [from, from + n) is correct but not complete.  None of the pointer
   267  * arguments may be null pointers.
   268  */
   269 
   270 size_t _Locale_wctomb(struct _Locale_ctype *,
   271                       char *, size_t,
   272                       const wchar_t,
   273                       mbstate_t *);
   274 
   275 /*
   276  * Again, very similar to wcrtomb.  The differences are that (1) it
   277  * doesn't treat null characters as special; and (2) it stores at most
   278  * n characters.  Converts c to a multibyte sequence, stores that
   279  * sequence in the array 'to', and returns the length of the sequence.
   280  * Modifies shift_state if appropriate.  The return value is (size_t) -1
   281  * if c is not a valid wide character, and (size_t) -2 if the length of
   282  * the multibyte character sequence is greater than n.
   283  */
   284 # endif
   285 
   286 size_t _Locale_unshift(struct _Locale_ctype *,
   287                        mbstate_t *,
   288                        char *, size_t, char **);
   289 
   290 /*
   291  * Inserts whatever characters are necessary to restore st to an
   292  * initial shift state.  Sets *next to buf + m, where m is the number
   293  * of characters inserted.  (0 <= m <= n.)  Returns m to indicate
   294  * success, (size_t) -1 to indicate error, (size_t) -2 to indicate
   295  * partial success (more than n characters needed).  For success or partial
   296  * success, sets *next to buf + m.
   297  */
   298 
   299 # endif /*  _STLP_NO_MBSTATE_T */
   300 
   301 /*
   302  * FUNCTIONS THAT USE COLLATE
   303  */
   304 
   305 int _Locale_strcmp(struct _Locale_collate *,
   306                    const char *, size_t,
   307                    const char *, size_t);
   308 # ifndef _STLP_NO_WCHAR_T
   309 int _Locale_strwcmp(struct _Locale_collate *,
   310                     const wchar_t *, size_t,
   311                     const wchar_t *, size_t);
   312 # endif
   313 /*
   314  * Compares the two sequences [s1, s1 + n1) and [s2, s2 + n2).  Neither
   315  * sequence is assumed to be null-terminated, and null characters
   316  * aren't special.  If the two sequences are the same up through
   317  * min(n1, n2), then the sequence that compares less is whichever one
   318  * is shorter.
   319  */
   320 
   321 size_t _Locale_strxfrm(struct _Locale_collate *,
   322                        char *, size_t,
   323                        const char *, size_t);
   324 
   325 # ifndef _STLP_NO_WCHAR_T
   326 size_t _Locale_strwxfrm(struct _Locale_collate *,
   327                         wchar_t *, size_t,
   328                         const wchar_t *, size_t);
   329 # endif
   330 
   331 /*
   332  * Creates a transformed version of the string [s2, s2 + n2).  The
   333  * string may contain embedded null characters; nulls aren't special.
   334  * The transformed string begins at s1, and contains at most n1
   335  * characters.  The return value is the length of the transformed
   336  * string.  If the return value is greater than n1 then this is an
   337  * error condition: it indicates that there wasn't enough space.  In
   338  * that case, the contents of [s1, s1 + n1) is unspecified.
   339 */
   340 
   341 /*
   342  * FUNCTIONS THAT USE NUMERIC
   343  */
   344 
   345 /*
   346  * Equivalent to the first three fields in struct lconv.  (C standard,
   347  * section 7.4.)
   348  */
   349 char _Locale_decimal_point(struct _Locale_numeric *);
   350 char _Locale_thousands_sep(struct _Locale_numeric *);
   351 const char * _Locale_grouping(struct _Locale_numeric *);
   352 
   353 
   354 /*
   355  * Return "true" and "false" in English locales, and something
   356  * appropriate in non-English locales.
   357  */
   358 const char * _Locale_true(struct _Locale_numeric *);
   359 const char * _Locale_false(struct _Locale_numeric *);
   360 
   361 
   362 /*
   363  * FUNCTIONS THAT USE MONETARY
   364  */
   365 
   366 /*
   367  * Return the obvious fields of struct lconv.
   368  */
   369 const char * _Locale_int_curr_symbol(struct _Locale_monetary *);
   370 const char * _Locale_currency_symbol(struct _Locale_monetary *);
   371 char         _Locale_mon_decimal_point(struct _Locale_monetary *);
   372 char         _Locale_mon_thousands_sep(struct _Locale_monetary *);
   373 const char * _Locale_mon_grouping(struct _Locale_monetary *);
   374 const char * _Locale_positive_sign(struct _Locale_monetary *);
   375 const char * _Locale_negative_sign(struct _Locale_monetary *);
   376 char         _Locale_int_frac_digits(struct _Locale_monetary *);
   377 char         _Locale_frac_digits(struct _Locale_monetary *);
   378 int          _Locale_p_cs_precedes(struct _Locale_monetary *);
   379 int          _Locale_p_sep_by_space(struct _Locale_monetary *);
   380 int          _Locale_p_sign_posn(struct _Locale_monetary *);
   381 int          _Locale_n_cs_precedes(struct _Locale_monetary *);
   382 int          _Locale_n_sep_by_space(struct _Locale_monetary *);
   383 int          _Locale_n_sign_posn(struct _Locale_monetary *);
   384 
   385 
   386 /*
   387  * FUNCTIONS THAT USE TIME
   388  */
   389 
   390 /*
   391  * month is in the range [0, 12).
   392  */
   393 const char * _Locale_full_monthname(struct _Locale_time *, int);
   394 const char * _Locale_abbrev_monthname(struct _Locale_time *, int);
   395 
   396 
   397 /*
   398  * day is in the range [0, 7).  Sunday is 0.
   399  */
   400 const char * _Locale_full_dayofweek(struct _Locale_time *, int);
   401 const char * _Locale_abbrev_dayofweek(struct _Locale_time *, int);
   402 
   403 
   404 const char * _Locale_d_t_fmt(struct _Locale_time *);
   405 const char * _Locale_d_fmt(struct _Locale_time *);
   406 const char * _Locale_t_fmt(struct _Locale_time *);
   407 const char * _Locale_long_d_t_fmt(struct _Locale_time*);
   408 const char * _Locale_long_d_fmt(struct _Locale_time*);
   409 
   410 const char * _Locale_am_str(struct _Locale_time *);
   411 const char * _Locale_pm_str(struct _Locale_time *);
   412 const char * _Locale_t_fmt_ampm(struct _Locale_time *);
   413 
   414 
   415 /*
   416  * FUNCTIONS THAT USE MESSAGES
   417  */
   418 
   419 # ifdef _STLP_REAL_LOCALE_IMPLEMENTED
   420 #  if defined (WIN32) || defined (_WIN32)
   421 typedef int nl_catd_type;
   422 #  elif defined (_STLP_USE_GLIBC) && !defined (__CYGWIN__)
   423 typedef nl_catd nl_catd_type;
   424 #  else
   425 typedef int nl_catd_type;
   426 #  endif
   427 # else
   428 typedef int nl_catd_type;
   429 # endif /* _STLP_REAL_LOCALE_IMPLEMENTED */
   430 
   431 
   432 /*
   433  * Very similar to catopen, except that it uses the given message
   434  * category to determine which catalog to open.
   435  */
   436 nl_catd_type _Locale_catopen(struct _Locale_messages*, const char*);
   437 
   438 /* Complementary to _Locale_catopen.
   439  * The catalog must be a value that was returned by a previous call
   440  * to _Locale_catopen.
   441  */
   442 void _Locale_catclose(struct _Locale_messages*, nl_catd_type);
   443 
   444 /*
   445  * Returns a string, identified by a set index and a message index,
   446  * from an opened message catalog.  Returns the supplied default if
   447  * no such string exists.
   448  */
   449 const char * _Locale_catgets(struct _Locale_messages *, nl_catd_type,
   450                              int, int,const char *);
   451 
   452 #ifdef __cplusplus
   453 }
   454 #endif
   455 
   456 #endif /* _STLP_C_LOCALE_IMPL_H */