使用字符串替代字符指针操作,未测试

This commit is contained in:
nnhy 2016-03-14 05:06:04 +00:00
parent a37cbd0f20
commit bef7df0d7c
7 changed files with 36 additions and 46 deletions

View File

@ -29,7 +29,7 @@ struct ConfigBlock
const void* Data() const;
uint CopyTo(Buffer& bs) const;
bool Init(const char* name, const Buffer& bs);
bool Init(const String& name, const Buffer& bs);
bool Write(const Storage& storage, uint addr, const Buffer& bs);
bool Remove(const Storage& storage, uint addr);
};
@ -73,28 +73,19 @@ uint ConfigBlock::CopyTo(Buffer& bs) const
}
// 构造一个新的配置块
bool ConfigBlock::Init(const char* name, const Buffer& bs)
bool ConfigBlock::Init(const String& name, const Buffer& bs)
{
if(name == nullptr) return false;
//assert_param2(name, "配置块名称不能为空");
if(!name) return false;
TS("ConfigBlock::Init");
uint slen = strlen(name);
if(slen > sizeof(Name)) return false;
if(slen > ArrayLength(Name)) slen = ArrayLength(Name);
Buffer ns(Name, ArrayLength(Name));
// 无论如何,把整个名称区域清空
ns.Clear();
if(name.Length() > sizeof(Name)) return false;
// 配置块的大小,只有第一次能够修改,以后即使废弃也不能修改,仅仅清空名称
if(bs.Length() > 0)
{
Size = bs.Length();
ns.SetLength(slen);
ns = name;
name.CopyTo(0, Name, -1);
}
Hash = GetHash();
@ -169,26 +160,23 @@ bool CheckSignature(const Storage& st, uint& addr, bool create)
}
// 循环查找配置块
const ConfigBlock* FindBlock(const Storage& st, uint addr, const char* name)
const ConfigBlock* FindBlock(const Storage& st, uint addr, const String& name)
{
TS("Config::Find");
if(name == nullptr) return nullptr;
//assert_param2(name, "配置段名称不能为空");
if(!name) return nullptr;
if(!CheckSignature(st, addr, false)) return nullptr;
// 第一个配置块
auto cfg = (const ConfigBlock*)addr;
uint slen = strlen(name);
if(slen > sizeof(cfg->Name)) return nullptr;
//assert_param2(slen <= sizeof(cfg->Name), "配置段名称最大4个字符");
if(name.Length() > sizeof(cfg->Name)) return nullptr;
// 遍历链表,找到同名块
while(cfg->Valid())
{
if(cfg->Name[0] && memcmp(name, cfg->Name, slen) == 0) return cfg;
if(cfg->Name[0] && name == cfg->Name) return cfg;
cfg = cfg->Next();
}
@ -218,7 +206,7 @@ const ConfigBlock* NewBlock(const Storage& st, uint addr, int size)
}
// 循环查找配置块
const void* Config::Find(const char* name) const
const void* Config::Find(const String& name) const
{
return FindBlock(Device, Address, name);
}
@ -240,12 +228,12 @@ const void* Config::New(int size) const
}
// 删除
bool Config::Remove(const char* name) const
bool Config::Remove(const String& name) const
{
//return Set(name, ByteArray(0));
TS("Config::Remove");
if(name == nullptr) return nullptr;
if(!name) return false;
auto cfg = FindBlock(Device, Address, name);
if(!cfg) return false;
@ -258,13 +246,11 @@ bool Config::Remove(const char* name) const
}
// 根据名称更新块
const void* Config::Set(const char* name, const Buffer& bs) const
const void* Config::Set(const String& name, const Buffer& bs) const
{
TS("Config::Set");
if(name == nullptr) return nullptr;
//assert_param2(name, "配置块名称不能为空");
//assert_param2(Device, "未指定配置段的存储设备");
if(!name) return nullptr;
auto cfg = FindBlock(Device, Address, name);
if(!cfg) cfg = NewBlock(Device, Address, bs.Length());
@ -279,12 +265,11 @@ const void* Config::Set(const char* name, const Buffer& bs) const
}
// 获取配置数据
bool Config::Get(const char* name, Buffer& bs) const
bool Config::Get(const String& name, Buffer& bs) const
{
TS("Config::Get");
if(name == nullptr) return false;
//assert_param2(name, "配置块名称不能为空");
if(!name) return false;
auto cfg = FindBlock(Device, Address, name);
if(!cfg) return false;
@ -292,12 +277,11 @@ bool Config::Get(const char* name, Buffer& bs) const
return cfg->CopyTo(bs) > 0;
}
const void* Config::Get(const char* name) const
const void* Config::Get(const String& name) const
{
TS("Config::GetByName");
if(name == nullptr) return nullptr;
//assert_param2(name, "配置块名称不能为空");
if(!name) return nullptr;
auto cfg = FindBlock(Device, Address, name);
if(cfg && cfg->Size) return cfg->Data();
@ -306,7 +290,7 @@ const void* Config::Get(const char* name) const
}
/*// 获取配置数据,如果不存在则覆盖
bool Config::GetOrSet(const char* name, Buffer& bs) const
bool Config::GetOrSet(const String& name, Buffer& bs) const
{
TS("Config::GetOrSet");

View File

@ -19,19 +19,19 @@ public:
Config(const Storage& st, uint addr, uint size);
// 查找。size不为0时表示要查找该大小的合适配置块
const void* Find(const char* name) const;
const void* Find(const String& name) const;
// 创建一个指定大小的配置块
const void* New(int size) const;
// 删除。仅清空名称,并不删除数据区
bool Remove(const char* name) const;
bool Remove(const String& name) const;
// 设置配置数据
const void* Set(const char* name, const Buffer& bs) const;
const void* Set(const String& name, const Buffer& bs) const;
// 获取配置数据
bool Get(const char* name, Buffer& bs) const;
bool Get(const String& name, Buffer& bs) const;
// 获取配置数据,如果不存在则覆盖
//bool GetOrSet(const char* name, Buffer& bs) const;
// 获取配置数据
const void* Get(const char* name) const;
const void* Get(const String& name) const;
// 当前
static const Config* Current;

View File

@ -2,6 +2,8 @@
#include "Platform\stm32.h"
#include <stdlib.h>
// 仅用于调试使用的一些函数实现RTM不需要
#define MEM_DEBUG DEBUG
@ -313,6 +315,7 @@ void ShowFault(uint exception)
#else
#if defined ( __CC_ARM )
# include <rw/_defs.h>
// 发行版不允许抛出异常以及显示异常信息这将极大减小使用C++标准库所带来的固件膨胀
@ -324,5 +327,6 @@ void _RWSTD_EXPORT __rw_throw (int, ...)
}
_RWSTD_NAMESPACE_END // __rw
#endif
#endif

View File

@ -44,9 +44,9 @@ public:
virtual void Register(TransportHandler handler, void* param = nullptr);
#if DEBUG
virtual const char* ToString() const { return "ITransport"; }
virtual String ToString() const { return String("ITransport"); }
#else
virtual const char* ToString() const { return ""; }
virtual String ToString() const { return String(""); }
#endif
protected:
@ -76,7 +76,7 @@ public:
virtual void Set(ITransport* port);
virtual const char* ToString() const { return "PackPort"; }
virtual String ToString() const { return String("PackPort"); }
protected:
virtual bool OnOpen();

View File

@ -2,7 +2,7 @@
extern "C"
{
uint32_t HSE_VALUE = 8000000;
unsigned int HSE_VALUE = 8000000;
uint32_t SystemCoreClock = 72000000;
__I uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9};

View File

@ -358,9 +358,10 @@ void TinyController::ShowMessage(const TinyMessage& msg, bool send, const ITrans
if(st)
{
msg_printf("Mac=");
if(strcmp(port->ToString(), "R24") == 0)
auto name = port->ToString();
if(name == "R24")
ByteArray(st, 5).Show();
else if(strcmp(port->ToString(), "ShunCom") == 0)
else if(name == "ShunCom")
ByteArray(st, 2).Show();
else
ByteArray(st, 6).Show();

View File

@ -2,6 +2,7 @@
#include <stdlib.h>
#include <math.h>
#include <stdarg.h>
#include <string.h>
#include "Sys.h"
//#include "Type.h"