first add files

This commit is contained in:
2019-11-29 11:58:31 +08:00
parent 9c86489a35
commit 15db8e01c7
16 changed files with 677 additions and 0 deletions

3
src/CMakeLists.txt Normal file
View File

@@ -0,0 +1,3 @@
add_subdirectory(xml)
add_subdirectory(json)

77
src/cmd/CmdParse.cpp Normal file
View File

@@ -0,0 +1,77 @@
#include<hgl/ut/CmdParse.h>
#include<hgl/Str.h>
namespace hgl
{
namespace util
{
CmdParse::CmdParse(const OSStringList &_args)
{
args=_args;
}
CmdParse::~CmdParse()
{
}
int CmdParse::Find(const OSString &flag)const
{
return args.Find(flag,flag.Length());
}
bool CmdParse::GetInteger(const OSString &flag,int *result)const
{
int index=Find(flag);
if(index==-1)return(false);
const OSString &str=args[index];
if(str.Length()>flag.Length())
{
stoi(str.c_str()+flag.Length(),*result);
}
else
{
stoi(str.c_str(),*result);
}
return(true);
}
bool CmdParse::GetString(const OSString &flag,OSString &result)const
{
int index=Find(flag);
os_char *p=nullptr;
if(index==-1)return(false);
const OSString &str=args[index];
if(str.Length()>flag.Length())
{
p=str.c_str()+flag.Length();
}
else
{
p=args[index+1];
}
if(*p=='"') //有引号
{
int len=strchr(p+1,L'"')-p;
if(len>1)
result.Strcpy(p+1,len-1);
else
result=p+1;
}
else //无引号
{
result=p;
}
return(true);
}
}//namespace util
}//namespace hgl

22
src/json/CMakeLists.txt Normal file
View File

@@ -0,0 +1,22 @@
set(JSON_TOOL_HEADER_FILES ${CMUTIL_ROOT_INCLUDE_PATH}/hgl/util/json/JsonTool.h)
set(JSON_TOOL_SOURCE_FILES JsonTool.cpp)
SOURCE_GROUP("JSON" FILES JsonTool.cpp)
IF(WIN32)
SET(JSONCPP_PATH ${CMUTIL_ROOT_3RDPTY_PATH}/jsoncpp)
include_directories(${JSONCPP_PATH}/include)
include_directories(${JSONCPP_PATH}/src/lib_json)
SET(JSONCPP_SOURCE ${JSONCPP_PATH}/src/lib_json/json_reader.cpp
${JSONCPP_PATH}/src/lib_json/json_value.cpp
${JSONCPP_PATH}/src/lib_json/json_writer.cpp)
SET(JSON_TOOL_SOURCE_FILES ${JSON_TOOL_SOURCE_FILES} ${JSONCPP_SOURCE})
SOURCE_GROUP("JSON\\jsoncpp" FILES ${JSONCPP_SOURCE})
ENDIF(WIN32)
add_cm_library(CMUtil.JSON "CM/Util" ${JSON_TOOL_HEADER_FILES}
${JSON_TOOL_SOURCE_FILES})

92
src/json/JsonTool.cpp Normal file
View File

@@ -0,0 +1,92 @@
#include<string>
#include<sstream>
#include<json/json.h>
#include<hgl/filesystem/FileSystem.h>
#include<hgl/type/StdString.h>
using namespace hgl::filesystem;
using namespace std;
namespace hgl
{
bool JsonToString(const Json::Value &jv_root,UTF8String &str,OSString &error_info)
{
Json::StreamWriterBuilder builder;
Json::StreamWriter *writer=builder.newStreamWriter();
JSONCPP_OSTRINGSTREAM json_result;
bool result;
try
{
writer->write(jv_root,&json_result);
result=true;
str=std_to_u8(json_result.str());
}
catch(std::exception &e)
{
error_info=OS_TEXT("[C++ Exception][Json::StreamWriter::write] ")+std_to_os(e.what());
result=false;
}
delete writer;
return result;
}
bool ParseJson(Json::Value &root,const char *txt,const int size,OSString &error_str)
{
Json::CharReaderBuilder builder;
Json::CharReader *reader=builder.newCharReader();
Json::String errs;
const bool result=reader->parse(txt,txt+size,&root,&errs);
delete reader;
error_str=std_to_os(errs);
return result;
}
bool LoadJson(Json::Value &root,const OSString &filename,OSString &error_info)
{
char *txt;
int size;
size=LoadFileToMemory(filename,(void **)&txt);
if(size<=0)
{
error_info=OS_TEXT("[ERROR][LoadJson] Load file failed, filename: ")+filename;
return(false);
}
bool result;
result=ParseJson(root,txt,size,error_info);
delete[] txt;
return(result);
}
int SaveJson(Json::Value &root,const OSString &filename,OSString &error_info)
{
UTF8String txt;
if(!JsonToString(root,txt,error_info))
return(false);
const int64 result=SaveMemoryToFile(filename,txt.c_str(),txt.Length());
if(result!=txt.Length())
{
error_info=OS_TEXT("[ERROR][SaveJson] Save file failed, only write ")+OSString(result)+OS_TEXT("/")+OSString(txt.Length());
return(false);
}
return(true);
}
}//namespace hgl

38
src/time/Timer.cpp Normal file
View File

@@ -0,0 +1,38 @@
#include<hgl/ut/Timer.h>
#include<hgl/Time.h>
namespace hgl
{
Timer::Timer(double t)
{
hglSetProperty(Interval,this,Timer::GetInterval,Timer::SetInterval);
if(t)
Interval=t;
else
SetEnabled(false);
OnTimer=nullptr;
}
void Timer::SetInterval(double t)
{
inter=t;
next=GetDoubleTime()+t;
}
void Timer::Update()
{
if(OnTimer==nullptr) //没有设置事件函数
SetEnabled(false);
double cur_time=GetDoubleTime();
if(inter&&cur_time>=next) //间隔大于0且时间到了
{
SafeCallEvent(OnTimer,(this));
next=cur_time+inter;
}
}
}//namespace hgl

22
src/xml/CMakeLists.txt Normal file
View File

@@ -0,0 +1,22 @@
SET(XML_PARSE_SOURCE XMLParseClass.cpp)
SOURCE_GROUP("XML" FILES XMLParseClass.cpp)
IF(WIN32)
SET(EXPAT_SOURCE_PATH ${CMUTIL_ROOT_3RDPTY_PATH}/expat/expat/lib)
include_directories(${EXPAT_SOURCE_PATH})
SET(EXPAT_SOURCE
${EXPAT_SOURCE_PATH}/xmlparse.c
${EXPAT_SOURCE_PATH}/xmlrole.c
${EXPAT_SOURCE_PATH}/xmltok.c
${EXPAT_SOURCE_PATH}/xmltok_impl.c
${EXPAT_SOURCE_PATH}/xmltok_ns.c)
SET(XML_PARSE_SOURCE ${XML_PARSE_SOURCE} ${EXPAT_SOURCE})
SOURCE_GROUP("XML\\Expat" FILES ${EXPAT_SOURCE})
ENDIF(WIN32)
add_cm_library(CMUtil.XML "CM/Util" ${XML_PARSE_SOURCE})

188
src/xml/XMLParseClass.cpp Normal file
View File

@@ -0,0 +1,188 @@
//取名为XMLParseClass是为了避免与expat的xmlparse.c编译造成obj冲突
#include<hgl/util/xml/XMLParse.h>
#include<hgl/io/FileInputStream.h>
#include<hgl/filesystem/FileSystem.h>
#include<expat.h>
namespace hgl
{
namespace
{
constexpr uint HGL_XML_PARSE_MAX_SIZE=HGL_SIZE_1KB*128; //最大一次解晰长度
void XMLStartElement(XMLParse *xml,const XML_Char *name,const XML_Char **atts)
{
xml->StartElement(name,atts);
}
void XMLCharData(XMLParse *xml,const XML_Char *str,int len)
{
xml->CharData(str,len);
}
void XMLEndElement(XMLParse *xml,const XML_Char *name)
{
xml->EndElement(name);
}
}
XMLParse::XMLParse()
{
xml=nullptr;
}
XMLParse::~XMLParse()
{
if(!xml)return;
XML_ParserFree(xml);
}
void XMLParse::StartParse()
{
XML_SetElementHandler(xml,(XML_StartElementHandler)XMLStartElement,(XML_EndElementHandler)XMLEndElement);
XML_SetCharacterDataHandler(xml,(XML_CharacterDataHandler)XMLCharData);
}
/**
* 重新开始一次解晰
*/
void XMLParse::Start()
{
if(xml)
{
XML_ParserReset(xml,"utf-8");
}
else
{
xml=XML_ParserCreate("utf-8");
XML_SetUserData(xml,this);
StartParse();
}
}
/**
* 解晰一段xml文本
* @param buf 文本缓冲区
* @param len 文本长度
* @param isFin 是否结束
* @return 此次解晰是否成功
*/
bool XMLParse::Parse(const char *buf,int len,bool isFin)
{
if(!xml)return(false);
return XML_Parse(xml,buf,len,isFin);
}
bool hgl::XMLParse::Parse(io::InputStream *is, bool isFin)
{
if(!is)return(false);
if(is->CanSize()&&is->GetSize()<=HGL_XML_PARSE_MAX_SIZE) //可以取长度的,并且<=指定长度的一次读完
{
int full_size=is->Available();
char *data=new char[full_size];
int pos=0;
int size;
bool result;
while(pos<full_size)
{
size=is->ReadFully(data,full_size);
if(size<0)
return(false);
result=Parse(data,size,pos+size>=full_size);
if(!result)
return(false);
pos+=size;
}
return(true);
}
else //不能取长度或是大于指定长度的
{
char data[HGL_XML_PARSE_MAX_SIZE];
int size;
bool result;
for(;;)
{
size=is->Available();
if(size<=0)break;
if(size>HGL_XML_PARSE_MAX_SIZE)
{
size=is->Read(data,HGL_XML_PARSE_MAX_SIZE);
result=Parse(data,HGL_XML_PARSE_MAX_SIZE,false);
}
else
{
size=is->Read(data,size);
result=Parse(data,size,true);
}
if(!result)return(false);
}
return(true);
}
}
/**
* 解晰一个XML文件
*/
bool XMLParseFile(XMLParse *xml,const OSString &filename)
{
if(!xml)return(false);
if(filename.IsEmpty())return(false);
if(!filesystem::FileCanRead(filename))return(false);
io::OpenFileInputStream fis(filename);
return xml->Parse(&fis);
}
namespace
{
void StartElementCB(XMLParseCB *xml,const XML_Char *name,const XML_Char **atts)
{
SafeCallEvent(xml->OnStartElement,(name,atts));
}
void CharDataCB(XMLParseCB *xml,const XML_Char *str,int len)
{
SafeCallEvent(xml->OnCharData,(str,len));
}
void EndElementCB(XMLParseCB *xml,const XML_Char *name)
{
SafeCallEvent(xml->OnEndElement,(name));
}
}
XMLParseCB::XMLParseCB()
{
OnStartElement=nullptr;
OnCharData=nullptr;
OnEndElement=nullptr;
}
void XMLParseCB::StartParse()
{
XML_SetElementHandler(xml,(XML_StartElementHandler)StartElementCB,(XML_EndElementHandler)EndElementCB);
XML_SetCharacterDataHandler(xml,(XML_CharacterDataHandler)CharDataCB);
}
}//namespace hgl