/** {{{ static int php_lua_print(lua_State *L) */ static int php_lua_print(lua_State *L) { int i = 0; TSRMLS_FETCH(); for (i = -lua_gettop(L) ; i<0; i++) { zval *tmp = php_lua_get_zval_from_lua(L, i, NULL TSRMLS_CC); zend_print_zval_r(tmp, 1 TSRMLS_CC); zval_ptr_dtor(&tmp); } return 0; }
static void print_hash(HashTable *ht, int indent, zend_bool is_object TSRMLS_DC) { zval **tmp; char *string_key; HashPosition iterator; ulong num_key; uint str_len; int i; for (i=0; i<indent; i++) { ZEND_PUTS(" "); } ZEND_PUTS("(\n"); indent += PRINT_ZVAL_INDENT; zend_hash_internal_pointer_reset_ex(ht, &iterator); while (zend_hash_get_current_data_ex(ht, (void **) &tmp, &iterator) == SUCCESS) { for (i=0; i<indent; i++) { ZEND_PUTS(" "); } ZEND_PUTS("["); switch (zend_hash_get_current_key_ex(ht, &string_key, &str_len, &num_key, 0, &iterator)) { case HASH_KEY_IS_STRING: if (is_object) { char *prop_name, *class_name; zend_unmangle_property_name(string_key, &class_name, &prop_name); ZEND_PUTS(prop_name); if (class_name) { if (class_name[0]=='*') { ZEND_PUTS(":protected"); } else { ZEND_PUTS(":private"); } } } else { ZEND_WRITE(string_key, str_len-1); } break; case HASH_KEY_IS_LONG: zend_printf("%ld", num_key); break; } ZEND_PUTS("] => "); zend_print_zval_r(*tmp, indent+PRINT_ZVAL_INDENT TSRMLS_CC); ZEND_PUTS("\n"); zend_hash_move_forward_ex(ht, &iterator); } indent -= PRINT_ZVAL_INDENT; for (i=0; i<indent; i++) { ZEND_PUTS(" "); } ZEND_PUTS(")\n"); }
static PHP_FUNCTION(params_array) { HashTable *options = NULL; zval *v; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &v) == FAILURE) { RETURN_FALSE; } options = Z_ARRVAL_P(v);//读取array类型的值 //zend_hash_internal_pointer_reset //zend_hash_has_more_elements 判断HashTable是否有元素 //zend_hash_move_forward 移动HashTable到顶端 //zend_hash_get_current_key_ex 读取HashTable当前的key,HashTable的key有两种,一种是指定字符串,另一种是顺序的0-n下标 //zend_hash_get_current_data 读取HashTable当前的值到zval //zend_hash_get_current_key_type 获取当前key的类型 for(zend_hash_internal_pointer_reset(options); SUCCESS == zend_hash_has_more_elements(options); zend_hash_move_forward(options)) { char *k1; ulong nkey = -1, keylen; zval **z; zend_hash_get_current_key_ex(options, &k1, &keylen, &nkey, 0, NULL); zend_hash_get_current_data(options, (void **)&z); php_printf(" key: "); if (HASH_KEY_IS_STRING == zend_hash_get_current_key_type(options)) { PHPWRITE(k1, keylen); }else{ php_printf("%ld", nkey); } php_printf(" value: "); if (Z_TYPE_P(*z) == IS_STRING) { //php_printf("string(%d)\n", Z_STRLEN_P(*z)); PHPWRITE(Z_STRVAL_P(*z), Z_STRLEN_P(*z)); }else{ zend_print_zval_r((*z), 0 TSRMLS_CC); } php_printf("\n"); } RETURN_TRUE; }
static void php_print_gpcse_array(char *name, uint name_length ELS_DC) { zval **data, **tmp, tmp2; char *string_key; ulong num_key; if (zend_hash_find(&EG(symbol_table), name, name_length+1, (void **) &data)!=FAILURE && ((*data)->type==IS_ARRAY)) { zend_hash_internal_pointer_reset((*data)->value.ht); while (zend_hash_get_current_data((*data)->value.ht, (void **) &tmp) == SUCCESS) { PUTS("<TR VALIGN=\"baseline\" BGCOLOR=\"" PHP_CONTENTS_COLOR "\">"); PUTS("<TD BGCOLOR=\"" PHP_ENTRY_NAME_COLOR "\"><B>"); PUTS(name); PUTS("[\""); switch (zend_hash_get_current_key((*data)->value.ht, &string_key, &num_key, 0)) { case HASH_KEY_IS_STRING: zend_html_puts(string_key, strlen(string_key)); break; case HASH_KEY_IS_LONG: php_printf("%ld",num_key); break; } PUTS("\"]</B></TD><TD>"); if ((*tmp)->type == IS_ARRAY) { PUTS("<PRE>"); zend_print_zval_r(*tmp, 0); PUTS("</PRE>"); } else if ((*tmp)->type != IS_STRING) { tmp2 = **tmp; zval_copy_ctor(&tmp2); convert_to_string(&tmp2); zend_html_puts(tmp2.value.str.val, tmp2.value.str.len); zval_dtor(&tmp2); } else { zend_html_puts((*tmp)->value.str.val, (*tmp)->value.str.len); } PUTS(" </TD></TR>\n"); zend_hash_move_forward((*data)->value.ht); } } }