summaryrefslogtreecommitdiff
path: root/Zend/zend_constants.c
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>1999-04-07 18:10:10 +0000
committerAndi Gutmans <andi@php.net>1999-04-07 18:10:10 +0000
commit573b46022c46ab41a879c23f4ea432dd4d0c102e (patch)
tree12cabc0497f414c8c7678e18f2a034eefb1604a9 /Zend/zend_constants.c
parentf70a4db647886f65a3e24249351d2c8abc0cdfb3 (diff)
downloadphp-git-573b46022c46ab41a879c23f4ea432dd4d0c102e.tar.gz
Zend Library
Diffstat (limited to 'Zend/zend_constants.c')
-rw-r--r--Zend/zend_constants.c236
1 files changed, 236 insertions, 0 deletions
diff --git a/Zend/zend_constants.c b/Zend/zend_constants.c
new file mode 100644
index 0000000000..6072227a82
--- /dev/null
+++ b/Zend/zend_constants.c
@@ -0,0 +1,236 @@
+/*
+ +----------------------------------------------------------------------+
+ | Zend Engine |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1998, 1999 Andi Gutmans, Zeev Suraski |
+ +----------------------------------------------------------------------+
+ | This source file is subject to the Zend license, that is bundled |
+ | with this package in the file LICENSE. If you did not receive a |
+ | copy of the Zend license, please mail us at zend@zend.com so we can |
+ | send you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Authors: Andi Gutmans <andi@zend.com> |
+ | Zeev Suraski <zeev@zend.com> |
+ +----------------------------------------------------------------------+
+*/
+
+
+#include "zend.h"
+#include "zend_constants.h"
+#include "zend_variables.h"
+#include "zend_operators.h"
+#include "zend_globals.h"
+
+
+void free_zend_constant(zend_constant *c)
+{
+ if (!(c->flags & CONST_PERSISTENT)) {
+ zval_dtor(&c->value);
+ }
+ free(c->name);
+}
+
+
+static int clean_non_persistent_constant(zend_constant *c)
+{
+ if (c->flags & CONST_PERSISTENT) {
+ return 0;
+ } else {
+ return 1;
+ }
+}
+
+
+static int clean_module_constant(zend_constant *c, int *module_number)
+{
+ if (c->module_number == *module_number) {
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+void clean_module_constants(int module_number)
+{
+ zend_hash_apply_with_argument(EG(zend_constants), (int (*)(void *,void *)) clean_module_constant, (void *) &module_number);
+}
+
+
+int zend_startup_constants(void)
+{
+#if WIN32|WINNT
+ DWORD dwBuild=0;
+ DWORD dwVersion = GetVersion();
+ DWORD dwWindowsMajorVersion = (DWORD)(LOBYTE(LOWORD(dwVersion)));
+ DWORD dwWindowsMinorVersion = (DWORD)(HIBYTE(LOWORD(dwVersion)));
+#endif
+
+
+/* ZEND_FIX: Move to PHP */
+#if 0
+#if WIN32|WINNT
+ // Get build numbers for Windows NT or Win95
+ if (dwVersion < 0x80000000){
+ php3_os="WINNT";
+ } else {
+ php3_os="WIN32";
+ }
+#else
+ php3_os=PHP_OS;
+#endif
+#endif
+
+
+ EG(zend_constants) = (HashTable *) malloc(sizeof(HashTable));
+
+ if (zend_hash_init(EG(zend_constants), 20, NULL, (void(*)(void *)) free_zend_constant, 1)==FAILURE) {
+ return FAILURE;
+ }
+
+#if 0
+ /* This should go back to PHP */
+ REGISTER_MAIN_STRINGL_CONSTANT("PHP_VERSION", PHP_VERSION, sizeof(PHP_VERSION)-1, CONST_PERSISTENT | CONST_CS);
+ REGISTER_MAIN_STRINGL_CONSTANT("PHP_OS", php3_os, strlen(php3_os), CONST_PERSISTENT | CONST_CS);
+#endif
+ REGISTER_MAIN_LONG_CONSTANT("E_ERROR", E_ERROR, CONST_PERSISTENT | CONST_CS);
+ REGISTER_MAIN_LONG_CONSTANT("E_WARNING", E_WARNING, CONST_PERSISTENT | CONST_CS);
+ REGISTER_MAIN_LONG_CONSTANT("E_NOTICE", E_NOTICE, CONST_PERSISTENT | CONST_CS);
+ REGISTER_MAIN_LONG_CONSTANT("E_PARSE", E_PARSE, CONST_PERSISTENT | CONST_CS);
+ REGISTER_MAIN_LONG_CONSTANT("E_ALL", E_ALL, CONST_PERSISTENT | CONST_CS);
+
+ /* true/false constants */
+ {
+ zend_constant c;
+
+ c.value.type = IS_BOOL;
+ c.flags = CONST_PERSISTENT;
+ c.module_number = 0;
+
+ c.name = zend_strndup("TRUE",4);
+ c.name_len = 5;
+ c.value.value.lval = 1;
+ c.value.type = IS_BOOL;
+ zend_register_constant(&c);
+
+ c.name = zend_strndup("FALSE",5);
+ c.name_len = 6;
+ c.value.value.lval = 0;
+ c.value.type = IS_BOOL;
+ zend_register_constant(&c);
+ }
+
+ return SUCCESS;
+}
+
+
+int zend_shutdown_constants(void)
+{
+ zend_hash_destroy(EG(zend_constants));
+ free(EG(zend_constants));
+ return SUCCESS;
+}
+
+
+void clean_non_persistent_constants(void)
+{
+ zend_hash_apply(EG(zend_constants), (int (*)(void *)) clean_non_persistent_constant);
+}
+
+
+ZEND_API void zend_register_long_constant(char *name, uint name_len, long lval, int flags, int module_number)
+{
+ zend_constant c;
+
+ c.value.type = IS_LONG;
+ c.value.value.lval = lval;
+ c.flags = flags;
+ c.name = zend_strndup(name,name_len);
+ c.name_len = name_len;
+ c.module_number = module_number;
+ zend_register_constant(&c);
+}
+
+
+ZEND_API void zend_register_double_constant(char *name, uint name_len, double dval, int flags, int module_number)
+{
+ zend_constant c;
+
+ c.value.type = IS_DOUBLE;
+ c.value.value.dval = dval;
+ c.flags = flags;
+ c.name = zend_strndup(name,name_len);
+ c.name_len = name_len;
+ c.module_number = module_number;
+ zend_register_constant(&c);
+}
+
+
+ZEND_API void zend_register_stringl_constant(char *name, uint name_len, char *strval, uint strlen, int flags, int module_number)
+{
+ zend_constant c;
+
+ c.value.type = IS_STRING;
+ c.value.value.str.val = strval;
+ c.value.value.str.len = strlen;
+ c.flags = flags;
+ c.name = zend_strndup(name,name_len);
+ c.name_len = name_len;
+ c.module_number = module_number;
+ zend_register_constant(&c);
+}
+
+
+ZEND_API void zend_register_string_constant(char *name, uint name_len, char *strval, int flags, int module_number)
+{
+ zend_register_stringl_constant(name, name_len, strval, strlen(strval), flags, module_number);
+}
+
+
+ZEND_API int zend_get_constant(char *name, uint name_len, zval *result)
+{
+ zend_constant *c;
+ char *lookup_name = estrndup(name,name_len);
+ int retval;
+
+ 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;
+ } else {
+ retval=1;
+ *result = c->value;
+ zval_copy_ctor(result);
+ }
+ } else {
+ retval=0;
+ }
+
+ efree(lookup_name);
+ return retval;
+}
+
+
+ZEND_API void zend_register_constant(zend_constant *c)
+{
+ char *lowercase_name = zend_strndup(c->name, c->name_len);
+
+#if 0
+ printf("Registering constant for module %d\n",c->module_number);
+#endif
+
+ 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) {
+ zval_dtor(&c->value);
+ }
+ free(lowercase_name);
+}
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */