Просмотр исходного кода

Add new api functions sqstd_throwerrorf and sqstd_pushstringf from squirrel

mingodad 6 лет назад
Родитель
Сommit
87f62e3ec6

+ 1 - 0
SquiLu/include/sqstdaux.h

@@ -8,6 +8,7 @@ extern "C" {
 
 SQUIRREL_API void sqstd_seterrorhandlers(HSQUIRRELVM v);
 SQUIRREL_API void sqstd_printcallstack(HSQUIRRELVM v);
+SQUIRREL_API SQRESULT sqstd_throwerrorf(HSQUIRRELVM v,const SQChar *err,...);
 
 #ifdef __cplusplus
 } /*extern "C"*/

+ 1 - 0
SquiLu/include/sqstdstring.h

@@ -23,6 +23,7 @@ SQUIRREL_API SQInteger sqstd_rex_getsubexpcount(SQRex* exp);
 SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *subexp);
 
 SQUIRREL_API SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen,SQChar **output);
+SQUIRREL_API void sqstd_pushstringf(HSQUIRRELVM v,const SQChar *s,...);
 
 SQUIRREL_API SQRESULT sqstd_register_stringlib(HSQUIRRELVM v);
 

+ 21 - 0
SquiLu/sqstdlib/sqstdaux.cpp

@@ -1,7 +1,9 @@
 /* see copyright notice in squirrel.h */
 #include <squirrel.h>
 #include <sqstdaux.h>
+#include <stdio.h>
 #include <assert.h>
+#include <stdarg.h>
 
 void sqstd_printcallstack(HSQUIRRELVM v)
 {
@@ -110,6 +112,25 @@ void sqstd_printcallstack(HSQUIRRELVM v)
 	}
 }
 
+SQRESULT sqstd_throwerrorf(HSQUIRRELVM v,const SQChar *err,...)
+{
+    SQInteger n=256;
+    va_list args;
+begin:
+    va_start(args,err);
+    SQChar *b=sq_getscratchpad(v,n);
+    SQInteger r=scvsprintf(b,n,err,args);
+    va_end(args);
+    if (r>=n) {
+        n=r+1;//required+null
+        goto begin;
+    } else if (r<0) {
+        return sq_throwerror(v,_SC("@failed to generate formatted error message"));
+    } else {
+        return sq_throwerror(v,b);
+    }
+}
+
 static SQRESULT _sqstd_aux_printerror(HSQUIRRELVM v)
 {
 	SQPRINTFUNCTION pf = sq_geterrorfunc(v);

+ 20 - 0
SquiLu/sqstdlib/sqstdstring.cpp

@@ -8,6 +8,7 @@
 #include <ctype.h>
 #include <assert.h>
 #include <stddef.h>
+#include <stdarg.h>
 
 #ifdef _WIN32_WCE
 extern "C" {
@@ -233,6 +234,25 @@ static SQRESULT _string_format(HSQUIRRELVM v)
 	return 1;
 }
 
+void sqstd_pushstringf(HSQUIRRELVM v,const SQChar *s,...)
+{
+    SQInteger n=256;
+    va_list args;
+begin:
+    va_start(args,s);
+    SQChar *b=sq_getscratchpad(v,n);
+    SQInteger r=scvsprintf(b,n,s,args);
+    va_end(args);
+    if (r>=n) {
+        n=r+1;//required+null
+        goto begin;
+    } else if (r<0) {
+        sq_pushnull(v);
+    } else {
+        sq_pushstring(v,b,r);
+    }
+}
+
 static SQRESULT _string_printf(HSQUIRRELVM v)
 {
 	SQChar *dest = NULL;