
1: /* Return number of characters in multibyte representation for current 2: character set. 3: Copyright (C) 1996, 1999 Free Software Foundation, Inc. 4: This file is part of the GNU C Library. 5: Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. 6: 7: The GNU C Library is free software; you can redistribute it and/or 8: modify it under the terms of the GNU Lesser General Public 9: License as published by the Free Software Foundation; either 10: version 2.1 of the License, or (at your option) any later version. 11: 12: The GNU C Library is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15: Lesser General Public License for more details. 16: 17: You should have received a copy of the GNU Lesser General Public 18: License along with the GNU C Library; if not, write to the Free 19: Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 20: 02111-1307 USA. */ 21: 22: #include <langinfo.h> 23: #include <locale.h> 24: #include <stdlib.h> 25: #include "localeinfo.h" 26: 27: 28: /* This is a gross hack to get broken programs running. 29: 30: ISO C provides no mean to find out how many bytes the wide 31: character representation really uses. But it defines MB_CUR_LEN to 32: return the information for the multi-byte character representation. 33: Many programmers don't know the difference between the two and 34: think this means the same. But assuming all characters have a size 35: of MB_CUR_LEN after they have been processed by `mbrtowc' is wrong. 36: Instead the maximum number of characters used for the conversion is 37: MB_CUR_LEN. 38: 39: It is known that some Motif applications have this problem. To 40: cure this one has to make sure the glibc uses the function in this 41: file instead of the one in locale/mb_cur_max.c. This can either be 42: done by linking with this file or by using the LD_PRELOAD feature 43: of the dynamic linker. */ 44: size_t 45: __ctype_get_mb_cur_max (void) 46: { 47: union locale_data_value u; 48: 49: u.string = nl_langinfo (_NL_CTYPE_MB_CUR_MAX); 50: return ((size_t []) { 1, 1, 1, 2, 2, 3, 4 })[u.word]; 51: }