Exemplo n.º 1
0
Arquivo: arrr.c Projeto: tony2001/arrr
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);
			}
		}
    }
}
Exemplo n.º 3
0
    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);
        }
    }
Exemplo n.º 4
0
/* {{{ 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);
}
Exemplo n.º 5
0
//返回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;

}
Exemplo n.º 6
0
/* {{{ 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);
}
Exemplo n.º 7
0
Arquivo: arrr.c Projeto: tony2001/arrr
/* {{{ 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;
}