- add HttpMessage class constants
authorMichael Wallner <mike@php.net>
Wed, 3 Aug 2005 11:40:02 +0000 (11:40 +0000)
committerMichael Wallner <mike@php.net>
Wed, 3 Aug 2005 11:40:02 +0000 (11:40 +0000)
http_message_object.c
missing.c
missing.h
php_http_std_defs.h

index 8365a593af3bd3365d57b3ecf0eb7ed2500791cf..637ee06aea7f868df37f20e5e2309b5a9599b394 100644 (file)
@@ -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, "");
index 7f9fcd8771b71b58eeea9058e8585cef148838d4..aefbdb9f08674d59571b7600e9015f6cb17baff8 100644 (file)
--- 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
index 215cbf32880d6eea1a5954f35365ee87559ad9f3..822c3b3bfd4b3e0fad225c93c0063824598f5039 100644 (file)
--- 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
 
 /*
index dc20aa1e7caa4964508b2f39b8651e92a8b2cf21..93b5f65ef4ca6fddb566b3dbed9748229579a145 100644 (file)
@@ -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)