Bug #17642 Updated: setting certain locales undefines defines
| From: | ilia at prohost dot org | Date: | Fri, 07 Jun 2002 15:47:26 +0000 |
| Subject: | Bug #17642 Updated: setting certain locales undefines defines | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-9768@lists.php.net to get a copy of this message | ||
ID: 17642
Updated by: ilia@prohost.org
Reported By: ilia@prohost.org
Status: Open
Bug Type: Scripting Engine problem
Operating System: Linux 2.4.18
PHP Version: 4.2.1
New Comment:
I've looked the Zend constants code and it appears the code ALWAYS
lowercases the name of the define (not done for variables). To
lowercase the define name, C's tolower() function is used, which obides
by locale settings, since I is not avaliable it is left as is accoring
to the tolower()'s man page.
The solution which appears to work, seems to be the removal of
zend_str_tolower(lookup_name, name_len);
inside ZEND_API int zend_get_constant function and removal of
end_str_tolower(lowercase_name, c->name_len);
inside ZEND_API int zend_register_constant
Previous Comments:
------------------------------------------------------------------------
[2002-06-07 11:28:46] ilia@prohost.org
Yeah, that does appear to be the problem, any define containing the
letter 'I' gets broken after the local is exported.
Interestingly enough, if I move the define below the setlocale() lin,e
it begins to work fine. Also, this does not seem to be a problem for
variable names as they are unaffected by change in locale.
------------------------------------------------------------------------
[2002-06-07 11:14:40] derick@php.net
This is because the 'I' doesn't exist in tr_TR.
Derick
------------------------------------------------------------------------
[2002-06-07 11:03:10] ilia@prohost.org
One more thing, If i use the get_defined_constants() function to fetch
the list of all the defines, the __REQUEST_TIMESTAMP__ is always there
and always has the correct value in it.
------------------------------------------------------------------------
[2002-06-07 11:00:38] ilia@prohost.org
Setting certain locales, such as tr_TR (Turkish) undefines certain
defines. Here is an example script
<?
define('__REQUEST_TIMESTAMP__', time());
echo "BEFORE: ".__REQUEST_TIMESTAMP__."<br>\n";
setlocale(LC_ALL, 'tr_TR');
echo "AFTER: ".__REQUEST_TIMESTAMP__."<br>\n";
?>
Results in the following output:
BEFORE: 1023461965
Notice: Use of undefined constant __REQUEST_TIMESTAMP__ - assumed
'__REQUEST_TIMESTAMP__' in /home/forum/test.php on line 12
AFTER: __REQUEST_TIMESTAMP__
On the otherhand using any other locale, such as de_DE or pl_PL seems
to work fine and does not undefine the define.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=17642&edit=1