1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Silicon Graphics Computer Systems, Inc. 4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1999 6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Boris Fomitchev 7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * This material is provided "as is", with absolutely no warranty expressed 9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * or implied. Any use is at your own risk. 10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use or copy this software for any purpose is hereby granted 12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * without fee, provided the above notices are retained on all copies. 13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to modify the code and to distribute modified code is granted, 14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided the above notices are retained, and a notice that the code was 15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * modified is included with the above copyright notice. 16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef MESSAGE_FACETS_H 19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define MESSAGE_FACETS_H 20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <string> 22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <locale> 23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include <hash_map> 24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#include "c_locale.h" 26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_BEGIN_NAMESPACE 28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_PRIV_NAMESPACE 29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Class _Catalog_locale_map. The reason for this is that, internally, 31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// a message string is always a char*. We need a ctype facet to convert 32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// a string to and from wchar_t, and the user is permitted to provide such 33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// a facet when calling open(). 34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottstruct _Catalog_locale_map { 36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_locale_map() : M(0) {} 37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ~_Catalog_locale_map() { if (M) delete M; } 38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void insert(nl_catd_type key, const locale& L); 40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott locale lookup(nl_catd_type key) const; 41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void erase(nl_catd_type key); 42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef hash_map<nl_catd_type, locale, hash<nl_catd_type>, equal_to<nl_catd_type>, 44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott allocator<pair<_STLP_CONST nl_catd_type, locale> > > map_type; 45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott map_type *M; 46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate: // Invalidate copy constructor and assignment 48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_locale_map(const _Catalog_locale_map&); 49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void operator=(const _Catalog_locale_map&); 50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* 53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * In glibc nl_catd type is void *, but messages_base::catalog is defined as int 54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * by ISO/IEC 14882; The int may be too short to store pointer on 64-bit platforms; 55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Another problem, is that do_open() may return negative value to indicate that no 56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * catalog open---this case can't be represented with pointers. 57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * The class _Catalog_nl_catd_map intended to make relation between 58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * messages_base::catalog and nl_catd handler. 59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * 60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_GLIBC2_LOCALIZATION) 63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# define _STLP_USE_NL_CATD_MAPPING 64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/* If no mapping a message_base::catalog entry, int typedef according C++ Standard 22.2.7.1, 66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * has to be large enough to contain a nl_catd_type value. 67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott */ 68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_STATIC_ASSERT(sizeof(nl_catd_type) <= sizeof(int)) 69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass _STLP_CLASS_DECLSPEC _Catalog_nl_catd_map { 72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic: 73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_nl_catd_map() 74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott {} 75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ~_Catalog_nl_catd_map() 76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott {} 77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef hash_map<messages_base::catalog, nl_catd_type, hash<messages_base::catalog>, equal_to<messages_base::catalog>, 79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott allocator<pair<_STLP_CONST messages_base::catalog, nl_catd_type> > > map_type; 80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef hash_map<nl_catd_type, messages_base::catalog, hash<nl_catd_type>, equal_to<nl_catd_type>, 81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott allocator<pair<_STLP_CONST nl_catd_type, messages_base::catalog> > > rmap_type; 82e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // typedef map<messages_base::catalog,nl_catd_type> map_type; 83e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott // typedef map<nl_catd_type,messages_base::catalog> rmap_type; 84e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 85e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott messages_base::catalog insert(nl_catd_type cat) 86e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_NL_CATD_MAPPING) 87e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return (messages_base::catalog)cat; } 88e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 89e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ; 90e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 92e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void erase(messages_base::catalog) 93e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_NL_CATD_MAPPING) 94e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott {} 95e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ; 97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott nl_catd_type operator [] ( messages_base::catalog cat ) 100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_USE_NL_CATD_MAPPING) 101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return cat; } 102e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else 103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott { return cat < 0 ? 0 : M[cat]; } 104e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 105e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 106e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate: 107e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_nl_catd_map(const _Catalog_nl_catd_map&); 108e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_nl_catd_map& operator =(const _Catalog_nl_catd_map&); 109e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 110e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_USE_NL_CATD_MAPPING) 111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott map_type M; 112e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott rmap_type Mr; 113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott static _STLP_VOLATILE __stl_atomic_t _count; 114e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 115e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 116e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 117e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass _Messages { 118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic: 119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott typedef messages_base::catalog catalog; 120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Messages(bool, const char *name); 122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Messages(bool, _Locale_messages*); 123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott catalog do_open(const string& __fn, const locale& __loc) const; 125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott string do_get(catalog __c, int __set, int __msgid, 126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const string& __dfault) const; 127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_WCHAR_T) 128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott wstring do_get(catalog __c, int __set, int __msgid, 129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott const wstring& __dfault) const; 130e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 131e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott void do_close(catalog __c) const; 132e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott ~_Messages(); 133e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate: 135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Locale_messages* _M_message_obj; 136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Catalog_locale_map* _M_map; 137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott mutable _Catalog_nl_catd_map _M_cat; 138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott //private definition to avoid warning (with ICL) 140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Messages(const _Messages&); 141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott _Messages& operator=(const _Messages&); 142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}; 143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_MOVE_TO_STD_NAMESPACE 145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott_STLP_END_NAMESPACE 147e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 148e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif 149e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott 150e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// Local Variables: 151e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// mode:C++ 152e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott// End: 153