Return to spl_functions.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / spl |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 6: +----------------------------------------------------------------------+ ! 7: | This source file is subject to version 3.01 of the PHP license, | ! 8: | that is bundled with this package in the file LICENSE, and is | ! 9: | available through the world-wide-web at the following url: | ! 10: | http://www.php.net/license/3_01.txt | ! 11: | If you did not receive a copy of the PHP license and are unable to | ! 12: | obtain it through the world-wide-web, please send a note to | ! 13: | license@php.net so we can mail you a copy immediately. | ! 14: +----------------------------------------------------------------------+ ! 15: | Authors: Marcus Boerger <helly@php.net> | ! 16: +----------------------------------------------------------------------+ ! 17: */ ! 18: ! 19: /* $Id: spl_functions.c 321634 2012-01-01 13:15:04Z felipe $ */ ! 20: ! 21: #ifdef HAVE_CONFIG_H ! 22: #include "config.h" ! 23: #endif ! 24: ! 25: #include "php.h" ! 26: #include "php_ini.h" ! 27: #include "ext/standard/info.h" ! 28: #include "php_spl.h" ! 29: ! 30: /* {{{ spl_register_interface */ ! 31: void spl_register_interface(zend_class_entry ** ppce, char * class_name, const zend_function_entry * functions TSRMLS_DC) ! 32: { ! 33: zend_class_entry ce; ! 34: ! 35: INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), functions); ! 36: *ppce = zend_register_internal_interface(&ce TSRMLS_CC); ! 37: } ! 38: /* }}} */ ! 39: ! 40: /* {{{ spl_register_std_class */ ! 41: PHPAPI void spl_register_std_class(zend_class_entry ** ppce, char * class_name, void * obj_ctor, const zend_function_entry * function_list TSRMLS_DC) ! 42: { ! 43: zend_class_entry ce; ! 44: ! 45: INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), function_list); ! 46: *ppce = zend_register_internal_class(&ce TSRMLS_CC); ! 47: ! 48: /* entries changed by initialize */ ! 49: if (obj_ctor) { ! 50: (*ppce)->create_object = obj_ctor; ! 51: } ! 52: } ! 53: /* }}} */ ! 54: ! 55: /* {{{ spl_register_sub_class */ ! 56: PHPAPI void spl_register_sub_class(zend_class_entry ** ppce, zend_class_entry * parent_ce, char * class_name, void *obj_ctor, const zend_function_entry * function_list TSRMLS_DC) ! 57: { ! 58: zend_class_entry ce; ! 59: ! 60: INIT_CLASS_ENTRY_EX(ce, class_name, strlen(class_name), function_list); ! 61: *ppce = zend_register_internal_class_ex(&ce, parent_ce, NULL TSRMLS_CC); ! 62: ! 63: /* entries changed by initialize */ ! 64: if (obj_ctor) { ! 65: (*ppce)->create_object = obj_ctor; ! 66: } else { ! 67: (*ppce)->create_object = parent_ce->create_object; ! 68: } ! 69: } ! 70: /* }}} */ ! 71: ! 72: /* {{{ spl_register_property */ ! 73: void spl_register_property( zend_class_entry * class_entry, char *prop_name, int prop_name_len, int prop_flags TSRMLS_DC) ! 74: { ! 75: zend_declare_property_null(class_entry, prop_name, prop_name_len, prop_flags TSRMLS_CC); ! 76: } ! 77: /* }}} */ ! 78: ! 79: /* {{{ spl_add_class_name */ ! 80: void spl_add_class_name(zval *list, zend_class_entry * pce, int allow, int ce_flags TSRMLS_DC) ! 81: { ! 82: if (!allow || (allow > 0 && pce->ce_flags & ce_flags) || (allow < 0 && !(pce->ce_flags & ce_flags))) { ! 83: size_t len = pce->name_length; ! 84: zval *tmp; ! 85: ! 86: if (zend_hash_find(Z_ARRVAL_P(list), pce->name, len+1, (void*)&tmp) == FAILURE) { ! 87: MAKE_STD_ZVAL(tmp); ! 88: ZVAL_STRINGL(tmp, pce->name, pce->name_length, 1); ! 89: zend_hash_add(Z_ARRVAL_P(list), pce->name, len+1, &tmp, sizeof(zval *), NULL); ! 90: } ! 91: } ! 92: } ! 93: /* }}} */ ! 94: ! 95: /* {{{ spl_add_interfaces */ ! 96: void spl_add_interfaces(zval *list, zend_class_entry * pce, int allow, int ce_flags TSRMLS_DC) ! 97: { ! 98: zend_uint num_interfaces; ! 99: ! 100: for (num_interfaces = 0; num_interfaces < pce->num_interfaces; num_interfaces++) { ! 101: spl_add_class_name(list, pce->interfaces[num_interfaces], allow, ce_flags TSRMLS_CC); ! 102: } ! 103: } ! 104: /* }}} */ ! 105: ! 106: /* {{{ spl_add_classes */ ! 107: int spl_add_classes(zend_class_entry *pce, zval *list, int sub, int allow, int ce_flags TSRMLS_DC) ! 108: { ! 109: if (!pce) { ! 110: return 0; ! 111: } ! 112: spl_add_class_name(list, pce, allow, ce_flags TSRMLS_CC); ! 113: if (sub) { ! 114: spl_add_interfaces(list, pce, allow, ce_flags TSRMLS_CC); ! 115: while (pce->parent) { ! 116: pce = pce->parent; ! 117: spl_add_classes(pce, list, sub, allow, ce_flags TSRMLS_CC); ! 118: } ! 119: } ! 120: return 0; ! 121: } ! 122: /* }}} */ ! 123: ! 124: char * spl_gen_private_prop_name(zend_class_entry *ce, char *prop_name, int prop_len, int *name_len TSRMLS_DC) /* {{{ */ ! 125: { ! 126: char *rv; ! 127: ! 128: zend_mangle_property_name(&rv, name_len, ce->name, ce->name_length, prop_name, prop_len, 0); ! 129: ! 130: return rv; ! 131: } ! 132: /* }}} */ ! 133: ! 134: /* ! 135: * Local variables: ! 136: * tab-width: 4 ! 137: * c-basic-offset: 4 ! 138: * End: ! 139: * vim600: fdm=marker ! 140: * vim: noet sw=4 ts=4 ! 141: */