From ae49b12aa10ddf40429fbc7935154838cb74369e Mon Sep 17 00:00:00 2001 From: Sandu Liviu Catalin Date: Wed, 24 Apr 2019 21:36:52 +0300 Subject: [PATCH] Move throwerrorf into the aux standard library. Implement pushstringf into the string library as well. --- include/sqstdaux.h | 2 ++ include/sqstdstring.h | 2 ++ include/squirrel.h | 1 - sqstdlib/sqstdaux.cpp | 21 +++++++++++++++++++++ sqstdlib/sqstdstring.cpp | 20 ++++++++++++++++++++ squirrel/sqapi.cpp | 22 ---------------------- 6 files changed, 45 insertions(+), 23 deletions(-) diff --git a/include/sqstdaux.h b/include/sqstdaux.h index 7396add..ab08499 100644 --- a/include/sqstdaux.h +++ b/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 diff --git a/include/sqstdstring.h b/include/sqstdstring.h index e7ecbed..3209a2d 100644 --- a/include/sqstdstring.h +++ b/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 diff --git a/include/squirrel.h b/include/squirrel.h index 9d9a9ab..19ed82f 100644 --- a/include/squirrel.h +++ b/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); diff --git a/sqstdlib/sqstdaux.cpp b/sqstdlib/sqstdaux.cpp index 3c478fc..75c1653 100644 --- a/sqstdlib/sqstdaux.cpp +++ b/sqstdlib/sqstdaux.cpp @@ -1,7 +1,9 @@ /* see copyright notice in squirrel.h */ #include #include +#include #include +#include 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); + } +} diff --git a/sqstdlib/sqstdstring.cpp b/sqstdlib/sqstdstring.cpp index e624646..7f7599b 100644 --- a/sqstdlib/sqstdstring.cpp +++ b/sqstdlib/sqstdstring.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #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; diff --git a/squirrel/sqapi.cpp b/squirrel/sqapi.cpp index 11f751e..7af6a1e 100644 --- a/squirrel/sqapi.cpp +++ b/squirrel/sqapi.cpp @@ -13,8 +13,6 @@ #include "sqfuncstate.h" #include "sqclass.h" -#include - 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);