Commit 84f4c1e8 authored by fallenstardust's avatar fallenstardust

update gframe

parent 16a42e5a
......@@ -28,7 +28,13 @@ public:
static void WriteInt8(unsigned char*& p, char val) {
buffer_write<char>(p, val);
}
// return: string length
/**
* @brief Copy a C-style string to another C-style string.
* @param src The source wide string
* @param pstr The destination char string
* @param bufsize The size of the destination buffer
* @return The length of the copied string
*/
template<typename T1, typename T2>
static int CopyWStr(const T1* src, T2* pstr, int bufsize) {
int l = 0;
......@@ -50,8 +56,12 @@ public:
*pstr = 0;
return l;
}
template<typename T1, typename T2, size_t N>
static int CopyCharArray(const T1* src, T2(&dst)[N]) {
return CopyWStr(src, dst, N);
}
template<size_t N>
static void CopyString(const char* src, wchar_t(&dst)[N]) {
static void CopyString(const char* src, char(&dst)[N]) {
dst[0] = 0;
std::strncat(dst, src, N - 1);
}
......
......@@ -124,13 +124,13 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
if (events & BEV_EVENT_CONNECTED) {
bool create_game = (size_t)ctx != 0;
CTOS_PlayerInfo cspi;
BufferIO::CopyWStr(mainGame->ebNickName->getText(), cspi.name, 20);
BufferIO::CopyCharArray(mainGame->ebNickName->getText(), cspi.name);
SendPacketToServer(CTOS_PLAYER_INFO, cspi);
if(create_game) {
CTOS_CreateGame cscg;
if(bot_mode) {
BufferIO::CopyWStr(L"Bot Game", cscg.name, 20);
BufferIO::CopyWStr(L"", cscg.pass, 20);
BufferIO::CopyCharArray(L"Bot Game", cscg.name);
BufferIO::CopyCharArray(L"", cscg.pass);
cscg.info.rule = 5;
cscg.info.mode = 0;
cscg.info.start_hand = 5;
......@@ -143,8 +143,8 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
cscg.info.no_shuffle_deck = mainGame->chkBotNoShuffleDeck->isChecked();
}
else {
BufferIO::CopyWStr(mainGame->ebServerName->getText(), cscg.name, 20);
BufferIO::CopyWStr(mainGame->ebServerPass->getText(), cscg.pass, 20);
BufferIO::CopyCharArray(mainGame->ebServerName->getText(), cscg.name);
BufferIO::CopyCharArray(mainGame->ebServerPass->getText(), cscg.pass);
cscg.info.rule = mainGame->cbRule->getSelected();
cscg.info.mode = mainGame->cbMatchMode->getSelected();
cscg.info.start_hand = wcstol(mainGame->ebStartHand->getText(),nullptr,10);
......@@ -161,7 +161,7 @@ void DuelClient::ClientEvent(bufferevent *bev, short events, void *ctx) {
CTOS_JoinGame csjg;
csjg.version = PRO_VERSION;
csjg.gameid = 0;
BufferIO::CopyWStr(mainGame->ebJoinPass->getText(), csjg.pass, 20);
BufferIO::CopyCharArray(mainGame->ebJoinPass->getText(), csjg.pass);
SendPacketToServer(CTOS_JOIN_GAME, csjg);
}
bufferevent_enable(bev, EV_READ);
......@@ -671,11 +671,11 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->btnSpectatorSwap->setVisible(true);
}
if(selftype != 1) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname);
} else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname);
}
} else {
if(selftype > 3) {
......@@ -685,15 +685,15 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->btnSpectatorSwap->setVisible(true);
}
if(selftype > 1 && selftype < 4) {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag, 20);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.clientname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag);
} else {
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.clientname, 20);
BufferIO::CopyWStr(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag, 20);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[0]->getToolTipText().c_str(), mainGame->dInfo.hostname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[1]->getToolTipText().c_str(), mainGame->dInfo.hostname_tag);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[2]->getToolTipText().c_str(), mainGame->dInfo.clientname);
BufferIO::CopyWideString(mainGame->stHostPrepDuelist[3]->getToolTipText().c_str(), mainGame->dInfo.clientname_tag);
}
mainGame->dInfo.tag_player[0] = false;
mainGame->dInfo.tag_player[1] = false;
......@@ -834,7 +834,7 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
}
// UTF-16 to wchar_t
wchar_t msg[LEN_CHAT_MSG];
BufferIO::CopyWStr(chat_msg, msg, LEN_CHAT_MSG);
BufferIO::CopyCharArray(chat_msg, msg);
mainGame->gMutex.lock();
mainGame->AddChatMsg(msg, player, play_sound);
mainGame->gMutex.unlock();
......@@ -851,21 +851,21 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
break;
wchar_t name[20];
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, name, 20);
BufferIO::CopyCharArray(pkt->name, name);
if(mainGame->dInfo.isTag) {
if(pkt->pos == 0)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname);
else if(pkt->pos == 1)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname_tag);
else if(pkt->pos == 2)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname);
else if(pkt->pos == 3)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname_tag, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname_tag);
} else {
if(pkt->pos == 0)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.hostname, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.hostname);
else if(pkt->pos == 1)
BufferIO::CopyWStr(pkt->name, mainGame->dInfo.clientname, 20);
BufferIO::CopyCharArray(pkt->name, mainGame->dInfo.clientname);
}
mainGame->gMutex.lock();
if(mainGame->gameConf.hide_player_name)
......@@ -902,13 +902,13 @@ void DuelClient::HandleSTOCPacketLan(unsigned char* data, int len) {
mainGame->stHostPrepDuelist[pos]->setDrawBackground(false);
mainGame->chkHostPrepReady[pos]->setChecked(false);
if(pos == 0)
BufferIO::CopyWStr(prename, mainGame->dInfo.hostname, 20);
BufferIO::CopyCharArray(prename, mainGame->dInfo.hostname);
else if(pos == 1)
BufferIO::CopyWStr(prename, mainGame->dInfo.hostname_tag, 20);
BufferIO::CopyCharArray(prename, mainGame->dInfo.hostname_tag);
else if(pos == 2)
BufferIO::CopyWStr(prename, mainGame->dInfo.clientname, 20);
BufferIO::CopyCharArray(prename, mainGame->dInfo.clientname);
else if(pos == 3)
BufferIO::CopyWStr(prename, mainGame->dInfo.clientname_tag, 20);
BufferIO::CopyCharArray(prename, mainGame->dInfo.clientname_tag);
} else if(state == PLAYERCHANGE_READY) {
mainGame->chkHostPrepReady[pos]->setChecked(true);
if(pos == selftype) {
......
......@@ -2149,9 +2149,9 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
break;
const wchar_t* input = mainGame->ebChatInput->getText();
if(input[0]) {
unsigned short msgbuf[256];
int len = BufferIO::CopyWStr(input, msgbuf, 256);
DuelClient::SendBufferToServer(CTOS_CHAT, msgbuf, (len + 1) * sizeof(short));
uint16_t msgbuf[LEN_CHAT_MSG];
int len = BufferIO::CopyCharArray(input, msgbuf);
DuelClient::SendBufferToServer(CTOS_CHAT, msgbuf, (len + 1) * sizeof(uint16_t));
mainGame->ebChatInput->setText(L"");
return true;
}
......
......@@ -60,12 +60,11 @@ void DuelInfo::Clear() {
}
bool IsExtension(const wchar_t* filename, const wchar_t* extension) {
int flen = std::wcslen(filename);
int elen = std::wcslen(extension);
if (!flen || !elen || flen < elen)
auto flen = std::wcslen(filename);
auto elen = std::wcslen(extension);
if (!elen || flen < elen)
return false;
auto fend = filename + flen;
return !wcsncasecmp(fend - elen, extension, elen);
return !wcsncasecmp(filename + (flen - elen), extension, elen);
}
void Game::process(irr::SEvent &event) {
......@@ -1688,11 +1687,12 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const w
}
}
FileSystem::TraversalDir(deckpath, [additem](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !wcsncasecmp(wcsrchr(name, '.'), L".ydk", 4)) {
size_t len = wcslen(name);
if (!isdir && IsExtension(name, L".ydk")) {
size_t len = std::wcslen(name);
wchar_t deckname[256];
wcsncpy(deckname, name, len - 4);
deckname[len - 4] = 0;
size_t count = std::min(len - 4, sizeof deckname / sizeof deckname[0]);
std::wcsncpy(deckname, name, count);
deckname[(sizeof deckname / sizeof deckname[0]) - 1] = 0;
additem(deckname);
}
});
......@@ -1700,7 +1700,7 @@ void Game::RefreshDeck(const wchar_t* deckpath, const std::function<void(const w
void Game::RefreshReplay() {
lstReplayList->clear();
FileSystem::TraversalDir(L"./replay", [this](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !wcsncasecmp(wcsrchr(name, '.'), L".yrp", 4) && Replay::CheckReplay(name))
if (!isdir && IsExtension(name, L".yrp") && Replay::CheckReplay(name))
lstReplayList->addItem(name);
});
}
......@@ -1708,7 +1708,7 @@ void Game::RefreshSingleplay() {
lstSinglePlayList->clear();
stSinglePlayInfo->setText(L"");
FileSystem::TraversalDir(L"./single", [this](const wchar_t* name, bool isdir) {
if(!isdir && wcsrchr(name, '.') && !wcsncasecmp(wcsrchr(name, '.'), L".lua", 4))
if(!isdir && IsExtension(name, L".lua"))
lstSinglePlayList->addItem(name);
});
}
......
......@@ -70,9 +70,8 @@ public:
static bool DeleteDir(const wchar_t* wdir) {
wchar_t pdir[256];
int len = BufferIO::CopyWStr(wdir, pdir, sizeof pdir / sizeof pdir[0]);
pdir[len + 1] = 0;
SHFILEOPSTRUCTW lpFileOp;
BufferIO::CopyWideString(wdir, pdir);
SHFILEOPSTRUCTW lpFileOp{};
lpFileOp.hwnd = NULL;
lpFileOp.wFunc = FO_DELETE;
lpFileOp.pFrom = pdir;
......@@ -174,8 +173,12 @@ public:
static bool DeleteDir(const char* dir) {
bool success = true;
TraversalDir(dir, [dir, &success](const char *name, bool isdir) {
char full_path[256];
snprintf(full_path, sizeof full_path, "%s/%s", dir, name);
char full_path[1024];
int len = std::snprintf(full_path, sizeof full_path, "%s/%s", dir, name);
if (len < 0 || len >= (int)(sizeof full_path)) {
success = false;
return;
}
if (isdir)
{
if(!DeleteDir(full_path))
......@@ -207,7 +210,9 @@ public:
while((dirp = readdir(dir)) != nullptr) {
file_unit funit;
char fname[1024];
std::snprintf(fname, sizeof fname, "%s/%s", path, dirp->d_name);
int len = std::snprintf(fname, sizeof fname, "%s/%s", path, dirp->d_name);
if (len < 0 || len >= (int)(sizeof fname))
continue;
stat(fname, &fileStat);
funit.filename = std::string(dirp->d_name);
funit.is_dir = S_ISDIR(fileStat.st_mode);
......
......@@ -97,7 +97,7 @@ void NetServer::BroadcastEvent(evutil_socket_t fd, short events, void* arg) {
hp.port = server_port;
hp.version = PRO_VERSION;
hp.host = duel_mode->host_info;
BufferIO::CopyWStr(duel_mode->name, hp.name, 20);
BufferIO::CopyCharArray(duel_mode->name, hp.name);
sendto(fd, (const char*)&hp, sizeof(HostPacket), 0, (sockaddr*)&sockTo, sizeof(sockTo));
}
}
......@@ -250,7 +250,7 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
std::memcpy(&packet, pdata, sizeof packet);
auto pkt = &packet;
BufferIO::NullTerminate(pkt->name);
BufferIO::CopyWStr(pkt->name, dp->name, 20);
BufferIO::CopyCharArray(pkt->name, dp->name);
break;
}
case CTOS_CREATE_GAME: {
......@@ -293,8 +293,8 @@ void NetServer::HandleCTOSPacket(DuelPlayer* dp, unsigned char* data, int len) {
#endif
BufferIO::NullTerminate(pkt->name);
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->name, duel_mode->name, 20);
BufferIO::CopyWStr(pkt->pass, duel_mode->pass, 20);
BufferIO::CopyCharArray(pkt->name, duel_mode->name);
BufferIO::CopyCharArray(pkt->pass, duel_mode->pass);
duel_mode->JoinGame(dp, 0, true);
StartBroadcast();
break;
......
......@@ -45,7 +45,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
}
wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20);
BufferIO::CopyCharArray(pkt->pass, jpass);
if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR;
......@@ -63,7 +63,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0])
scpe.pos = 0;
else
......@@ -102,7 +102,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
NetServer::SendPacketToPlayer(dp, STOC_TYPE_CHANGE, sctc);
if(players[0]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[0]->name, scpe.name, 20);
BufferIO::CopyCharArray(players[0]->name, scpe.name);
scpe.pos = 0;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[0]) {
......@@ -113,7 +113,7 @@ void SingleDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater)
}
if(players[1]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[1]->name, scpe.name, 20);
BufferIO::CopyCharArray(players[1]->name, scpe.name);
scpe.pos = 1;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[1]) {
......@@ -191,7 +191,7 @@ void SingleDuel::ToDuelist(DuelPlayer* dp) {
return;
observers.erase(dp);
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0]) {
players[0] = dp;
dp->type = NETPLAYER_TYPE_PLAYER1;
......
......@@ -49,7 +49,7 @@ int SingleMode::SinglePlayThread() {
mainGame->dInfo.start_lp = start_lp;
myswprintf(mainGame->dInfo.strLP[0], L"%d", mainGame->dInfo.lp[0]);
myswprintf(mainGame->dInfo.strLP[1], L"%d", mainGame->dInfo.lp[1]);
BufferIO::CopyWStr(mainGame->ebNickName->getText(), mainGame->dInfo.hostname, 20);
BufferIO::CopyWideString(mainGame->ebNickName->getText(), mainGame->dInfo.hostname);
mainGame->dInfo.clientname[0] = 0;
mainGame->dInfo.player_type = 0;
mainGame->dInfo.turn = 0;
......@@ -98,10 +98,10 @@ int SingleMode::SinglePlayThread() {
is_continuing = SinglePlayAnalyze(engineBuffer.data(), len);
last_replay.BeginRecord();
last_replay.WriteHeader(rh);
unsigned short buffer[20];
BufferIO::CopyWStr(mainGame->dInfo.hostname, buffer, 20);
uint16_t buffer[20];
BufferIO::CopyCharArray(mainGame->dInfo.hostname, buffer);
last_replay.WriteData(buffer, 40, false);
BufferIO::CopyWStr(mainGame->dInfo.clientname, buffer, 20);
BufferIO::CopyCharArray(mainGame->dInfo.clientname, buffer);
last_replay.WriteData(buffer, 40, false);
last_replay.WriteInt32(start_lp, false);
last_replay.WriteInt32(start_hand, false);
......@@ -737,14 +737,14 @@ bool SingleMode::SinglePlayAnalyze(unsigned char* msg, unsigned int len) {
break;
}
case MSG_AI_NAME: {
char namebuf[128];
wchar_t wname[128];
char namebuf[128]{};
wchar_t wname[20]{};
int len = BufferIO::ReadInt16(pbuf);
auto begin = pbuf;
pbuf += len + 1;
std::memcpy(namebuf, begin, len + 1);
BufferIO::DecodeUTF8(namebuf, wname);
BufferIO::CopyWStr(wname, mainGame->dInfo.clientname, 20);
BufferIO::CopyCharArray(wname, mainGame->dInfo.clientname);
break;
}
case MSG_SHOW_HINT: {
......
......@@ -49,7 +49,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
}
wchar_t jpass[20];
BufferIO::NullTerminate(pkt->pass);
BufferIO::CopyWStr(pkt->pass, jpass, 20);
BufferIO::CopyCharArray(pkt->pass, jpass);
if(wcscmp(jpass, pass)) {
STOC_ErrorMsg scem;
scem.msg = ERRMSG_JOINERROR;
......@@ -67,7 +67,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
sctc.type = (host_player == dp) ? 0x10 : 0;
if(!players[0] || !players[1] || !players[2] || !players[3]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0])
scpe.pos = 0;
else if(!players[1])
......@@ -101,7 +101,7 @@ void TagDuel::JoinGame(DuelPlayer* dp, unsigned char* pdata, bool is_creater) {
for(int i = 0; i < 4; ++i)
if(players[i]) {
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(players[i]->name, scpe.name, 20);
BufferIO::CopyCharArray(players[i]->name, scpe.name);
scpe.pos = i;
NetServer::SendPacketToPlayer(dp, STOC_HS_PLAYER_ENTER, scpe);
if(ready[i]) {
......@@ -157,7 +157,7 @@ void TagDuel::ToDuelist(DuelPlayer* dp) {
if(dp->type == NETPLAYER_TYPE_OBSERVER) {
observers.erase(dp);
STOC_HS_PlayerEnter scpe;
BufferIO::CopyWStr(dp->name, scpe.name, 20);
BufferIO::CopyCharArray(dp->name, scpe.name);
if(!players[0])
dp->type = 0;
else if(!players[1])
......
......@@ -2,6 +2,7 @@
#define BUFFERIO_H
#include <cstdint>
#include <cwchar>
#include "../ocgcore/buffer.h"
class BufferIO {
......@@ -27,7 +28,13 @@ public:
static void WriteInt8(unsigned char*& p, char val) {
buffer_write<char>(p, val);
}
// return: string length
/**
* @brief Copy a C-style string to another C-style string.
* @param src The source wide string
* @param pstr The destination char string
* @param bufsize The size of the destination buffer
* @return The length of the copied string
*/
template<typename T1, typename T2>
static int CopyWStr(const T1* src, T2* pstr, int bufsize) {
int l = 0;
......@@ -49,6 +56,20 @@ public:
*pstr = 0;
return l;
}
template<typename T1, typename T2, size_t N>
static int CopyCharArray(const T1* src, T2(&dst)[N]) {
return CopyWStr(src, dst, N);
}
template<size_t N>
static void CopyString(const char* src, char(&dst)[N]) {
dst[0] = 0;
std::strncat(dst, src, N - 1);
}
template<size_t N>
static void CopyWideString(const wchar_t* src, wchar_t(&dst)[N]) {
dst[0] = 0;
std::wcsncat(dst, src, N - 1);
}
template<typename T>
static bool CheckUTF8Byte(const T* str, int len) {
for (int i = 1; i < len; ++i) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment