فهرست منبع

Implement sq_throwerrorf to allow formatted error messages.

Sandu Liviu Catalin 6 سال پیش
والد
کامیت
454e35fc23
2فایلهای تغییر یافته به همراه23 افزوده شده و 0 حذف شده
  1. 1 0
      include/squirrel.h
  2. 22 0
      squirrel/sqapi.cpp

+ 1 - 0
include/squirrel.h

@@ -329,6 +329,7 @@ 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_throwerror(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);

+ 22 - 0
squirrel/sqapi.cpp

@@ -13,6 +13,8 @@
 #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);
@@ -1129,6 +1131,26 @@ 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,n);
+    }
+    return SQ_ERROR;
+}
+
 SQRESULT sq_throwobject(HSQUIRRELVM v)
 {
     v->_lasterror = v->GetUp(-1);