Json stl拓展完成

This commit is contained in:
2022-04-22 02:16:45 +08:00
parent bb87d4d3a9
commit 44ea52a10a
9 changed files with 250 additions and 42 deletions

View File

@@ -4,12 +4,10 @@
#include "RSAC.h"
#include "STL.h"
int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror)
int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, BOOL printerror)
{
//wchar_t* 转 char*
int size = wcslen(filename);
char* fname = (char*)new char[size];
DNFTOOL::UnicodeToAnsi(filename, fname, size);
char* fname = DNFTOOL::wchar_tTochar((wchar_t*)filename);
FILE* file;
file = fopen(fname, "rb");
@@ -55,7 +53,7 @@ int squirrel::SQloadfile(uint32_t v, const wchar_t* filename, bool printerror)
return -1;
}
int squirrel::SQdofile(uint32_t v, const wchar_t* filename, bool retval, bool printerror)
int squirrel::SQdofile(uint32_t v, const wchar_t* filename, BOOL retval, BOOL printerror)
{
if (SQloadfile(v, filename, printerror) >= 0)
{
@@ -274,14 +272,9 @@ int squirrel::SendPackWChar(uint32_t v)
wchar_t* n1;
SQGetString(v, 2, &n1);
std::wcout << u8"字符串值为:" << n1 << std::endl;
//wchar_t* 转 char*
int size = wcslen(n1);
char* fname = (char*)new char[size];
DNFTOOL::UnicodeToAnsi(n1, fname, size);
fname[size] = '\0';
std::cout << u8"字符串值为:" << fname << std::endl;
char* fname = DNFTOOL::wchar_tTochar(n1);
_SendPacksChar(*_SendClass, 0, fname, strlen(fname));
SQPushInt(v, 1);
@@ -724,9 +717,9 @@ int squirrel::Set_STL(uint32_t v)
int ParameterNum = SQGetTop(v);
int IntValue;
float FloatValue;
FLOAT FloatValue;
char* StrValue;
bool BoolValue;
BOOL BoolValue;
if (ParameterNum == 5)
{
//获取容器名字
@@ -1059,6 +1052,126 @@ int squirrel::Set_DragonModel(uint32_t v)
#endif
#if defined JSON_STL
//构造Json类型容器
static std::map<wchar_t*, std::string>Json_STL;
//Json容器
int squirrel::Jsoner_STL(uint32_t v)
{
wchar_t* Name;
int Type;
int ParameterNum = SQGetTop(v);
if (ParameterNum == 3)
{
//获取容器名字
SQGetString(v, 2, &Name);
//获取模式
SQGetInt(v, 3, &Type);
switch (Type)
{
case 0://构造
{
if (Json_STL.count(Name) != 0)//如果这个hash不存在 就创建
{
//构造对应 hash 的 Json容器
std::string str = "";
Json_STL[Name] = str;
}
else
{
SQPushBool(v, false);
return 1;
}
break;
}
case 1://读取
{
wchar_t* buffer = DNFTOOL::charTowchar_t((char*)Json_STL[Name].c_str());
SQPushString(v, buffer, wcslen(buffer));//传给nut
return 1;
break;
}
}
SQPushBool(v, true);
}
else if (ParameterNum == 4)
{
//获取容器名字
SQGetString(v, 2, &Name);
//获取Key 的名字
wchar_t* keybuffer;
SQGetString(v, 3, &keybuffer);
//转化为可用Key
char* key = DNFTOOL::wchar_tTochar(keybuffer);
//构造json dom
rapidjson::Document Dom;
Dom.Parse(Json_STL[Name].c_str());//加载 字符串
if(Json_STL[Name].length() == 0 )Dom.SetObject();//如果未初始化就初始化一次
rapidjson::Value BB;
//获取值的类型
int ValueType = SQ_GetType(v, 4);
//判断值类型
switch (ValueType)
{
case OT_INTEGER://int类型
{
int Value;
SQGetInt(v, 4, &Value);
BB.SetInt(Value);
break;
}
case OT_FLOAT://float类型
{
FLOAT Value;
SQGetFloat(v, 4, &Value);
BB.SetFloat(Value);
break;
}
case OT_BOOL://bool类型
{
BOOL Value;
SQGetBool(v, 4, &Value);
BB.SetBool(Value);
break;
}
case OT_STRING://string类型
{
wchar_t* Value;
SQGetString(v, 4, &Value);
char* str = DNFTOOL::wchar_tTochar(Value);
BB.SetString(rapidjson::StringRef(str));
break;
}
default:
break;
}
if (Dom[key].IsNull())
{
Dom.AddMember(rapidjson::StringRef(key), BB, Dom.GetAllocator());
}
rapidjson::StringBuffer jsonBuffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(jsonBuffer);
Dom.Accept(writer);
Json_STL[Name] = jsonBuffer.GetString();
//delete[] key;
SQPushBool(v, true);
}
else
{
SQPushBool(v, false);
}
return 1;
}
#endif
//获取Squirrel v 基址
inline uint32_t GetSqVm()
{
@@ -1142,6 +1255,11 @@ void squirrel::R_Register_Nut()
RegisterNutApi(L"L_Timer_STL", squirrel::Timer_STL);//时间容器
#endif
//Json STL
#if defined JSON_STL
RegisterNutApi(L"L_Json_STL", squirrel::Jsoner_STL);//时间容器
#endif
//龙盒
#if defined DRAGONBOX_SWITCH
RegisterNutApi(L"L_Get_DragonModel", squirrel::Get_DragonModel);//获取龙盒模式