From 791714f8fbc8e92970711321a3fd99331df566f1 Mon Sep 17 00:00:00 2001 From: Michael Wallner Date: Wed, 3 Aug 2005 11:40:02 +0000 Subject: [PATCH] - add HttpMessage class constants --- http_message_object.c | 6 +++++ missing.c | 55 +++++++++++++++++++++++++++++++++++++++++++ missing.h | 7 ++++++ php_http_std_defs.h | 3 +++ 4 files changed, 71 insertions(+) diff --git a/http_message_object.c b/http_message_object.c index 8365a59..637ee06 100644 --- a/http_message_object.c +++ b/http_message_object.c @@ -128,6 +128,8 @@ static zend_object_handlers http_message_object_handlers; void _http_message_object_init(INIT_FUNC_ARGS) { + zval constants; + HTTP_REGISTER_CLASS_EX(HttpMessage, http_message_object, NULL, 0); HTTP_LONG_CONSTANT("HTTP_MSG_NONE", HTTP_MSG_NONE); @@ -182,6 +184,10 @@ static inline void _http_message_object_declare_default_properties(TSRMLS_D) { zend_class_entry *ce = http_message_object_ce; + DCL_CONST(long, "NONE", HTTP_MSG_NONE); + DCL_CONST(long, "REQUEST", HTTP_MSG_REQUEST); + DCL_CONST(long, "RESPONSE", HTTP_MSG_RESPONSE); + DCL_PROP(PROTECTED, long, type, HTTP_MSG_NONE); DCL_PROP(PROTECTED, string, body, ""); DCL_PROP(PROTECTED, string, requestMethod, ""); diff --git a/missing.c b/missing.c index 7f9fcd8..aefbdb9 100644 --- a/missing.c +++ b/missing.c @@ -71,6 +71,61 @@ void zend_update_property_bool(zend_class_entry *scope, zval *object, char *name #endif +static inline zval *new_class_constant_zval(zend_class_entry *ce) +{ + zval *z; + if (ce->type & ZEND_INTERNAL_CLASS) { + z = malloc(sizeof(zval)); + } else { + ALLOC_ZVAL(z); + } + INIT_PZVAL(z); + return z; +} + +int zend_declare_class_constant(zend_class_entry *ce, char *name, size_t name_length, zval *value TSRMLS_DC) +{ + return zend_hash_add(&ce->constants_table, name, name_length, &value, sizeof(zval *), NULL); +} + +int zend_declare_class_constant_long(zend_class_entry *ce, char *name, size_t name_length, long value TSRMLS_DC) +{ + zval *constant = new_class_constant_zval(ce); + ZVAL_LONG(constant, value); + return zend_declare_class_constant(ce, name, name_length, constant TSRMLS_CC); +} + +int zend_declare_class_constant_bool(zend_class_entry *ce, char *name, size_t name_length, zend_bool value TSRMLS_DC) +{ + zval *constant = new_class_constant_zval(ce); + ZVAL_BOOL(constant, value); + return zend_declare_class_constant(ce, name, name_length, constant TSRMLS_CC); +} + +int zend_declare_class_constant_double(zend_class_entry *ce, char *name, size_t name_length, double value TSRMLS_DC) +{ + zval *constant = new_class_constant_zval(ce); + ZVAL_DOUBLE(constant, value); + return zend_declare_class_constant(ce, name, name_length, constant TSRMLS_CC); +} + +int zend_declare_class_constant_string(zend_class_entry *ce, char *name, size_t name_length, char *value TSRMLS_DC) +{ + return zend_declare_class_constant_stringl(ce, name, name_length, value, strlen(value) TSRMLS_CC); +} + +int zend_declare_class_constant_stringl(zend_class_entry *ce, char *name, size_t name_length, char *value, size_t value_length TSRMLS_DC) +{ + zval *constant = new_class_constant_zval(ce); + Z_TYPE_P(constant) = IS_STRING; + Z_STRLEN_P(constant) = value_length; + Z_STRVAL_P(constant) = malloc(value_length + 1); + memcpy(Z_STRVAL_P(constant), value, value_length); + Z_STRVAL_P(constant)[value_length] = '\0'; + return zend_declare_class_constant(ce, name, name_length, constant TSRMLS_CC); +} + + /* * Local variables: * tab-width: 4 diff --git a/missing.h b/missing.h index 215cbf3..822c3b3 100644 --- a/missing.h +++ b/missing.h @@ -28,6 +28,13 @@ extern int zend_declare_property_bool(zend_class_entry *ce, char *name, int name extern void zend_update_property_bool(zend_class_entry *scope, zval *object, char *name, int name_length, long value TSRMLS_DC); #endif +int zend_declare_class_constant(zend_class_entry *ce, char *name, size_t name_length, zval *value TSRMLS_DC); +int zend_declare_class_constant_null(zend_class_entry *ce, char *name, size_t name_length TSRMLS_DC); +int zend_declare_class_constant_long(zend_class_entry *ce, char *name, size_t name_length, long value TSRMLS_DC); +int zend_declare_class_constant_bool(zend_class_entry *ce, char *name, size_t name_length, zend_bool value TSRMLS_DC); +int zend_declare_class_constant_double(zend_class_entry *ce, char *name, size_t name_length, double value TSRMLS_DC); +int zend_declare_class_constant_string(zend_class_entry *ce, char *name, size_t name_length, char *value TSRMLS_DC); +int zend_declare_class_constant_stringl(zend_class_entry *ce, char *name, size_t name_length, char *value, size_t value_length TSRMLS_DC); #endif /* diff --git a/php_http_std_defs.h b/php_http_std_defs.h index dc20aa1..93b5f65 100644 --- a/php_http_std_defs.h +++ b/php_http_std_defs.h @@ -178,6 +178,7 @@ typedef int STATUS; name## _ce = zend_register_internal_class_ex(&ce, parent, NULL TSRMLS_CC); \ name## _ce->ce_flags |= flags; \ memcpy(& name## _handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers)); \ + zend_hash_init(& name## _ce->constants_table, 0, NULL, ZVAL_INTERNAL_PTR_DTOR, 1); \ name## _declare_default_properties(); \ } @@ -298,6 +299,8 @@ typedef int STATUS; # define GET_PROP(o, n) GET_PROP_EX(o, getThis(), n) # define GET_PROP_EX(o, this, n) zend_read_property(o->zo.ce, this, (#n), sizeof(#n)-1, 0 TSRMLS_CC) +# define DCL_CONST(t, n, v) zend_declare_class_constant_ ##t(ce, (n), sizeof(n), (v) TSRMLS_CC) + # define ACC_PROP_PRIVATE(ce, flags) ((flags & ZEND_ACC_PRIVATE) && (EG(scope) && ce == EG(scope)) # define ACC_PROP_PROTECTED(ce, flags) ((flags & ZEND_ACC_PROTECTED) && (zend_check_protected(ce, EG(scope)))) # define ACC_PROP_PUBLIC(flags) (flags & ZEND_ACC_PUBLIC) -- 2.30.2