summaryrefslogtreecommitdiff
path: root/Zend/zend_constants.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>2002-06-19 04:13:12 +0000
committerAndi Gutmans <andi@php.net>2002-06-19 04:13:12 +0000
commit70de1bd5bbd0bc0564d10def0e2905b2b61400fe (patch)
treee11420bd7b147becd81d18afd8f6647f755593e6 /Zend/zend_constants.c
parent5060a9b379fac39d382b2a395b539cc3c897929e (diff)
downloadphp-git-70de1bd5bbd0bc0564d10def0e2905b2b61400fe.tar.gz
- Fix problem where you couldn't define constants with different cases but
- the same name.
Diffstat (limited to 'Zend/zend_constants.c')
-rw-r--r--Zend/zend_constants.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
index 2874a24bf9..62469faf06 100644
--- a/Zend/zend_constants.c
+++ b/Zend/zend_constants.c
@@ -220,26 +220,27 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result TSRMLS_DC
{
zend_constant *c;
char *lookup_name;
- int retval;
+ int retval = 1;
- lookup_name = do_alloca(name_len+1);
- memcpy(lookup_name, name, name_len+1);
+ if (zend_hash_find(EG(zend_constants), name, name_len+1, (void **) &c) == FAILURE) {
+ lookup_name = do_alloca(name_len+1);
+ memcpy(lookup_name, name, name_len+1);
+ zend_str_tolower(lookup_name, name_len);
- zend_str_tolower(lookup_name, name_len);
-
- if (zend_hash_find(EG(zend_constants), lookup_name, name_len+1, (void **) &c)==SUCCESS) {
- if ((c->flags & CONST_CS) && memcmp(c->name, name, name_len)!=0) {
- retval=0;
+ if (zend_hash_find(EG(zend_constants), lookup_name, name_len+1, (void **) &c)==SUCCESS) {
+ if ((c->flags & CONST_CS) && memcmp(c->name, name, name_len)!=0) {
+ retval=0;
+ }
} else {
- retval=1;
- *result = c->value;
- zval_copy_ctor(result);
+ retval=0;
}
- } else {
- retval=0;
+ free_alloca(lookup_name);
}
- free_alloca(lookup_name);
+ if (retval) {
+ *result = c->value;
+ zval_copy_ctor(result);
+ }
return retval;
}
@@ -247,14 +248,21 @@ ZEND_API int zend_get_constant(char *name, uint name_len, zval *result TSRMLS_DC
ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
{
- char *lowercase_name = zend_strndup(c->name, c->name_len);
+ char *lowercase_name;
int ret = SUCCESS;
#if 0
printf("Registering constant for module %d\n", c->module_number);
#endif
- zend_str_tolower(lowercase_name, c->name_len);
+ lowercase_name = do_alloca(c->name_len);
+
+ memcpy(lowercase_name, c->name, c->name_len);
+
+ if (!(c->flags & CONST_CS)) {
+ zend_str_tolower(lowercase_name, c->name_len);
+ }
+
if (zend_hash_add(EG(zend_constants), lowercase_name, c->name_len, (void *) c, sizeof(zend_constant), NULL)==FAILURE) {
free(c->name);
if (!(c->flags & CONST_PERSISTENT)
@@ -264,7 +272,7 @@ ZEND_API int zend_register_constant(zend_constant *c TSRMLS_DC)
zend_error(E_NOTICE,"Constant %s already defined", lowercase_name);
ret = FAILURE;
}
- free(lowercase_name);
+ free_alloca(lowercase_name);
return ret;
}