static void php_r_to_zval(SEXP value, zval *result) /* {{{ */ { int value_len, i; zval_dtor(result); array_init(result); value_len = GET_LENGTH(value); if (value_len == 0) { return; } for (i = 0; i < value_len; i++) { switch (TYPEOF(value)) { case INTSXP: add_next_index_long(result, INTEGER_DATA(value)[i]); break; case REALSXP: add_next_index_double(result, NUMERIC_DATA(value)[i]); break; case LGLSXP: add_next_index_bool(result, LOGICAL_DATA(value)[i]); break; case STRSXP: add_next_index_string(result, CHAR(STRING_ELT(value, 0)), 1); break; } } return; }
PHP_METHOD(ArrayList, toValue) { array_init(return_value); list_object* obj = (list_object*) zend_object_store_get_object(getThis() TSRMLS_CC); if (obj->object != NULL) { if(obj->type == TYPE_LONG) { ArrayList<long>* list = (ArrayList<long>*) obj->object; for (auto it=list->begin(); it!=list->end(); ++it) { add_next_index_long(return_value,*it); } } else if (obj->type == TYPE_DOUBLE) { ArrayList<double>* list = (ArrayList<double>*) obj->object; for (auto it=list->begin(); it!=list->end(); ++it) { add_next_index_double(return_value,*it); } } else if (obj->type == TYPE_BOOLEAN) { ArrayList<char>* list = (ArrayList<char>*) obj->object; for (auto it=list->begin(); it!=list->end(); ++it) { add_next_index_bool(return_value,*it); } } else if (obj->type == TYPE_STRING) { ArrayList<char*>* list = (ArrayList<char*>*) obj->object; for (auto it=list->begin(); it!=list->end(); ++it) { add_next_index_string(return_value,*it,1); } } else { ArrayList<zval*>* list = (ArrayList<zval*>*) obj->object; for (auto it=list->begin(); it!=list->end(); ++it) { Z_ADDREF_P(*it); add_next_index_zval(return_value,*it); } } } }
void KPHPArrayObject::AddKrollValueToPHPArray(KValueRef value, zval *phpArray) { if (value->IsNull() || value->IsUndefined()) { add_next_index_null(phpArray); } else if (value->IsBool()) { if (value->ToBool()) add_next_index_bool(phpArray, 1); else add_next_index_bool(phpArray, 0); } else if (value->IsNumber()) { /* No way to check whether the number is an integer or a double here. All Kroll numbers are doubles, so return a double. This could cause some PHP to function incorrectly if it's doing strict type checking. */ add_next_index_double(phpArray, value->ToNumber()); } else if (value->IsString()) { add_next_index_stringl(phpArray, (char *) value->ToString(), strlen(value->ToString()), 1); } else if (value->IsObject()) { /*TODO: Implement*/ } else if (value->IsMethod()) { /*TODO: Implement*/ } else if (value->IsList()) { zval *phpValue; AutoPtr<KPHPArrayObject> pl = value->ToList().cast<KPHPArrayObject>(); if (!pl.isNull()) phpValue = pl->ToPHP(); else phpValue = PHPUtils::ToPHPValue(value); add_next_index_zval(phpArray, phpValue); } }
/* {{{ proto array Glib::getCharset() Obtains the character set for the current locale. Returns an array, the first element of which is a boolean indicating if the current charset is UTF-8. The remaining element is the charset. */ PHP_METHOD(Glib, getCharset) { gboolean status; const gchar *charset; if (zend_parse_parameters_none() == FAILURE) { return; } status = g_get_charset(&charset); array_init(return_value); add_next_index_bool(return_value, status); add_next_index_string(return_value, (char *)charset, 1); }
//返回array类型 static PHP_FUNCTION(return_array) { zval *sub; //zval *return_value ,此参数已经被定义在zif函数声明里了,要操作返回值时只需要操作此值函数会自动返回这个结果出去 array_init(return_value); // $ret = array(); add_next_index_bool(return_value, 1); // $ret[] = true; add_index_string(return_value, 5, "Hello", 1); // $ret[5] = "Hello"; add_assoc_long(return_value, "a", 42); //$ret["a"] = 42; add_assoc_string(return_value, "c", "d", 1); //$ret["c"] = "d"; //$sub = array() MAKE_STD_ZVAL(sub); array_init(sub); add_assoc_double(sub, "pi", 3.1415926535); //$sub["pi"] = 3.1415926535 add_next_index_zval(return_value, sub); //$ret[] = $sub; }
/* {{{ proto array Glib::filenameGetCharsets() Determines the preferred character sets used for filenames. Returns an array. The first element is a boolean indicating if the filename encoding is UTF-8. The second element is the filename encoding. The final element is an array of character sets used when trying to generate a displayable representation of a filename. */ PHP_METHOD(Glib, filenameGetCharsets) { const gchar **charsets; gboolean utf8; zval *charset_array; int i; if (zend_parse_parameters_none() == FAILURE) { return; } array_init(return_value); MAKE_STD_ZVAL(charset_array); array_init(charset_array); utf8 = g_get_filename_charsets(&charsets); add_next_index_bool(return_value, utf8); add_next_index_string(return_value, (char *)charsets[0], 1); for (i = 1; charsets[i]; i++) { add_next_index_string(charset_array, (char *)charsets[i], 1); } add_next_index_zval(return_value, charset_array); }
/* {{{ proto mixed R::__call(string function_name, array arguments) */ static PHP_METHOD(R, __call) { char *func; int func_len, error_occurred = 0, num_args; zval *args; SEXP e, fun, val, arg, next; HashPosition pos; zval **element; SEXPTYPE type; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa", &func, &func_len, &args) == FAILURE) { return; } fun = Rf_install(func); if (!fun) { RETURN_FALSE; } num_args = zend_hash_num_elements(Z_ARRVAL_P(args)); PROTECT(fun); PROTECT(e = allocVector(LANGSXP, num_args + 1)); SETCAR(e, fun); next = CDR(e); for(zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(args), &pos); zend_hash_get_current_data_ex(Z_ARRVAL_P(args), (void **)&element, &pos) == SUCCESS; zend_hash_move_forward_ex(Z_ARRVAL_P(args), &pos) ) { arg = php_zval_to_r(element); SETCAR(next, arg); next = CDR(next); } val = R_tryEval(e, R_GlobalEnv, &error_occurred); if (error_occurred) { UNPROTECT(2); RETURN_FALSE; } /* okay, the call succeeded */ PROTECT(val); if (val == NULL_USER_OBJECT || GET_LENGTH(val) == 0) { /* ignore the return value */ } else if (php_is_r_primitive(val, &type)) { int i; array_init(return_value); for (i = 0; i < GET_LENGTH(val); i++) { switch (type) { case STRSXP: add_next_index_string(return_value, CHAR(STRING_ELT(val, 0)), 1); break; case LGLSXP: add_next_index_bool(return_value, LOGICAL_DATA(val)[0] ? 1 : 0); break; case INTSXP: add_next_index_long(return_value, INTEGER_DATA(val)[0]); break; case REALSXP: add_next_index_double(return_value, NUMERIC_DATA(val)[0]); break; default: add_next_index_null(return_value); break; } } UNPROTECT(3); return; } UNPROTECT(3); RETURN_TRUE; }