--- a/src/squirrel_helper.hpp Mon Jun 16 14:43:19 2008 +0000
+++ b/src/squirrel_helper.hpp Tue Jun 17 11:46:09 2008 +0000
@@ -9,6 +9,7 @@
#include "core/math_func.hpp"
#include "economy_type.h"
#include "misc/smallvec.h"
+#include "squirrel_helper_type.hpp"
/**
* The Squirrel convert routines
@@ -95,6 +96,35 @@
template <> inline const char *GetParam(ForceType<const char *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { const SQChar *tmp; sq_getstring (vm, index, &tmp); char *tmp_str = strdup(FS2OTTD(tmp)); *ptr->Append() = (void *)tmp_str; return tmp_str; }
template <> inline void *GetParam(ForceType<void *> , HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer tmp; sq_getuserpointer(vm, index, &tmp); return tmp; }
+ template <> inline Array *GetParam(ForceType<Array *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr)
+ {
+ SQObject obj;
+ sq_getstackobj(vm, index, &obj);
+ sq_pushobject(vm, obj);
+ sq_pushnull(vm);
+
+ SmallVector<int32, 2> data;
+
+ while (SQ_SUCCEEDED(sq_next(vm, -2))) {
+ SQInteger tmp;
+ if (SQ_SUCCEEDED(sq_getinteger(vm, -1, &tmp))) {
+ *data.Append() = (int32)tmp;
+ } else {
+ // TODO: handle following error properly: "array member is not numeric; ignoring member"
+ }
+
+ sq_pop(vm, 2);
+ }
+ sq_pop(vm, 2);
+
+ Array *arr = (Array*)MallocT<byte>(sizeof(Array) + sizeof(int32) * data.Length());
+ arr->size = data.Length();
+ memcpy(arr->array, data.Begin(), sizeof(int32) * data.Length());
+
+ *ptr->Append() = arr;
+ return arr;
+ }
+
/**
* Helper class to recognize the function type (retval type, args) and use the proper specialization
* for SQ callback. The partial specializations for the second arg (Tis_void_retval) are not possible