Bläddra i källkod

Add new method to array "minsize" to resize an array only if needed.
Also changed find_lua to return all matches (start_pos, len) when an array is given.

mingodad 9 år sedan
förälder
incheckning
8c988eac33

+ 1 - 0
SquiLu/include/sqapi.h

@@ -148,6 +148,7 @@ SQUIRREL_API_FUNC(SQRESULT, rawnewmember, (HSQUIRRELVM v,SQInteger idx,SQBool bs
 SQUIRREL_API_FUNC(SQRESULT, arrayappend, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, arraypop, (HSQUIRRELVM v,SQInteger idx,SQBool pushval))
 SQUIRREL_API_FUNC(SQRESULT, arrayresize, (HSQUIRRELVM v,SQInteger idx,SQInteger newsize))
+SQUIRREL_API_FUNC(SQRESULT, arrayminsize, (HSQUIRRELVM v,SQInteger idx,SQInteger minsize))
 SQUIRREL_API_FUNC(SQRESULT, arrayreverse, (HSQUIRRELVM v,SQInteger idx))
 SQUIRREL_API_FUNC(SQRESULT, arrayremove, (HSQUIRRELVM v,SQInteger idx,SQInteger itemidx))
 SQUIRREL_API_FUNC(SQRESULT, arrayinsert, (HSQUIRRELVM v,SQInteger idx,SQInteger destpos))

+ 44 - 0
SquiLu/samples/test-find-lua.nut

@@ -0,0 +1,44 @@
+auto str = [==[
+<txNomeParlamentar>ABEL MESQUITA JR.</txNomeParlamentar>
+<ideCadastro>178957</ideCadastro>
+<nuCarteiraParlamentar>1</nuCarteiraParlamentar>
+<nuLegislatura>2015</nuLegislatura>
+<sgUF>RR</sgUF>
+<sgPartido>DEM</sgPartido>
+<codLegislatura>55</codLegislatura>
+<numSubCota>10</numSubCota>
+<txtDescricao>TELEFONIA</txtDescricao>
+<numEspecificacaoSubCota>0</numEspecificacaoSubCota>
+<txtDescricaoEspecificacao/>
+<txtFornecedor>CELULAR FUNCIONAL</txtFornecedor>
+<txtCNPJCPF/>
+<txtNumero/>
+<indTipoDocumento>0</indTipoDocumento>
+<datEmissao>2016-01-12T00:00:00</datEmissao>
+<vlrDocumento>120.48</vlrDocumento>
+<vlrGlosa>0</vlrGlosa>
+<vlrLiquido>120.48</vlrLiquido>
+<numMes>1</numMes>
+<numAno>2016</numAno>
+<numParcela>0</numParcela>
+<txtPassageiro/>
+<txtTrecho/>
+<numLote>0</numLote>
+<numRessarcimento>0</numRessarcimento>
+<nuDeputadoId>3074</nuDeputadoId>
+<ideDocumento/>
+]==];
+
+auto result_array = [];
+auto start_pos = 0;
+
+//auto find_re = "(<[^>]+>)";
+//auto find_re = "(<[^>]+>)([^<]*)(</[^>]+>)";
+//auto find_re = "<[^>]+>()([^<]*)()</[^>]+>";
+auto find_re = "<[^>]+>([^<]*)</[^>]+>";
+
+while(str.find_lua(find_re, result_array, start_pos) >= 0)
+{
+	print(result_array.join("\t"));
+	start_pos = result_array[1]+1;
+}

+ 28 - 26
SquiLu/squirrel/sqapi.cpp

@@ -385,11 +385,14 @@ SQBool sq_instanceof(HSQUIRRELVM v)
 	return _instance(inst)->InstanceOf(_class(cl))?SQTrue:SQFalse;
 }
 
+#define CHECK_ARRAY_AT(check_n, arr_var) \
+	sq_aux_paramscheck(v,check_n);\
+	SQObjectPtr &arr_var = stack_get(v,idx);\
+	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr_var);
+
 SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx)
 {
-	sq_aux_paramscheck(v,2);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(2, arr);
 	_array(arr)->Append(v->GetUp(-1));
 	v->Pop();
 	return SQ_OK;
@@ -397,9 +400,7 @@ SQRESULT sq_arrayappend(HSQUIRRELVM v,SQInteger idx)
 
 SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(1, arr);
 	if(_array(arr)->Size() > 0) {
         if(pushval != 0){ v->Push(_array(arr)->Top()); }
 		_array(arr)->Pop();
@@ -408,24 +409,33 @@ SQRESULT sq_arraypop(HSQUIRRELVM v,SQInteger idx,SQBool pushval)
 	return sq_throwerror(v, _SC("empty array"));
 }
 
-SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize)
+static inline SQRESULT sq_arrayresize_base(HSQUIRRELVM v,SQArray *arr,SQInteger newsize)
 {
-	sq_aux_paramscheck(v,1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
 	if(newsize >= 0) {
-		_array(arr)->Resize(newsize);
+		arr->Resize(newsize);
 		return SQ_OK;
 	}
 	return sq_throwerror(v,_SC("negative size"));
 }
 
+SQRESULT sq_arrayresize(HSQUIRRELVM v,SQInteger idx,SQInteger newsize)
+{
+    CHECK_ARRAY_AT(1, arr);
+    return sq_arrayresize_base(v, _array(arr), newsize);
+}
+
+SQRESULT sq_arrayminsize(HSQUIRRELVM v,SQInteger idx,SQInteger minsize)
+{
+    CHECK_ARRAY_AT(1, arr);
+	if(_array(arr)->Size() < minsize) {
+        return sq_arrayresize_base(v, _array(arr), minsize);
+	}
+	return SQ_OK;
+}
 
 SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &o = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, o);
+    CHECK_ARRAY_AT(1, o);
 	SQArray *arr = _array(o);
 	if(arr->Size() > 0) {
 		SQObjectPtr t;
@@ -443,17 +453,13 @@ SQRESULT sq_arrayreverse(HSQUIRRELVM v,SQInteger idx)
 
 SQRESULT sq_arrayremove(HSQUIRRELVM v,SQInteger idx,SQInteger itemidx)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(1, arr);
 	return _array(arr)->Remove(itemidx) ? SQ_OK : sq_throwerror(v,_SC("index out of range"));
 }
 
 SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(1, arr);
 	SQRESULT ret = _array(arr)->Insert(destpos, v->GetUp(-1)) ? SQ_OK : sq_throwerror(v,_SC("index out of range"));
 	v->Pop();
 	return ret;
@@ -461,9 +467,7 @@ SQRESULT sq_arrayinsert(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
 
 SQRESULT sq_arrayset(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(1, arr);
 	SQRESULT ret = _array(arr)->Set(destpos, v->GetUp(-1)) ? SQ_OK : sq_throwerror(v,_SC("index out of range"));
 	v->Pop();
 	return ret;
@@ -471,9 +475,7 @@ SQRESULT sq_arrayset(HSQUIRRELVM v,SQInteger idx,SQInteger destpos)
 
 SQRESULT sq_arrayget(HSQUIRRELVM v,SQInteger idx,SQInteger pos)
 {
-	sq_aux_paramscheck(v, 1);
-	SQObjectPtr &arr = stack_get(v,idx);
-	_CHECK_OBJ_TYPE(v, OT_ARRAY, arr);
+    CHECK_ARRAY_AT(1, arr);
 	v->PushNull();
 	if(!_array(arr)->Get(pos, v->GetUp(-1)))
 	{

+ 2 - 0
SquiLu/squirrel/sqarray.h

@@ -70,7 +70,9 @@ public:
 		SQObjectPtr _null;
 		Resize(size,_null);
 	}
+	void Minsize(SQInteger size) { if(Size() <= size) Resize(size);}
 	void Resize(SQInteger size,SQObjectPtr &fill) { _values.resize(size,fill); ShrinkIfNeeded(); }
+	void Minsize(SQInteger size,SQObjectPtr &fill) { if(Size() <= size) _values.resize(size,fill);}
 	void Reserve(SQInteger size) { _values.reserve(size); }
 	void Append(const SQObject &o){_values.push_back(o);}
 	void Extend(const SQArray *a);

+ 25 - 1
SquiLu/squirrel/sqbaselib.cpp

@@ -852,7 +852,7 @@ static SQRESULT array_remove(HSQUIRRELVM v)
 	return sq_throwerror(v, _SC("idx out of range"));
 }
 
-static SQRESULT array_resize(HSQUIRRELVM v)
+static inline SQRESULT array_resize_base(HSQUIRRELVM v, int isMinSize)
 {
 	SQObject &o = stack_get(v, 1);
 	SQObject &nsize = stack_get(v, 2);
@@ -860,12 +860,24 @@ static SQRESULT array_resize(HSQUIRRELVM v)
 	if(sq_isnumeric(nsize)) {
 		if(sq_gettop(v) > 2)
 			fill = stack_get(v, 3);
+        if(isMinSize && (_array(o)->Size() >= tointeger(nsize)))
+            return SQ_OK;
 		_array(o)->Resize(tointeger(nsize),fill);
 		return 0;
 	}
 	return sq_throwerror(v, _SC("size must be a number"));
 }
 
+static SQRESULT array_resize(HSQUIRRELVM v)
+{
+    return array_resize_base(v, 0);
+}
+
+static SQRESULT array_minsize(HSQUIRRELVM v)
+{
+    return array_resize_base(v, 1);
+}
+
 static SQRESULT __map_array(SQArray *dest,SQArray *src,HSQUIRRELVM v) {
 	SQObjectPtr temp;
 	SQInteger size = src->Size();
@@ -1218,6 +1230,7 @@ SQRegFunction SQSharedState::_array_default_delegate_funcz[]={
 	{_SC("insert"),array_insert,3, _SC("an")},
 	{_SC("remove"),array_remove,2, _SC("an")},
 	{_SC("resize"),array_resize,-2, _SC("an")},
+	{_SC("minsize"),array_minsize,-2, _SC("an")},
 	{_SC("reverse"),array_reverse,1, _SC("a")},
 	{_SC("sort"),array_sort,-1, _SC("ac")},
 	{_SC("slice"),array_slice,-1, _SC("ann")},
@@ -1590,12 +1603,23 @@ static SQRESULT string_find_lua(HSQUIRRELVM v)
         }
         else if(rtype == OT_ARRAY)
         {
+            SQObjectPtr &arr = stack_get(v,3);
+            _array(arr)->Minsize(2 + (ms.level*2));
             sq_pushinteger(v, 0);
             sq_pushinteger(v, ms.start_pos);
             sq_rawset(v, 3);
             sq_pushinteger(v, 1);
             sq_pushinteger(v, ms.end_pos);
             sq_rawset(v, 3);
+            SQInteger idx = 2;
+            for(int i=0; i < ms.level; ++i){
+                sq_pushinteger(v, idx++);
+                sq_pushinteger(v, ms.capture[i].init - ms.src_init);
+                sq_rawset(v, 3);
+                sq_pushinteger(v, idx++);
+                sq_pushinteger(v, ms.capture[i].len);
+                sq_rawset(v, 3);
+            }
         }
         sq_pushinteger(v, rc);
         return 1;