ソースを参照

More new api functions that exists in Lua but is missing on Squirrel

mingodad 13 年 前
コミット
ff5347acc2
2 ファイル変更28 行追加0 行削除
  1. 3 0
      include/squirrel.h
  2. 25 0
      squirrel/sqapi.cpp

+ 3 - 0
include/squirrel.h

@@ -365,11 +365,14 @@ SQUIRREL_API void sq_newclosure(HSQUIRRELVM v,SQFUNCTION func,SQUnsignedInteger
 SQUIRREL_API SQRESULT sq_setparamscheck(HSQUIRRELVM v,SQInteger nparamscheck,const SQChar *typemask);
 SQUIRREL_API SQRESULT sq_bindenv(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len);
+SQUIRREL_API void sq_pushfstring(HSQUIRRELVM v,const SQChar *fmt, ...);
 SQUIRREL_API void sq_pushfloat(HSQUIRRELVM v,SQFloat f);
 SQUIRREL_API void sq_pushinteger(HSQUIRRELVM v,SQInteger n);
 SQUIRREL_API void sq_pushbool(HSQUIRRELVM v,SQBool b);
 SQUIRREL_API void sq_pushuserpointer(HSQUIRRELVM v,SQUserPointer p);
 SQUIRREL_API void sq_pushnull(HSQUIRRELVM v);
+SQUIRREL_API SQRESULT sq_checkoption (HSQUIRRELVM v, SQInteger narg, const SQChar *def,
+                                 const SQChar *const lst[]);
 SQUIRREL_API SQObjectType sq_gettype(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API const SQChar *sq_gettypename(HSQUIRRELVM v,SQInteger idx);
 SQUIRREL_API SQRESULT sq_typeof(HSQUIRRELVM v,SQInteger idx);

+ 25 - 0
squirrel/sqapi.cpp

@@ -233,6 +233,19 @@ void sq_pushstring(HSQUIRRELVM v,const SQChar *s,SQInteger len)
 	else v->PushNull();
 }
 
+void sq_pushfstring(HSQUIRRELVM v,const SQChar *fmt, ...)
+{
+    if(fmt){
+        static SQChar str[1024];
+        va_list vl;
+        va_start(vl, fmt);
+        SQInteger len = scvsnprintf(str, sizeof(str), fmt, vl);
+        va_end(vl);
+        v->Push(SQObjectPtr(SQString::Create(_ss(v), str, len)));
+    }
+	else v->PushNull();
+}
+
 void sq_pushinteger(HSQUIRRELVM v,SQInteger n)
 {
 	v->Push(n);
@@ -1814,4 +1827,16 @@ done_and_return:
     va_end(vl);
     sq_settop(v, top);
     return ret_val; //all went ok
+}
+
+SQRESULT sq_checkoption (HSQUIRRELVM v, SQInteger narg, const SQChar *def,
+                                 const SQChar *const lst[]) {
+  const SQChar *name;
+  if(def && sq_gettop(v) >= narg && sq_getstring(v, narg, &name) != SQ_OK) name = def;
+  else if(sq_getstring(v, narg, &name) != SQ_OK) return SQ_ERROR;
+  int i;
+  for (i=0; lst[i]; i++)
+    if (scstrcmp(lst[i], name) == 0)
+      return i;
+  return sq_throwerror(v, _SC("invalid option [%d] [%s]"), narg-1, name);
 }