From b400f819d93c012aa46c1e9a0f376d7d90d24497 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 21 Feb 2022 13:39:22 +0800 Subject: [PATCH 01/12] modify:source file encoding to utf8-bom --- .../ModuleAuth_Define.h | 76 +++++++++--------- .../ModuleAuth_Error.h | 14 ++-- .../ModuleAuthorize_User.cpp | 74 +++++++++--------- .../ModuleAuthorize_User.h | 6 +- .../ModuleConfig_Define.h | 78 +++++++++---------- .../ModuleConfig_Error.h | 22 +++--- .../ModuleConfigure_Json.cpp | 44 +++++------ .../ModuleConfigure_Json.h | 6 +- XEngine_Source/XEngine_UserProtocol.h | 8 +- 9 files changed, 164 insertions(+), 164 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Define.h b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Define.h index 156fa80..026d5d0 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Define.h +++ b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Define.h @@ -1,61 +1,61 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/29 10:30:04 // File Name: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize\ModuleAuth_Define.h // File Path: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize // File Base: ModuleAuth_Define // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: +// Purpose: 导出定义 // History: *********************************************************************/ ////////////////////////////////////////////////////////////////////////// -// +// 导出函数 ////////////////////////////////////////////////////////////////////////// extern "C" DWORD ModuleAuthorize_GetLastError(int* pInt_SysError = NULL); /************************************************************************/ -/* ֤ */ +/* 验证导出函数 */ /************************************************************************/ /******************************************************************** -ƣModuleAuthorize_User_Init -ܣʼȨỰ - .һlpszAuthFile - In/OutIn - ַָͣ - ɿգN - ˼Ȩļַ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleAuthorize_User_Init +函数功能:初始化授权会话管理器 + 参数.一:lpszAuthFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入授权文件地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ extern "C" BOOL ModuleAuthorize_User_Init(LPCTSTR lpszAuthFile); /************************************************************************ -ƣModuleAuthorize_User_Destory -ܣȨ -ֵ - ͣ߼ - ˼Ƿٳɹ -ע +函数名称:ModuleAuthorize_User_Destory +函数功能:销毁授权管理器 +返回值 + 类型:逻辑型 + 意思:是否销毁成功 +备注: ************************************************************************/ extern "C" BOOL ModuleAuthorize_User_Destory(); /******************************************************************** -ƣModuleAuthorize_User_Exist -ܣǷ֤ͨ - .һlpszUser - In/OutIn - ַָͣ - ɿգN - ˼û - .lpszPass - In/OutIn - ַָͣ - ɿգN - ˼ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleAuthorize_User_Exist +函数功能:是否验证通过 + 参数.一:lpszUser + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入用户名 + 参数.二:lpszPass + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入密码 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ extern "C" BOOL ModuleAuthorize_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Error.h b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Error.h index dbcf052..ae40127 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Error.h +++ b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuth_Error.h @@ -1,16 +1,16 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/29 10:29:54 // File Name: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize\ModuleAuth_Error.h // File Path: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize // File Base: ModuleAuth_Error // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: +// Purpose: 导出错误 // History: *********************************************************************/ -#define ERROR_MODULE_AUTHORIZE_USER_PARAMENT 0xA0001 // -#define ERROR_MODULE_AUTHORIZE_USER_OPENFILE 0xA0002 //ļʧ -#define ERROR_MODULE_AUTHORIZE_USER_NOTFOUND 0xA0003 //ûҵ -#define ERROR_MODULE_AUTHORIZE_USER_PASSWORD 0xA0004 // \ No newline at end of file +#define ERROR_MODULE_AUTHORIZE_USER_PARAMENT 0xA0001 //参数错误 +#define ERROR_MODULE_AUTHORIZE_USER_OPENFILE 0xA0002 //打开文件失败 +#define ERROR_MODULE_AUTHORIZE_USER_NOTFOUND 0xA0003 //没有找到 +#define ERROR_MODULE_AUTHORIZE_USER_PASSWORD 0xA0004 //密码错误 \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.cpp b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.cpp index a562eea..6fea7b2 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.cpp +++ b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.cpp @@ -1,4 +1,4 @@ -#include "pch.h" +#include "pch.h" #include "ModuleAuthorize_User.h" /******************************************************************** // Created: 2021/12/29 10:24:25 @@ -6,9 +6,9 @@ // File Path: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize\ModuleAuthorize_User // File Base: ModuleAuthorize_User // File Ext: cpp -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: û֤ +// Purpose: 用户验证 // History: *********************************************************************/ CModuleAuthorize_User::CModuleAuthorize_User() @@ -20,20 +20,20 @@ CModuleAuthorize_User::~CModuleAuthorize_User() } ////////////////////////////////////////////////////////////////////////// -// ú +// 公用函数 ////////////////////////////////////////////////////////////////////////// /******************************************************************** -ƣModuleAuthorize_User_Init -ܣʼȨỰ - .һlpszAuthFile - In/OutIn - ַָͣ - ɿգN - ˼Ȩļַ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleAuthorize_User_Init +函数功能:初始化授权会话管理器 + 参数.一:lpszAuthFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入授权文件地址 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ BOOL CModuleAuthorize_User::ModuleAuthorize_User_Init(LPCTSTR lpszAuthFile) { @@ -80,12 +80,12 @@ BOOL CModuleAuthorize_User::ModuleAuthorize_User_Init(LPCTSTR lpszAuthFile) return TRUE; } /************************************************************************ -ƣModuleAuthorize_User_Destory -ܣȨ -ֵ - ͣ߼ - ˼Ƿٳɹ -ע +函数名称:ModuleAuthorize_User_Destory +函数功能:销毁授权管理器 +返回值 + 类型:逻辑型 + 意思:是否销毁成功 +备注: ************************************************************************/ BOOL CModuleAuthorize_User::ModuleAuthorize_User_Destory() { @@ -95,22 +95,22 @@ BOOL CModuleAuthorize_User::ModuleAuthorize_User_Destory() return TRUE; } /******************************************************************** -ƣModuleAuthorize_User_Exist -ܣǷ֤ͨ - .һlpszUser - In/OutIn - ַָͣ - ɿգN - ˼û - .lpszPass - In/OutIn - ַָͣ - ɿգN - ˼ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleAuthorize_User_Exist +函数功能:是否验证通过 + 参数.一:lpszUser + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入用户名 + 参数.二:lpszPass + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入密码 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ BOOL CModuleAuthorize_User::ModuleAuthorize_User_Exist(LPCTSTR lpszUser, LPCTSTR lpszPass) { diff --git a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.h b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.h index 50b4e56..b1c455f 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.h +++ b/XEngine_Source/XEngine_ModuleAuthorize/ModuleAuthorize_User/ModuleAuthorize_User.h @@ -1,13 +1,13 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/29 10:23:14 // File Name: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize\ModuleAuthorize_User\ModuleAuthorize_User.h // File Path: D:\XEngine_ProxyServer\XEngine_Source\XEngine_ModuleAuthorize\ModuleAuthorize_User // File Base: ModuleAuthorize_User // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: û֤ +// Purpose: 用户验证 // History: *********************************************************************/ diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h index f9f13b3..50750c4 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Define.h @@ -1,47 +1,47 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/02 16:09:03 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure\ModuleConfig_Define.h // File Path: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure // File Base: ModuleConfig_Define // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: ģ鵼 +// Purpose: 配置模块导出定义 // History: *********************************************************************/ ////////////////////////////////////////////////////////////////////////// -// ݽṹ +// 导出的数据结构 ////////////////////////////////////////////////////////////////////////// typedef struct tag_XEngine_ServiceConfig { - TCHAR tszIPAddr[128]; //IPַ,Ҫ - BOOL bDeamon; //Ƿػ,LINUXЧ - int nSocksPort; //Socks˿,<=0 - int nTunnelPort; //Tunnel˿ + TCHAR tszIPAddr[128]; //本机IP地址,根据需要配置 + BOOL bDeamon; //是否以守护进程启动,LINUX有效 + int nSocksPort; //Socks端口,<=0不启用 + int nTunnelPort; //Tunnel服务端口 struct { - int nMaxClient; //ͻ˸ - int nMaxQueue; //и - int nIOThread; //IO߳ + int nMaxClient; //最大客户端个数 + int nMaxQueue; //最大队列个数 + int nIOThread; //网络IO线程数 }st_XMax; struct { - int nTimeCheck; // - int nSocksTimeOut; //TCPʱʱ - int nTunnelTimeOut; //HTTPʱʱ - }st_XTime; //*ʱ=ʱ + int nTimeCheck; //检测次数 + int nSocksTimeOut; //TCP超时时间 + int nTunnelTimeOut; //HTTP超时时间 + }st_XTime; //次数*时间=超时 struct { - TCHAR tszLogFile[MAX_PATH]; //־· - int nMaxSize; //־С - int nMaxCount; //־ - int nLogLeave; //־ȼ + TCHAR tszLogFile[MAX_PATH]; //日志保存路径 + int nMaxSize; //最大日志大小 + int nMaxCount; //最大日志个数 + int nLogLeave; //日志等级 }st_XLog; struct { - int bAuth; //Ƿ֤,0 - TCHAR tszAuthFile[MAX_PATH]; //ַ֤ + int bAuth; //是否启用验证,大于0启用 + TCHAR tszAuthFile[MAX_PATH]; //验证地址 }st_XAuth; struct { @@ -49,28 +49,28 @@ typedef struct tag_XEngine_ServiceConfig }st_XVer; }XENGINE_SERVICECONFIG; ////////////////////////////////////////////////////////////////////////// -// +// 导出函数定义 ////////////////////////////////////////////////////////////////////////// extern "C" DWORD ModuleConfigure_GetLastError(int* pInt_ErrorCode = NULL); /************************************************************************/ -/* ļöȡ */ +/* 文件配置读取 */ /************************************************************************/ /******************************************************************** -ƣModuleConfigure_Json_File -ܣȡJSONļ - .һlpszConfigFile - In/OutIn - ַָͣ - ɿգN - ˼Ҫȡļ - .pSt_ServerConfig - In/OutOut - ͣݽṹָ - ɿգN - ˼Ϣ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleConfigure_Json_File +函数功能:读取JSON配置文件 + 参数.一:lpszConfigFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要读取的配置文件 + 参数.二:pSt_ServerConfig + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出服务配置信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ extern "C" BOOL ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig); \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h index 00bf513..23a60fd 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfig_Error.h @@ -1,20 +1,20 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/02 16:15:47 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure\ModuleConfig_Error.h // File Path: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure // File Base: ModuleConfig_Error // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: ģ鵼 +// Purpose: 配置模块导出错误 // History: *********************************************************************/ -#define ERROR_MODULE_CONFIGURE_JSON_PARAMENT 0xA0001 // -#define ERROR_MODULE_CONFIGURE_JSON_OPENFILE 0xA0002 //ļʧ -#define ERROR_MODULE_CONFIGURE_JSON_PARSE 0xA0003 //JSONʧ -#define ERROR_MODULE_CONFIGURE_JSON_XMAX 0xA0004 //ȡXMAXʧ -#define ERROR_MODULE_CONFIGURE_JSON_XTIME 0xA0005 //ȡXTIMEʧ -#define ERROR_MODULE_CONFIGURE_JSON_XLOG 0xA0006 //ȡXLOGʧ -#define ERROR_MODULE_CONFIGURE_JSON_XAUTH 0xA0007 //û֤ -#define ERROR_MODULE_CONFIGURE_JSON_XVER 0xA0008 //ûа汾 \ No newline at end of file +#define ERROR_MODULE_CONFIGURE_JSON_PARAMENT 0xA0001 //参数错误 +#define ERROR_MODULE_CONFIGURE_JSON_OPENFILE 0xA0002 //打开文件失败 +#define ERROR_MODULE_CONFIGURE_JSON_PARSE 0xA0003 //解析JSON失败 +#define ERROR_MODULE_CONFIGURE_JSON_XMAX 0xA0004 //读取XMAX配置失败 +#define ERROR_MODULE_CONFIGURE_JSON_XTIME 0xA0005 //读取XTIME配置失败 +#define ERROR_MODULE_CONFIGURE_JSON_XLOG 0xA0006 //读取XLOG配置失败 +#define ERROR_MODULE_CONFIGURE_JSON_XAUTH 0xA0007 //没有验证配置 +#define ERROR_MODULE_CONFIGURE_JSON_XVER 0xA0008 //没有版本配置 \ No newline at end of file diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index 3735aa8..cad9070 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -1,4 +1,4 @@ -#include "pch.h" +#include "pch.h" #include "ModuleConfigure_Json.h" /******************************************************************** // Created: 2021/12/02 16:14:11 @@ -6,9 +6,9 @@ // File Path: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure\ModuleConfigure_Json // File Base: ModuleConfigure_Json // File Ext: cpp -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: JSONöдʵ +// Purpose: JSON配置读写实现 // History: *********************************************************************/ CModuleConfigure_Json::CModuleConfigure_Json() @@ -20,25 +20,25 @@ CModuleConfigure_Json::~CModuleConfigure_Json() } ////////////////////////////////////////////////////////////////////////// -// ú +// 公用函数 ////////////////////////////////////////////////////////////////////////// /******************************************************************** -ƣModuleConfigure_Json_File -ܣȡJSONļ - .һlpszConfigFile - In/OutIn - ַָͣ - ɿգN - ˼Ҫȡļ - .pSt_ServerConfig - In/OutOut - ͣݽṹָ - ɿգN - ˼Ϣ -ֵ - ͣ߼ - ˼Ƿɹ -ע +函数名称:ModuleConfigure_Json_File +函数功能:读取JSON配置文件 + 参数.一:lpszConfigFile + In/Out:In + 类型:常量字符指针 + 可空:N + 意思:输入要读取的配置文件 + 参数.二:pSt_ServerConfig + In/Out:Out + 类型:数据结构指针 + 可空:N + 意思:输出服务配置信息 +返回值 + 类型:逻辑型 + 意思:是否成功 +备注: *********************************************************************/ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XENGINE_SERVICECONFIG* pSt_ServerConfig) { @@ -53,7 +53,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE Json::Value st_JsonRoot; JSONCPP_STRING st_JsonError; Json::CharReaderBuilder st_JsonBuilder; - //ȡļݵ + //读取配置文件所有内容到缓冲区 FILE* pSt_File = _tfopen(lpszConfigFile, _T("rb")); if (NULL == pSt_File) { @@ -73,7 +73,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE nCount += nRet; } fclose(pSt_File); - //ʼļ + //开始解析配置文件 std::unique_ptr const pSt_JsonReader(st_JsonBuilder.newCharReader()); if (!pSt_JsonReader->parse(tszMsgBuffer, tszMsgBuffer + nCount, &st_JsonRoot, &st_JsonError)) { diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h index 43943ed..7ff4947 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.h @@ -1,13 +1,13 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/02 16:08:16 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure\ModuleConfigure_Json\ModuleConfigure_Json.h // File Path: D:\XEngine_ServiceApp\XEngine_Source\XEngine_ModuleConfigure\ModuleConfigure_Json // File Base: ModuleConfigure_Json // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: JSONļд +// Purpose: JSON配置文件读写 // History: *********************************************************************/ diff --git a/XEngine_Source/XEngine_UserProtocol.h b/XEngine_Source/XEngine_UserProtocol.h index 9f319b4..cfb4626 100644 --- a/XEngine_Source/XEngine_UserProtocol.h +++ b/XEngine_Source/XEngine_UserProtocol.h @@ -1,17 +1,17 @@ -#pragma once +#pragma once /******************************************************************** // Created: 2021/12/03 14:16:27 // File Name: D:\XEngine_ServiceApp\XEngine_Source\XEngine_UserProtocol.h // File Path: D:\XEngine_ServiceApp\XEngine_Source // File Base: XEngine_UserProtocol // File Ext: h -// Project: XEngine(ͨ) +// Project: XEngine(网络通信引擎) // Author: qyt -// Purpose: ûԶЭͷ +// Purpose: 用户自定义协议头 // History: *********************************************************************/ /////////////////////////////////////////////////////////////////////////// -// ݽṹ +// 导出的数据结构 /////////////////////////////////////////////////////////////////////////// #pragma pack(push) #pragma pack(1) -- Gitee From e76753ddf06db4c1f0e2b8b6cc289c56a6be94ef Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 21 Feb 2022 13:39:42 +0800 Subject: [PATCH 02/12] delete:gitee dir --- .gitee/ISSUE_TEMPLATE.zh-CN.md | 13 ------------- .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md | 14 -------------- 2 files changed, 27 deletions(-) delete mode 100644 .gitee/ISSUE_TEMPLATE.zh-CN.md delete mode 100644 .gitee/PULL_REQUEST_TEMPLATE.zh-CN.md diff --git a/.gitee/ISSUE_TEMPLATE.zh-CN.md b/.gitee/ISSUE_TEMPLATE.zh-CN.md deleted file mode 100644 index f09d98d..0000000 --- a/.gitee/ISSUE_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,13 +0,0 @@ -### 该问题是怎么引起的? - - - -### 重现步骤 - - - -### 报错信息 - - - - diff --git a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md b/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md deleted file mode 100644 index 66d4332..0000000 --- a/.gitee/PULL_REQUEST_TEMPLATE.zh-CN.md +++ /dev/null @@ -1,14 +0,0 @@ -### 相关的Issue - - -### 原因(目的、解决的问题等) - - -### 描述(做了什么,变更了什么) - - -### 测试用例(新增、改动、可能影响的功能) - - - - -- Gitee From 3fcd9961314b24944bc8315a4e1fc2dc2a23ba6b Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 11 Apr 2022 11:10:22 +0800 Subject: [PATCH 03/12] added:CHANGELOG CONTRIBUTING.md COPYRIGHT --- CHANGELOG | 37 +++++++++++++++++++++++++++++++++++++ CONTRIBUTING.md | 16 ++++++++++++++++ COPYRIGHT | 3 +++ 3 files changed, 56 insertions(+) create mode 100644 CHANGELOG create mode 100644 CONTRIBUTING.md create mode 100644 COPYRIGHT diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000..f72ed26 --- /dev/null +++ b/CHANGELOG @@ -0,0 +1,37 @@ +XEngine_ProxyServer V1.1.0.1001 + +添加:用户验证模块 +添加:SOCKS和TUNNEL支持用户基本验证 +添加:日志文件路径设置 +添加:验证文件列表 +修改:配置文件socks修改为验证 +优化:当发送消息给客户端的时候可以超时了 +修复:没有子域名,域名无法解析的问题 +修复:LINUX构建错误 +修复:vscopy文件拷贝问题 +删除:多余的协议定义 + +added:user authorize module +added:socks and tunnel user authorize +added:log set file address +added:version list information +modify:configure modify socks to auth +improved:can be timeout when send message to client +fixed:no have subdomain,The domain name cannot be resolved +fixed:build error on linux +fixed:vscopy file +delete:Redundant protocol definitions +====================================================================================== +XEngine_ProxyServer V1.0.0.1001 + +支持:HTTP隧道匿名代理 +支持:SOCKS5隧道匿名代理 +支持:配置模块 +支持:心跳超时 +支持:日志管理 + +Support: HTTP tunnel anonymous proxy +Support: SOCKS5 tunnel anonymous proxy +Support: configuration module +Support: Heartbeat timeout +Support: log management \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5e25399 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,16 @@ +author by:qyt 486179@qq.com + +## 贡献准则(Contribution Guidelines) + +此服务是一个尝试由社区驱动,你的共享价值将不可估量! +the service is an attempt to be driven by the community, your shared value will be immeasurable! + +## 提交代码(Submit code) + +想要贡献代码,你需要按照我们的风格来提交代码. +To contribute code, you need to submit code in our style + +## 法律声明(Legal Notice) + +如果你的提交的请求有依赖其他库,请注意库的版权.你的提交代码将被允许被我们随意复制,分发,删除,修改 +If your submitted request depends on other libraries, please pay attention to the copyright of the library. Your submitted code will be allowed to be copied, distributed, deleted, and modified by us at will \ No newline at end of file diff --git a/COPYRIGHT b/COPYRIGHT new file mode 100644 index 0000000..0ef9391 --- /dev/null +++ b/COPYRIGHT @@ -0,0 +1,3 @@ + the open source software depend on the following libraries, please note the copyright +XEngine:https://gitee.com/xyry/libxengine or https://github.com/libxengine/xengine +jsoncpp:https://github.com/open-source-parsers/jsoncpp \ No newline at end of file -- Gitee From 16cbf62322e38ad1febb86ee9d4cc34878b8dfd2 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 11 Apr 2022 11:11:33 +0800 Subject: [PATCH 04/12] update:vs2019 to vs2022 --- .../XEngine_ModuleAuthorize.vcxproj | 8 ++++---- .../XEngine_ModuleConfigure.vcxproj | 8 ++++---- .../XEngine_ServiceApp/XEngine_ServiceApp.vcxproj | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj b/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj index 53b7b33..ed06b79 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj +++ b/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj @@ -29,26 +29,26 @@ DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true MultiByte diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 4569d2e..155178c 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -29,26 +29,26 @@ DynamicLibrary true - v142 + v143 MultiByte DynamicLibrary false - v142 + v143 true MultiByte DynamicLibrary true - v142 + v143 Unicode DynamicLibrary false - v142 + v143 true MultiByte diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj index 49064fa..4c4fd53 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj @@ -29,26 +29,26 @@ Application true - v142 + v143 MultiByte Application false - v142 + v143 true MultiByte Application true - v142 + v143 Unicode Application false - v142 + v143 true MultiByte -- Gitee From 0f08560d2290aa74c8c0d28e8def748b28b32402 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 11 Apr 2022 11:22:09 +0800 Subject: [PATCH 05/12] added:jsoncpp module modify:vcpkg json use to project json --- XEngine_Source/Makefile | 7 +- XEngine_Source/XEngine.sln | 19 +- .../XEngine_ModuleAuthorize/Makefile | 2 +- .../XEngine_ModuleConfigure/Makefile | 6 +- .../XEngine_ModuleConfigure.vcxproj | 2 +- XEngine_Source/XEngine_ModuleConfigure/pch.h | 26 +- XEngine_Source/XEngine_ServiceApp/Makefile | 8 +- .../XEngine_ThirdPart/jsoncpp/Makefile | 46 + .../jsoncpp/json/allocator.h | 88 + .../jsoncpp/json/assertions.h | 61 + .../XEngine_ThirdPart/jsoncpp/json/config.h | 150 ++ .../XEngine_ThirdPart/jsoncpp/json/forwards.h | 43 + .../XEngine_ThirdPart/jsoncpp/json/json.h | 15 + .../jsoncpp/json/json_features.h | 61 + .../XEngine_ThirdPart/jsoncpp/json/reader.h | 405 ++++ .../XEngine_ThirdPart/jsoncpp/json/value.h | 935 ++++++++ .../XEngine_ThirdPart/jsoncpp/json/version.h | 28 + .../XEngine_ThirdPart/jsoncpp/json/writer.h | 369 +++ .../XEngine_ThirdPart/jsoncpp/json_reader.cpp | 1992 +++++++++++++++++ .../XEngine_ThirdPart/jsoncpp/json_tool.h | 138 ++ .../XEngine_ThirdPart/jsoncpp/json_value.cpp | 1634 ++++++++++++++ .../jsoncpp/json_valueiterator.inl | 156 ++ .../XEngine_ThirdPart/jsoncpp/json_writer.cpp | 1259 +++++++++++ .../XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj | 177 ++ .../jsoncpp/jsoncpp.vcxproj.filters | 63 + .../jsoncpp/jsoncpp.vcxproj.user | 4 + 26 files changed, 7676 insertions(+), 18 deletions(-) create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters create mode 100644 XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user diff --git a/XEngine_Source/Makefile b/XEngine_Source/Makefile index 310220a..b666bf3 100644 --- a/XEngine_Source/Makefile +++ b/XEngine_Source/Makefile @@ -3,15 +3,20 @@ UNICODE = 0 #编译的选项参数 FLAGS = RELEASE=$(RELEASE) #要编译的模块 +THIRDPART_MODULE_JSONCPP = ./XEngine_ThirdPart/jsoncpp + MODULE_CONFIGURE_PATH = ./XEngine_ModuleConfigure MODULE_AUTHORIZE_PATH = ./XEngine_ModuleAuthorize APP_SERVICE_PATH = ./XEngine_ServiceApp -XENGINE_MODULES = libXEngine_ModuleConfigure.so libXEngine_ModuleAuthorize.so XEngine_ServiceApp.exe +XENGINE_MODULES = libjsoncpp.so libXEngine_ModuleConfigure.so libXEngine_ModuleAuthorize.so XEngine_ServiceApp.exe .PHONY:MakeAll MakeAll:$(XENGINE_MODULES) +libjsoncpp.so: + make -C $(THIRDPART_MODULE_JSONCPP) $(FLAGS) + libXEngine_ModuleConfigure.so: make -C $(MODULE_CONFIGURE_PATH) $(FLAGS) libXEngine_ModuleAuthorize.so: diff --git a/XEngine_Source/XEngine.sln b/XEngine_Source/XEngine.sln index fce9a93..6fc27e9 100644 --- a/XEngine_Source/XEngine.sln +++ b/XEngine_Source/XEngine.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31911.196 +# Visual Studio Version 17 +VisualStudioVersion = 17.1.32328.378 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ServiceApp", "XEngine_ServiceApp\XEngine_ServiceApp.vcxproj", "{B94018F9-541B-4BE4-A2A8-AD49DD35357B}" EndProject @@ -14,6 +14,10 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_UserHdr", "XEngine_ EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "XEngine_ModuleAuthorize", "XEngine_ModuleAuthorize\XEngine_ModuleAuthorize.vcxproj", "{58026DC2-5383-490C-9BB4-BF3152192F0C}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "XEngine_ThirdPart", "XEngine_ThirdPart", "{F18FFEA0-27D2-4590-9190-F69F5E3D21D2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jsoncpp", "XEngine_ThirdPart\jsoncpp\jsoncpp.vcxproj", "{F1736B3F-03A2-4FC7-B045-A12BA8D724FB}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 @@ -46,10 +50,21 @@ Global {58026DC2-5383-490C-9BB4-BF3152192F0C}.Release|x64.Build.0 = Release|x64 {58026DC2-5383-490C-9BB4-BF3152192F0C}.Release|x86.ActiveCfg = Release|Win32 {58026DC2-5383-490C-9BB4-BF3152192F0C}.Release|x86.Build.0 = Release|Win32 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x64.ActiveCfg = Debug|x64 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x64.Build.0 = Debug|x64 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x86.ActiveCfg = Debug|Win32 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Debug|x86.Build.0 = Debug|Win32 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x64.ActiveCfg = Release|x64 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x64.Build.0 = Release|x64 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x86.ActiveCfg = Release|Win32 + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB}.Release|x86.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {F1736B3F-03A2-4FC7-B045-A12BA8D724FB} = {F18FFEA0-27D2-4590-9190-F69F5E3D21D2} + EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {9B202F91-A601-429E-BB0F-880DDEE096FE} EndGlobalSection diff --git a/XEngine_Source/XEngine_ModuleAuthorize/Makefile b/XEngine_Source/XEngine_ModuleAuthorize/Makefile index a00f37f..90efaf8 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/Makefile +++ b/XEngine_Source/XEngine_ModuleAuthorize/Makefile @@ -3,7 +3,7 @@ RELEASE = 0 UNICODE = 0 INCLUDE = -I ./ LOADBIN = -LIB = -ljsoncpp +LIB = LIBEX = -static-libgcc -lrt -ldl -lpthread LOADSO = -Wl,-rpath= LIBINCLUDE = ModuleAuthorize_User.o pch.o diff --git a/XEngine_Source/XEngine_ModuleConfigure/Makefile b/XEngine_Source/XEngine_ModuleConfigure/Makefile index 1a44416..7bca8c1 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/Makefile +++ b/XEngine_Source/XEngine_ModuleConfigure/Makefile @@ -1,11 +1,11 @@ CC = g++ -Wall -std=c++17 -fPIC RELEASE = 0 UNICODE = 0 -INCLUDE = -I ./ -LOADBIN = +INCLUDE = -I ./ -I ../XEngine_ThirdPart/jsoncpp +LOADBIN = -L ../XEngine_ThirdPart/jsoncpp LIB = -ljsoncpp LIBEX = -static-libgcc -lrt -ldl -lpthread -LOADSO = -Wl,-rpath= +LOADSO = -Wl,-rpath=./,--disable-new-dtags LIBINCLUDE = ModuleConfigure_Json.o pch.o ifeq ($(RELEASE),1) diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 155178c..9579ba2 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -72,7 +72,7 @@ true - $(XEngine_Include);$(IncludePath) + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) diff --git a/XEngine_Source/XEngine_ModuleConfigure/pch.h b/XEngine_Source/XEngine_ModuleConfigure/pch.h index e24f672..2bc4ede 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/pch.h +++ b/XEngine_Source/XEngine_ModuleConfigure/pch.h @@ -11,13 +11,6 @@ // 添加要在此处预编译的标头 #include "framework.h" #include -#include -#else -#ifdef _CENTOS -#include -#else -#include -#endif #endif #endif //PCH_H #include @@ -25,6 +18,7 @@ #include #include #include +#include using namespace std; #include #include @@ -42,4 +36,20 @@ using namespace std; // History: *********************************************************************/ extern BOOL Config_IsErrorOccur; -extern DWORD Config_dwErrorCode; \ No newline at end of file +extern DWORD Config_dwErrorCode; + +#ifdef _MSC_BUILD +#ifdef _DEBUG +#ifdef _WIN64 +#pragma comment(lib,"../x64/Debug/jsoncpp") +#else +#pragma comment(lib,"../Debug/jsoncpp") +#endif +#else +#ifdef _WIN64 +#pragma comment(lib,"../x64/Release/jsoncpp") +#else +#pragma comment(lib,"../Release/jsoncpp") +#endif +#endif +#endif \ No newline at end of file diff --git a/XEngine_Source/XEngine_ServiceApp/Makefile b/XEngine_Source/XEngine_ServiceApp/Makefile index d655e02..784331e 100644 --- a/XEngine_Source/XEngine_ServiceApp/Makefile +++ b/XEngine_Source/XEngine_ServiceApp/Makefile @@ -1,8 +1,12 @@ CC = g++ -Wall RELEASE = 0 UNICODE = 0 -LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_Client -L /usr/local/lib/XEngine_Release/XEngine_NetHelp -L ../XEngine_ModuleConfigure -L ../XEngine_ModuleAuthorize -LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_OPenSsl -lXEngine_ManagePool -lXEngine_NetXApi -lHelpComponents_XLog -lRfcComponents_ProxyProtocol -lXClient_Socket -lNetHelp_APIHelp -lXEngine_ModuleConfigure -lXEngine_ModuleAuthorize +LOADBIN = -L /usr/local/lib/XEngine_Release/XEngine_BaseLib -L /usr/local/lib/XEngine_Release/XEngine_Core -L /usr/local/lib/XEngine_Release/XEngine_HelpComponents -L /usr/local/lib/XEngine_Release/XEngine_RfcComponents -L /usr/local/lib/XEngine_Release/XEngine_Client -L /usr/local/lib/XEngine_Release/XEngine_NetHelp \ + -L ../XEngine_ThirdPart/jsoncpp \ + -L ../XEngine_ModuleConfigure -L ../XEngine_ModuleAuthorize +LIB = -lXEngine_BaseLib -lXEngine_Algorithm -lXEngine_Core -lXEngine_OPenSsl -lXEngine_ManagePool -lXEngine_NetXApi -lHelpComponents_XLog -lRfcComponents_ProxyProtocol -lXClient_Socket -lNetHelp_APIHelp \ + -ljsoncpp \ + -lXEngine_ModuleConfigure -lXEngine_ModuleAuthorize LIBEX = -static-libgcc -ldl -lrt -lpthread LOADSO = -Wl,-rpath=./,--disable-new-dtags LIBINCLUDE = XEngine_Configure.o XEngine_Network.o XEngine_SocksTask.o XEngine_TunnelTask.o XEngine_ServiceApp.o diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile b/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile new file mode 100644 index 0000000..30dbd85 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/Makefile @@ -0,0 +1,46 @@ +CC = g++ -Wall -std=c++17 -fPIC +RELEASE = 0 +UNICODE = 0 +INCLUDE = -I ./ +FILECENTOS = /etc/redhat-release +LOADBIN = +LIB = +LIBEX = -static-libgcc -lrt -ldl -lpthread +LOADSO = -Wl,-rpath= +LIBINCLUDE = json_reader.o json_value.o json_writer.o + +ifeq ($(RELEASE),1) +FLAGS = -c -O2 +DEBUG = +else +FLAGS = -c -lc_p +DEBUG = -g -pg +endif + +ifeq ($(UNICODE),1) +UNICODE = -D _UNICODE +else +UNICODE = +endif + +all:$(LIBINCLUDE) + $(CC) $(DEBUG) $(LIBINCLUDE) -o libjsoncpp.so -shared -fPIC $(LOADBIN) $(LIB) $(LIBEX) $(LOADSO) + +json_reader.o:json_reader.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_reader.cpp +json_value.o:json_value.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_value.cpp +json_writer.o:json_writer.cpp + $(CC) $(DEBUG) $(FLAGS) $(UNICODE) $(INCLUDE) json_writer.cpp + +InstallAll:InstallSo +InstallSo:./libjsoncpp.so + cp ./libjsoncpp.so ../../../XEngine_Release/libjsoncpp.so + + + +CleanAll:CleanObj CleanMk +CleanObj: + rm *.o +CleanMk: + rm *.so diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h new file mode 100644 index 0000000..d669dda --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/allocator.h @@ -0,0 +1,88 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ALLOCATOR_H_INCLUDED +#define JSON_ALLOCATOR_H_INCLUDED + +#include +#include + +#pragma pack(push, 8) + +namespace Json { +template class SecureAllocator { +public: + // Type definitions + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * Allocate memory for N items using the standard allocator. + */ + pointer allocate(size_type n) { + // allocate using "global operator new" + return static_cast(::operator new(n * sizeof(T))); + } + + /** + * Release memory which was allocated for N items at pointer P. + * + * The memory block is filled with zeroes before being released. + */ + void deallocate(pointer p, size_type n) { + // memset_s is used because memset may be optimized away by the compiler + memset_s(p, n * sizeof(T), 0, n * sizeof(T)); + // free using "global operator delete" + ::operator delete(p); + } + + /** + * Construct an item in-place at pointer P. + */ + template void construct(pointer p, Args&&... args) { + // construct using "placement new" and "perfect forwarding" + ::new (static_cast(p)) T(std::forward(args)...); + } + + size_type max_size() const { return size_t(-1) / sizeof(T); } + + pointer address(reference x) const { return std::addressof(x); } + + const_pointer address(const_reference x) const { return std::addressof(x); } + + /** + * Destroy an item in-place at pointer P. + */ + void destroy(pointer p) { + // destroy using "explicit destructor" + p->~T(); + } + + // Boilerplate + SecureAllocator() {} + template SecureAllocator(const SecureAllocator&) {} + template struct rebind { using other = SecureAllocator; }; +}; + +template +bool operator==(const SecureAllocator&, const SecureAllocator&) { + return true; +} + +template +bool operator!=(const SecureAllocator&, const SecureAllocator&) { + return false; +} + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_ALLOCATOR_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h new file mode 100644 index 0000000..0a0120d --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/assertions.h @@ -0,0 +1,61 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_ASSERTIONS_H_INCLUDED +#define JSON_ASSERTIONS_H_INCLUDED + +#include +#include + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +/** It should not be possible for a maliciously designed file to + * cause an abort() or seg-fault, so these macros are used only + * for pre-condition violations and internal logic errors. + */ +#if JSON_USE_EXCEPTION + +// @todo <= add detail about condition in exception +#define JSON_ASSERT(condition) \ + do { \ + if (!(condition)) { \ + Json::throwLogicError("assert json failed"); \ + } \ + } while (0) + +#define JSON_FAIL_MESSAGE(message) \ + do { \ + OStringStream oss; \ + oss << message; \ + Json::throwLogicError(oss.str()); \ + abort(); \ + } while (0) + +#else // JSON_USE_EXCEPTION + +#define JSON_ASSERT(condition) assert(condition) + +// The call to assert() will show the failure message in debug builds. In +// release builds we abort, for a core-dump or debugger. +#define JSON_FAIL_MESSAGE(message) \ + { \ + OStringStream oss; \ + oss << message; \ + assert(false && oss.str().c_str()); \ + abort(); \ + } + +#endif + +#define JSON_ASSERT_MESSAGE(condition, message) \ + do { \ + if (!(condition)) { \ + JSON_FAIL_MESSAGE(message); \ + } \ + } while (0) + +#endif // JSON_ASSERTIONS_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h new file mode 100644 index 0000000..81d7969 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/config.h @@ -0,0 +1,150 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_CONFIG_H_INCLUDED +#define JSON_CONFIG_H_INCLUDED +#include +#include +#include +#include +#include +#include +#include +#include + +// If non-zero, the library uses exceptions to report bad input instead of C +// assertion macros. The default is to use exceptions. +#ifndef JSON_USE_EXCEPTION +#define JSON_USE_EXCEPTION 1 +#endif + +// Temporary, tracked for removal with issue #982. +#ifndef JSON_USE_NULLREF +#define JSON_USE_NULLREF 1 +#endif + +/// If defined, indicates that the source file is amalgamated +/// to prevent private header inclusion. +/// Remarks: it is automatically defined in the generated amalgamated header. +// #define JSON_IS_AMALGAMATION + +// Export macros for DLL visibility +#if defined(JSON_DLL_BUILD) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllexport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#elif defined(__GNUC__) || defined(__clang__) +#define JSON_API __attribute__((visibility("default"))) +#endif // if defined(_MSC_VER) + +#elif defined(JSON_DLL) +#if defined(_MSC_VER) || defined(__MINGW32__) +#define JSON_API __declspec(dllimport) +#define JSONCPP_DISABLE_DLL_INTERFACE_WARNING +#endif // if defined(_MSC_VER) +#endif // ifdef JSON_DLL_BUILD + +#if !defined(JSON_API) +#define JSON_API +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1800 +#error \ + "ERROR: Visual Studio 12 (2013) with _MSC_VER=1800 is the oldest supported compiler with sufficient C++11 capabilities" +#endif + +#if defined(_MSC_VER) && _MSC_VER < 1900 +// As recommended at +// https://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010 +extern JSON_API int msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...); +#define jsoncpp_snprintf msvc_pre1900_c99_snprintf +#else +#define jsoncpp_snprintf std::snprintf +#endif + +// If JSON_NO_INT64 is defined, then Json only support C++ "int" type for +// integer +// Storages, and 64 bits integer support is disabled. +// #define JSON_NO_INT64 1 + +// JSONCPP_OVERRIDE is maintained for backwards compatibility of external tools. +// C++11 should be used directly in JSONCPP. +#define JSONCPP_OVERRIDE override + +#ifdef __clang__ +#if __has_extension(attribute_deprecated_with_message) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#endif +#elif defined(__GNUC__) // not clang (gcc comes later since clang emulates gcc) +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)) +#define JSONCPP_DEPRECATED(message) __attribute__((deprecated(message))) +#elif (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)) +#define JSONCPP_DEPRECATED(message) __attribute__((__deprecated__)) +#endif // GNUC version +#elif defined(_MSC_VER) // MSVC (after clang because clang on Windows emulates + // MSVC) +#define JSONCPP_DEPRECATED(message) __declspec(deprecated(message)) +#endif // __clang__ || __GNUC__ || _MSC_VER + +#if !defined(JSONCPP_DEPRECATED) +#define JSONCPP_DEPRECATED(message) +#endif // if !defined(JSONCPP_DEPRECATED) + +#if defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +#define JSON_USE_INT64_DOUBLE_CONVERSION 1 +#endif + +#if !defined(JSON_IS_AMALGAMATION) + +#include "allocator.h" +#include "version.h" + +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { +using Int = int; +using UInt = unsigned int; +#if defined(JSON_NO_INT64) +using LargestInt = int; +using LargestUInt = unsigned int; +#undef JSON_HAS_INT64 +#else // if defined(JSON_NO_INT64) +// For Microsoft Visual use specific types as long long is not supported +#if defined(_MSC_VER) // Microsoft Visual Studio +using Int64 = __int64; +using UInt64 = unsigned __int64; +#else // if defined(_MSC_VER) // Other platforms, use long long +using Int64 = int64_t; +using UInt64 = uint64_t; +#endif // if defined(_MSC_VER) +using LargestInt = Int64; +using LargestUInt = UInt64; +#define JSON_HAS_INT64 +#endif // if defined(JSON_NO_INT64) + +template +using Allocator = + typename std::conditional, + std::allocator>::type; +using String = std::basic_string, Allocator>; +using IStringStream = + std::basic_istringstream; +using OStringStream = + std::basic_ostringstream; +using IStream = std::istream; +using OStream = std::ostream; +} // namespace Json + +// Legacy names (formerly macros). +using JSONCPP_STRING = Json::String; +using JSONCPP_ISTRINGSTREAM = Json::IStringStream; +using JSONCPP_OSTRINGSTREAM = Json::OStringStream; +using JSONCPP_ISTREAM = Json::IStream; +using JSONCPP_OSTREAM = Json::OStream; + +#endif // JSON_CONFIG_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h new file mode 100644 index 0000000..733b9d6 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/forwards.h @@ -0,0 +1,43 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FORWARDS_H_INCLUDED +#define JSON_FORWARDS_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "config.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +// writer.h +class StreamWriter; +class StreamWriterBuilder; +class Writer; +class FastWriter; +class StyledWriter; +class StyledStreamWriter; + +// reader.h +class Reader; +class CharReader; +class CharReaderBuilder; + +// json_features.h +class Features; + +// value.h +using ArrayIndex = unsigned int; +class StaticString; +class Path; +class PathArgument; +class Value; +class ValueIteratorBase; +class ValueIterator; +class ValueConstIterator; + +} // namespace Json + +#endif // JSON_FORWARDS_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h new file mode 100644 index 0000000..c6a9bbd --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json.h @@ -0,0 +1,15 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_JSON_H_INCLUDED +#define JSON_JSON_H_INCLUDED + +#include "config.h" +#include "json_features.h" +#include "reader.h" +#include "value.h" +#include "writer.h" + +#endif // JSON_JSON_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h new file mode 100644 index 0000000..6d881b8 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/json_features.h @@ -0,0 +1,61 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_FEATURES_H_INCLUDED +#define JSON_FEATURES_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Configuration passed to reader and writer. + * This configuration object can be used to force the Reader or Writer + * to behave in a standard conforming way. + */ +class JSON_API Features { +public: + /** \brief A configuration that allows all features and assumes all strings + * are UTF-8. + * - C & C++ comments are allowed + * - Root object can be any JSON value + * - Assumes Value strings are encoded in UTF-8 + */ + static Features all(); + + /** \brief A configuration that is strictly compatible with the JSON + * specification. + * - Comments are forbidden. + * - Root object must be either an array or an object value. + * - Assumes Value strings are encoded in UTF-8 + */ + static Features strictMode(); + + /** \brief Initialize the configuration like JsonConfig::allFeatures; + */ + Features(); + + /// \c true if comments are allowed. Default: \c true. + bool allowComments_{true}; + + /// \c true if root must be either an array or an object value. Default: \c + /// false. + bool strictRoot_{false}; + + /// \c true if dropped null placeholders are allowed. Default: \c false. + bool allowDroppedNullPlaceholders_{false}; + + /// \c true if numeric object key are allowed. Default: \c false. + bool allowNumericKeys_{false}; +}; + +} // namespace Json + +#pragma pack(pop) + +#endif // JSON_FEATURES_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h new file mode 100644 index 0000000..775037e --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/reader.h @@ -0,0 +1,405 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_READER_H_INCLUDED +#define JSON_READER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "json_features.h" +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +/** \brief Unserialize a JSON document into a + * Value. + * + * \deprecated Use CharReader and CharReaderBuilder. + */ + +class JSON_API Reader { +public: + using Char = char; + using Location = const Char*; + + /** \brief An error tagged with where in the JSON text it was encountered. + * + * The offsets give the [start, limit) range of bytes within the text. Note + * that this is bytes, not codepoints. + */ + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + String message; + }; + + /** \brief Constructs a Reader allowing all features for parsing. + * \deprecated Use CharReader and CharReaderBuilder. + */ + Reader(); + + /** \brief Constructs a Reader allowing the specified feature set for parsing. + * \deprecated Use CharReader and CharReaderBuilder. + */ + Reader(const Features& features); + + /** \brief Read a Value from a JSON + * document. + * + * \param document UTF-8 encoded string containing the document + * to read. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool parse(const std::string& document, Value& root, + bool collectComments = true); + + /** \brief Read a Value from a JSON + * document. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded + * string of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string + * of the document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it + * was successfully parsed. + * \param collectComments \c true to collect comment and allow writing + * them back during serialization, \c false to + * discard comments. This parameter is ignored + * if Features::allowComments_ is \c false. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + bool parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments = true); + + /// \brief Parse from input stream. + /// \see Json::operator>>(std::istream&, Json::Value&). + bool parse(IStream& is, Value& root, bool collectComments = true); + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. + * \deprecated Use getFormattedErrorMessages() instead (typo fix). + */ + JSONCPP_DEPRECATED("Use getFormattedErrorMessages() instead.") + String getFormatedErrorMessages() const; + + /** \brief Returns a user friendly string that list errors in the parsed + * document. + * + * \return Formatted error message with the list of errors with their + * location in the parsed document. An empty string is returned if no error + * occurred during parsing. + */ + String getFormattedErrorMessages() const; + + /** \brief Returns a vector of structured errors encountered while parsing. + * + * \return A (possibly empty) vector of StructuredError objects. Currently + * only one error can be returned, but the caller should tolerate multiple + * errors. This can occur if the parser recovers from a non-fatal parse + * error and then encounters additional errors. + */ + std::vector getStructuredErrors() const; + + /** \brief Add a semantic error message. + * + * \param value JSON Value location associated with the error + * \param message The error message. + * \return \c true if the error was successfully added, \c false if the Value + * offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message); + + /** \brief Add a semantic error message with extra context. + * + * \param value JSON Value location associated with the error + * \param message The error message. + * \param extra Additional JSON Value location to contextualize the error + * \return \c true if the error was successfully added, \c false if either + * Value offset exceeds the document size. + */ + bool pushError(const Value& value, const String& message, const Value& extra); + + /** \brief Return whether there are any errors. + * + * \return \c true if there are no errors to report \c false if errors have + * occurred. + */ + bool good() const; + +private: + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + String message_; + Location extra_; + }; + + using Errors = std::deque; + + bool readToken(Token& token); + void skipSpaces(); + bool match(const Char* pattern, int patternLength); + bool readComment(); + bool readCStyleComment(); + bool readCppStyleComment(); + bool readString(); + void readNumber(); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, String& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static bool containsNewLine(Location begin, Location end); + static String normalizeEOL(Location begin, Location end); + + using Nodes = std::stack; + Nodes nodes_; + Errors errors_; + String document_; + Location begin_{}; + Location end_{}; + Location current_{}; + Location lastValueEnd_{}; + Value* lastValue_{}; + String commentsBefore_; + Features features_; + bool collectComments_{}; +}; // Reader + +/** Interface for reading JSON from a char array. + */ +class JSON_API CharReader { +public: + virtual ~CharReader() = default; + /** \brief Read a Value from a JSON + * document. The document must be a UTF-8 encoded string containing the + * document to read. + * + * \param beginDoc Pointer on the beginning of the UTF-8 encoded string + * of the document to read. + * \param endDoc Pointer on the end of the UTF-8 encoded string of the + * document to read. Must be >= beginDoc. + * \param[out] root Contains the root value of the document if it was + * successfully parsed. + * \param[out] errs Formatted error messages (if not NULL) a user + * friendly string that lists errors in the parsed + * document. + * \return \c true if the document was successfully parsed, \c false if an + * error occurred. + */ + virtual bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) = 0; + + class JSON_API Factory { + public: + virtual ~Factory() = default; + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual CharReader* newCharReader() const = 0; + }; // Factory +}; // CharReader + +/** \brief Build a CharReader implementation. + * + * Usage: + * \code + * using namespace Json; + * CharReaderBuilder builder; + * builder["collectComments"] = false; + * Value value; + * String errs; + * bool ok = parseFromStream(builder, std::cin, &value, &errs); + * \endcode + */ +class JSON_API CharReaderBuilder : public CharReader::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + * These are case-sensitive. + * Available settings (case-sensitive): + * - `"collectComments": false or true` + * - true to collect comment and allow writing them back during + * serialization, false to discard comments. This parameter is ignored + * if allowComments is false. + * - `"allowComments": false or true` + * - true if comments are allowed. + * - `"allowTrailingCommas": false or true` + * - true if trailing commas in objects and arrays are allowed. + * - `"strictRoot": false or true` + * - true if root must be either an array or an object value + * - `"allowDroppedNullPlaceholders": false or true` + * - true if dropped null placeholders are allowed. (See + * StreamWriterBuilder.) + * - `"allowNumericKeys": false or true` + * - true if numeric object keys are allowed. + * - `"allowSingleQuotes": false or true` + * - true if '' are allowed for strings (both keys and values) + * - `"stackLimit": integer` + * - Exceeding stackLimit (recursive depth of `readValue()`) will cause an + * exception. + * - This is a security issue (seg-faults caused by deeply nested JSON), so + * the default is low. + * - `"failIfExtra": false or true` + * - If true, `parse()` returns false when extra non-whitespace trails the + * JSON value in the input string. + * - `"rejectDupKeys": false or true` + * - If true, `parse()` returns false when a key is duplicated within an + * object. + * - `"allowSpecialFloats": false or true` + * - If true, special float values (NaNs and infinities) are allowed and + * their values are lossfree restorable. + * - `"skipBom": false or true` + * - If true, if the input starts with the Unicode byte order mark (BOM), + * it is skipped. + * + * You can examine 'settings_` yourself to see the defaults. You can also + * write and read them just like any JSON Value. + * \sa setDefaults() + */ + Json::Value settings_; + + CharReaderBuilder(); + ~CharReaderBuilder() override; + + CharReader* newCharReader() const override; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + + /** A simple way to update a specific setting. + */ + Value& operator[](const String& key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderDefaults + */ + static void setDefaults(Json::Value* settings); + /** Same as old Features::strictMode(). + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_reader.cpp CharReaderBuilderStrictMode + */ + static void strictMode(Json::Value* settings); +}; + +/** Consume entire stream and use its begin/end. + * Someday we might have a real StreamReader, but for now this + * is convenient. + */ +bool JSON_API parseFromStream(CharReader::Factory const&, IStream&, Value* root, + String* errs); + +/** \brief Read from 'sin' into 'root'. + * + * Always keep comments from the input JSON. + * + * This can be used to read a file into a particular sub-object. + * For example: + * \code + * Json::Value root; + * cin >> root["dir"]["file"]; + * cout << root; + * \endcode + * Result: + * \verbatim + * { + * "dir": { + * "file": { + * // The input stream JSON would be nested here. + * } + * } + * } + * \endverbatim + * \throw std::exception on parse error. + * \see Json::operator<<() + */ +JSON_API IStream& operator>>(IStream&, Value&); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_READER_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h new file mode 100644 index 0000000..d24ca53 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/value.h @@ -0,0 +1,935 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_H_INCLUDED +#define JSON_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "forwards.h" +#endif // if !defined(JSON_IS_AMALGAMATION) + +// Conditional NORETURN attribute on the throw functions would: +// a) suppress false positives from static code analysis +// b) possibly improve optimization opportunities. +#if !defined(JSONCPP_NORETURN) +#if defined(_MSC_VER) && _MSC_VER == 1800 +#define JSONCPP_NORETURN __declspec(noreturn) +#else +#define JSONCPP_NORETURN [[noreturn]] +#endif +#endif + +// Support for '= delete' with template declarations was a late addition +// to the c++11 standard and is rejected by clang 3.8 and Apple clang 8.2 +// even though these declare themselves to be c++11 compilers. +#if !defined(JSONCPP_TEMPLATE_DELETE) +#if defined(__clang__) && defined(__apple_build_version__) +#if __apple_build_version__ <= 8000042 +#define JSONCPP_TEMPLATE_DELETE +#endif +#elif defined(__clang__) +#if __clang_major__ == 3 && __clang_minor__ <= 8 +#define JSONCPP_TEMPLATE_DELETE +#endif +#endif +#if !defined(JSONCPP_TEMPLATE_DELETE) +#define JSONCPP_TEMPLATE_DELETE = delete +#endif +#endif + +#include +#include +#include +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(push) +#pragma warning(disable : 4251 4275) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +/** \brief JSON (JavaScript Object Notation). + */ +namespace Json { + +#if JSON_USE_EXCEPTION +/** Base class for all exceptions we throw. + * + * We use nothing but these internally. Of course, STL can throw others. + */ +class JSON_API Exception : public std::exception { +public: + Exception(String msg); + ~Exception() noexcept override; + char const* what() const noexcept override; + +protected: + String msg_; +}; + +/** Exceptions which the user cannot easily avoid. + * + * E.g. out-of-memory (when we use malloc), stack-overflow, malicious input + * + * \remark derived from Json::Exception + */ +class JSON_API RuntimeError : public Exception { +public: + RuntimeError(String const& msg); +}; + +/** Exceptions thrown by JSON_ASSERT/JSON_FAIL macros. + * + * These are precondition-violations (user bugs) and internal errors (our bugs). + * + * \remark derived from Json::Exception + */ +class JSON_API LogicError : public Exception { +public: + LogicError(String const& msg); +}; +#endif + +/// used internally +JSONCPP_NORETURN void throwRuntimeError(String const& msg); +/// used internally +JSONCPP_NORETURN void throwLogicError(String const& msg); + +/** \brief Type of the value held by a Value object. + */ +enum ValueType { + nullValue = 0, ///< 'null' value + intValue, ///< signed integer value + uintValue, ///< unsigned integer value + realValue, ///< double value + stringValue, ///< UTF-8 string value + booleanValue, ///< bool value + arrayValue, ///< array value (ordered list) + objectValue ///< object value (collection of name/value pairs). +}; + +enum CommentPlacement { + commentBefore = 0, ///< a comment placed on the line before a value + commentAfterOnSameLine, ///< a comment just after a value on the same line + commentAfter, ///< a comment on the line after a value (only make sense for + /// root value) + numberOfCommentPlacement +}; + +/** \brief Type of precision for formatting of real values. + */ +enum PrecisionType { + significantDigits = 0, ///< we set max number of significant digits in string + decimalPlaces ///< we set max number of digits after "." in string +}; + +/** \brief Lightweight wrapper to tag static string. + * + * Value constructor and objectValue member assignment takes advantage of the + * StaticString and avoid the cost of string duplication when storing the + * string or the member name. + * + * Example of usage: + * \code + * Json::Value aValue( StaticString("some text") ); + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ +class JSON_API StaticString { +public: + explicit StaticString(const char* czstring) : c_str_(czstring) {} + + operator const char*() const { return c_str_; } + + const char* c_str() const { return c_str_; } + +private: + const char* c_str_; +}; + +/** \brief Represents a JSON value. + * + * This class is a discriminated union wrapper that can represents a: + * - signed integer [range: Value::minInt - Value::maxInt] + * - unsigned integer (range: 0 - Value::maxUInt) + * - double + * - UTF-8 string + * - boolean + * - 'null' + * - an ordered list of Value + * - collection of name/value pairs (javascript object) + * + * The type of the held value is represented by a #ValueType and + * can be obtained using type(). + * + * Values of an #objectValue or #arrayValue can be accessed using operator[]() + * methods. + * Non-const methods will automatically create the a #nullValue element + * if it does not exist. + * The sequence of an #arrayValue will be automatically resized and initialized + * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. + * + * The get() methods can be used to obtain default value in the case the + * required element does not exist. + * + * It is possible to iterate over the list of member keys of an object using + * the getMemberNames() method. + * + * \note #Value string-length fit in size_t, but keys must be < 2^30. + * (The reason is an implementation detail.) A #CharReader will raise an + * exception if a bound is exceeded to avoid security holes in your app, + * but the Value API does *not* check bounds. That is the responsibility + * of the caller. + */ +class JSON_API Value { + friend class ValueIteratorBase; + +public: + using Members = std::vector; + using iterator = ValueIterator; + using const_iterator = ValueConstIterator; + using UInt = Json::UInt; + using Int = Json::Int; +#if defined(JSON_HAS_INT64) + using UInt64 = Json::UInt64; + using Int64 = Json::Int64; +#endif // defined(JSON_HAS_INT64) + using LargestInt = Json::LargestInt; + using LargestUInt = Json::LargestUInt; + using ArrayIndex = Json::ArrayIndex; + + // Required for boost integration, e. g. BOOST_TEST + using value_type = std::string; + +#if JSON_USE_NULLREF + // Binary compatibility kludges, do not use. + static const Value& null; + static const Value& nullRef; +#endif + + // null and nullRef are deprecated, use this instead. + static Value const& nullSingleton(); + + /// Minimum signed integer value that can be stored in a Json::Value. + static constexpr LargestInt minLargestInt = + LargestInt(~(LargestUInt(-1) / 2)); + /// Maximum signed integer value that can be stored in a Json::Value. + static constexpr LargestInt maxLargestInt = LargestInt(LargestUInt(-1) / 2); + /// Maximum unsigned integer value that can be stored in a Json::Value. + static constexpr LargestUInt maxLargestUInt = LargestUInt(-1); + + /// Minimum signed int value that can be stored in a Json::Value. + static constexpr Int minInt = Int(~(UInt(-1) / 2)); + /// Maximum signed int value that can be stored in a Json::Value. + static constexpr Int maxInt = Int(UInt(-1) / 2); + /// Maximum unsigned int value that can be stored in a Json::Value. + static constexpr UInt maxUInt = UInt(-1); + +#if defined(JSON_HAS_INT64) + /// Minimum signed 64 bits int value that can be stored in a Json::Value. + static constexpr Int64 minInt64 = Int64(~(UInt64(-1) / 2)); + /// Maximum signed 64 bits int value that can be stored in a Json::Value. + static constexpr Int64 maxInt64 = Int64(UInt64(-1) / 2); + /// Maximum unsigned 64 bits int value that can be stored in a Json::Value. + static constexpr UInt64 maxUInt64 = UInt64(-1); +#endif // defined(JSON_HAS_INT64) + /// Default precision for real value for string representation. + static constexpr UInt defaultRealPrecision = 17; + // The constant is hard-coded because some compiler have trouble + // converting Value::maxUInt64 to a double correctly (AIX/xlC). + // Assumes that UInt64 is a 64 bits integer. + static constexpr double maxUInt64AsDouble = 18446744073709551615.0; +// Workaround for bug in the NVIDIAs CUDA 9.1 nvcc compiler +// when using gcc and clang backend compilers. CZString +// cannot be defined as private. See issue #486 +#ifdef __NVCC__ +public: +#else +private: +#endif +#ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + class CZString { + public: + enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; + CZString(ArrayIndex index); + CZString(char const* str, unsigned length, DuplicationPolicy allocate); + CZString(CZString const& other); + CZString(CZString&& other) noexcept; + ~CZString(); + CZString& operator=(const CZString& other); + CZString& operator=(CZString&& other) noexcept; + + bool operator<(CZString const& other) const; + bool operator==(CZString const& other) const; + ArrayIndex index() const; + // const char* c_str() const; ///< \deprecated + char const* data() const; + unsigned length() const; + bool isStaticString() const; + + private: + void swap(CZString& other); + + struct StringStorage { + unsigned policy_ : 2; + unsigned length_ : 30; // 1GB max + }; + + char const* cstr_; // actually, a prefixed string, unless policy is noDup + union { + ArrayIndex index_; + StringStorage storage_; + }; + }; + +public: + typedef std::map ObjectValues; +#endif // ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION + +public: + /** + * \brief Create a default Value of the given type. + * + * This is a very useful constructor. + * To create an empty array, pass arrayValue. + * To create an empty object, pass objectValue. + * Another Value can then be set to this one by assignment. + * This is useful since clear() and resize() will not alter types. + * + * Examples: + * \code + * Json::Value null_value; // null + * Json::Value arr_value(Json::arrayValue); // [] + * Json::Value obj_value(Json::objectValue); // {} + * \endcode + */ + Value(ValueType type = nullValue); + Value(Int value); + Value(UInt value); +#if defined(JSON_HAS_INT64) + Value(Int64 value); + Value(UInt64 value); +#endif // if defined(JSON_HAS_INT64) + Value(double value); + Value(const char* value); ///< Copy til first 0. (NULL causes to seg-fault.) + Value(const char* begin, const char* end); ///< Copy all, incl zeroes. + /** + * \brief Constructs a value from a static string. + * + * Like other value string constructor but do not duplicate the string for + * internal storage. The given string must remain alive after the call to + * this constructor. + * + * \note This works only for null-terminated strings. (We cannot change the + * size of this class, so we have nowhere to store the length, which might be + * computed later for various operations.) + * + * Example of usage: + * \code + * static StaticString foo("some text"); + * Json::Value aValue(foo); + * \endcode + */ + Value(const StaticString& value); + Value(const String& value); + Value(bool value); + Value(std::nullptr_t ptr) = delete; + Value(const Value& other); + Value(Value&& other) noexcept; + ~Value(); + + /// \note Overwrite existing comments. To preserve comments, use + /// #swapPayload(). + Value& operator=(const Value& other); + Value& operator=(Value&& other) noexcept; + + /// Swap everything. + void swap(Value& other); + /// Swap values but leave comments and source offsets in place. + void swapPayload(Value& other); + + /// copy everything. + void copy(const Value& other); + /// copy values but leave comments and source offsets in place. + void copyPayload(const Value& other); + + ValueType type() const; + + /// Compare payload only, not comments etc. + bool operator<(const Value& other) const; + bool operator<=(const Value& other) const; + bool operator>=(const Value& other) const; + bool operator>(const Value& other) const; + bool operator==(const Value& other) const; + bool operator!=(const Value& other) const; + int compare(const Value& other) const; + + const char* asCString() const; ///< Embedded zeroes could cause you trouble! +#if JSONCPP_USING_SECURE_MEMORY + unsigned getCStringLength() const; // Allows you to understand the length of + // the CString +#endif + String asString() const; ///< Embedded zeroes are possible. + /** Get raw char* of string-value. + * \return false if !string. (Seg-fault if str or end are NULL.) + */ + bool getString(char const** begin, char const** end) const; + Int asInt() const; + UInt asUInt() const; +#if defined(JSON_HAS_INT64) + Int64 asInt64() const; + UInt64 asUInt64() const; +#endif // if defined(JSON_HAS_INT64) + LargestInt asLargestInt() const; + LargestUInt asLargestUInt() const; + float asFloat() const; + double asDouble() const; + bool asBool() const; + + bool isNull() const; + bool isBool() const; + bool isInt() const; + bool isInt64() const; + bool isUInt() const; + bool isUInt64() const; + bool isIntegral() const; + bool isDouble() const; + bool isNumeric() const; + bool isString() const; + bool isArray() const; + bool isObject() const; + + /// The `as` and `is` member function templates and specializations. + template T as() const JSONCPP_TEMPLATE_DELETE; + template bool is() const JSONCPP_TEMPLATE_DELETE; + + bool isConvertibleTo(ValueType other) const; + + /// Number of values in array or object + ArrayIndex size() const; + + /// \brief Return true if empty array, empty object, or null; + /// otherwise, false. + bool empty() const; + + /// Return !isNull() + explicit operator bool() const; + + /// Remove all object members and array elements. + /// \pre type() is arrayValue, objectValue, or nullValue + /// \post type() is unchanged + void clear(); + + /// Resize the array to newSize elements. + /// New elements are initialized to null. + /// May only be called on nullValue or arrayValue. + /// \pre type() is arrayValue or nullValue + /// \post type() is arrayValue + void resize(ArrayIndex newSize); + + //@{ + /// Access an array element (zero based index). If the array contains less + /// than index element, then null value are inserted in the array so that + /// its size is index+1. + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + Value& operator[](ArrayIndex index); + Value& operator[](int index); + //@} + + //@{ + /// Access an array element (zero based index). + /// (You may need to say 'value[0u]' to get your compiler to distinguish + /// this from the operator[] which takes a string.) + const Value& operator[](ArrayIndex index) const; + const Value& operator[](int index) const; + //@} + + /// If the array contains at least index+1 elements, returns the element + /// value, otherwise returns defaultValue. + Value get(ArrayIndex index, const Value& defaultValue) const; + /// Return true if index < size(). + bool isValidIndex(ArrayIndex index) const; + /// \brief Append value to array at the end. + /// + /// Equivalent to jsonvalue[jsonvalue.size()] = value; + Value& append(const Value& value); + Value& append(Value&& value); + + /// \brief Insert value in array at specific index + bool insert(ArrayIndex index, const Value& newValue); + bool insert(ArrayIndex index, Value&& newValue); + + /// Access an object value by name, create a null member if it does not exist. + /// \note Because of our implementation, keys are limited to 2^30 -1 chars. + /// Exceeding that will cause an exception. + Value& operator[](const char* key); + /// Access an object value by name, returns null if there is no member with + /// that name. + const Value& operator[](const char* key) const; + /// Access an object value by name, create a null member if it does not exist. + /// \param key may contain embedded nulls. + Value& operator[](const String& key); + /// Access an object value by name, returns null if there is no member with + /// that name. + /// \param key may contain embedded nulls. + const Value& operator[](const String& key) const; + /** \brief Access an object value by name, create a null member if it does not + * exist. + * + * If the object has no entry for that name, then the member name used to + * store the new entry is not duplicated. + * Example of use: + * \code + * Json::Value object; + * static const StaticString code("code"); + * object[code] = 1234; + * \endcode + */ + Value& operator[](const StaticString& key); + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + Value get(const char* key, const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \note key may contain embedded nulls. + Value get(const char* begin, const char* end, + const Value& defaultValue) const; + /// Return the member named key if it exist, defaultValue otherwise. + /// \note deep copy + /// \param key may contain embedded nulls. + Value get(const String& key, const Value& defaultValue) const; + /// Most general and efficient version of isMember()const, get()const, + /// and operator[]const + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + Value const* find(char const* begin, char const* end) const; + /// Most general and efficient version of object-mutators. + /// \note As stated elsewhere, behavior is undefined if (end-begin) >= 2^30 + /// \return non-zero, but JSON_ASSERT if this is neither object nor nullValue. + Value* demand(char const* begin, char const* end); + /// \brief Remove and return the named member. + /// + /// Do nothing if it did not exist. + /// \pre type() is objectValue or nullValue + /// \post type() is unchanged + void removeMember(const char* key); + /// Same as removeMember(const char*) + /// \param key may contain embedded nulls. + void removeMember(const String& key); + /// Same as removeMember(const char* begin, const char* end, Value* removed), + /// but 'key' is null-terminated. + bool removeMember(const char* key, Value* removed); + /** \brief Remove the named map member. + * + * Update 'removed' iff removed. + * \param key may contain embedded nulls. + * \return true iff removed (no exceptions) + */ + bool removeMember(String const& key, Value* removed); + /// Same as removeMember(String const& key, Value* removed) + bool removeMember(const char* begin, const char* end, Value* removed); + /** \brief Remove the indexed array element. + * + * O(n) expensive operations. + * Update 'removed' iff removed. + * \return true if removed (no exceptions) + */ + bool removeIndex(ArrayIndex index, Value* removed); + + /// Return true if the object has a member named key. + /// \note 'key' must be null-terminated. + bool isMember(const char* key) const; + /// Return true if the object has a member named key. + /// \param key may contain embedded nulls. + bool isMember(const String& key) const; + /// Same as isMember(String const& key)const + bool isMember(const char* begin, const char* end) const; + + /// \brief Return a list of the member names. + /// + /// If null, return an empty list. + /// \pre type() is objectValue or nullValue + /// \post if type() was nullValue, it remains nullValue + Members getMemberNames() const; + + /// \deprecated Always pass len. + JSONCPP_DEPRECATED("Use setComment(String const&) instead.") + void setComment(const char* comment, CommentPlacement placement) { + setComment(String(comment, strlen(comment)), placement); + } + /// Comments must be //... or /* ... */ + void setComment(const char* comment, size_t len, CommentPlacement placement) { + setComment(String(comment, len), placement); + } + /// Comments must be //... or /* ... */ + void setComment(String comment, CommentPlacement placement); + bool hasComment(CommentPlacement placement) const; + /// Include delimiters and embedded newlines. + String getComment(CommentPlacement placement) const; + + String toStyledString() const; + + const_iterator begin() const; + const_iterator end() const; + + iterator begin(); + iterator end(); + + // Accessors for the [start, limit) range of bytes within the JSON text from + // which this value was parsed, if any. + void setOffsetStart(ptrdiff_t start); + void setOffsetLimit(ptrdiff_t limit); + ptrdiff_t getOffsetStart() const; + ptrdiff_t getOffsetLimit() const; + +private: + void setType(ValueType v) { + bits_.value_type_ = static_cast(v); + } + bool isAllocated() const { return bits_.allocated_; } + void setIsAllocated(bool v) { bits_.allocated_ = v; } + + void initBasic(ValueType type, bool allocated = false); + void dupPayload(const Value& other); + void releasePayload(); + void dupMeta(const Value& other); + + Value& resolveReference(const char* key); + Value& resolveReference(const char* key, const char* end); + + // struct MemberNamesTransform + //{ + // typedef const char *result_type; + // const char *operator()( const CZString &name ) const + // { + // return name.c_str(); + // } + //}; + + union ValueHolder { + LargestInt int_; + LargestUInt uint_; + double real_; + bool bool_; + char* string_; // if allocated_, ptr to { unsigned, char[] }. + ObjectValues* map_; + } value_; + + struct { + // Really a ValueType, but types should agree for bitfield packing. + unsigned int value_type_ : 8; + // Unless allocated_, string_ must be null-terminated. + unsigned int allocated_ : 1; + } bits_; + + class Comments { + public: + Comments() = default; + Comments(const Comments& that); + Comments(Comments&& that) noexcept; + Comments& operator=(const Comments& that); + Comments& operator=(Comments&& that) noexcept; + bool has(CommentPlacement slot) const; + String get(CommentPlacement slot) const; + void set(CommentPlacement slot, String comment); + + private: + using Array = std::array; + std::unique_ptr ptr_; + }; + Comments comments_; + + // [start, limit) byte offsets in the source JSON text from which this Value + // was extracted. + ptrdiff_t start_; + ptrdiff_t limit_; +}; + +template <> inline bool Value::as() const { return asBool(); } +template <> inline bool Value::is() const { return isBool(); } + +template <> inline Int Value::as() const { return asInt(); } +template <> inline bool Value::is() const { return isInt(); } + +template <> inline UInt Value::as() const { return asUInt(); } +template <> inline bool Value::is() const { return isUInt(); } + +#if defined(JSON_HAS_INT64) +template <> inline Int64 Value::as() const { return asInt64(); } +template <> inline bool Value::is() const { return isInt64(); } + +template <> inline UInt64 Value::as() const { return asUInt64(); } +template <> inline bool Value::is() const { return isUInt64(); } +#endif + +template <> inline double Value::as() const { return asDouble(); } +template <> inline bool Value::is() const { return isDouble(); } + +template <> inline String Value::as() const { return asString(); } +template <> inline bool Value::is() const { return isString(); } + +/// These `as` specializations are type conversions, and do not have a +/// corresponding `is`. +template <> inline float Value::as() const { return asFloat(); } +template <> inline const char* Value::as() const { + return asCString(); +} + +/** \brief Experimental and untested: represents an element of the "path" to + * access a node. + */ +class JSON_API PathArgument { +public: + friend class Path; + + PathArgument(); + PathArgument(ArrayIndex index); + PathArgument(const char* key); + PathArgument(String key); + +private: + enum Kind { kindNone = 0, kindIndex, kindKey }; + String key_; + ArrayIndex index_{}; + Kind kind_{kindNone}; +}; + +/** \brief Experimental and untested: represents a "path" to access a node. + * + * Syntax: + * - "." => root node + * - ".[n]" => elements at index 'n' of root node (an array value) + * - ".name" => member named 'name' of root node (an object value) + * - ".name1.name2.name3" + * - ".[0][1][2].name1[3]" + * - ".%" => member name is provided as parameter + * - ".[%]" => index is provided as parameter + */ +class JSON_API Path { +public: + Path(const String& path, const PathArgument& a1 = PathArgument(), + const PathArgument& a2 = PathArgument(), + const PathArgument& a3 = PathArgument(), + const PathArgument& a4 = PathArgument(), + const PathArgument& a5 = PathArgument()); + + const Value& resolve(const Value& root) const; + Value resolve(const Value& root, const Value& defaultValue) const; + /// Creates the "path" to access the specified node and returns a reference on + /// the node. + Value& make(Value& root) const; + +private: + using InArgs = std::vector; + using Args = std::vector; + + void makePath(const String& path, const InArgs& in); + void addPathInArg(const String& path, const InArgs& in, + InArgs::const_iterator& itInArg, PathArgument::Kind kind); + static void invalidPath(const String& path, int location); + + Args args_; +}; + +/** \brief base class for Value iterators. + * + */ +class JSON_API ValueIteratorBase { +public: + using iterator_category = std::bidirectional_iterator_tag; + using size_t = unsigned int; + using difference_type = int; + using SelfType = ValueIteratorBase; + + bool operator==(const SelfType& other) const { return isEqual(other); } + + bool operator!=(const SelfType& other) const { return !isEqual(other); } + + difference_type operator-(const SelfType& other) const { + return other.computeDistance(*this); + } + + /// Return either the index or the member name of the referenced value as a + /// Value. + Value key() const; + + /// Return the index of the referenced Value, or -1 if it is not an + /// arrayValue. + UInt index() const; + + /// Return the member name of the referenced Value, or "" if it is not an + /// objectValue. + /// \note Avoid `c_str()` on result, as embedded zeroes are possible. + String name() const; + + /// Return the member name of the referenced Value. "" if it is not an + /// objectValue. + /// \deprecated This cannot be used for UTF-8 strings, since there can be + /// embedded nulls. + JSONCPP_DEPRECATED("Use `key = name();` instead.") + char const* memberName() const; + /// Return the member name of the referenced Value, or NULL if it is not an + /// objectValue. + /// \note Better version than memberName(). Allows embedded nulls. + char const* memberName(char const** end) const; + +protected: + /*! Internal utility functions to assist with implementing + * other iterator functions. The const and non-const versions + * of the "deref" protected methods expose the protected + * current_ member variable in a way that can often be + * optimized away by the compiler. + */ + const Value& deref() const; + Value& deref(); + + void increment(); + + void decrement(); + + difference_type computeDistance(const SelfType& other) const; + + bool isEqual(const SelfType& other) const; + + void copy(const SelfType& other); + +private: + Value::ObjectValues::iterator current_; + // Indicates that iterator is for a null value. + bool isNull_{true}; + +public: + // For some reason, BORLAND needs these at the end, rather + // than earlier. No idea why. + ValueIteratorBase(); + explicit ValueIteratorBase(const Value::ObjectValues::iterator& current); +}; + +/** \brief const iterator for object and array value. + * + */ +class JSON_API ValueConstIterator : public ValueIteratorBase { + friend class Value; + +public: + using value_type = const Value; + // typedef unsigned int size_t; + // typedef int difference_type; + using reference = const Value&; + using pointer = const Value*; + using SelfType = ValueConstIterator; + + ValueConstIterator(); + ValueConstIterator(ValueIterator const& other); + +private: + /*! \internal Use by Value to create an iterator. + */ + explicit ValueConstIterator(const Value::ObjectValues::iterator& current); + +public: + SelfType& operator=(const ValueIteratorBase& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + reference operator*() const { return deref(); } + + pointer operator->() const { return &deref(); } +}; + +/** \brief Iterator for object and array value. + */ +class JSON_API ValueIterator : public ValueIteratorBase { + friend class Value; + +public: + using value_type = Value; + using size_t = unsigned int; + using difference_type = int; + using reference = Value&; + using pointer = Value*; + using SelfType = ValueIterator; + + ValueIterator(); + explicit ValueIterator(const ValueConstIterator& other); + ValueIterator(const ValueIterator& other); + +private: + /*! \internal Use by Value to create an iterator. + */ + explicit ValueIterator(const Value::ObjectValues::iterator& current); + +public: + SelfType& operator=(const SelfType& other); + + SelfType operator++(int) { + SelfType temp(*this); + ++*this; + return temp; + } + + SelfType operator--(int) { + SelfType temp(*this); + --*this; + return temp; + } + + SelfType& operator--() { + decrement(); + return *this; + } + + SelfType& operator++() { + increment(); + return *this; + } + + /*! The return value of non-const iterators can be + * changed, so the these functions are not const + * because the returned references/pointers can be used + * to change state of the base class. + */ + reference operator*() const { return const_cast(deref()); } + pointer operator->() const { return const_cast(&deref()); } +}; + +inline void swap(Value& a, Value& b) { a.swap(b); } + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h new file mode 100644 index 0000000..99a27fa --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/version.h @@ -0,0 +1,28 @@ +#ifndef JSON_VERSION_H_INCLUDED +#define JSON_VERSION_H_INCLUDED + +// Note: version must be updated in three places when doing a release. This +// annoying process ensures that amalgamate, CMake, and meson all report the +// correct version. +// 1. /meson.build +// 2. /include/json/version.h +// 3. /CMakeLists.txt +// IMPORTANT: also update the SOVERSION!! + +#define JSONCPP_VERSION_STRING "1.9.5" +#define JSONCPP_VERSION_MAJOR 1 +#define JSONCPP_VERSION_MINOR 9 +#define JSONCPP_VERSION_PATCH 5 +#define JSONCPP_VERSION_QUALIFIER +#define JSONCPP_VERSION_HEXA \ + ((JSONCPP_VERSION_MAJOR << 24) | (JSONCPP_VERSION_MINOR << 16) | \ + (JSONCPP_VERSION_PATCH << 8)) + +#ifdef JSONCPP_USING_SECURE_MEMORY +#undef JSONCPP_USING_SECURE_MEMORY +#endif +#define JSONCPP_USING_SECURE_MEMORY 0 +// If non-zero, the library zeroes any memory that it has allocated before +// it frees its memory. + +#endif // JSON_VERSION_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h new file mode 100644 index 0000000..acf7c35 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json/writer.h @@ -0,0 +1,369 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef JSON_WRITER_H_INCLUDED +#define JSON_WRITER_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include "value.h" +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include + +// Disable warning C4251: : needs to have dll-interface to +// be used by... +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) && defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4251) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#pragma pack(push, 8) + +namespace Json { + +class Value; + +/** + * + * Usage: + * \code + * using namespace Json; + * void writeToStdout(StreamWriter::Factory const& factory, Value const& value) + * { std::unique_ptr const writer( factory.newStreamWriter()); + * writer->write(value, &std::cout); + * std::cout << std::endl; // add lf and flush + * } + * \endcode + */ +class JSON_API StreamWriter { +protected: + OStream* sout_; // not owned; will not delete +public: + StreamWriter(); + virtual ~StreamWriter(); + /** Write Value into document as configured in sub-class. + * Do not take ownership of sout, but maintain a reference during function. + * \pre sout != NULL + * \return zero on success (For now, we always return zero, so check the + * stream instead.) \throw std::exception possibly, depending on + * configuration + */ + virtual int write(Value const& root, OStream* sout) = 0; + + /** \brief A simple abstract factory. + */ + class JSON_API Factory { + public: + virtual ~Factory(); + /** \brief Allocate a CharReader via operator new(). + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + virtual StreamWriter* newStreamWriter() const = 0; + }; // Factory +}; // StreamWriter + +/** \brief Write into stringstream, then return string, for convenience. + * A StreamWriter will be created from the factory, used, and then deleted. + */ +String JSON_API writeString(StreamWriter::Factory const& factory, + Value const& root); + +/** \brief Build a StreamWriter implementation. + +* Usage: +* \code +* using namespace Json; +* Value value = ...; +* StreamWriterBuilder builder; +* builder["commentStyle"] = "None"; +* builder["indentation"] = " "; // or whatever you like +* std::unique_ptr writer( +* builder.newStreamWriter()); +* writer->write(value, &std::cout); +* std::cout << std::endl; // add lf and flush +* \endcode +*/ +class JSON_API StreamWriterBuilder : public StreamWriter::Factory { +public: + // Note: We use a Json::Value so that we can add data-members to this class + // without a major version bump. + /** Configuration of this builder. + * Available settings (case-sensitive): + * - "commentStyle": "None" or "All" + * - "indentation": "". + * - Setting this to an empty string also omits newline characters. + * - "enableYAMLCompatibility": false or true + * - slightly change the whitespace around colons + * - "dropNullPlaceholders": false or true + * - Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's JavaScript, it makes for smaller output and the + * browser can handle the output just fine. + * - "useSpecialFloats": false or true + * - If true, outputs non-finite floating point values in the following way: + * NaN values as "NaN", positive infinity as "Infinity", and negative + * infinity as "-Infinity". + * - "precision": int + * - Number of precision digits for formatting of real values. + * - "precisionType": "significant"(default) or "decimal" + * - Type of precision for formatting of real values. + * - "emitUTF8": false or true + * - If true, outputs raw UTF8 strings instead of escaping them. + + * You can examine 'settings_` yourself + * to see the defaults. You can also write and read them just like any + * JSON Value. + * \sa setDefaults() + */ + Json::Value settings_; + + StreamWriterBuilder(); + ~StreamWriterBuilder() override; + + /** + * \throw std::exception if something goes wrong (e.g. invalid settings) + */ + StreamWriter* newStreamWriter() const override; + + /** \return true if 'settings' are legal and consistent; + * otherwise, indicate bad settings via 'invalid'. + */ + bool validate(Json::Value* invalid) const; + /** A simple way to update a specific setting. + */ + Value& operator[](const String& key); + + /** Called by ctor, but you can use this to reset settings_. + * \pre 'settings' != NULL (but Json::null is fine) + * \remark Defaults: + * \snippet src/lib_json/json_writer.cpp StreamWriterBuilderDefaults + */ + static void setDefaults(Json::Value* settings); +}; + +/** \brief Abstract class for writers. + * \deprecated Use StreamWriter. (And really, this is an implementation detail.) + */ +class JSON_API Writer { +public: + virtual ~Writer(); + + virtual String write(const Value& root) = 0; +}; + +/** \brief Outputs a Value in JSON format + *without formatting (not human friendly). + * + * The JSON document is written in a single line. It is not intended for 'human' + *consumption, + * but may be useful to support feature such as RPC where bandwidth is limited. + * \sa Reader, Value + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSON_API FastWriter + : public Writer { +public: + FastWriter(); + ~FastWriter() override = default; + + void enableYAMLCompatibility(); + + /** \brief Drop the "null" string from the writer's output for nullValues. + * Strictly speaking, this is not valid JSON. But when the output is being + * fed to a browser's JavaScript, it makes for smaller output and the + * browser can handle the output just fine. + */ + void dropNullPlaceholders(); + + void omitEndingLineFeed(); + +public: // overridden from Writer + String write(const Value& root) override; + +private: + void writeValue(const Value& value); + + String document_; + bool yamlCompatibilityEnabled_{false}; + bool dropNullPlaceholders_{false}; + bool omitEndingLineFeed_{false}; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +/** \brief Writes a Value in JSON format in a + *human friendly way. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + *line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + *types, + * and all the values fit on one lines, then print the array on a single + *line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + *#CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSON_API + StyledWriter : public Writer { +public: + StyledWriter(); + ~StyledWriter() override = default; + +public: // overridden from Writer + /** \brief Serialize a Value in JSON format. + * \param root Value to serialize. + * \return String containing the JSON document that represents the root value. + */ + String write(const Value& root) override; + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultilineArray(const Value& value); + void pushValue(const String& value); + void writeIndent(); + void writeWithIndent(const String& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); + + using ChildValues = std::vector; + + ChildValues childValues_; + String document_; + String indentString_; + unsigned int rightMargin_{74}; + unsigned int indentSize_{3}; + bool addChildValues_{false}; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +/** \brief Writes a Value in JSON format in a + human friendly way, + to a stream rather than to a string. + * + * The rules for line break and indent are as follow: + * - Object value: + * - if empty then print {} without indent and line break + * - if not empty the print '{', line break & indent, print one value per + line + * and then unindent and line break and print '}'. + * - Array value: + * - if empty then print [] without indent and line break + * - if the array contains no object value, empty array or some other value + types, + * and all the values fit on one lines, then print the array on a single + line. + * - otherwise, it the values do not fit on one line, or the array contains + * object or non empty array, then print one value per line. + * + * If the Value have comments then they are outputed according to their + #CommentPlacement. + * + * \sa Reader, Value, Value::setComment() + * \deprecated Use StreamWriterBuilder. + */ +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) // Deriving from deprecated class +#endif +class JSON_API + StyledStreamWriter { +public: + /** + * \param indentation Each level will be indented by this amount extra. + */ + StyledStreamWriter(String indentation = "\t"); + ~StyledStreamWriter() = default; + +public: + /** \brief Serialize a Value in JSON format. + * \param out Stream to write to. (Can be ostringstream, e.g.) + * \param root Value to serialize. + * \note There is no point in deriving from Writer, since write() should not + * return a value. + */ + void write(OStream& out, const Value& root); + +private: + void writeValue(const Value& value); + void writeArrayValue(const Value& value); + bool isMultilineArray(const Value& value); + void pushValue(const String& value); + void writeIndent(); + void writeWithIndent(const String& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(const Value& root); + void writeCommentAfterValueOnSameLine(const Value& root); + static bool hasCommentForValue(const Value& value); + static String normalizeEOL(const String& text); + + using ChildValues = std::vector; + + ChildValues childValues_; + OStream* document_; + String indentString_; + unsigned int rightMargin_{74}; + String indentation_; + bool addChildValues_ : 1; + bool indented_ : 1; +}; +#if defined(_MSC_VER) +#pragma warning(pop) +#endif + +#if defined(JSON_HAS_INT64) +String JSON_API valueToString(Int value); +String JSON_API valueToString(UInt value); +#endif // if defined(JSON_HAS_INT64) +String JSON_API valueToString(LargestInt value); +String JSON_API valueToString(LargestUInt value); +String JSON_API valueToString( + double value, unsigned int precision = Value::defaultRealPrecision, + PrecisionType precisionType = PrecisionType::significantDigits); +String JSON_API valueToString(bool value); +String JSON_API valueToQuotedString(const char* value); + +/// \brief Output using the StyledStreamWriter. +/// \see Json::operator>>() +JSON_API OStream& operator<<(OStream&, const Value& root); + +} // namespace Json + +#pragma pack(pop) + +#if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) +#pragma warning(pop) +#endif // if defined(JSONCPP_DISABLE_DLL_INTERFACE_WARNING) + +#endif // JSON_WRITER_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp new file mode 100644 index 0000000..02f4b2f --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_reader.cpp @@ -0,0 +1,1992 @@ +// Copyright 2007-2011 Baptiste Lepilleur and The JsonCpp Authors +// Copyright (C) 2016 InfoTeCS JSC. All rights reserved. +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#if __cplusplus >= 201103L + +#if !defined(sscanf) +#define sscanf std::sscanf +#endif + +#endif //__cplusplus + +#if defined(_MSC_VER) +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES +#endif //_MSC_VER + +#if defined(_MSC_VER) +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +// Define JSONCPP_DEPRECATED_STACK_LIMIT as an appropriate integer at compile +// time to change the stack limit +#if !defined(JSONCPP_DEPRECATED_STACK_LIMIT) +#define JSONCPP_DEPRECATED_STACK_LIMIT 1000 +#endif + +static size_t const stackLimit_g = + JSONCPP_DEPRECATED_STACK_LIMIT; // see readValue() + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +using CharReaderPtr = std::unique_ptr; +#else +using CharReaderPtr = std::auto_ptr; +#endif + +// Implementation of class Features +// //////////////////////////////// + +Features::Features() = default; + +Features Features::all() { return {}; } + +Features Features::strictMode() { + Features features; + features.allowComments_ = false; + features.strictRoot_ = true; + features.allowDroppedNullPlaceholders_ = false; + features.allowNumericKeys_ = false; + return features; +} + +// Implementation of class Reader +// //////////////////////////////// + +bool Reader::containsNewLine(Reader::Location begin, Reader::Location end) { + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); +} + +// Class Reader +// ////////////////////////////////////////////////////////////////// + +Reader::Reader() : features_(Features::all()) {} + +Reader::Reader(const Features& features) : features_(features) {} + +bool Reader::parse(const std::string& document, Value& root, + bool collectComments) { + document_.assign(document.begin(), document.end()); + const char* begin = document_.c_str(); + const char* end = begin + document_.length(); + return parse(begin, end, root, collectComments); +} + +bool Reader::parse(std::istream& is, Value& root, bool collectComments) { + // std::istream_iterator begin(is); + // std::istream_iterator end; + // Those would allow streamed input from a file, if parse() were a + // template function. + + // Since String is reference-counted, this at least does not + // create an extra copy. + String doc(std::istreambuf_iterator(is), {}); + return parse(doc.data(), doc.data() + doc.size(), root, collectComments); +} + +bool Reader::parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + bool successful = readValue(); + Token token; + skipCommentTokens(token); + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool Reader::readValue() { + // readValue() may call itself only if it calls readObject() or ReadArray(). + // These methods execute nodes_.push() just before and nodes_.pop)() just + // after calling readValue(). parse() executes one nodes_.push(), so > instead + // of >=. + if (nodes_.size() > stackLimit_g) + throwRuntimeError("Exceeded stackLimit in readValue()."); + + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenFalse: { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNull: { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // Else, fall through... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void Reader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool Reader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + token.type_ = tokenNumber; + readNumber(); + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return ok; +} + +void Reader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +bool Reader::match(const Char* pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool Reader::readComment() { + Location commentBegin = current_ - 1; + Char c = getNextChar(); + bool successful = false; + if (c == '*') + successful = readCStyleComment(); + else if (c == '/') + successful = readCppStyleComment(); + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (c != '*' || !containsNewLine(commentBegin, current_)) + placement = commentAfterOnSameLine; + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +String Reader::normalizeEOL(Reader::Location begin, Reader::Location end) { + String normalized; + normalized.reserve(static_cast(end - begin)); + Reader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void Reader::addComment(Location begin, Location end, + CommentPlacement placement) { + assert(collectComments_); + const String& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != nullptr); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool Reader::readCStyleComment() { + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + } + return getNextChar() == '/'; +} + +bool Reader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +void Reader::readNumber() { + Location p = current_; + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } +} + +bool Reader::readString() { + Char c = '\0'; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool Reader::readObject(Token& token) { + Token tokenName; + String name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && name.empty()) // empty object + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); +} + +bool Reader::readArray(Token& token) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + skipSpaces(); + if (current_ != end_ && *current_ == ']') // empty array + { + Token endArray; + readToken(endArray); + return true; + } + int index = 0; + for (;;) { + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token currentToken; + // Accept Comment after last item in the array. + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); + } + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); + } + if (currentToken.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool Reader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + bool isNegative = *current == '-'; + if (isNegative) + ++current; + // TODO: Help the compiler do the div and mod at compile time or get rid of + // them. + Value::LargestUInt maxIntegerValue = + isNegative ? Value::LargestUInt(Value::maxLargestInt) + 1 + : Value::maxLargestUInt; + Value::LargestUInt threshold = maxIntegerValue / 10; + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + auto digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, b) this is the last digit, and + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > maxIntegerValue % 10) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + if (isNegative && value == maxIntegerValue) + decoded = Value::minLargestInt; + else if (isNegative) + decoded = -Value::LargestInt(value); + else if (value <= Value::LargestUInt(Value::maxInt)) + decoded = Value::LargestInt(value); + else + decoded = value; + return true; +} + +bool Reader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + String buffer(token.start_, token.end_); + IStringStream is(buffer); + if (!(is >> value)) + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); + decoded = value; + return true; +} + +bool Reader::decodeString(Token& token) { + String decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool Reader::decodeString(Token& token, String& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool Reader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, current); + if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, current); + } + return true; +} + +bool Reader::decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool Reader::addError(const String& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool Reader::recoverFromError(TokenType skipUntilToken) { + size_t const errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool Reader::addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& Reader::currentValue() { return *(nodes_.top()); } + +Reader::Char Reader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void Reader::getLocationLineAndColumn(Location location, int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +String Reader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +// Deprecated. Preserved for backward compatibility +String Reader::getFormatedErrorMessages() const { + return getFormattedErrorMessages(); +} + +String Reader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector Reader::getStructuredErrors() const { + std::vector allErrors; + for (const auto& error : errors_) { + Reader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +bool Reader::pushError(const Value& value, const String& message) { + ptrdiff_t const length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = nullptr; + errors_.push_back(info); + return true; +} + +bool Reader::pushError(const Value& value, const String& message, + const Value& extra) { + ptrdiff_t const length = end_ - begin_; + if (value.getOffsetStart() > length || value.getOffsetLimit() > length || + extra.getOffsetLimit() > length) + return false; + Token token; + token.type_ = tokenError; + token.start_ = begin_ + value.getOffsetStart(); + token.end_ = begin_ + value.getOffsetLimit(); + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = begin_ + extra.getOffsetStart(); + errors_.push_back(info); + return true; +} + +bool Reader::good() const { return errors_.empty(); } + +// Originally copied from the Features class (now deprecated), used internally +// for features implementation. +class OurFeatures { +public: + static OurFeatures all(); + bool allowComments_; + bool allowTrailingCommas_; + bool strictRoot_; + bool allowDroppedNullPlaceholders_; + bool allowNumericKeys_; + bool allowSingleQuotes_; + bool failIfExtra_; + bool rejectDupKeys_; + bool allowSpecialFloats_; + bool skipBom_; + size_t stackLimit_; +}; // OurFeatures + +OurFeatures OurFeatures::all() { return {}; } + +// Implementation of class Reader +// //////////////////////////////// + +// Originally copied from the Reader class (now deprecated), used internally +// for implementing JSON reading. +class OurReader { +public: + using Char = char; + using Location = const Char*; + struct StructuredError { + ptrdiff_t offset_start; + ptrdiff_t offset_limit; + String message; + }; + + explicit OurReader(OurFeatures const& features); + bool parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments = true); + String getFormattedErrorMessages() const; + std::vector getStructuredErrors() const; + +private: + OurReader(OurReader const&); // no impl + void operator=(OurReader const&); // no impl + + enum TokenType { + tokenEndOfStream = 0, + tokenObjectBegin, + tokenObjectEnd, + tokenArrayBegin, + tokenArrayEnd, + tokenString, + tokenNumber, + tokenTrue, + tokenFalse, + tokenNull, + tokenNaN, + tokenPosInf, + tokenNegInf, + tokenArraySeparator, + tokenMemberSeparator, + tokenComment, + tokenError + }; + + class Token { + public: + TokenType type_; + Location start_; + Location end_; + }; + + class ErrorInfo { + public: + Token token_; + String message_; + Location extra_; + }; + + using Errors = std::deque; + + bool readToken(Token& token); + void skipSpaces(); + void skipBom(bool skipBom); + bool match(const Char* pattern, int patternLength); + bool readComment(); + bool readCStyleComment(bool* containsNewLineResult); + bool readCppStyleComment(); + bool readString(); + bool readStringSingleQuote(); + bool readNumber(bool checkInf); + bool readValue(); + bool readObject(Token& token); + bool readArray(Token& token); + bool decodeNumber(Token& token); + bool decodeNumber(Token& token, Value& decoded); + bool decodeString(Token& token); + bool decodeString(Token& token, String& decoded); + bool decodeDouble(Token& token); + bool decodeDouble(Token& token, Value& decoded); + bool decodeUnicodeCodePoint(Token& token, Location& current, Location end, + unsigned int& unicode); + bool decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, unsigned int& unicode); + bool addError(const String& message, Token& token, Location extra = nullptr); + bool recoverFromError(TokenType skipUntilToken); + bool addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken); + void skipUntilSpace(); + Value& currentValue(); + Char getNextChar(); + void getLocationLineAndColumn(Location location, int& line, + int& column) const; + String getLocationLineAndColumn(Location location) const; + void addComment(Location begin, Location end, CommentPlacement placement); + void skipCommentTokens(Token& token); + + static String normalizeEOL(Location begin, Location end); + static bool containsNewLine(Location begin, Location end); + + using Nodes = std::stack; + + Nodes nodes_{}; + Errors errors_{}; + String document_{}; + Location begin_ = nullptr; + Location end_ = nullptr; + Location current_ = nullptr; + Location lastValueEnd_ = nullptr; + Value* lastValue_ = nullptr; + bool lastValueHasAComment_ = false; + String commentsBefore_{}; + + OurFeatures const features_; + bool collectComments_ = false; +}; // OurReader + +// complete copy of Read impl, for OurReader + +bool OurReader::containsNewLine(OurReader::Location begin, + OurReader::Location end) { + return std::any_of(begin, end, [](char b) { return b == '\n' || b == '\r'; }); +} + +OurReader::OurReader(OurFeatures const& features) : features_(features) {} + +bool OurReader::parse(const char* beginDoc, const char* endDoc, Value& root, + bool collectComments) { + if (!features_.allowComments_) { + collectComments = false; + } + + begin_ = beginDoc; + end_ = endDoc; + collectComments_ = collectComments; + current_ = begin_; + lastValueEnd_ = nullptr; + lastValue_ = nullptr; + commentsBefore_.clear(); + errors_.clear(); + while (!nodes_.empty()) + nodes_.pop(); + nodes_.push(&root); + + // skip byte order mark if it exists at the beginning of the UTF-8 text. + skipBom(features_.skipBom_); + bool successful = readValue(); + nodes_.pop(); + Token token; + skipCommentTokens(token); + if (features_.failIfExtra_ && (token.type_ != tokenEndOfStream)) { + addError("Extra non-whitespace after JSON value.", token); + return false; + } + if (collectComments_ && !commentsBefore_.empty()) + root.setComment(commentsBefore_, commentAfter); + if (features_.strictRoot_) { + if (!root.isArray() && !root.isObject()) { + // Set error location to start of doc, ideally should be first token found + // in doc + token.type_ = tokenError; + token.start_ = beginDoc; + token.end_ = endDoc; + addError( + "A valid JSON document must be either an array or an object value.", + token); + return false; + } + } + return successful; +} + +bool OurReader::readValue() { + // To preserve the old behaviour we cast size_t to int. + if (nodes_.size() > features_.stackLimit_) + throwRuntimeError("Exceeded stackLimit in readValue()."); + Token token; + skipCommentTokens(token); + bool successful = true; + + if (collectComments_ && !commentsBefore_.empty()) { + currentValue().setComment(commentsBefore_, commentBefore); + commentsBefore_.clear(); + } + + switch (token.type_) { + case tokenObjectBegin: + successful = readObject(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenArrayBegin: + successful = readArray(token); + currentValue().setOffsetLimit(current_ - begin_); + break; + case tokenNumber: + successful = decodeNumber(token); + break; + case tokenString: + successful = decodeString(token); + break; + case tokenTrue: { + Value v(true); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenFalse: { + Value v(false); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNull: { + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNaN: { + Value v(std::numeric_limits::quiet_NaN()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenPosInf: { + Value v(std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenNegInf: { + Value v(-std::numeric_limits::infinity()); + currentValue().swapPayload(v); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + } break; + case tokenArraySeparator: + case tokenObjectEnd: + case tokenArrayEnd: + if (features_.allowDroppedNullPlaceholders_) { + // "Un-read" the current token and mark the current value as a null + // token. + current_--; + Value v; + currentValue().swapPayload(v); + currentValue().setOffsetStart(current_ - begin_ - 1); + currentValue().setOffsetLimit(current_ - begin_); + break; + } // else, fall through ... + default: + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return addError("Syntax error: value, object or array expected.", token); + } + + if (collectComments_) { + lastValueEnd_ = current_; + lastValueHasAComment_ = false; + lastValue_ = ¤tValue(); + } + + return successful; +} + +void OurReader::skipCommentTokens(Token& token) { + if (features_.allowComments_) { + do { + readToken(token); + } while (token.type_ == tokenComment); + } else { + readToken(token); + } +} + +bool OurReader::readToken(Token& token) { + skipSpaces(); + token.start_ = current_; + Char c = getNextChar(); + bool ok = true; + switch (c) { + case '{': + token.type_ = tokenObjectBegin; + break; + case '}': + token.type_ = tokenObjectEnd; + break; + case '[': + token.type_ = tokenArrayBegin; + break; + case ']': + token.type_ = tokenArrayEnd; + break; + case '"': + token.type_ = tokenString; + ok = readString(); + break; + case '\'': + if (features_.allowSingleQuotes_) { + token.type_ = tokenString; + ok = readStringSingleQuote(); + } else { + // If we don't allow single quotes, this is a failure case. + ok = false; + } + break; + case '/': + token.type_ = tokenComment; + ok = readComment(); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + token.type_ = tokenNumber; + readNumber(false); + break; + case '-': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenNegInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case '+': + if (readNumber(true)) { + token.type_ = tokenNumber; + } else { + token.type_ = tokenPosInf; + ok = features_.allowSpecialFloats_ && match("nfinity", 7); + } + break; + case 't': + token.type_ = tokenTrue; + ok = match("rue", 3); + break; + case 'f': + token.type_ = tokenFalse; + ok = match("alse", 4); + break; + case 'n': + token.type_ = tokenNull; + ok = match("ull", 3); + break; + case 'N': + if (features_.allowSpecialFloats_) { + token.type_ = tokenNaN; + ok = match("aN", 2); + } else { + ok = false; + } + break; + case 'I': + if (features_.allowSpecialFloats_) { + token.type_ = tokenPosInf; + ok = match("nfinity", 7); + } else { + ok = false; + } + break; + case ',': + token.type_ = tokenArraySeparator; + break; + case ':': + token.type_ = tokenMemberSeparator; + break; + case 0: + token.type_ = tokenEndOfStream; + break; + default: + ok = false; + break; + } + if (!ok) + token.type_ = tokenError; + token.end_ = current_; + return ok; +} + +void OurReader::skipSpaces() { + while (current_ != end_) { + Char c = *current_; + if (c == ' ' || c == '\t' || c == '\r' || c == '\n') + ++current_; + else + break; + } +} + +void OurReader::skipBom(bool skipBom) { + // The default behavior is to skip BOM. + if (skipBom) { + if ((end_ - begin_) >= 3 && strncmp(begin_, "\xEF\xBB\xBF", 3) == 0) { + begin_ += 3; + current_ = begin_; + } + } +} + +bool OurReader::match(const Char* pattern, int patternLength) { + if (end_ - current_ < patternLength) + return false; + int index = patternLength; + while (index--) + if (current_[index] != pattern[index]) + return false; + current_ += patternLength; + return true; +} + +bool OurReader::readComment() { + const Location commentBegin = current_ - 1; + const Char c = getNextChar(); + bool successful = false; + bool cStyleWithEmbeddedNewline = false; + + const bool isCStyleComment = (c == '*'); + const bool isCppStyleComment = (c == '/'); + if (isCStyleComment) { + successful = readCStyleComment(&cStyleWithEmbeddedNewline); + } else if (isCppStyleComment) { + successful = readCppStyleComment(); + } + + if (!successful) + return false; + + if (collectComments_) { + CommentPlacement placement = commentBefore; + + if (!lastValueHasAComment_) { + if (lastValueEnd_ && !containsNewLine(lastValueEnd_, commentBegin)) { + if (isCppStyleComment || !cStyleWithEmbeddedNewline) { + placement = commentAfterOnSameLine; + lastValueHasAComment_ = true; + } + } + } + + addComment(commentBegin, current_, placement); + } + return true; +} + +String OurReader::normalizeEOL(OurReader::Location begin, + OurReader::Location end) { + String normalized; + normalized.reserve(static_cast(end - begin)); + OurReader::Location current = begin; + while (current != end) { + char c = *current++; + if (c == '\r') { + if (current != end && *current == '\n') + // convert dos EOL + ++current; + // convert Mac EOL + normalized += '\n'; + } else { + normalized += c; + } + } + return normalized; +} + +void OurReader::addComment(Location begin, Location end, + CommentPlacement placement) { + assert(collectComments_); + const String& normalized = normalizeEOL(begin, end); + if (placement == commentAfterOnSameLine) { + assert(lastValue_ != nullptr); + lastValue_->setComment(normalized, placement); + } else { + commentsBefore_ += normalized; + } +} + +bool OurReader::readCStyleComment(bool* containsNewLineResult) { + *containsNewLineResult = false; + + while ((current_ + 1) < end_) { + Char c = getNextChar(); + if (c == '*' && *current_ == '/') + break; + if (c == '\n') + *containsNewLineResult = true; + } + + return getNextChar() == '/'; +} + +bool OurReader::readCppStyleComment() { + while (current_ != end_) { + Char c = getNextChar(); + if (c == '\n') + break; + if (c == '\r') { + // Consume DOS EOL. It will be normalized in addComment. + if (current_ != end_ && *current_ == '\n') + getNextChar(); + // Break on Moc OS 9 EOL. + break; + } + } + return true; +} + +bool OurReader::readNumber(bool checkInf) { + Location p = current_; + if (checkInf && p != end_ && *p == 'I') { + current_ = ++p; + return false; + } + char c = '0'; // stopgap for already consumed character + // integral part + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + // fractional part + if (c == '.') { + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + // exponential part + if (c == 'e' || c == 'E') { + c = (current_ = p) < end_ ? *p++ : '\0'; + if (c == '+' || c == '-') + c = (current_ = p) < end_ ? *p++ : '\0'; + while (c >= '0' && c <= '9') + c = (current_ = p) < end_ ? *p++ : '\0'; + } + return true; +} +bool OurReader::readString() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '"') + break; + } + return c == '"'; +} + +bool OurReader::readStringSingleQuote() { + Char c = 0; + while (current_ != end_) { + c = getNextChar(); + if (c == '\\') + getNextChar(); + else if (c == '\'') + break; + } + return c == '\''; +} + +bool OurReader::readObject(Token& token) { + Token tokenName; + String name; + Value init(objectValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + while (readToken(tokenName)) { + bool initialTokenOk = true; + while (tokenName.type_ == tokenComment && initialTokenOk) + initialTokenOk = readToken(tokenName); + if (!initialTokenOk) + break; + if (tokenName.type_ == tokenObjectEnd && + (name.empty() || + features_.allowTrailingCommas_)) // empty object or trailing comma + return true; + name.clear(); + if (tokenName.type_ == tokenString) { + if (!decodeString(tokenName, name)) + return recoverFromError(tokenObjectEnd); + } else if (tokenName.type_ == tokenNumber && features_.allowNumericKeys_) { + Value numberName; + if (!decodeNumber(tokenName, numberName)) + return recoverFromError(tokenObjectEnd); + name = numberName.asString(); + } else { + break; + } + if (name.length() >= (1U << 30)) + throwRuntimeError("keylength >= 2^30"); + if (features_.rejectDupKeys_ && currentValue().isMember(name)) { + String msg = "Duplicate key: '" + name + "'"; + return addErrorAndRecover(msg, tokenName, tokenObjectEnd); + } + + Token colon; + if (!readToken(colon) || colon.type_ != tokenMemberSeparator) { + return addErrorAndRecover("Missing ':' after object member name", colon, + tokenObjectEnd); + } + Value& value = currentValue()[name]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenObjectEnd); + + Token comma; + if (!readToken(comma) || + (comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && + comma.type_ != tokenComment)) { + return addErrorAndRecover("Missing ',' or '}' in object declaration", + comma, tokenObjectEnd); + } + bool finalizeTokenOk = true; + while (comma.type_ == tokenComment && finalizeTokenOk) + finalizeTokenOk = readToken(comma); + if (comma.type_ == tokenObjectEnd) + return true; + } + return addErrorAndRecover("Missing '}' or object member name", tokenName, + tokenObjectEnd); +} + +bool OurReader::readArray(Token& token) { + Value init(arrayValue); + currentValue().swapPayload(init); + currentValue().setOffsetStart(token.start_ - begin_); + int index = 0; + for (;;) { + skipSpaces(); + if (current_ != end_ && *current_ == ']' && + (index == 0 || + (features_.allowTrailingCommas_ && + !features_.allowDroppedNullPlaceholders_))) // empty array or trailing + // comma + { + Token endArray; + readToken(endArray); + return true; + } + Value& value = currentValue()[index++]; + nodes_.push(&value); + bool ok = readValue(); + nodes_.pop(); + if (!ok) // error already set + return recoverFromError(tokenArrayEnd); + + Token currentToken; + // Accept Comment after last item in the array. + ok = readToken(currentToken); + while (currentToken.type_ == tokenComment && ok) { + ok = readToken(currentToken); + } + bool badTokenType = (currentToken.type_ != tokenArraySeparator && + currentToken.type_ != tokenArrayEnd); + if (!ok || badTokenType) { + return addErrorAndRecover("Missing ',' or ']' in array declaration", + currentToken, tokenArrayEnd); + } + if (currentToken.type_ == tokenArrayEnd) + break; + } + return true; +} + +bool OurReader::decodeNumber(Token& token) { + Value decoded; + if (!decodeNumber(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeNumber(Token& token, Value& decoded) { + // Attempts to parse the number as an integer. If the number is + // larger than the maximum supported value of an integer then + // we decode the number as a double. + Location current = token.start_; + const bool isNegative = *current == '-'; + if (isNegative) { + ++current; + } + + // We assume we can represent the largest and smallest integer types as + // unsigned integers with separate sign. This is only true if they can fit + // into an unsigned integer. + static_assert(Value::maxLargestInt <= Value::maxLargestUInt, + "Int must be smaller than UInt"); + + // We need to convert minLargestInt into a positive number. The easiest way + // to do this conversion is to assume our "threshold" value of minLargestInt + // divided by 10 can fit in maxLargestInt when absolute valued. This should + // be a safe assumption. + static_assert(Value::minLargestInt <= -Value::maxLargestInt, + "The absolute value of minLargestInt must be greater than or " + "equal to maxLargestInt"); + static_assert(Value::minLargestInt / 10 >= -Value::maxLargestInt, + "The absolute value of minLargestInt must be only 1 magnitude " + "larger than maxLargest Int"); + + static constexpr Value::LargestUInt positive_threshold = + Value::maxLargestUInt / 10; + static constexpr Value::UInt positive_last_digit = Value::maxLargestUInt % 10; + + // For the negative values, we have to be more careful. Since typically + // -Value::minLargestInt will cause an overflow, we first divide by 10 and + // then take the inverse. This assumes that minLargestInt is only a single + // power of 10 different in magnitude, which we check above. For the last + // digit, we take the modulus before negating for the same reason. + static constexpr auto negative_threshold = + Value::LargestUInt(-(Value::minLargestInt / 10)); + static constexpr auto negative_last_digit = + Value::UInt(-(Value::minLargestInt % 10)); + + const Value::LargestUInt threshold = + isNegative ? negative_threshold : positive_threshold; + const Value::UInt max_last_digit = + isNegative ? negative_last_digit : positive_last_digit; + + Value::LargestUInt value = 0; + while (current < token.end_) { + Char c = *current++; + if (c < '0' || c > '9') + return decodeDouble(token, decoded); + + const auto digit(static_cast(c - '0')); + if (value >= threshold) { + // We've hit or exceeded the max value divided by 10 (rounded down). If + // a) we've only just touched the limit, meaing value == threshold, + // b) this is the last digit, or + // c) it's small enough to fit in that rounding delta, we're okay. + // Otherwise treat this number as a double to avoid overflow. + if (value > threshold || current != token.end_ || + digit > max_last_digit) { + return decodeDouble(token, decoded); + } + } + value = value * 10 + digit; + } + + if (isNegative) { + // We use the same magnitude assumption here, just in case. + const auto last_digit = static_cast(value % 10); + decoded = -Value::LargestInt(value / 10) * 10 - last_digit; + } else if (value <= Value::LargestUInt(Value::maxLargestInt)) { + decoded = Value::LargestInt(value); + } else { + decoded = value; + } + + return true; +} + +bool OurReader::decodeDouble(Token& token) { + Value decoded; + if (!decodeDouble(token, decoded)) + return false; + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeDouble(Token& token, Value& decoded) { + double value = 0; + const String buffer(token.start_, token.end_); + IStringStream is(buffer); + if (!(is >> value)) { + return addError( + "'" + String(token.start_, token.end_) + "' is not a number.", token); + } + decoded = value; + return true; +} + +bool OurReader::decodeString(Token& token) { + String decoded_string; + if (!decodeString(token, decoded_string)) + return false; + Value decoded(decoded_string); + currentValue().swapPayload(decoded); + currentValue().setOffsetStart(token.start_ - begin_); + currentValue().setOffsetLimit(token.end_ - begin_); + return true; +} + +bool OurReader::decodeString(Token& token, String& decoded) { + decoded.reserve(static_cast(token.end_ - token.start_ - 2)); + Location current = token.start_ + 1; // skip '"' + Location end = token.end_ - 1; // do not include '"' + while (current != end) { + Char c = *current++; + if (c == '"') + break; + if (c == '\\') { + if (current == end) + return addError("Empty escape sequence in string", token, current); + Char escape = *current++; + switch (escape) { + case '"': + decoded += '"'; + break; + case '/': + decoded += '/'; + break; + case '\\': + decoded += '\\'; + break; + case 'b': + decoded += '\b'; + break; + case 'f': + decoded += '\f'; + break; + case 'n': + decoded += '\n'; + break; + case 'r': + decoded += '\r'; + break; + case 't': + decoded += '\t'; + break; + case 'u': { + unsigned int unicode; + if (!decodeUnicodeCodePoint(token, current, end, unicode)) + return false; + decoded += codePointToUTF8(unicode); + } break; + default: + return addError("Bad escape sequence in string", token, current); + } + } else { + decoded += c; + } + } + return true; +} + +bool OurReader::decodeUnicodeCodePoint(Token& token, Location& current, + Location end, unsigned int& unicode) { + + if (!decodeUnicodeEscapeSequence(token, current, end, unicode)) + return false; + if (unicode >= 0xD800 && unicode <= 0xDBFF) { + // surrogate pairs + if (end - current < 6) + return addError( + "additional six characters expected to parse unicode surrogate pair.", + token, current); + if (*(current++) == '\\' && *(current++) == 'u') { + unsigned int surrogatePair; + if (decodeUnicodeEscapeSequence(token, current, end, surrogatePair)) { + unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); + } else + return false; + } else + return addError("expecting another \\u token to begin the second half of " + "a unicode surrogate pair", + token, current); + } + return true; +} + +bool OurReader::decodeUnicodeEscapeSequence(Token& token, Location& current, + Location end, + unsigned int& ret_unicode) { + if (end - current < 4) + return addError( + "Bad unicode escape sequence in string: four digits expected.", token, + current); + int unicode = 0; + for (int index = 0; index < 4; ++index) { + Char c = *current++; + unicode *= 16; + if (c >= '0' && c <= '9') + unicode += c - '0'; + else if (c >= 'a' && c <= 'f') + unicode += c - 'a' + 10; + else if (c >= 'A' && c <= 'F') + unicode += c - 'A' + 10; + else + return addError( + "Bad unicode escape sequence in string: hexadecimal digit expected.", + token, current); + } + ret_unicode = static_cast(unicode); + return true; +} + +bool OurReader::addError(const String& message, Token& token, Location extra) { + ErrorInfo info; + info.token_ = token; + info.message_ = message; + info.extra_ = extra; + errors_.push_back(info); + return false; +} + +bool OurReader::recoverFromError(TokenType skipUntilToken) { + size_t errorCount = errors_.size(); + Token skip; + for (;;) { + if (!readToken(skip)) + errors_.resize(errorCount); // discard errors caused by recovery + if (skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream) + break; + } + errors_.resize(errorCount); + return false; +} + +bool OurReader::addErrorAndRecover(const String& message, Token& token, + TokenType skipUntilToken) { + addError(message, token); + return recoverFromError(skipUntilToken); +} + +Value& OurReader::currentValue() { return *(nodes_.top()); } + +OurReader::Char OurReader::getNextChar() { + if (current_ == end_) + return 0; + return *current_++; +} + +void OurReader::getLocationLineAndColumn(Location location, int& line, + int& column) const { + Location current = begin_; + Location lastLineStart = current; + line = 0; + while (current < location && current != end_) { + Char c = *current++; + if (c == '\r') { + if (*current == '\n') + ++current; + lastLineStart = current; + ++line; + } else if (c == '\n') { + lastLineStart = current; + ++line; + } + } + // column & line start at 1 + column = int(location - lastLineStart) + 1; + ++line; +} + +String OurReader::getLocationLineAndColumn(Location location) const { + int line, column; + getLocationLineAndColumn(location, line, column); + char buffer[18 + 16 + 16 + 1]; + jsoncpp_snprintf(buffer, sizeof(buffer), "Line %d, Column %d", line, column); + return buffer; +} + +String OurReader::getFormattedErrorMessages() const { + String formattedMessage; + for (const auto& error : errors_) { + formattedMessage += + "* " + getLocationLineAndColumn(error.token_.start_) + "\n"; + formattedMessage += " " + error.message_ + "\n"; + if (error.extra_) + formattedMessage += + "See " + getLocationLineAndColumn(error.extra_) + " for detail.\n"; + } + return formattedMessage; +} + +std::vector OurReader::getStructuredErrors() const { + std::vector allErrors; + for (const auto& error : errors_) { + OurReader::StructuredError structured; + structured.offset_start = error.token_.start_ - begin_; + structured.offset_limit = error.token_.end_ - begin_; + structured.message = error.message_; + allErrors.push_back(structured); + } + return allErrors; +} + +class OurCharReader : public CharReader { + bool const collectComments_; + OurReader reader_; + +public: + OurCharReader(bool collectComments, OurFeatures const& features) + : collectComments_(collectComments), reader_(features) {} + bool parse(char const* beginDoc, char const* endDoc, Value* root, + String* errs) override { + bool ok = reader_.parse(beginDoc, endDoc, *root, collectComments_); + if (errs) { + *errs = reader_.getFormattedErrorMessages(); + } + return ok; + } +}; + +CharReaderBuilder::CharReaderBuilder() { setDefaults(&settings_); } +CharReaderBuilder::~CharReaderBuilder() = default; +CharReader* CharReaderBuilder::newCharReader() const { + bool collectComments = settings_["collectComments"].asBool(); + OurFeatures features = OurFeatures::all(); + features.allowComments_ = settings_["allowComments"].asBool(); + features.allowTrailingCommas_ = settings_["allowTrailingCommas"].asBool(); + features.strictRoot_ = settings_["strictRoot"].asBool(); + features.allowDroppedNullPlaceholders_ = + settings_["allowDroppedNullPlaceholders"].asBool(); + features.allowNumericKeys_ = settings_["allowNumericKeys"].asBool(); + features.allowSingleQuotes_ = settings_["allowSingleQuotes"].asBool(); + + // Stack limit is always a size_t, so we get this as an unsigned int + // regardless of it we have 64-bit integer support enabled. + features.stackLimit_ = static_cast(settings_["stackLimit"].asUInt()); + features.failIfExtra_ = settings_["failIfExtra"].asBool(); + features.rejectDupKeys_ = settings_["rejectDupKeys"].asBool(); + features.allowSpecialFloats_ = settings_["allowSpecialFloats"].asBool(); + features.skipBom_ = settings_["skipBom"].asBool(); + return new OurCharReader(collectComments, features); +} + +bool CharReaderBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set{ + "collectComments", + "allowComments", + "allowTrailingCommas", + "strictRoot", + "allowDroppedNullPlaceholders", + "allowNumericKeys", + "allowSingleQuotes", + "stackLimit", + "failIfExtra", + "rejectDupKeys", + "allowSpecialFloats", + "skipBom", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[key] = *si; + else + return false; + } + return invalid ? invalid->empty() : true; +} + +Value& CharReaderBuilder::operator[](const String& key) { + return settings_[key]; +} +// static +void CharReaderBuilder::strictMode(Json::Value* settings) { + //! [CharReaderBuilderStrictMode] + (*settings)["allowComments"] = false; + (*settings)["allowTrailingCommas"] = false; + (*settings)["strictRoot"] = true; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = true; + (*settings)["rejectDupKeys"] = true; + (*settings)["allowSpecialFloats"] = false; + (*settings)["skipBom"] = true; + //! [CharReaderBuilderStrictMode] +} +// static +void CharReaderBuilder::setDefaults(Json::Value* settings) { + //! [CharReaderBuilderDefaults] + (*settings)["collectComments"] = true; + (*settings)["allowComments"] = true; + (*settings)["allowTrailingCommas"] = true; + (*settings)["strictRoot"] = false; + (*settings)["allowDroppedNullPlaceholders"] = false; + (*settings)["allowNumericKeys"] = false; + (*settings)["allowSingleQuotes"] = false; + (*settings)["stackLimit"] = 1000; + (*settings)["failIfExtra"] = false; + (*settings)["rejectDupKeys"] = false; + (*settings)["allowSpecialFloats"] = false; + (*settings)["skipBom"] = true; + //! [CharReaderBuilderDefaults] +} + +////////////////////////////////// +// global functions + +bool parseFromStream(CharReader::Factory const& fact, IStream& sin, Value* root, + String* errs) { + OStringStream ssin; + ssin << sin.rdbuf(); + String doc = ssin.str(); + char const* begin = doc.data(); + char const* end = begin + doc.size(); + // Note that we do not actually need a null-terminator. + CharReaderPtr const reader(fact.newCharReader()); + return reader->parse(begin, end, root, errs); +} + +IStream& operator>>(IStream& sin, Value& root) { + CharReaderBuilder b; + String errs; + bool ok = parseFromStream(b, sin, &root, &errs); + if (!ok) { + throwRuntimeError(errs); + } + return sin; +} + +} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h new file mode 100644 index 0000000..3d34f2e --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_tool.h @@ -0,0 +1,138 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#ifndef LIB_JSONCPP_JSON_TOOL_H_INCLUDED +#define LIB_JSONCPP_JSON_TOOL_H_INCLUDED + +#if !defined(JSON_IS_AMALGAMATION) +#include +#endif + +// Also support old flag NO_LOCALE_SUPPORT +#ifdef NO_LOCALE_SUPPORT +#define JSONCPP_NO_LOCALE_SUPPORT +#endif + +#ifndef JSONCPP_NO_LOCALE_SUPPORT +#include +#endif + +/* This header provides common string manipulation support, such as UTF-8, + * portable conversion from/to string... + * + * It is an internal header that must not be exposed. + */ + +namespace Json { +static inline char getDecimalPoint() { +#ifdef JSONCPP_NO_LOCALE_SUPPORT + return '\0'; +#else + struct lconv* lc = localeconv(); + return lc ? *(lc->decimal_point) : '\0'; +#endif +} + +/// Converts a unicode code-point to UTF-8. +static inline String codePointToUTF8(unsigned int cp) { + String result; + + // based on description from http://en.wikipedia.org/wiki/UTF-8 + + if (cp <= 0x7f) { + result.resize(1); + result[0] = static_cast(cp); + } else if (cp <= 0x7FF) { + result.resize(2); + result[1] = static_cast(0x80 | (0x3f & cp)); + result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); + } else if (cp <= 0xFFFF) { + result.resize(3); + result[2] = static_cast(0x80 | (0x3f & cp)); + result[1] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[0] = static_cast(0xE0 | (0xf & (cp >> 12))); + } else if (cp <= 0x10FFFF) { + result.resize(4); + result[3] = static_cast(0x80 | (0x3f & cp)); + result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); + result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); + result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); + } + + return result; +} + +enum { + /// Constant that specify the size of the buffer that must be passed to + /// uintToString. + uintToStringBufferSize = 3 * sizeof(LargestUInt) + 1 +}; + +// Defines a char buffer for use with uintToString(). +using UIntToStringBuffer = char[uintToStringBufferSize]; + +/** Converts an unsigned integer to string. + * @param value Unsigned integer to convert to string + * @param current Input/Output string buffer. + * Must have at least uintToStringBufferSize chars free. + */ +static inline void uintToString(LargestUInt value, char*& current) { + *--current = 0; + do { + *--current = static_cast(value % 10U + static_cast('0')); + value /= 10; + } while (value != 0); +} + +/** Change ',' to '.' everywhere in buffer. + * + * We had a sophisticated way, but it did not work in WinCE. + * @see https://github.com/open-source-parsers/jsoncpp/pull/9 + */ +template Iter fixNumericLocale(Iter begin, Iter end) { + for (; begin != end; ++begin) { + if (*begin == ',') { + *begin = '.'; + } + } + return begin; +} + +template void fixNumericLocaleInput(Iter begin, Iter end) { + char decimalPoint = getDecimalPoint(); + if (decimalPoint == '\0' || decimalPoint == '.') { + return; + } + for (; begin != end; ++begin) { + if (*begin == '.') { + *begin = decimalPoint; + } + } +} + +/** + * Return iterator that would be the new end of the range [begin,end), if we + * were to delete zeros in the end of string, but not the last zero before '.'. + */ +template +Iter fixZerosInTheEnd(Iter begin, Iter end, unsigned int precision) { + for (; begin != end; --end) { + if (*(end - 1) != '0') { + return end; + } + // Don't delete the last zero before the decimal point. + if (begin != (end - 1) && begin != (end - 2) && *(end - 2) == '.') { + if (precision) { + return end; + } + return end - 2; + } + } + return end; +} + +} // namespace Json + +#endif // LIB_JSONCPP_JSON_TOOL_H_INCLUDED diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp new file mode 100644 index 0000000..c99b5b4 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_value.cpp @@ -0,0 +1,1634 @@ +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include + +// Provide implementation equivalent of std::snprintf for older _MSC compilers +#if defined(_MSC_VER) && _MSC_VER < 1900 +#include +static int msvc_pre1900_c99_vsnprintf(char* outBuf, size_t size, + const char* format, va_list ap) { + int count = -1; + if (size != 0) + count = _vsnprintf_s(outBuf, size, _TRUNCATE, format, ap); + if (count == -1) + count = _vscprintf(format, ap); + return count; +} + +int JSON_API msvc_pre1900_c99_snprintf(char* outBuf, size_t size, + const char* format, ...) { + va_list ap; + va_start(ap, format); + const int count = msvc_pre1900_c99_vsnprintf(outBuf, size, format, ap); + va_end(ap); + return count; +} +#endif + +// Disable warning C4702 : unreachable code +#if defined(_MSC_VER) +#pragma warning(disable : 4702) +#endif + +#define JSON_ASSERT_UNREACHABLE assert(false) + +namespace Json { +template +static std::unique_ptr cloneUnique(const std::unique_ptr& p) { + std::unique_ptr r; + if (p) { + r = std::unique_ptr(new T(*p)); + } + return r; +} + +// This is a walkaround to avoid the static initialization of Value::null. +// kNull must be word-aligned to avoid crashing on ARM. We use an alignment of +// 8 (instead of 4) as a bit of future-proofing. +#if defined(__ARMEL__) +#define ALIGNAS(byte_alignment) __attribute__((aligned(byte_alignment))) +#else +#define ALIGNAS(byte_alignment) +#endif + +// static +Value const& Value::nullSingleton() { + static Value const nullStatic; + return nullStatic; +} + +#if JSON_USE_NULLREF +// for backwards compatibility, we'll leave these global references around, but +// DO NOT use them in JSONCPP library code any more! +// static +Value const& Value::null = Value::nullSingleton(); + +// static +Value const& Value::nullRef = Value::nullSingleton(); +#endif + +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +template +static inline bool InRange(double d, T min, U max) { + // The casts can lose precision, but we are looking only for + // an approximate range. Might fail on edge cases though. ~cdunn + return d >= static_cast(min) && d <= static_cast(max); +} +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) +static inline double integerToDouble(Json::UInt64 value) { + return static_cast(Int64(value / 2)) * 2.0 + + static_cast(Int64(value & 1)); +} + +template static inline double integerToDouble(T value) { + return static_cast(value); +} + +template +static inline bool InRange(double d, T min, U max) { + return d >= integerToDouble(min) && d <= integerToDouble(max); +} +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + +/** Duplicates the specified string value. + * @param value Pointer to the string to duplicate. Must be zero-terminated if + * length is "unknown". + * @param length Length of the value. if equals to unknown, then it will be + * computed using strlen(value). + * @return Pointer on the duplicate instance of string. + */ +static inline char* duplicateStringValue(const char* value, size_t length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + if (length >= static_cast(Value::maxInt)) + length = Value::maxInt - 1; + + auto newString = static_cast(malloc(length + 1)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateStringValue(): " + "Failed to allocate string value buffer"); + } + memcpy(newString, value, length); + newString[length] = 0; + return newString; +} + +/* Record the length as a prefix. + */ +static inline char* duplicateAndPrefixStringValue(const char* value, + unsigned int length) { + // Avoid an integer overflow in the call to malloc below by limiting length + // to a sane value. + JSON_ASSERT_MESSAGE(length <= static_cast(Value::maxInt) - + sizeof(unsigned) - 1U, + "in Json::Value::duplicateAndPrefixStringValue(): " + "length too big for prefixing"); + size_t actualLength = sizeof(length) + length + 1; + auto newString = static_cast(malloc(actualLength)); + if (newString == nullptr) { + throwRuntimeError("in Json::Value::duplicateAndPrefixStringValue(): " + "Failed to allocate string value buffer"); + } + *reinterpret_cast(newString) = length; + memcpy(newString + sizeof(unsigned), value, length); + newString[actualLength - 1U] = + 0; // to avoid buffer over-run accidents by users later + return newString; +} +inline static void decodePrefixedString(bool isPrefixed, char const* prefixed, + unsigned* length, char const** value) { + if (!isPrefixed) { + *length = static_cast(strlen(prefixed)); + *value = prefixed; + } else { + *length = *reinterpret_cast(prefixed); + *value = prefixed + sizeof(unsigned); + } +} +/** Free the string duplicated by + * duplicateStringValue()/duplicateAndPrefixStringValue(). + */ +#if JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { + unsigned length = 0; + char const* valueDecoded; + decodePrefixedString(true, value, &length, &valueDecoded); + size_t const size = sizeof(unsigned) + length + 1U; + memset(value, 0, size); + free(value); +} +static inline void releaseStringValue(char* value, unsigned length) { + // length==0 => we allocated the strings memory + size_t size = (length == 0) ? strlen(value) : length; + memset(value, 0, size); + free(value); +} +#else // !JSONCPP_USING_SECURE_MEMORY +static inline void releasePrefixedStringValue(char* value) { free(value); } +static inline void releaseStringValue(char* value, unsigned) { free(value); } +#endif // JSONCPP_USING_SECURE_MEMORY + +} // namespace Json + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ValueInternals... +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +#if !defined(JSON_IS_AMALGAMATION) + +#include "json_valueiterator.inl" +#endif // if !defined(JSON_IS_AMALGAMATION) + +namespace Json { + +#if JSON_USE_EXCEPTION +Exception::Exception(String msg) : msg_(std::move(msg)) {} +Exception::~Exception() noexcept = default; +char const* Exception::what() const noexcept { return msg_.c_str(); } +RuntimeError::RuntimeError(String const& msg) : Exception(msg) {} +LogicError::LogicError(String const& msg) : Exception(msg) {} +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { + throw RuntimeError(msg); +} +JSONCPP_NORETURN void throwLogicError(String const& msg) { + throw LogicError(msg); +} +#else // !JSON_USE_EXCEPTION +JSONCPP_NORETURN void throwRuntimeError(String const& msg) { + std::cerr << msg << std::endl; + abort(); +} +JSONCPP_NORETURN void throwLogicError(String const& msg) { + std::cerr << msg << std::endl; + abort(); +} +#endif + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::CZString +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +// Notes: policy_ indicates if the string was allocated when +// a string is stored. + +Value::CZString::CZString(ArrayIndex index) : cstr_(nullptr), index_(index) {} + +Value::CZString::CZString(char const* str, unsigned length, + DuplicationPolicy allocate) + : cstr_(str) { + // allocate != duplicate + storage_.policy_ = allocate & 0x3; + storage_.length_ = length & 0x3FFFFFFF; +} + +Value::CZString::CZString(const CZString& other) { + cstr_ = (other.storage_.policy_ != noDuplication && other.cstr_ != nullptr + ? duplicateStringValue(other.cstr_, other.storage_.length_) + : other.cstr_); + storage_.policy_ = + static_cast( + other.cstr_ + ? (static_cast(other.storage_.policy_) == + noDuplication + ? noDuplication + : duplicate) + : static_cast(other.storage_.policy_)) & + 3U; + storage_.length_ = other.storage_.length_; +} + +Value::CZString::CZString(CZString&& other) noexcept + : cstr_(other.cstr_), index_(other.index_) { + other.cstr_ = nullptr; +} + +Value::CZString::~CZString() { + if (cstr_ && storage_.policy_ == duplicate) { + releaseStringValue(const_cast(cstr_), + storage_.length_ + 1U); // +1 for null terminating + // character for sake of + // completeness but not actually + // necessary + } +} + +void Value::CZString::swap(CZString& other) { + std::swap(cstr_, other.cstr_); + std::swap(index_, other.index_); +} + +Value::CZString& Value::CZString::operator=(const CZString& other) { + cstr_ = other.cstr_; + index_ = other.index_; + return *this; +} + +Value::CZString& Value::CZString::operator=(CZString&& other) noexcept { + cstr_ = other.cstr_; + index_ = other.index_; + other.cstr_ = nullptr; + return *this; +} + +bool Value::CZString::operator<(const CZString& other) const { + if (!cstr_) + return index_ < other.index_; + // return strcmp(cstr_, other.cstr_) < 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, min_len); + if (comp < 0) + return true; + if (comp > 0) + return false; + return (this_len < other_len); +} + +bool Value::CZString::operator==(const CZString& other) const { + if (!cstr_) + return index_ == other.index_; + // return strcmp(cstr_, other.cstr_) == 0; + // Assume both are strings. + unsigned this_len = this->storage_.length_; + unsigned other_len = other.storage_.length_; + if (this_len != other_len) + return false; + JSON_ASSERT(this->cstr_ && other.cstr_); + int comp = memcmp(this->cstr_, other.cstr_, this_len); + return comp == 0; +} + +ArrayIndex Value::CZString::index() const { return index_; } + +// const char* Value::CZString::c_str() const { return cstr_; } +const char* Value::CZString::data() const { return cstr_; } +unsigned Value::CZString::length() const { return storage_.length_; } +bool Value::CZString::isStaticString() const { + return storage_.policy_ == noDuplication; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class Value::Value +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +/*! \internal Default constructor initialization must be equivalent to: + * memset( this, 0, sizeof(Value) ) + * This optimization is used in ValueInternalMap fast allocator. + */ +Value::Value(ValueType type) { + static char const emptyString[] = ""; + initBasic(type); + switch (type) { + case nullValue: + break; + case intValue: + case uintValue: + value_.int_ = 0; + break; + case realValue: + value_.real_ = 0.0; + break; + case stringValue: + // allocated_ == false, so this is safe. + value_.string_ = const_cast(static_cast(emptyString)); + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(); + break; + case booleanValue: + value_.bool_ = false; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +Value::Value(Int value) { + initBasic(intValue); + value_.int_ = value; +} + +Value::Value(UInt value) { + initBasic(uintValue); + value_.uint_ = value; +} +#if defined(JSON_HAS_INT64) +Value::Value(Int64 value) { + initBasic(intValue); + value_.int_ = value; +} +Value::Value(UInt64 value) { + initBasic(uintValue); + value_.uint_ = value; +} +#endif // defined(JSON_HAS_INT64) + +Value::Value(double value) { + initBasic(realValue); + value_.real_ = value; +} + +Value::Value(const char* value) { + initBasic(stringValue, true); + JSON_ASSERT_MESSAGE(value != nullptr, + "Null Value Passed to Value Constructor"); + value_.string_ = duplicateAndPrefixStringValue( + value, static_cast(strlen(value))); +} + +Value::Value(const char* begin, const char* end) { + initBasic(stringValue, true); + value_.string_ = + duplicateAndPrefixStringValue(begin, static_cast(end - begin)); +} + +Value::Value(const String& value) { + initBasic(stringValue, true); + value_.string_ = duplicateAndPrefixStringValue( + value.data(), static_cast(value.length())); +} + +Value::Value(const StaticString& value) { + initBasic(stringValue); + value_.string_ = const_cast(value.c_str()); +} + +Value::Value(bool value) { + initBasic(booleanValue); + value_.bool_ = value; +} + +Value::Value(const Value& other) { + dupPayload(other); + dupMeta(other); +} + +Value::Value(Value&& other) noexcept { + initBasic(nullValue); + swap(other); +} + +Value::~Value() { + releasePayload(); + value_.uint_ = 0; +} + +Value& Value::operator=(const Value& other) { + Value(other).swap(*this); + return *this; +} + +Value& Value::operator=(Value&& other) noexcept { + other.swap(*this); + return *this; +} + +void Value::swapPayload(Value& other) { + std::swap(bits_, other.bits_); + std::swap(value_, other.value_); +} + +void Value::copyPayload(const Value& other) { + releasePayload(); + dupPayload(other); +} + +void Value::swap(Value& other) { + swapPayload(other); + std::swap(comments_, other.comments_); + std::swap(start_, other.start_); + std::swap(limit_, other.limit_); +} + +void Value::copy(const Value& other) { + copyPayload(other); + dupMeta(other); +} + +ValueType Value::type() const { + return static_cast(bits_.value_type_); +} + +int Value::compare(const Value& other) const { + if (*this < other) + return -1; + if (*this > other) + return 1; + return 0; +} + +bool Value::operator<(const Value& other) const { + int typeDelta = type() - other.type(); + if (typeDelta) + return typeDelta < 0; + switch (type()) { + case nullValue: + return false; + case intValue: + return value_.int_ < other.value_.int_; + case uintValue: + return value_.uint_ < other.value_.uint_; + case realValue: + return value_.real_ < other.value_.real_; + case booleanValue: + return value_.bool_ < other.value_.bool_; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + return other.value_.string_ != nullptr; + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + unsigned min_len = std::min(this_len, other_len); + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, min_len); + if (comp < 0) + return true; + if (comp > 0) + return false; + return (this_len < other_len); + } + case arrayValue: + case objectValue: { + auto thisSize = value_.map_->size(); + auto otherSize = other.value_.map_->size(); + if (thisSize != otherSize) + return thisSize < otherSize; + return (*value_.map_) < (*other.value_.map_); + } + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator<=(const Value& other) const { return !(other < *this); } + +bool Value::operator>=(const Value& other) const { return !(*this < other); } + +bool Value::operator>(const Value& other) const { return other < *this; } + +bool Value::operator==(const Value& other) const { + if (type() != other.type()) + return false; + switch (type()) { + case nullValue: + return true; + case intValue: + return value_.int_ == other.value_.int_; + case uintValue: + return value_.uint_ == other.value_.uint_; + case realValue: + return value_.real_ == other.value_.real_; + case booleanValue: + return value_.bool_ == other.value_.bool_; + case stringValue: { + if ((value_.string_ == nullptr) || (other.value_.string_ == nullptr)) { + return (value_.string_ == other.value_.string_); + } + unsigned this_len; + unsigned other_len; + char const* this_str; + char const* other_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + decodePrefixedString(other.isAllocated(), other.value_.string_, &other_len, + &other_str); + if (this_len != other_len) + return false; + JSON_ASSERT(this_str && other_str); + int comp = memcmp(this_str, other_str, this_len); + return comp == 0; + } + case arrayValue: + case objectValue: + return value_.map_->size() == other.value_.map_->size() && + (*value_.map_) == (*other.value_.map_); + default: + JSON_ASSERT_UNREACHABLE; + } + return false; // unreachable +} + +bool Value::operator!=(const Value& other) const { return !(*this == other); } + +const char* Value::asCString() const { + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == nullptr) + return nullptr; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return this_str; +} + +#if JSONCPP_USING_SECURE_MEMORY +unsigned Value::getCStringLength() const { + JSON_ASSERT_MESSAGE(type() == stringValue, + "in Json::Value::asCString(): requires stringValue"); + if (value_.string_ == 0) + return 0; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return this_len; +} +#endif + +bool Value::getString(char const** begin, char const** end) const { + if (type() != stringValue) + return false; + if (value_.string_ == nullptr) + return false; + unsigned length; + decodePrefixedString(this->isAllocated(), this->value_.string_, &length, + begin); + *end = *begin + length; + return true; +} + +String Value::asString() const { + switch (type()) { + case nullValue: + return ""; + case stringValue: { + if (value_.string_ == nullptr) + return ""; + unsigned this_len; + char const* this_str; + decodePrefixedString(this->isAllocated(), this->value_.string_, &this_len, + &this_str); + return String(this_str, this_len); + } + case booleanValue: + return value_.bool_ ? "true" : "false"; + case intValue: + return valueToString(value_.int_); + case uintValue: + return valueToString(value_.uint_); + case realValue: + return valueToString(value_.real_); + default: + JSON_FAIL_MESSAGE("Type is not convertible to string"); + } +} + +Value::Int Value::asInt() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestInt out of Int range"); + return Int(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt(), "LargestUInt out of Int range"); + return Int(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt, maxInt), + "double out of Int range"); + return Int(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int."); +} + +Value::UInt Value::asUInt() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestInt out of UInt range"); + return UInt(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isUInt(), "LargestUInt out of UInt range"); + return UInt(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt), + "double out of UInt range"); + return UInt(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt."); +} + +#if defined(JSON_HAS_INT64) + +Value::Int64 Value::asInt64() const { + switch (type()) { + case intValue: + return Int64(value_.int_); + case uintValue: + JSON_ASSERT_MESSAGE(isInt64(), "LargestUInt out of Int64 range"); + return Int64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, minInt64, maxInt64), + "double out of Int64 range"); + return Int64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to Int64."); +} + +Value::UInt64 Value::asUInt64() const { + switch (type()) { + case intValue: + JSON_ASSERT_MESSAGE(isUInt64(), "LargestInt out of UInt64 range"); + return UInt64(value_.int_); + case uintValue: + return UInt64(value_.uint_); + case realValue: + JSON_ASSERT_MESSAGE(InRange(value_.real_, 0, maxUInt64), + "double out of UInt64 range"); + return UInt64(value_.real_); + case nullValue: + return 0; + case booleanValue: + return value_.bool_ ? 1 : 0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to UInt64."); +} +#endif // if defined(JSON_HAS_INT64) + +LargestInt Value::asLargestInt() const { +#if defined(JSON_NO_INT64) + return asInt(); +#else + return asInt64(); +#endif +} + +LargestUInt Value::asLargestUInt() const { +#if defined(JSON_NO_INT64) + return asUInt(); +#else + return asUInt64(); +#endif +} + +double Value::asDouble() const { + switch (type()) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return integerToDouble(value_.uint_); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return value_.real_; + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0 : 0.0; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to double."); +} + +float Value::asFloat() const { + switch (type()) { + case intValue: + return static_cast(value_.int_); + case uintValue: +#if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + return static_cast(value_.uint_); +#else // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + // This can fail (silently?) if the value is bigger than MAX_FLOAT. + return static_cast(integerToDouble(value_.uint_)); +#endif // if !defined(JSON_USE_INT64_DOUBLE_CONVERSION) + case realValue: + return static_cast(value_.real_); + case nullValue: + return 0.0; + case booleanValue: + return value_.bool_ ? 1.0F : 0.0F; + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to float."); +} + +bool Value::asBool() const { + switch (type()) { + case booleanValue: + return value_.bool_; + case nullValue: + return false; + case intValue: + return value_.int_ != 0; + case uintValue: + return value_.uint_ != 0; + case realValue: { + // According to JavaScript language zero or NaN is regarded as false + const auto value_classification = std::fpclassify(value_.real_); + return value_classification != FP_ZERO && value_classification != FP_NAN; + } + default: + break; + } + JSON_FAIL_MESSAGE("Value is not convertible to bool."); +} + +bool Value::isConvertibleTo(ValueType other) const { + switch (other) { + case nullValue: + return (isNumeric() && asDouble() == 0.0) || + (type() == booleanValue && !value_.bool_) || + (type() == stringValue && asString().empty()) || + (type() == arrayValue && value_.map_->empty()) || + (type() == objectValue && value_.map_->empty()) || + type() == nullValue; + case intValue: + return isInt() || + (type() == realValue && InRange(value_.real_, minInt, maxInt)) || + type() == booleanValue || type() == nullValue; + case uintValue: + return isUInt() || + (type() == realValue && InRange(value_.real_, 0, maxUInt)) || + type() == booleanValue || type() == nullValue; + case realValue: + return isNumeric() || type() == booleanValue || type() == nullValue; + case booleanValue: + return isNumeric() || type() == booleanValue || type() == nullValue; + case stringValue: + return isNumeric() || type() == booleanValue || type() == stringValue || + type() == nullValue; + case arrayValue: + return type() == arrayValue || type() == nullValue; + case objectValue: + return type() == objectValue || type() == nullValue; + } + JSON_ASSERT_UNREACHABLE; + return false; +} + +/// Number of values in array or object +ArrayIndex Value::size() const { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + case stringValue: + return 0; + case arrayValue: // size of the array is highest index + 1 + if (!value_.map_->empty()) { + ObjectValues::const_iterator itLast = value_.map_->end(); + --itLast; + return (*itLast).first.index() + 1; + } + return 0; + case objectValue: + return ArrayIndex(value_.map_->size()); + } + JSON_ASSERT_UNREACHABLE; + return 0; // unreachable; +} + +bool Value::empty() const { + if (isNull() || isArray() || isObject()) + return size() == 0U; + return false; +} + +Value::operator bool() const { return !isNull(); } + +void Value::clear() { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue || + type() == objectValue, + "in Json::Value::clear(): requires complex value"); + start_ = 0; + limit_ = 0; + switch (type()) { + case arrayValue: + case objectValue: + value_.map_->clear(); + break; + default: + break; + } +} + +void Value::resize(ArrayIndex newSize) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::resize(): requires arrayValue"); + if (type() == nullValue) + *this = Value(arrayValue); + ArrayIndex oldSize = size(); + if (newSize == 0) + clear(); + else if (newSize > oldSize) + for (ArrayIndex i = oldSize; i < newSize; ++i) + (*this)[i]; + else { + for (ArrayIndex index = newSize; index < oldSize; ++index) { + value_.map_->erase(index); + } + JSON_ASSERT(size() == newSize); + } +} + +Value& Value::operator[](ArrayIndex index) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == arrayValue, + "in Json::Value::operator[](ArrayIndex): requires arrayValue"); + if (type() == nullValue) + *this = Value(arrayValue); + CZString key(index); + auto it = value_.map_->lower_bound(key); + if (it != value_.map_->end() && (*it).first == key) + return (*it).second; + + ObjectValues::value_type defaultValue(key, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + return (*it).second; +} + +Value& Value::operator[](int index) { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index): index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +const Value& Value::operator[](ArrayIndex index) const { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == arrayValue, + "in Json::Value::operator[](ArrayIndex)const: requires arrayValue"); + if (type() == nullValue) + return nullSingleton(); + CZString key(index); + ObjectValues::const_iterator it = value_.map_->find(key); + if (it == value_.map_->end()) + return nullSingleton(); + return (*it).second; +} + +const Value& Value::operator[](int index) const { + JSON_ASSERT_MESSAGE( + index >= 0, + "in Json::Value::operator[](int index) const: index cannot be negative"); + return (*this)[ArrayIndex(index)]; +} + +void Value::initBasic(ValueType type, bool allocated) { + setType(type); + setIsAllocated(allocated); + comments_ = Comments{}; + start_ = 0; + limit_ = 0; +} + +void Value::dupPayload(const Value& other) { + setType(other.type()); + setIsAllocated(false); + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + value_ = other.value_; + break; + case stringValue: + if (other.value_.string_ && other.isAllocated()) { + unsigned len; + char const* str; + decodePrefixedString(other.isAllocated(), other.value_.string_, &len, + &str); + value_.string_ = duplicateAndPrefixStringValue(str, len); + setIsAllocated(true); + } else { + value_.string_ = other.value_.string_; + } + break; + case arrayValue: + case objectValue: + value_.map_ = new ObjectValues(*other.value_.map_); + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::releasePayload() { + switch (type()) { + case nullValue: + case intValue: + case uintValue: + case realValue: + case booleanValue: + break; + case stringValue: + if (isAllocated()) + releasePrefixedStringValue(value_.string_); + break; + case arrayValue: + case objectValue: + delete value_.map_; + break; + default: + JSON_ASSERT_UNREACHABLE; + } +} + +void Value::dupMeta(const Value& other) { + comments_ = other.comments_; + start_ = other.start_; + limit_ = other.limit_; +} + +// Access an object value by name, create a null member if it does not exist. +// @pre Type of '*this' is object or null. +// @param key is null-terminated. +Value& Value::resolveReference(const char* key) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::resolveReference(): requires objectValue"); + if (type() == nullValue) + *this = Value(objectValue); + CZString actualKey(key, static_cast(strlen(key)), + CZString::noDuplication); // NOTE! + auto it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +// @param key is not null-terminated. +Value& Value::resolveReference(char const* key, char const* end) { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::resolveReference(key, end): requires objectValue"); + if (type() == nullValue) + *this = Value(objectValue); + CZString actualKey(key, static_cast(end - key), + CZString::duplicateOnCopy); + auto it = value_.map_->lower_bound(actualKey); + if (it != value_.map_->end() && (*it).first == actualKey) + return (*it).second; + + ObjectValues::value_type defaultValue(actualKey, nullSingleton()); + it = value_.map_->insert(it, defaultValue); + Value& value = (*it).second; + return value; +} + +Value Value::get(ArrayIndex index, const Value& defaultValue) const { + const Value* value = &((*this)[index]); + return value == &nullSingleton() ? defaultValue : *value; +} + +bool Value::isValidIndex(ArrayIndex index) const { return index < size(); } + +Value const* Value::find(char const* begin, char const* end) const { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::find(begin, end): requires " + "objectValue or nullValue"); + if (type() == nullValue) + return nullptr; + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); + ObjectValues::const_iterator it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return nullptr; + return &(*it).second; +} +Value* Value::demand(char const* begin, char const* end) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::demand(begin, end): requires " + "objectValue or nullValue"); + return &resolveReference(begin, end); +} +const Value& Value::operator[](const char* key) const { + Value const* found = find(key, key + strlen(key)); + if (!found) + return nullSingleton(); + return *found; +} +Value const& Value::operator[](const String& key) const { + Value const* found = find(key.data(), key.data() + key.length()); + if (!found) + return nullSingleton(); + return *found; +} + +Value& Value::operator[](const char* key) { + return resolveReference(key, key + strlen(key)); +} + +Value& Value::operator[](const String& key) { + return resolveReference(key.data(), key.data() + key.length()); +} + +Value& Value::operator[](const StaticString& key) { + return resolveReference(key.c_str()); +} + +Value& Value::append(const Value& value) { return append(Value(value)); } + +Value& Value::append(Value&& value) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::append: requires arrayValue"); + if (type() == nullValue) { + *this = Value(arrayValue); + } + return this->value_.map_->emplace(size(), std::move(value)).first->second; +} + +bool Value::insert(ArrayIndex index, const Value& newValue) { + return insert(index, Value(newValue)); +} + +bool Value::insert(ArrayIndex index, Value&& newValue) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == arrayValue, + "in Json::Value::insert: requires arrayValue"); + ArrayIndex length = size(); + if (index > length) { + return false; + } + for (ArrayIndex i = length; i > index; i--) { + (*this)[i] = std::move((*this)[i - 1]); + } + (*this)[index] = std::move(newValue); + return true; +} + +Value Value::get(char const* begin, char const* end, + Value const& defaultValue) const { + Value const* found = find(begin, end); + return !found ? defaultValue : *found; +} +Value Value::get(char const* key, Value const& defaultValue) const { + return get(key, key + strlen(key), defaultValue); +} +Value Value::get(String const& key, Value const& defaultValue) const { + return get(key.data(), key.data() + key.length(), defaultValue); +} + +bool Value::removeMember(const char* begin, const char* end, Value* removed) { + if (type() != objectValue) { + return false; + } + CZString actualKey(begin, static_cast(end - begin), + CZString::noDuplication); + auto it = value_.map_->find(actualKey); + if (it == value_.map_->end()) + return false; + if (removed) + *removed = std::move(it->second); + value_.map_->erase(it); + return true; +} +bool Value::removeMember(const char* key, Value* removed) { + return removeMember(key, key + strlen(key), removed); +} +bool Value::removeMember(String const& key, Value* removed) { + return removeMember(key.data(), key.data() + key.length(), removed); +} +void Value::removeMember(const char* key) { + JSON_ASSERT_MESSAGE(type() == nullValue || type() == objectValue, + "in Json::Value::removeMember(): requires objectValue"); + if (type() == nullValue) + return; + + CZString actualKey(key, unsigned(strlen(key)), CZString::noDuplication); + value_.map_->erase(actualKey); +} +void Value::removeMember(const String& key) { removeMember(key.c_str()); } + +bool Value::removeIndex(ArrayIndex index, Value* removed) { + if (type() != arrayValue) { + return false; + } + CZString key(index); + auto it = value_.map_->find(key); + if (it == value_.map_->end()) { + return false; + } + if (removed) + *removed = it->second; + ArrayIndex oldSize = size(); + // shift left all items left, into the place of the "removed" + for (ArrayIndex i = index; i < (oldSize - 1); ++i) { + CZString keey(i); + (*value_.map_)[keey] = (*this)[i + 1]; + } + // erase the last one ("leftover") + CZString keyLast(oldSize - 1); + auto itLast = value_.map_->find(keyLast); + value_.map_->erase(itLast); + return true; +} + +bool Value::isMember(char const* begin, char const* end) const { + Value const* value = find(begin, end); + return nullptr != value; +} +bool Value::isMember(char const* key) const { + return isMember(key, key + strlen(key)); +} +bool Value::isMember(String const& key) const { + return isMember(key.data(), key.data() + key.length()); +} + +Value::Members Value::getMemberNames() const { + JSON_ASSERT_MESSAGE( + type() == nullValue || type() == objectValue, + "in Json::Value::getMemberNames(), value must be objectValue"); + if (type() == nullValue) + return Value::Members(); + Members members; + members.reserve(value_.map_->size()); + ObjectValues::const_iterator it = value_.map_->begin(); + ObjectValues::const_iterator itEnd = value_.map_->end(); + for (; it != itEnd; ++it) { + members.push_back(String((*it).first.data(), (*it).first.length())); + } + return members; +} + +static bool IsIntegral(double d) { + double integral_part; + return modf(d, &integral_part) == 0.0; +} + +bool Value::isNull() const { return type() == nullValue; } + +bool Value::isBool() const { return type() == booleanValue; } + +bool Value::isInt() const { + switch (type()) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= minInt && value_.int_ <= maxInt; +#else + return true; +#endif + case uintValue: + return value_.uint_ <= UInt(maxInt); + case realValue: + return value_.real_ >= minInt && value_.real_ <= maxInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isUInt() const { + switch (type()) { + case intValue: +#if defined(JSON_HAS_INT64) + return value_.int_ >= 0 && LargestUInt(value_.int_) <= LargestUInt(maxUInt); +#else + return value_.int_ >= 0; +#endif + case uintValue: +#if defined(JSON_HAS_INT64) + return value_.uint_ <= maxUInt; +#else + return true; +#endif + case realValue: + return value_.real_ >= 0 && value_.real_ <= maxUInt && + IsIntegral(value_.real_); + default: + break; + } + return false; +} + +bool Value::isInt64() const { +#if defined(JSON_HAS_INT64) + switch (type()) { + case intValue: + return true; + case uintValue: + return value_.uint_ <= UInt64(maxInt64); + case realValue: + // Note that maxInt64 (= 2^63 - 1) is not exactly representable as a + // double, so double(maxInt64) will be rounded up to 2^63. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < double(maxInt64) && IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isUInt64() const { +#if defined(JSON_HAS_INT64) + switch (type()) { + case intValue: + return value_.int_ >= 0; + case uintValue: + return true; + case realValue: + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= 0 && value_.real_ < maxUInt64AsDouble && + IsIntegral(value_.real_); + default: + break; + } +#endif // JSON_HAS_INT64 + return false; +} + +bool Value::isIntegral() const { + switch (type()) { + case intValue: + case uintValue: + return true; + case realValue: +#if defined(JSON_HAS_INT64) + // Note that maxUInt64 (= 2^64 - 1) is not exactly representable as a + // double, so double(maxUInt64) will be rounded up to 2^64. Therefore we + // require the value to be strictly less than the limit. + return value_.real_ >= double(minInt64) && + value_.real_ < maxUInt64AsDouble && IsIntegral(value_.real_); +#else + return value_.real_ >= minInt && value_.real_ <= maxUInt && + IsIntegral(value_.real_); +#endif // JSON_HAS_INT64 + default: + break; + } + return false; +} + +bool Value::isDouble() const { + return type() == intValue || type() == uintValue || type() == realValue; +} + +bool Value::isNumeric() const { return isDouble(); } + +bool Value::isString() const { return type() == stringValue; } + +bool Value::isArray() const { return type() == arrayValue; } + +bool Value::isObject() const { return type() == objectValue; } + +Value::Comments::Comments(const Comments& that) + : ptr_{cloneUnique(that.ptr_)} {} + +Value::Comments::Comments(Comments&& that) noexcept + : ptr_{std::move(that.ptr_)} {} + +Value::Comments& Value::Comments::operator=(const Comments& that) { + ptr_ = cloneUnique(that.ptr_); + return *this; +} + +Value::Comments& Value::Comments::operator=(Comments&& that) noexcept { + ptr_ = std::move(that.ptr_); + return *this; +} + +bool Value::Comments::has(CommentPlacement slot) const { + return ptr_ && !(*ptr_)[slot].empty(); +} + +String Value::Comments::get(CommentPlacement slot) const { + if (!ptr_) + return {}; + return (*ptr_)[slot]; +} + +void Value::Comments::set(CommentPlacement slot, String comment) { + if (slot >= CommentPlacement::numberOfCommentPlacement) + return; + if (!ptr_) + ptr_ = std::unique_ptr(new Array()); + (*ptr_)[slot] = std::move(comment); +} + +void Value::setComment(String comment, CommentPlacement placement) { + if (!comment.empty() && (comment.back() == '\n')) { + // Always discard trailing newline, to aid indentation. + comment.pop_back(); + } + JSON_ASSERT(!comment.empty()); + JSON_ASSERT_MESSAGE( + comment[0] == '\0' || comment[0] == '/', + "in Json::Value::setComment(): Comments must start with /"); + comments_.set(placement, std::move(comment)); +} + +bool Value::hasComment(CommentPlacement placement) const { + return comments_.has(placement); +} + +String Value::getComment(CommentPlacement placement) const { + return comments_.get(placement); +} + +void Value::setOffsetStart(ptrdiff_t start) { start_ = start; } + +void Value::setOffsetLimit(ptrdiff_t limit) { limit_ = limit; } + +ptrdiff_t Value::getOffsetStart() const { return start_; } + +ptrdiff_t Value::getOffsetLimit() const { return limit_; } + +String Value::toStyledString() const { + StreamWriterBuilder builder; + + String out = this->hasComment(commentBefore) ? "\n" : ""; + out += Json::writeString(builder, *this); + out += '\n'; + + return out; +} + +Value::const_iterator Value::begin() const { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->begin()); + break; + default: + break; + } + return {}; +} + +Value::const_iterator Value::end() const { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return const_iterator(value_.map_->end()); + break; + default: + break; + } + return {}; +} + +Value::iterator Value::begin() { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->begin()); + break; + default: + break; + } + return iterator(); +} + +Value::iterator Value::end() { + switch (type()) { + case arrayValue: + case objectValue: + if (value_.map_) + return iterator(value_.map_->end()); + break; + default: + break; + } + return iterator(); +} + +// class PathArgument +// ////////////////////////////////////////////////////////////////// + +PathArgument::PathArgument() = default; + +PathArgument::PathArgument(ArrayIndex index) + : index_(index), kind_(kindIndex) {} + +PathArgument::PathArgument(const char* key) : key_(key), kind_(kindKey) {} + +PathArgument::PathArgument(String key) : key_(std::move(key)), kind_(kindKey) {} + +// class Path +// ////////////////////////////////////////////////////////////////// + +Path::Path(const String& path, const PathArgument& a1, const PathArgument& a2, + const PathArgument& a3, const PathArgument& a4, + const PathArgument& a5) { + InArgs in; + in.reserve(5); + in.push_back(&a1); + in.push_back(&a2); + in.push_back(&a3); + in.push_back(&a4); + in.push_back(&a5); + makePath(path, in); +} + +void Path::makePath(const String& path, const InArgs& in) { + const char* current = path.c_str(); + const char* end = current + path.length(); + auto itInArg = in.begin(); + while (current != end) { + if (*current == '[') { + ++current; + if (*current == '%') + addPathInArg(path, in, itInArg, PathArgument::kindIndex); + else { + ArrayIndex index = 0; + for (; current != end && *current >= '0' && *current <= '9'; ++current) + index = index * 10 + ArrayIndex(*current - '0'); + args_.push_back(index); + } + if (current == end || *++current != ']') + invalidPath(path, int(current - path.c_str())); + } else if (*current == '%') { + addPathInArg(path, in, itInArg, PathArgument::kindKey); + ++current; + } else if (*current == '.' || *current == ']') { + ++current; + } else { + const char* beginName = current; + while (current != end && !strchr("[.", *current)) + ++current; + args_.push_back(String(beginName, current)); + } + } +} + +void Path::addPathInArg(const String& /*path*/, const InArgs& in, + InArgs::const_iterator& itInArg, + PathArgument::Kind kind) { + if (itInArg == in.end()) { + // Error: missing argument %d + } else if ((*itInArg)->kind_ != kind) { + // Error: bad argument type + } else { + args_.push_back(**itInArg++); + } +} + +void Path::invalidPath(const String& /*path*/, int /*location*/) { + // Error: invalid path. +} + +const Value& Path::resolve(const Value& root) const { + const Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) { + // Error: unable to resolve path (array value expected at position... ) + return Value::nullSingleton(); + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: unable to resolve path (object value expected at position...) + return Value::nullSingleton(); + } + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) { + // Error: unable to resolve path (object has no member named '' at + // position...) + return Value::nullSingleton(); + } + } + } + return *node; +} + +Value Path::resolve(const Value& root, const Value& defaultValue) const { + const Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray() || !node->isValidIndex(arg.index_)) + return defaultValue; + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) + return defaultValue; + node = &((*node)[arg.key_]); + if (node == &Value::nullSingleton()) + return defaultValue; + } + } + return *node; +} + +Value& Path::make(Value& root) const { + Value* node = &root; + for (const auto& arg : args_) { + if (arg.kind_ == PathArgument::kindIndex) { + if (!node->isArray()) { + // Error: node is not an array at position ... + } + node = &((*node)[arg.index_]); + } else if (arg.kind_ == PathArgument::kindKey) { + if (!node->isObject()) { + // Error: node is not an object at position... + } + node = &((*node)[arg.key_]); + } + } + return *node; +} + +} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl new file mode 100644 index 0000000..d6128b8 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_valueiterator.inl @@ -0,0 +1,156 @@ +// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +// included by json_value.cpp + +namespace Json { + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIteratorBase +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIteratorBase::ValueIteratorBase() : current_() {} + +ValueIteratorBase::ValueIteratorBase( + const Value::ObjectValues::iterator& current) + : current_(current), isNull_(false) {} + +Value& ValueIteratorBase::deref() { return current_->second; } +const Value& ValueIteratorBase::deref() const { return current_->second; } + +void ValueIteratorBase::increment() { ++current_; } + +void ValueIteratorBase::decrement() { --current_; } + +ValueIteratorBase::difference_type +ValueIteratorBase::computeDistance(const SelfType& other) const { + // Iterator for null value are initialized using the default + // constructor, which initialize current_ to the default + // std::map::iterator. As begin() and end() are two instance + // of the default std::map::iterator, they can not be compared. + // To allow this, we handle this comparison specifically. + if (isNull_ && other.isNull_) { + return 0; + } + + // Usage of std::distance is not portable (does not compile with Sun Studio 12 + // RogueWave STL, + // which is the one used by default). + // Using a portable hand-made version for non random iterator instead: + // return difference_type( std::distance( current_, other.current_ ) ); + difference_type myDistance = 0; + for (Value::ObjectValues::iterator it = current_; it != other.current_; + ++it) { + ++myDistance; + } + return myDistance; +} + +bool ValueIteratorBase::isEqual(const SelfType& other) const { + if (isNull_) { + return other.isNull_; + } + return current_ == other.current_; +} + +void ValueIteratorBase::copy(const SelfType& other) { + current_ = other.current_; + isNull_ = other.isNull_; +} + +Value ValueIteratorBase::key() const { + const Value::CZString czstring = (*current_).first; + if (czstring.data()) { + if (czstring.isStaticString()) + return Value(StaticString(czstring.data())); + return Value(czstring.data(), czstring.data() + czstring.length()); + } + return Value(czstring.index()); +} + +UInt ValueIteratorBase::index() const { + const Value::CZString czstring = (*current_).first; + if (!czstring.data()) + return czstring.index(); + return Value::UInt(-1); +} + +String ValueIteratorBase::name() const { + char const* keey; + char const* end; + keey = memberName(&end); + if (!keey) + return String(); + return String(keey, end); +} + +char const* ValueIteratorBase::memberName() const { + const char* cname = (*current_).first.data(); + return cname ? cname : ""; +} + +char const* ValueIteratorBase::memberName(char const** end) const { + const char* cname = (*current_).first.data(); + if (!cname) { + *end = nullptr; + return nullptr; + } + *end = cname + (*current_).first.length(); + return cname; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueConstIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueConstIterator::ValueConstIterator() = default; + +ValueConstIterator::ValueConstIterator( + const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueConstIterator::ValueConstIterator(ValueIterator const& other) + : ValueIteratorBase(other) {} + +ValueConstIterator& ValueConstIterator:: +operator=(const ValueIteratorBase& other) { + copy(other); + return *this; +} + +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// class ValueIterator +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// +// ////////////////////////////////////////////////////////////////// + +ValueIterator::ValueIterator() = default; + +ValueIterator::ValueIterator(const Value::ObjectValues::iterator& current) + : ValueIteratorBase(current) {} + +ValueIterator::ValueIterator(const ValueConstIterator& other) + : ValueIteratorBase(other) { + throwRuntimeError("ConstIterator to Iterator should never be allowed."); +} + +ValueIterator::ValueIterator(const ValueIterator& other) = default; + +ValueIterator& ValueIterator::operator=(const SelfType& other) { + copy(other); + return *this; +} + +} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp new file mode 100644 index 0000000..855f3a8 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/json_writer.cpp @@ -0,0 +1,1259 @@ +// Copyright 2011 Baptiste Lepilleur and The JsonCpp Authors +// Distributed under MIT license, or public domain if desired and +// recognized in your jurisdiction. +// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE + +#if !defined(JSON_IS_AMALGAMATION) +#include "json_tool.h" +#include +#endif // if !defined(JSON_IS_AMALGAMATION) +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if __cplusplus >= 201103L +#include +#include + +#if !defined(isnan) +#define isnan std::isnan +#endif + +#if !defined(isfinite) +#define isfinite std::isfinite +#endif + +#else +#include +#include + +#if defined(_MSC_VER) +#if !defined(isnan) +#include +#define isnan _isnan +#endif + +#if !defined(isfinite) +#include +#define isfinite _finite +#endif + +#if !defined(_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES) +#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 +#endif //_CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES + +#endif //_MSC_VER + +#if defined(__sun) && defined(__SVR4) // Solaris +#if !defined(isfinite) +#include +#define isfinite finite +#endif +#endif + +#if defined(__hpux) +#if !defined(isfinite) +#if defined(__ia64) && !defined(finite) +#define isfinite(x) \ + ((sizeof(x) == sizeof(float) ? _Isfinitef(x) : _IsFinite(x))) +#endif +#endif +#endif + +#if !defined(isnan) +// IEEE standard states that NaN values will not compare to themselves +#define isnan(x) ((x) != (x)) +#endif + +#if !defined(__APPLE__) +#if !defined(isfinite) +#define isfinite finite +#endif +#endif +#endif + +#if defined(_MSC_VER) +// Disable warning about strdup being deprecated. +#pragma warning(disable : 4996) +#endif + +namespace Json { + +#if __cplusplus >= 201103L || (defined(_CPPLIB_VER) && _CPPLIB_VER >= 520) +using StreamWriterPtr = std::unique_ptr; +#else +using StreamWriterPtr = std::auto_ptr; +#endif + +String valueToString(LargestInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + if (value == Value::minLargestInt) { + uintToString(LargestUInt(Value::maxLargestInt) + 1, current); + *--current = '-'; + } else if (value < 0) { + uintToString(LargestUInt(-value), current); + *--current = '-'; + } else { + uintToString(LargestUInt(value), current); + } + assert(current >= buffer); + return current; +} + +String valueToString(LargestUInt value) { + UIntToStringBuffer buffer; + char* current = buffer + sizeof(buffer); + uintToString(value, current); + assert(current >= buffer); + return current; +} + +#if defined(JSON_HAS_INT64) + +String valueToString(Int value) { return valueToString(LargestInt(value)); } + +String valueToString(UInt value) { return valueToString(LargestUInt(value)); } + +#endif // # if defined(JSON_HAS_INT64) + +namespace { +String valueToString(double value, bool useSpecialFloats, + unsigned int precision, PrecisionType precisionType) { + // Print into the buffer. We need not request the alternative representation + // that always has a decimal point because JSON doesn't distinguish the + // concepts of reals and integers. + if (!isfinite(value)) { + static const char* const reps[2][3] = {{"NaN", "-Infinity", "Infinity"}, + {"null", "-1e+9999", "1e+9999"}}; + return reps[useSpecialFloats ? 0 : 1] + [isnan(value) ? 0 : (value < 0) ? 1 : 2]; + } + + String buffer(size_t(36), '\0'); + while (true) { + int len = jsoncpp_snprintf( + &*buffer.begin(), buffer.size(), + (precisionType == PrecisionType::significantDigits) ? "%.*g" : "%.*f", + precision, value); + assert(len >= 0); + auto wouldPrint = static_cast(len); + if (wouldPrint >= buffer.size()) { + buffer.resize(wouldPrint + 1); + continue; + } + buffer.resize(wouldPrint); + break; + } + + buffer.erase(fixNumericLocale(buffer.begin(), buffer.end()), buffer.end()); + + // try to ensure we preserve the fact that this was given to us as a double on + // input + if (buffer.find('.') == buffer.npos && buffer.find('e') == buffer.npos) { + buffer += ".0"; + } + + // strip the zero padding from the right + if (precisionType == PrecisionType::decimalPlaces) { + buffer.erase(fixZerosInTheEnd(buffer.begin(), buffer.end(), precision), + buffer.end()); + } + + return buffer; +} +} // namespace + +String valueToString(double value, unsigned int precision, + PrecisionType precisionType) { + return valueToString(value, false, precision, precisionType); +} + +String valueToString(bool value) { return value ? "true" : "false"; } + +static bool doesAnyCharRequireEscaping(char const* s, size_t n) { + assert(s || !n); + + return std::any_of(s, s + n, [](unsigned char c) { + return c == '\\' || c == '"' || c < 0x20 || c > 0x7F; + }); +} + +static unsigned int utf8ToCodepoint(const char*& s, const char* e) { + const unsigned int REPLACEMENT_CHARACTER = 0xFFFD; + + unsigned int firstByte = static_cast(*s); + + if (firstByte < 0x80) + return firstByte; + + if (firstByte < 0xE0) { + if (e - s < 2) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = + ((firstByte & 0x1F) << 6) | (static_cast(s[1]) & 0x3F); + s += 1; + // oversized encoded characters are invalid + return calculated < 0x80 ? REPLACEMENT_CHARACTER : calculated; + } + + if (firstByte < 0xF0) { + if (e - s < 3) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = ((firstByte & 0x0F) << 12) | + ((static_cast(s[1]) & 0x3F) << 6) | + (static_cast(s[2]) & 0x3F); + s += 2; + // surrogates aren't valid codepoints itself + // shouldn't be UTF-8 encoded + if (calculated >= 0xD800 && calculated <= 0xDFFF) + return REPLACEMENT_CHARACTER; + // oversized encoded characters are invalid + return calculated < 0x800 ? REPLACEMENT_CHARACTER : calculated; + } + + if (firstByte < 0xF8) { + if (e - s < 4) + return REPLACEMENT_CHARACTER; + + unsigned int calculated = ((firstByte & 0x07) << 18) | + ((static_cast(s[1]) & 0x3F) << 12) | + ((static_cast(s[2]) & 0x3F) << 6) | + (static_cast(s[3]) & 0x3F); + s += 3; + // oversized encoded characters are invalid + return calculated < 0x10000 ? REPLACEMENT_CHARACTER : calculated; + } + + return REPLACEMENT_CHARACTER; +} + +static const char hex2[] = "000102030405060708090a0b0c0d0e0f" + "101112131415161718191a1b1c1d1e1f" + "202122232425262728292a2b2c2d2e2f" + "303132333435363738393a3b3c3d3e3f" + "404142434445464748494a4b4c4d4e4f" + "505152535455565758595a5b5c5d5e5f" + "606162636465666768696a6b6c6d6e6f" + "707172737475767778797a7b7c7d7e7f" + "808182838485868788898a8b8c8d8e8f" + "909192939495969798999a9b9c9d9e9f" + "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf" + "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf" + "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf" + "d0d1d2d3d4d5d6d7d8d9dadbdcdddedf" + "e0e1e2e3e4e5e6e7e8e9eaebecedeeef" + "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff"; + +static String toHex16Bit(unsigned int x) { + const unsigned int hi = (x >> 8) & 0xff; + const unsigned int lo = x & 0xff; + String result(4, ' '); + result[0] = hex2[2 * hi]; + result[1] = hex2[2 * hi + 1]; + result[2] = hex2[2 * lo]; + result[3] = hex2[2 * lo + 1]; + return result; +} + +static void appendRaw(String& result, unsigned ch) { + result += static_cast(ch); +} + +static void appendHex(String& result, unsigned ch) { + result.append("\\u").append(toHex16Bit(ch)); +} + +static String valueToQuotedStringN(const char* value, size_t length, + bool emitUTF8 = false) { + if (value == nullptr) + return ""; + + if (!doesAnyCharRequireEscaping(value, length)) + return String("\"") + value + "\""; + // We have to walk value and escape any special characters. + // Appending to String is not efficient, but this should be rare. + // (Note: forward slashes are *not* rare, but I am not escaping them.) + String::size_type maxsize = length * 2 + 3; // allescaped+quotes+NULL + String result; + result.reserve(maxsize); // to avoid lots of mallocs + result += "\""; + char const* end = value + length; + for (const char* c = value; c != end; ++c) { + switch (*c) { + case '\"': + result += "\\\""; + break; + case '\\': + result += "\\\\"; + break; + case '\b': + result += "\\b"; + break; + case '\f': + result += "\\f"; + break; + case '\n': + result += "\\n"; + break; + case '\r': + result += "\\r"; + break; + case '\t': + result += "\\t"; + break; + // case '/': + // Even though \/ is considered a legal escape in JSON, a bare + // slash is also legal, so I see no reason to escape it. + // (I hope I am not misunderstanding something.) + // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else { + appendRaw(result, codepoint); + } + } else { + unsigned codepoint = utf8ToCodepoint(c, end); // modifies `c` + if (codepoint < 0x20) { + appendHex(result, codepoint); + } else if (codepoint < 0x80) { + appendRaw(result, codepoint); + } else if (codepoint < 0x10000) { + // Basic Multilingual Plane + appendHex(result, codepoint); + } else { + // Extended Unicode. Encode 20 bits as a surrogate pair. + codepoint -= 0x10000; + appendHex(result, 0xd800 + ((codepoint >> 10) & 0x3ff)); + appendHex(result, 0xdc00 + (codepoint & 0x3ff)); + } + } + } break; + } + } + result += "\""; + return result; +} + +String valueToQuotedString(const char* value) { + return valueToQuotedStringN(value, strlen(value)); +} + +// Class Writer +// ////////////////////////////////////////////////////////////////// +Writer::~Writer() = default; + +// Class FastWriter +// ////////////////////////////////////////////////////////////////// + +FastWriter::FastWriter() + + = default; + +void FastWriter::enableYAMLCompatibility() { yamlCompatibilityEnabled_ = true; } + +void FastWriter::dropNullPlaceholders() { dropNullPlaceholders_ = true; } + +void FastWriter::omitEndingLineFeed() { omitEndingLineFeed_ = true; } + +String FastWriter::write(const Value& root) { + document_.clear(); + writeValue(root); + if (!omitEndingLineFeed_) + document_ += '\n'; + return document_; +} + +void FastWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + if (!dropNullPlaceholders_) + document_ += "null"; + break; + case intValue: + document_ += valueToString(value.asLargestInt()); + break; + case uintValue: + document_ += valueToString(value.asLargestUInt()); + break; + case realValue: + document_ += valueToString(value.asDouble()); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + document_ += valueToQuotedStringN(str, static_cast(end - str)); + break; + } + case booleanValue: + document_ += valueToString(value.asBool()); + break; + case arrayValue: { + document_ += '['; + ArrayIndex size = value.size(); + for (ArrayIndex index = 0; index < size; ++index) { + if (index > 0) + document_ += ','; + writeValue(value[index]); + } + document_ += ']'; + } break; + case objectValue: { + Value::Members members(value.getMemberNames()); + document_ += '{'; + for (auto it = members.begin(); it != members.end(); ++it) { + const String& name = *it; + if (it != members.begin()) + document_ += ','; + document_ += valueToQuotedStringN(name.data(), name.length()); + document_ += yamlCompatibilityEnabled_ ? ": " : ":"; + writeValue(value[name]); + } + document_ += '}'; + } break; + } +} + +// Class StyledWriter +// ////////////////////////////////////////////////////////////////// + +StyledWriter::StyledWriter() = default; + +String StyledWriter::write(const Value& root) { + document_.clear(); + addChildValues_ = false; + indentString_.clear(); + writeCommentBeforeValue(root); + writeValue(root); + writeCommentAfterValueOnSameLine(root); + document_ += '\n'; + return document_; +} + +void StyledWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + const String& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + document_ += " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledWriter::writeArrayValue(const Value& value) { + size_t size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultilineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + ArrayIndex index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + writeIndent(); + writeValue(childValue); + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + document_ += ','; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + document_ += "[ "; + for (size_t index = 0; index < size; ++index) { + if (index > 0) + document_ += ", "; + document_ += childValues_[index]; + } + document_ += " ]"; + } + } +} + +bool StyledWriter::isMultilineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledWriter::pushValue(const String& value) { + if (addChildValues_) + childValues_.push_back(value); + else + document_ += value; +} + +void StyledWriter::writeIndent() { + if (!document_.empty()) { + char last = document_[document_.length() - 1]; + if (last == ' ') // already indented + return; + if (last != '\n') // Comments may add new-line + document_ += '\n'; + } + document_ += indentString_; +} + +void StyledWriter::writeWithIndent(const String& value) { + writeIndent(); + document_ += value; +} + +void StyledWriter::indent() { indentString_ += String(indentSize_, ' '); } + +void StyledWriter::unindent() { + assert(indentString_.size() >= indentSize_); + indentString_.resize(indentString_.size() - indentSize_); +} + +void StyledWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + document_ += '\n'; + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + document_ += *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + writeIndent(); + ++iter; + } + + // Comments are stripped of trailing newlines, so add one here + document_ += '\n'; +} + +void StyledWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + document_ += " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + document_ += '\n'; + document_ += root.getComment(commentAfter); + document_ += '\n'; + } +} + +bool StyledWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +// Class StyledStreamWriter +// ////////////////////////////////////////////////////////////////// + +StyledStreamWriter::StyledStreamWriter(String indentation) + : document_(nullptr), indentation_(std::move(indentation)), + addChildValues_(), indented_(false) {} + +void StyledStreamWriter::write(OStream& out, const Value& root) { + document_ = &out; + addChildValues_ = false; + indentString_.clear(); + indented_ = true; + writeCommentBeforeValue(root); + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *document_ << "\n"; + document_ = nullptr; // Forget the stream, for safety. +} + +void StyledStreamWriter::writeValue(const Value& value) { + switch (value.type()) { + case nullValue: + pushValue("null"); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble())); + break; + case stringValue: { + // Is NULL possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue(valueToQuotedStringN(str, static_cast(end - str))); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + const String& name = *it; + const Value& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent(valueToQuotedString(name.c_str())); + *document_ << " : "; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void StyledStreamWriter::writeArrayValue(const Value& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isArrayMultiLine = isMultilineArray(value); + if (isArrayMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + const Value& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *document_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *document_ << "[ "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *document_ << ", "; + *document_ << childValues_[index]; + } + *document_ << " ]"; + } + } +} + +bool StyledStreamWriter::isMultilineArray(const Value& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + const Value& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void StyledStreamWriter::pushValue(const String& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *document_ << value; +} + +void StyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + *document_ << '\n' << indentString_; +} + +void StyledStreamWriter::writeWithIndent(const String& value) { + if (!indented_) + writeIndent(); + *document_ << value; + indented_ = false; +} + +void StyledStreamWriter::indent() { indentString_ += indentation_; } + +void StyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void StyledStreamWriter::writeCommentBeforeValue(const Value& root) { + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *document_ << *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would include newline + *document_ << indentString_; + ++iter; + } + indented_ = false; +} + +void StyledStreamWriter::writeCommentAfterValueOnSameLine(const Value& root) { + if (root.hasComment(commentAfterOnSameLine)) + *document_ << ' ' << root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *document_ << root.getComment(commentAfter); + } + indented_ = false; +} + +bool StyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +////////////////////////// +// BuiltStyledStreamWriter + +/// Scoped enums are not available until C++11. +struct CommentStyle { + /// Decide whether to write comments. + enum Enum { + None, ///< Drop all comments. + Most, ///< Recover odd behavior of previous versions (not implemented yet). + All ///< Keep all comments. + }; +}; + +struct BuiltStyledStreamWriter : public StreamWriter { + BuiltStyledStreamWriter(String indentation, CommentStyle::Enum cs, + String colonSymbol, String nullSymbol, + String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, + PrecisionType precisionType); + int write(Value const& root, OStream* sout) override; + +private: + void writeValue(Value const& value); + void writeArrayValue(Value const& value); + bool isMultilineArray(Value const& value); + void pushValue(String const& value); + void writeIndent(); + void writeWithIndent(String const& value); + void indent(); + void unindent(); + void writeCommentBeforeValue(Value const& root); + void writeCommentAfterValueOnSameLine(Value const& root); + static bool hasCommentForValue(const Value& value); + + using ChildValues = std::vector; + + ChildValues childValues_; + String indentString_; + unsigned int rightMargin_; + String indentation_; + CommentStyle::Enum cs_; + String colonSymbol_; + String nullSymbol_; + String endingLineFeedSymbol_; + bool addChildValues_ : 1; + bool indented_ : 1; + bool useSpecialFloats_ : 1; + bool emitUTF8_ : 1; + unsigned int precision_; + PrecisionType precisionType_; +}; +BuiltStyledStreamWriter::BuiltStyledStreamWriter( + String indentation, CommentStyle::Enum cs, String colonSymbol, + String nullSymbol, String endingLineFeedSymbol, bool useSpecialFloats, + bool emitUTF8, unsigned int precision, PrecisionType precisionType) + : rightMargin_(74), indentation_(std::move(indentation)), cs_(cs), + colonSymbol_(std::move(colonSymbol)), nullSymbol_(std::move(nullSymbol)), + endingLineFeedSymbol_(std::move(endingLineFeedSymbol)), + addChildValues_(false), indented_(false), + useSpecialFloats_(useSpecialFloats), emitUTF8_(emitUTF8), + precision_(precision), precisionType_(precisionType) {} +int BuiltStyledStreamWriter::write(Value const& root, OStream* sout) { + sout_ = sout; + addChildValues_ = false; + indented_ = true; + indentString_.clear(); + writeCommentBeforeValue(root); + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(root); + writeCommentAfterValueOnSameLine(root); + *sout_ << endingLineFeedSymbol_; + sout_ = nullptr; + return 0; +} +void BuiltStyledStreamWriter::writeValue(Value const& value) { + switch (value.type()) { + case nullValue: + pushValue(nullSymbol_); + break; + case intValue: + pushValue(valueToString(value.asLargestInt())); + break; + case uintValue: + pushValue(valueToString(value.asLargestUInt())); + break; + case realValue: + pushValue(valueToString(value.asDouble(), useSpecialFloats_, precision_, + precisionType_)); + break; + case stringValue: { + // Is NULL is possible for value.string_? No. + char const* str; + char const* end; + bool ok = value.getString(&str, &end); + if (ok) + pushValue( + valueToQuotedStringN(str, static_cast(end - str), emitUTF8_)); + else + pushValue(""); + break; + } + case booleanValue: + pushValue(valueToString(value.asBool())); + break; + case arrayValue: + writeArrayValue(value); + break; + case objectValue: { + Value::Members members(value.getMemberNames()); + if (members.empty()) + pushValue("{}"); + else { + writeWithIndent("{"); + indent(); + auto it = members.begin(); + for (;;) { + String const& name = *it; + Value const& childValue = value[name]; + writeCommentBeforeValue(childValue); + writeWithIndent( + valueToQuotedStringN(name.data(), name.length(), emitUTF8_)); + *sout_ << colonSymbol_; + writeValue(childValue); + if (++it == members.end()) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("}"); + } + } break; + } +} + +void BuiltStyledStreamWriter::writeArrayValue(Value const& value) { + unsigned size = value.size(); + if (size == 0) + pushValue("[]"); + else { + bool isMultiLine = (cs_ == CommentStyle::All) || isMultilineArray(value); + if (isMultiLine) { + writeWithIndent("["); + indent(); + bool hasChildValue = !childValues_.empty(); + unsigned index = 0; + for (;;) { + Value const& childValue = value[index]; + writeCommentBeforeValue(childValue); + if (hasChildValue) + writeWithIndent(childValues_[index]); + else { + if (!indented_) + writeIndent(); + indented_ = true; + writeValue(childValue); + indented_ = false; + } + if (++index == size) { + writeCommentAfterValueOnSameLine(childValue); + break; + } + *sout_ << ","; + writeCommentAfterValueOnSameLine(childValue); + } + unindent(); + writeWithIndent("]"); + } else // output on a single line + { + assert(childValues_.size() == size); + *sout_ << "["; + if (!indentation_.empty()) + *sout_ << " "; + for (unsigned index = 0; index < size; ++index) { + if (index > 0) + *sout_ << ((!indentation_.empty()) ? ", " : ","); + *sout_ << childValues_[index]; + } + if (!indentation_.empty()) + *sout_ << " "; + *sout_ << "]"; + } + } +} + +bool BuiltStyledStreamWriter::isMultilineArray(Value const& value) { + ArrayIndex const size = value.size(); + bool isMultiLine = size * 3 >= rightMargin_; + childValues_.clear(); + for (ArrayIndex index = 0; index < size && !isMultiLine; ++index) { + Value const& childValue = value[index]; + isMultiLine = ((childValue.isArray() || childValue.isObject()) && + !childValue.empty()); + } + if (!isMultiLine) // check if line length > max line length + { + childValues_.reserve(size); + addChildValues_ = true; + ArrayIndex lineLength = 4 + (size - 1) * 2; // '[ ' + ', '*n + ' ]' + for (ArrayIndex index = 0; index < size; ++index) { + if (hasCommentForValue(value[index])) { + isMultiLine = true; + } + writeValue(value[index]); + lineLength += static_cast(childValues_[index].length()); + } + addChildValues_ = false; + isMultiLine = isMultiLine || lineLength >= rightMargin_; + } + return isMultiLine; +} + +void BuiltStyledStreamWriter::pushValue(String const& value) { + if (addChildValues_) + childValues_.push_back(value); + else + *sout_ << value; +} + +void BuiltStyledStreamWriter::writeIndent() { + // blep intended this to look at the so-far-written string + // to determine whether we are already indented, but + // with a stream we cannot do that. So we rely on some saved state. + // The caller checks indented_. + + if (!indentation_.empty()) { + // In this case, drop newlines too. + *sout_ << '\n' << indentString_; + } +} + +void BuiltStyledStreamWriter::writeWithIndent(String const& value) { + if (!indented_) + writeIndent(); + *sout_ << value; + indented_ = false; +} + +void BuiltStyledStreamWriter::indent() { indentString_ += indentation_; } + +void BuiltStyledStreamWriter::unindent() { + assert(indentString_.size() >= indentation_.size()); + indentString_.resize(indentString_.size() - indentation_.size()); +} + +void BuiltStyledStreamWriter::writeCommentBeforeValue(Value const& root) { + if (cs_ == CommentStyle::None) + return; + if (!root.hasComment(commentBefore)) + return; + + if (!indented_) + writeIndent(); + const String& comment = root.getComment(commentBefore); + String::const_iterator iter = comment.begin(); + while (iter != comment.end()) { + *sout_ << *iter; + if (*iter == '\n' && ((iter + 1) != comment.end() && *(iter + 1) == '/')) + // writeIndent(); // would write extra newline + *sout_ << indentString_; + ++iter; + } + indented_ = false; +} + +void BuiltStyledStreamWriter::writeCommentAfterValueOnSameLine( + Value const& root) { + if (cs_ == CommentStyle::None) + return; + if (root.hasComment(commentAfterOnSameLine)) + *sout_ << " " + root.getComment(commentAfterOnSameLine); + + if (root.hasComment(commentAfter)) { + writeIndent(); + *sout_ << root.getComment(commentAfter); + } +} + +// static +bool BuiltStyledStreamWriter::hasCommentForValue(const Value& value) { + return value.hasComment(commentBefore) || + value.hasComment(commentAfterOnSameLine) || + value.hasComment(commentAfter); +} + +/////////////// +// StreamWriter + +StreamWriter::StreamWriter() : sout_(nullptr) {} +StreamWriter::~StreamWriter() = default; +StreamWriter::Factory::~Factory() = default; +StreamWriterBuilder::StreamWriterBuilder() { setDefaults(&settings_); } +StreamWriterBuilder::~StreamWriterBuilder() = default; +StreamWriter* StreamWriterBuilder::newStreamWriter() const { + const String indentation = settings_["indentation"].asString(); + const String cs_str = settings_["commentStyle"].asString(); + const String pt_str = settings_["precisionType"].asString(); + const bool eyc = settings_["enableYAMLCompatibility"].asBool(); + const bool dnp = settings_["dropNullPlaceholders"].asBool(); + const bool usf = settings_["useSpecialFloats"].asBool(); + const bool emitUTF8 = settings_["emitUTF8"].asBool(); + unsigned int pre = settings_["precision"].asUInt(); + CommentStyle::Enum cs = CommentStyle::All; + if (cs_str == "All") { + cs = CommentStyle::All; + } else if (cs_str == "None") { + cs = CommentStyle::None; + } else { + throwRuntimeError("commentStyle must be 'All' or 'None'"); + } + PrecisionType precisionType(significantDigits); + if (pt_str == "significant") { + precisionType = PrecisionType::significantDigits; + } else if (pt_str == "decimal") { + precisionType = PrecisionType::decimalPlaces; + } else { + throwRuntimeError("precisionType must be 'significant' or 'decimal'"); + } + String colonSymbol = " : "; + if (eyc) { + colonSymbol = ": "; + } else if (indentation.empty()) { + colonSymbol = ":"; + } + String nullSymbol = "null"; + if (dnp) { + nullSymbol.clear(); + } + if (pre > 17) + pre = 17; + String endingLineFeedSymbol; + return new BuiltStyledStreamWriter(indentation, cs, colonSymbol, nullSymbol, + endingLineFeedSymbol, usf, emitUTF8, pre, + precisionType); +} + +bool StreamWriterBuilder::validate(Json::Value* invalid) const { + static const auto& valid_keys = *new std::set{ + "indentation", + "commentStyle", + "enableYAMLCompatibility", + "dropNullPlaceholders", + "useSpecialFloats", + "emitUTF8", + "precision", + "precisionType", + }; + for (auto si = settings_.begin(); si != settings_.end(); ++si) { + auto key = si.name(); + if (valid_keys.count(key)) + continue; + if (invalid) + (*invalid)[key] = *si; + else + return false; + } + return invalid ? invalid->empty() : true; +} + +Value& StreamWriterBuilder::operator[](const String& key) { + return settings_[key]; +} +// static +void StreamWriterBuilder::setDefaults(Json::Value* settings) { + //! [StreamWriterBuilderDefaults] + (*settings)["commentStyle"] = "All"; + (*settings)["indentation"] = "\t"; + (*settings)["enableYAMLCompatibility"] = false; + (*settings)["dropNullPlaceholders"] = false; + (*settings)["useSpecialFloats"] = false; + (*settings)["emitUTF8"] = false; + (*settings)["precision"] = 17; + (*settings)["precisionType"] = "significant"; + //! [StreamWriterBuilderDefaults] +} + +String writeString(StreamWriter::Factory const& factory, Value const& root) { + OStringStream sout; + StreamWriterPtr const writer(factory.newStreamWriter()); + writer->write(root, &sout); + return sout.str(); +} + +OStream& operator<<(OStream& sout, Value const& root) { + StreamWriterBuilder builder; + StreamWriterPtr const writer(builder.newStreamWriter()); + writer->write(root, &sout); + return sout; +} + +} // namespace Json diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj new file mode 100644 index 0000000..e170cfc --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj @@ -0,0 +1,177 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 16.0 + Win32Proj + {f1736b3f-03a2-4fc7-b045-a12ba8d724fb} + jsoncpp + 10.0 + + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + DynamicLibrary + true + v143 + Unicode + + + DynamicLibrary + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + ./;$(IncludePath) + + + false + ./;$(IncludePath) + + + true + ./;$(IncludePath) + + + false + ./;$(IncludePath) + + + + Level3 + true + WIN32;_DEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) + true + NotUsing + pch.h + + + Windows + true + false + + + + + Level3 + true + true + true + WIN32;NDEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) + true + NotUsing + pch.h + + + Windows + true + true + true + false + + + + + Level3 + true + _DEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) + true + NotUsing + pch.h + + + Windows + true + false + + + + + Level3 + true + true + true + NDEBUG;JSONCPP_EXPORTS;_WINDOWS;_USRDLL;JSON_DLL_BUILD;%(PreprocessorDefinitions) + true + NotUsing + pch.h + + + Windows + true + true + true + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters new file mode 100644 index 0000000..ccf99d7 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.filters @@ -0,0 +1,63 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + {b702a2a0-b1a3-486d-b83e-23cb806e5158} + + + + + 源文件 + + + 源文件 + + + 源文件 + + + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + 头文件\json + + + \ No newline at end of file diff --git a/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user new file mode 100644 index 0000000..88a5509 --- /dev/null +++ b/XEngine_Source/XEngine_ThirdPart/jsoncpp/jsoncpp.vcxproj.user @@ -0,0 +1,4 @@ + + + + \ No newline at end of file -- Gitee From 8a27e6dbcd321d1349415eccd011d445e9882861 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Mon, 11 Apr 2022 13:36:57 +0800 Subject: [PATCH 06/12] modify:support x64 debug build --- .../XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj | 6 ++++-- .../XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj | 6 ++++-- XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h | 4 ++-- XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp | 6 +++--- .../XEngine_ServiceApp/XEngine_ServiceApp.vcxproj | 6 ++++-- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj b/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj index ed06b79..cc3f441 100644 --- a/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj +++ b/XEngine_Source/XEngine_ModuleAuthorize/XEngine_ModuleAuthorize.vcxproj @@ -43,7 +43,7 @@ DynamicLibrary true v143 - Unicode + MultiByte DynamicLibrary @@ -82,6 +82,8 @@ true + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false @@ -128,7 +130,7 @@ Level3 true - _DEBUG;XENGINEMODULEAUTHORIZE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _DEBUG;XENGINEMODULEAUTHORIZE_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 9579ba2..267c774 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -43,7 +43,7 @@ DynamicLibrary true v143 - Unicode + MultiByte DynamicLibrary @@ -82,6 +82,8 @@ true + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false @@ -131,7 +133,7 @@ Level3 true - _DEBUG;XENGINEMODULECONFIGURE_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) + _DEBUG;XENGINEMODULECONFIGURE_EXPORTS;_WINDOWS;_USRDLL;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true Use pch.h diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h index c17ddb2..8cd2696 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_Hdr.h @@ -8,7 +8,7 @@ #include #include #include -#ifdef _WINDOWS +#ifdef _MSC_BUILD #include #include #else @@ -82,7 +82,7 @@ extern XENGINE_SERVICECONFIG st_ServiceConfig; #define XENGINE_CLIENT_CLOSE_SERVICE 3 //连接库 -#ifdef _WINDOWS +#ifdef _MSC_BUILD #ifdef _WIN64 #pragma comment(lib,"../x64/Release/XEngine_ModuleConfigure.lib") #pragma comment(lib,"../x64/Release/XEngine_ModuleAuthorize.lib") diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp index f0eb0c1..e3b225d 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.cpp @@ -35,7 +35,7 @@ void ServiceApp_Stop(int signo) //LINUX守护进程 static int ServiceApp_Deamon() { -#ifndef _WINDOWS +#ifndef _MSC_BUILD pid_t nPID = 0; int nStatus = 0; nPID = fork(); @@ -65,7 +65,7 @@ static int ServiceApp_Deamon() int main(int argc, char** argv) { -#ifdef _WINDOWS +#ifdef _MSC_BUILD WSADATA st_WSAData; WSAStartup(MAKEWORD(2, 2), &st_WSAData); #endif @@ -205,7 +205,7 @@ XENGINE_SERVICEAPP_EXIT: HelpComponents_XLog_Destroy(xhLog); ModuleAuthorize_User_Destory(); } -#ifdef _WINDOWS +#ifdef _MSC_BUILD WSACleanup(); #endif return 0; diff --git a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj index 4c4fd53..2ef6fdd 100644 --- a/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj +++ b/XEngine_Source/XEngine_ServiceApp/XEngine_ServiceApp.vcxproj @@ -43,7 +43,7 @@ Application true v143 - Unicode + MultiByte Application @@ -82,6 +82,8 @@ true + $(XEngine_Include);$(IncludePath) + $(XEngine_Lib64);$(LibraryPath) false @@ -123,7 +125,7 @@ Level3 true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + _DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) true -- Gitee From 0c53001dfb2902c983390e82cc90b07fa1e804c6 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 12 Apr 2022 13:11:20 +0800 Subject: [PATCH 07/12] added:x64 copy file --- XEngine_Source/VSCopy-x64.bat | 24 +++++++++++++++++++++++ XEngine_Source/VSCopy-x86.bat | 36 +++++++++++++++++------------------ 2 files changed, 42 insertions(+), 18 deletions(-) create mode 100644 XEngine_Source/VSCopy-x64.bat diff --git a/XEngine_Source/VSCopy-x64.bat b/XEngine_Source/VSCopy-x64.bat new file mode 100644 index 0000000..8f3c7d7 --- /dev/null +++ b/XEngine_Source/VSCopy-x64.bat @@ -0,0 +1,24 @@ +copy /y "%XEngine_Lib64%\x64\XEngine_BaseLib\XEngine_BaseLib.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_BaseLib\XEngine_Algorithm.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_Core\XEngine_Core.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_Core\XEngine_OPenSsl.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_Core\XEngine_ManagePool.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_Core\XEngine_NetXApi.dll" "./" + +copy /y "%XEngine_Lib64%\x64\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_Client\XClient_Socket.dll" "./" + +copy /y "%XEngine_Lib64%\x64\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_RfcComponents\RfcComponents_ProxyProtocol.dll" "./" + +copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" + +copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" + +copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libcrypto-3-x64.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libssl-3-x64.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_LibEx\libcurl.dll" "./" +copy /y "%XEngine_Lib64%\XEngine_LibEx\nghttp2.dll" "./" +copy /y "%XEngine_Lib64%\x64\XEngine_HelpComponents\zlib1.dll" "./" \ No newline at end of file diff --git a/XEngine_Source/VSCopy-x86.bat b/XEngine_Source/VSCopy-x86.bat index 2465b0d..9406209 100644 --- a/XEngine_Source/VSCopy-x86.bat +++ b/XEngine_Source/VSCopy-x86.bat @@ -1,23 +1,23 @@ -copy /y "%XEngine_Library%\x86\XEngine_BaseLib\XEngine_BaseLib.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_BaseLib\XEngine_Algorithm.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_Core\XEngine_Core.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_Core\XEngine_OPenSsl.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_Core\XEngine_ManagePool.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_Core\XEngine_NetXApi.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_BaseLib.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_BaseLib\XEngine_Algorithm.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_Core.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_OPenSsl.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_ManagePool.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_Core\XEngine_NetXApi.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_Client\XClient_Socket.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_NetHelp\NetHelp_APIHelp.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_Client\XClient_Socket.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_RfcComponents\RfcComponents_ProxyProtocol.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_HelpComponents\HelpComponents_XLog.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_RfcComponents\RfcComponents_ProxyProtocol.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_ProcFile.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_SystemSdk\XEngine_SystemApi.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_LibEx\libcrypto-1_1.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_LibEx\libssl-1_1.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_LibEx\libcurl.dll" "./" -copy /y "%XEngine_Library%\x86\XEngine_HelpComponents\zlib1.dll" "./" \ No newline at end of file +copy /y "%XEngine_Lib32%\XEngine_LibEx\libcrypto-3.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_LibEx\libssl-3.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_LibEx\libcurl.dll" "./" +copy /y "%XEngine_Lib32%\XEngine_HelpComponents\zlib1.dll" "./" \ No newline at end of file -- Gitee From 722c7fe6da1c9c62bd7cdebe1ba2868d7ee32acc Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Tue, 12 Apr 2022 13:11:38 +0800 Subject: [PATCH 08/12] modify:readme --- README.en.md | 18 ++---------------- README.md | 15 +-------------- 2 files changed, 3 insertions(+), 30 deletions(-) diff --git a/README.en.md b/README.en.md index 8b1a795..c64a46a 100644 --- a/README.en.md +++ b/README.en.md @@ -24,29 +24,15 @@ this software support following features #### Requirements support system above windows 7sp1 and linux(ubuntu20.04,centos8) XEngine need V7.27 or above -vcpkg need 2021.05.11 or above #### Windows -use vs2019 x86(debug or release) x64(only release) open and complie -You need to configure the environment in the following way, otherwise you may need to set the library directory in the project yourself - -##### install Dependent library -vcpkg:https://github.com/microsoft/vcpkg -vcpkg.exe install jsoncpp -vcpkg integrate install -you can not use vcpkg and config jsoncpp development for youself +use vs open and complie +You need to configure the environment in the following way, otherwise you may need to set the library directory in the project yourself #### Linux Linux use Makefile to complie supproted ubuntu x64 or centos x64 -##### install Dependent library -install jsoncpp to your system -ubuntu20.04 -sudo apt install libjsoncpp-devel -Centos8.x -sudo dnf install jsoncpp-devel - ##### XEngine Install you can install xengine env to your system by shell like this:sudo XEngine_RunEnv.sh -i 3 diff --git a/README.md b/README.md index 4e45458..43b5964 100644 --- a/README.md +++ b/README.md @@ -24,28 +24,15 @@ c c++ Socks5 Proxy Service HTTP Tunnel Proxy Service #### 版本需求 支持WINDOWS 7SP1和LINUX(UBUNT20.04,CENTOS8)以上系统 XEngine版本需要V7.27或者以上版本 -vcpkg 需要2021.05.11以上版本 #### Windows -使用VS2019 x86(debug release) x64(release)打开并且编译 +使用VS打开并且编译 你需要按照下面的方式配置环境,不然你可能需要自己在项目中设置库目录 -##### 三方库环境 -需要使用VCPKG安装环境.代码地址:https://github.com/microsoft/vcpkg -安装好后你可能需要把它集成到你的VS中 -然后命令安装环境: vcpkg.exe install jsoncpp -集成VS环境: vcpkg integrate install -vcpkg 主要为了方便安装jsoncpp,如果你想自己配置jsoncpp的环境,可以不使用vcpkg... #### Linux Linux使用Makefile编译 UBUNTU20.04 x64或者CENTOS8 x64均可 -##### 三方库环境 -基于不同系统,可能命令不同,比如在Ubuntu下面 -sudo apt install libjsoncpp-devel -Centos8.x -sudo dnf install jsoncpp-devel - ##### 编译命令 在XEngine_Source目录下执行命令 make 编译 -- Gitee From 83308399d007e4d6af549410382ac9d1a1911153 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Apr 2022 16:38:43 +0800 Subject: [PATCH 09/12] fixed:the vs2022 release build error --- .../XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj index 267c774..bb4e5cc 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj +++ b/XEngine_Source/XEngine_ModuleConfigure/XEngine_ModuleConfigure.vcxproj @@ -77,7 +77,7 @@ false - $(XEngine_Include);$(IncludePath) + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib32);$(LibraryPath) @@ -87,7 +87,7 @@ false - $(XEngine_Include);$(IncludePath) + $(XEngine_Include);../XEngine_ThirdPart/jsoncpp;$(IncludePath) $(XEngine_Lib64);$(LibraryPath) -- Gitee From 3dd896343738b2460ff34fd77f870e078a4a6856 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Apr 2022 16:56:58 +0800 Subject: [PATCH 10/12] update:docment and configure file --- XEngine_Docment/Docment_en.docx | Bin 245041 -> 244824 bytes XEngine_Docment/Docment_zh.docx | Bin 243232 -> 243081 bytes .../XEngine_Config/XEngine_Config.json | 3 ++- 3 files changed, 2 insertions(+), 1 deletion(-) diff --git a/XEngine_Docment/Docment_en.docx b/XEngine_Docment/Docment_en.docx index 9057e20ccdf617387f5c849e8b2fc4840a8d9910..73eb262507cd78e430a18a6a9ee1b7d9cc1c7ede 100644 GIT binary patch delta 85264 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
FZpB+tTzMmg~=Gs_P5Sk7S6X)o7c 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 gCdP3sU}6)X3B`jwO@Jyi3j~@0Ddx!i_@% delta 85419 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 LL<@~GA7TFiY&dFF diff --git a/XEngine_Docment/Docment_zh.docx b/XEngine_Docment/Docment_zh.docx index 172dc1ac01f57ed89026119852df0b9b3bcdb905..7063c3426e39862632e781ae0561089812364089 100644 GIT binary patch delta 86061 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ü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 OR6vP?m&`J9kbeQKqg?R- delta 86199 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

s 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 S0<3SBT(tuy2BWS60000F+45EZ diff --git a/XEngine_Release/XEngine_Config/XEngine_Config.json b/XEngine_Release/XEngine_Config/XEngine_Config.json index ac11f93..82e9349 100644 --- a/XEngine_Release/XEngine_Config/XEngine_Config.json +++ b/XEngine_Release/XEngine_Config/XEngine_Config.json @@ -20,10 +20,11 @@ "tszLogFile":"./XEngine_Log/XEngine_ServiceApp.log" }, "XAuth":{ - "bAuth":0, + "bAuth":2, "tszAuthFile":"./XEngine_Config/UserList.txt" }, "XVer":[ + "1.2.0.1001 Build20220413", "1.1.0.1001 Build20211231", "1.0.0.1001 Build20211211" ] -- Gitee From 550968df97ad26859384a67e60ebcf58d8bd1b17 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Apr 2022 17:01:53 +0800 Subject: [PATCH 11/12] modify:not count version number --- .../ModuleConfigure_Json/ModuleConfigure_Json.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp index cad9070..d3c10db 100644 --- a/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp +++ b/XEngine_Source/XEngine_ModuleConfigure/ModuleConfigure_Json/ModuleConfigure_Json.cpp @@ -130,7 +130,7 @@ BOOL CModuleConfigure_Json::ModuleConfigure_Json_File(LPCTSTR lpszConfigFile, XE pSt_ServerConfig->st_XAuth.bAuth = st_JsonXAuth["bAuth"].asInt(); _tcscpy(pSt_ServerConfig->st_XAuth.tszAuthFile, st_JsonXAuth["tszAuthFile"].asCString()); - if (st_JsonRoot["XVer"].empty() || (2 != st_JsonRoot["XVer"].size())) + if (st_JsonRoot["XVer"].empty()) { Config_IsErrorOccur = TRUE; Config_dwErrorCode = ERROR_MODULE_CONFIGURE_JSON_XVER; -- Gitee From 8728a257b0a0e09112d33db4c66d6cc86f6545d8 Mon Sep 17 00:00:00 2001 From: qyt <486179@qq.com> Date: Wed, 13 Apr 2022 17:04:33 +0800 Subject: [PATCH 12/12] update:CHANGELOG --- CHANGELOG | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index f72ed26..f33c9ff 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ +XEngine_ProxyServer V1.2.0.1001 + +添加:jsoncpp模块到项目 +修改:VS2019到VS2022 + +added:jsoncpp module +modify:up vs2019 to vs2022 +====================================================================================== XEngine_ProxyServer V1.1.0.1001 添加:用户验证模块 -- Gitee