hholzgra Wed Sep 18 03:55:31 2002 EDT
Modified files:
/php4/ext/standard string.c
Log:
setlocale() will now accept multiple locale arguments, first match wins
Index: php4/ext/standard/string.c
diff -u php4/ext/standard/string.c:1.293 php4/ext/standard/string.c:1.294
--- php4/ext/standard/string.c:1.293 Wed Sep 11 10:51:09 2002
+++ php4/ext/standard/string.c Wed Sep 18 03:55:30 2002
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: string.c,v 1.293 2002/09/11 14:51:09 sniper Exp $ */
+/* $Id: string.c,v 1.294 2002/09/18 07:55:30 hholzgra Exp $ */
/* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */
@@ -3107,68 +3107,96 @@
}
/* }}} */
-/* {{{ proto string setlocale(mixed category, string locale)
+/* {{{ proto string setlocale(mixed category, string locale [, string ...])
Set locale information */
PHP_FUNCTION(setlocale)
{
+ pval ***args = (pval ***) emalloc(sizeof(pval **)*ZEND_NUM_ARGS());
zval **pcategory, **plocale;
- zval *category, *locale;
- int cat;
+ zval *locale;
+ int i, cat, n_args=ZEND_NUM_ARGS();
char *loc, *retval;
- if (ZEND_NUM_ARGS()!=2 || zend_get_parameters_ex(2, &pcategory,
&plocale)==FAILURE)
+ if (zend_get_parameters_array_ex(n_args, args)==FAILURE || n_args<2) {
+ efree(args);
WRONG_PARAM_COUNT;
+ }
#ifdef HAVE_SETLOCALE
- convert_to_string_ex(plocale);
- locale = *plocale;
-
+ pcategory = args[0];
if (Z_TYPE_PP(pcategory) == IS_LONG) {
convert_to_long_ex(pcategory);
cat = Z_LVAL_PP(pcategory);
} else { /* FIXME: The following behaviour should be removed. */
+ char *category;
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passing locale category
name as string is deprecated. Use the LC_* -constants instead.");
convert_to_string_ex(pcategory);
- category = *pcategory;
+ category = Z_STRVAL_P(*pcategory);
- if (!strcasecmp ("LC_ALL", Z_STRVAL_P(category)))
+ if (!strcasecmp ("LC_ALL", category))
cat = LC_ALL;
- else if (!strcasecmp ("LC_COLLATE", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_COLLATE", category))
cat = LC_COLLATE;
- else if (!strcasecmp ("LC_CTYPE", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_CTYPE", category))
cat = LC_CTYPE;
#ifdef LC_MESSAGES
- else if (!strcasecmp ("LC_MESSAGES", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_MESSAGES", category))
cat = LC_MESSAGES;
#endif
- else if (!strcasecmp ("LC_MONETARY", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_MONETARY", category))
cat = LC_MONETARY;
- else if (!strcasecmp ("LC_NUMERIC", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_NUMERIC", category))
cat = LC_NUMERIC;
- else if (!strcasecmp ("LC_TIME", Z_STRVAL_P(category)))
+ else if (!strcasecmp ("LC_TIME", category))
cat = LC_TIME;
else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid locale
category name %s, must be one of LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,
LC_NUMERIC, or LC_TIME.", Z_STRVAL_P(category));
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid locale
+category name %s, must be one of LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY,
+LC_NUMERIC, or LC_TIME.", category);
RETURN_FALSE;
}
}
- if (!strcmp ("0", Z_STRVAL_P(locale))) {
- loc = NULL;
+
+ if (Z_TYPE_PP(args[1]) == IS_ARRAY) {
+ zend_hash_internal_pointer_reset(Z_ARRVAL_PP(args[1]));
} else {
- loc = Z_STRVAL_P(locale);
+ i=1;
}
-
- retval = setlocale (cat, loc);
- if (retval) {
- /* Remember if locale was changed */
- if (loc) {
- STR_FREE(BG(locale_string));
- BG(locale_string) = estrdup(retval);
+ while(1) {
+ if (Z_TYPE_PP(args[1]) == IS_ARRAY) {
+ zend_hash_get_current_data(Z_ARRVAL_PP(args[1]),(void
+**)&plocale);
+ } else {
+ plocale = args[i];
}
- RETVAL_STRING(retval, 1);
- return;
+ convert_to_string_ex(plocale);
+
+ if (!strcmp ("0", Z_STRVAL_PP(plocale))) {
+ loc = NULL;
+ } else {
+ loc = Z_STRVAL_PP(plocale);
+ }
+
+ retval = setlocale (cat, loc);
+ if (retval) {
+ /* Remember if locale was changed */
+ if (loc) {
+ STR_FREE(BG(locale_string));
+ BG(locale_string) = estrdup(retval);
+ }
+
+ efree(args);
+ RETVAL_STRING(retval, 1);
+ return;
+ }
+
+ if (Z_TYPE_PP(args[1]) == IS_ARRAY) {
+ zend_hash_move_forward(Z_ARRVAL_PP(args[1]));
+ } else {
+ if(++i >= n_args) break;
+ }
}
+
#endif
+ efree(args);
+
RETURN_FALSE;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php