Pārlūkot izejas kodu

Move throwerrorf into the aux standard library. Implement pushstringf into the string library as well.

Sandu Liviu Catalin 6 gadi atpakaļ
vecāks
revīzija
ae49b12aa1

+ 2 - 0
include/sqstdaux.h

@@ -9,6 +9,8 @@ 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"*/
 #endif

+ 2 - 0
include/sqstdstring.h

@@ -24,6 +24,8 @@ SQUIRREL_API SQBool sqstd_rex_getsubexp(SQRex* exp, SQInteger n, SQRexMatch *sub
 
 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);
 
 #ifdef __cplusplus

+ 0 - 1
include/squirrel.h

@@ -329,7 +329,6 @@ SQUIRREL_API const SQChar *sq_getlocal(HSQUIRRELVM v,SQUnsignedInteger level,SQU
 SQUIRREL_API SQRESULT sq_getcallee(HSQUIRRELVM v);
 SQUIRREL_API const SQChar *sq_getfreevariable(HSQUIRRELVM v,SQInteger idx,SQUnsignedInteger nval);
 SQUIRREL_API SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err);
-SQUIRREL_API SQRESULT sq_throwerrorf(HSQUIRRELVM v,const SQChar *err,...);
 SQUIRREL_API SQRESULT sq_throwobject(HSQUIRRELVM v);
 SQUIRREL_API void sq_reseterror(HSQUIRRELVM v);
 SQUIRREL_API void sq_getlasterror(HSQUIRRELVM v);

+ 21 - 0
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)
 {
@@ -128,3 +130,22 @@ void sqstd_seterrorhandlers(HSQUIRRELVM v)
     sq_newclosure(v,_sqstd_aux_printerror,0);
     sq_seterrorhandler(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);
+    }
+}

+ 20 - 0
sqstdlib/sqstdstring.cpp

@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <ctype.h>
 #include <assert.h>
+#include <stdarg.h>
 
 #define MAX_FORMAT_LEN  20
 #define MAX_WFORMAT_LEN 3
@@ -153,6 +154,25 @@ SQRESULT sqstd_format(HSQUIRRELVM v,SQInteger nformatstringidx,SQInteger *outlen
     return SQ_OK;
 }
 
+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 SQInteger _string_printf(HSQUIRRELVM v)
 {
     SQChar *dest = NULL;

+ 0 - 22
squirrel/sqapi.cpp

@@ -13,8 +13,6 @@
 #include "sqfuncstate.h"
 #include "sqclass.h"
 
-#include <stdarg.h>
-
 static bool sq_aux_gettypedarg(HSQUIRRELVM v,SQInteger idx,SQObjectType type,SQObjectPtr **o)
 {
     *o = &stack_get(v,idx);
@@ -1131,26 +1129,6 @@ SQRESULT sq_throwerror(HSQUIRRELVM v,const SQChar *err)
     return SQ_ERROR;
 }
 
-SQRESULT sq_throwerrorf(HSQUIRRELVM v,const SQChar *err,...)
-{
-    SQInteger n=256;
-    va_list args;
-begin:
-    va_start(args,err);
-    SQChar *b=_ss(v)->GetScratchPad(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) {
-        v->_lasterror=SQString::Create(_ss(v),_SC("@failed to generate formatted error message"));
-    } else {
-        v->_lasterror=SQString::Create(_ss(v),b,r);
-    }
-    return SQ_ERROR;
-}
-
 SQRESULT sq_throwobject(HSQUIRRELVM v)
 {
     v->_lasterror = v->GetUp(-1);