+----------------------------------------------------------------------+
| Authors: Rasmus Lerdorf <rasmus@lerdorf.on.ca> |
| Jaakko Hyvätti <jaakko.hyvatti@iki.fi> |
+ | Wez Furlong <wez@thebrainroom.com> |
+----------------------------------------------------------------------+
*/
#if HAVE_LOCALE_H
#include <locale.h>
#endif
+#if HAVE_LANGINFO_H
+#include <langinfo.h>
+#endif
/* This must be fixed to handle the input string according to LC_CTYPE.
Defaults to ISO-8859-1 for now. */
enum entity_charset charset = cs_8859_1;
int len;
-#if HAVE_LOCALE_H
+ /* Guarantee default behaviour */
if (charset_hint == NULL)
- {
- /* try to figure out the charset from the locale */
- char * localename;
- char * dot, * at;
-
- /* lang[_territory][.codeset][@modifier] */
- localename = setlocale(LC_CTYPE, NULL);
-
- dot = strchr(localename, '.');
- if (dot) {
- dot++;
- /* locale specifies a codeset */
- at = strchr(dot, '@');
- if (at)
- len = at - dot;
- else
- len = strlen(dot);
- charset_hint = dot;
+ return cs_8859_1;
+
+ if (strlen(charset_hint) == 0) {
+ /* try to detect the charset for the locale */
+#if HAVE_NL_LANGINFO
+ charset_hint = nl_langinfo(CODESET);
+#endif
+#if HAVE_LOCALE_H
+ if (charset_hint == NULL)
+ {
+ /* try to figure out the charset from the locale */
+ char * localename;
+ char * dot, * at;
+
+ /* lang[_territory][.codeset][@modifier] */
+ localename = setlocale(LC_CTYPE, NULL);
+
+ dot = strchr(localename, '.');
+ if (dot) {
+ dot++;
+ /* locale specifies a codeset */
+ at = strchr(dot, '@');
+ if (at)
+ len = at - dot;
+ else
+ len = strlen(dot);
+ charset_hint = dot;
+ }
+ else {
+ /* no explicit name; see if the name itself
+ * is the charset */
+ charset_hint = localename;
+ len = strlen(charset_hint);
+ }
}
- else {
- /* no explicit name; see if the name itself
- * is the charset */
- charset_hint = localename;
+ else
len = strlen(charset_hint);
- }
- }
- else
- len = strlen(charset_hint);
#else
- if (charset_hint)
- len = strlen(charset_hint);
+ if (charset_hint)
+ len = strlen(charset_hint);
#endif
-
+ }
if (charset_hint) {
/* now walk the charset map and look for the codeset */
for (i = 0; charset_map[i].codeset; i++) {
}
}
}
-
return charset;
}
/* }}} */
#ifdef HAVE_LOCALE_H
# include <locale.h>
#endif
+#ifdef HAVE_LANGINFO_H
+# include <langinfo.h>
+#endif
#include "scanf.h"
#include "zend_API.h"
#include "zend_execute.h"
}
/* }}} */
+#if HAVE_NL_LANGINFO
+PHP_MINIT_FUNCTION(nl_langinfo)
+{
+#define REGISTER_NL_LANGINFO_CONSTANT(x) REGISTER_LONG_CONSTANT(#x, x, CONST_CS | CONST_PERSISTENT)
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_1);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_2);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_3);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_4);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_5);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_6);
+ REGISTER_NL_LANGINFO_CONSTANT(ABDAY_7);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_1);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_2);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_3);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_4);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_5);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_6);
+ REGISTER_NL_LANGINFO_CONSTANT(DAY_7);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_1);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_2);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_3);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_4);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_5);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_6);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_7);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_8);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_9);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_10);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_11);
+ REGISTER_NL_LANGINFO_CONSTANT(ABMON_12);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_1);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_2);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_3);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_4);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_5);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_6);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_7);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_8);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_9);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_10);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_11);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_12);
+ REGISTER_NL_LANGINFO_CONSTANT(AM_STR);
+ REGISTER_NL_LANGINFO_CONSTANT(PM_STR);
+ REGISTER_NL_LANGINFO_CONSTANT(D_T_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(D_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(T_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(T_FMT_AMPM);
+ REGISTER_NL_LANGINFO_CONSTANT(ERA);
+ REGISTER_NL_LANGINFO_CONSTANT(ERA_YEAR);
+ REGISTER_NL_LANGINFO_CONSTANT(ERA_D_T_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(ERA_D_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(ERA_T_FMT);
+ REGISTER_NL_LANGINFO_CONSTANT(ALT_DIGITS);
+ REGISTER_NL_LANGINFO_CONSTANT(INT_CURR_SYMBOL);
+#ifdef CURRENCY_SYMBOL
+ REGISTER_NL_LANGINFO_CONSTANT(CURRENCY_SYMBOL);
+#endif
+#ifdef CRNCYSTR
+ REGISTER_NL_LANGINFO_CONSTANT(CRNCYSTR);
+#endif
+ REGISTER_NL_LANGINFO_CONSTANT(MON_DECIMAL_POINT);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_THOUSANDS_SEP);
+ REGISTER_NL_LANGINFO_CONSTANT(MON_GROUPING);
+ REGISTER_NL_LANGINFO_CONSTANT(POSITIVE_SIGN);
+ REGISTER_NL_LANGINFO_CONSTANT(NEGATIVE_SIGN);
+ REGISTER_NL_LANGINFO_CONSTANT(INT_FRAC_DIGITS);
+ REGISTER_NL_LANGINFO_CONSTANT(FRAC_DIGITS);
+ REGISTER_NL_LANGINFO_CONSTANT(P_CS_PRECEDES);
+ REGISTER_NL_LANGINFO_CONSTANT(P_SEP_BY_SPACE);
+ REGISTER_NL_LANGINFO_CONSTANT(N_CS_PRECEDES);
+ REGISTER_NL_LANGINFO_CONSTANT(N_SEP_BY_SPACE);
+ REGISTER_NL_LANGINFO_CONSTANT(P_SIGN_POSN);
+ REGISTER_NL_LANGINFO_CONSTANT(N_SIGN_POSN);
+#ifdef DECIMAL_POINT
+ REGISTER_NL_LANGINFO_CONSTANT(DECIMAL_POINT);
+#endif
+#ifdef RADIXCHAR
+ REGISTER_NL_LANGINFO_CONSTANT(RADIXCHAR);
+#endif
+#ifdef THOUSANDS_SEP
+ REGISTER_NL_LANGINFO_CONSTANT(THOUSANDS_SEP);
+#endif
+#ifdef THOUSEP
+ REGISTER_NL_LANGINFO_CONSTANT(THOUSEP);
+#endif
+ REGISTER_NL_LANGINFO_CONSTANT(GROUPING);
+ REGISTER_NL_LANGINFO_CONSTANT(YESEXPR);
+ REGISTER_NL_LANGINFO_CONSTANT(NOEXPR);
+ REGISTER_NL_LANGINFO_CONSTANT(YESSTR);
+ REGISTER_NL_LANGINFO_CONSTANT(NOSTR);
+#ifdef CODESET
+ REGISTER_NL_LANGINFO_CONSTANT(CODESET);
+#endif
+#undef REGISTER_NL_LANGINFO_CONSTANT
+ return SUCCESS;
+}
+PHP_FUNCTION(nl_langinfo)
+{
+ zval ** item;
+ char * value;
+
+ if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &item) == FAILURE) {
+ WRONG_PARAM_COUNT;
+ }
+ convert_to_long_ex(item);
+ value = nl_langinfo(Z_LVAL_PP(item));
+ if (value == NULL) {
+ RETURN_FALSE;
+ }
+ else {
+ RETURN_STRING(value, 1);
+ }
+}
+#endif
+
#ifdef HAVE_STRCOLL
/* {{{ proto int strcoll(string str1, string str2)
Compare two strings using the current locale */