mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-11-30 10:57:34 +08:00
285 lines
5.5 KiB
C++
285 lines
5.5 KiB
C++
#include "StdAfx.h"
|
||
#include "AclTrans.h"
|
||
|
||
CAclTrans::CAclTrans(void)
|
||
: m_hWnd(0)
|
||
, m_sPath(_T(""))
|
||
, m_nMsgTransing(0)
|
||
, m_nMsgTransEnd(0)
|
||
{
|
||
}
|
||
|
||
CAclTrans::~CAclTrans(void)
|
||
{
|
||
}
|
||
|
||
CAclTrans::CAclTrans(HWND hWnd, CString &sPath)
|
||
: m_nMsgTransing(0)
|
||
, m_nMsgTransEnd(0)
|
||
{
|
||
Init(hWnd, sPath);
|
||
}
|
||
|
||
void CAclTrans::Init(HWND hWnd, CString &sPath)
|
||
{
|
||
m_hWnd =hWnd;
|
||
m_sPath = sPath;
|
||
}
|
||
|
||
void CAclTrans::OnTransing(int nMsg)
|
||
{
|
||
m_nMsgTransing = nMsg;
|
||
}
|
||
|
||
void CAclTrans::OnTransEnd(int nMsg)
|
||
{
|
||
m_nMsgTransEnd = nMsg;
|
||
}
|
||
|
||
void *CAclTrans::RunThread(void *arg)
|
||
{
|
||
CAclTrans *pAclTrans = (CAclTrans*) arg;
|
||
|
||
pAclTrans->ScanPath(&pAclTrans->m_sPath);
|
||
::PostMessage(pAclTrans->m_hWnd, pAclTrans->m_nMsgTransEnd, 0, 0);
|
||
return NULL;
|
||
}
|
||
|
||
void CAclTrans::Run(BOOL bTrans)
|
||
{
|
||
acl_pthread_t tid;
|
||
|
||
m_bTrans = bTrans;
|
||
if (m_sPath.GetLength() == 0)
|
||
return;
|
||
acl_pthread_create(&tid, NULL, RunThread, this);
|
||
}
|
||
|
||
void CAclTrans::Restore(char *psBuf)
|
||
{
|
||
char *pTagBegin, *ptr, *pBegin;
|
||
int len = (int) strlen("_acl");
|
||
|
||
while (1)
|
||
{
|
||
pTagBegin = strcasestr(psBuf, "_acl");
|
||
if (pTagBegin == NULL)
|
||
break;
|
||
if (strncmp(pTagBegin, "_acl", len) == 0)
|
||
{
|
||
if (*(pTagBegin + 1) == '.' && *(pTagBegin + 2) == 'h')
|
||
{
|
||
// skip "lib_acl.h"
|
||
psBuf = pTagBegin + len;
|
||
continue;
|
||
}
|
||
ptr = pTagBegin;
|
||
pBegin = NULL;
|
||
while (ptr >= psBuf)
|
||
{
|
||
if (*ptr == '>') {
|
||
if (pBegin == NULL)
|
||
pBegin = ptr + 1;
|
||
break;
|
||
}
|
||
if (*ptr == '<') {
|
||
pBegin = NULL;
|
||
break;
|
||
}
|
||
if (*ptr == ' ' || *ptr == '\t'
|
||
|| *ptr == '\r' || *ptr == '\n'
|
||
|| *ptr == '*' || *ptr == '('
|
||
|| *ptr == '{')
|
||
{
|
||
if (pBegin == NULL)
|
||
pBegin = ptr + 1;
|
||
}
|
||
ptr--;
|
||
}
|
||
if (pBegin == NULL) {
|
||
psBuf = pTagBegin + len;
|
||
continue;
|
||
}
|
||
|
||
memcpy(pBegin + len, pBegin, pTagBegin - pBegin);
|
||
memcpy(pBegin, "acl_", len);
|
||
psBuf = pTagBegin + len;
|
||
}
|
||
else if (strncmp(pTagBegin, "_ACL", len) == 0)
|
||
{
|
||
ptr = pTagBegin;
|
||
pBegin = NULL;
|
||
while (ptr >= psBuf)
|
||
{
|
||
if (*ptr == '>') {
|
||
if (pBegin == NULL)
|
||
pBegin = ptr + 1;
|
||
break;
|
||
}
|
||
if (*ptr == '<') {
|
||
pBegin = NULL;
|
||
break;
|
||
}
|
||
if (*ptr == ' ' || *ptr == '\t'
|
||
|| *ptr == '\r' || *ptr == '\n'
|
||
|| *ptr == '*' || *ptr == '('
|
||
|| *ptr == '{')
|
||
{
|
||
if (pBegin == NULL)
|
||
pBegin = ptr + 1;
|
||
}
|
||
ptr--;
|
||
}
|
||
if (pBegin == NULL) {
|
||
psBuf = pTagBegin + len;
|
||
continue;
|
||
}
|
||
memcpy(pBegin + len, pBegin, pTagBegin - pBegin);
|
||
memcpy(pBegin, "ACL_", len);
|
||
psBuf = pTagBegin + len;
|
||
}
|
||
else
|
||
psBuf = pTagBegin + len;
|
||
}
|
||
}
|
||
|
||
void CAclTrans::Trans(char *psBuf)
|
||
{
|
||
char *pTagBegin, *pTagEnd, *pNextChar;
|
||
int len = (int) strlen("acl_");
|
||
long int n;
|
||
|
||
while (1)
|
||
{
|
||
AGAIN_TAG:
|
||
pTagBegin = strcasestr(psBuf, "acl_");
|
||
if (pTagBegin == NULL)
|
||
break;
|
||
if (strncmp(pTagBegin, "acl_", len) == 0)
|
||
{
|
||
pNextChar = pTagBegin + len;
|
||
pTagEnd = pNextChar;
|
||
while (*pTagEnd)
|
||
{
|
||
if (*pTagEnd == '(')
|
||
break;
|
||
if (*pTagEnd == ' ' || *pTagEnd == '\t'
|
||
|| *pTagEnd == '\r' || *pTagEnd == '\n'
|
||
|| *pTagEnd == '.' || *pTagEnd == '\''
|
||
|| *pTagEnd == '\"')
|
||
{
|
||
psBuf = pTagEnd;
|
||
goto AGAIN_TAG;
|
||
}
|
||
pTagEnd++;
|
||
}
|
||
if (*pTagEnd == 0) {
|
||
psBuf = pTagEnd;
|
||
continue;
|
||
}
|
||
n = pTagEnd - pNextChar;
|
||
memcpy(pTagBegin, pNextChar, n);
|
||
memcpy(pTagBegin + n, "_acl", len);
|
||
psBuf = pTagEnd;
|
||
}
|
||
else if (strncmp(pTagBegin, "ACL_", len) == 0)
|
||
{
|
||
pNextChar = pTagBegin + len;
|
||
pTagEnd = pNextChar;
|
||
while (*pTagEnd)
|
||
{
|
||
if (*pTagEnd == ' ' || *pTagEnd == '\t'
|
||
|| *pTagEnd == ';' || *pTagEnd == ')'
|
||
|| *pTagEnd == '}' || *pTagEnd == '*')
|
||
break;
|
||
if (*pTagEnd == '\r' || *pTagEnd == '\n'
|
||
|| *pTagEnd == '.' || *pTagEnd == '\''
|
||
|| *pTagEnd == '\"' || *pTagEnd == '(')
|
||
{
|
||
psBuf = pTagEnd;
|
||
goto AGAIN_TAG;
|
||
}
|
||
pTagEnd++;
|
||
}
|
||
if (*pTagEnd == 0)
|
||
{
|
||
psBuf = pTagEnd;
|
||
continue;
|
||
}
|
||
n = pTagEnd - pNextChar;
|
||
memcpy(pTagBegin, pNextChar, n);
|
||
memcpy(pTagBegin + n, "_ACL", len);
|
||
psBuf = pTagEnd;
|
||
}
|
||
else
|
||
psBuf += len;
|
||
}
|
||
}
|
||
|
||
int CAclTrans::TransFile(const char *psPath)
|
||
{
|
||
char *sBuf = NULL;
|
||
size_t iLen;
|
||
|
||
#undef RETURN
|
||
#define RETURN(_x_) do \
|
||
{ \
|
||
if (sBuf) \
|
||
acl_myfree(sBuf); \
|
||
return(_x_); \
|
||
} while(0);
|
||
|
||
sBuf = acl_vstream_loadfile(psPath);
|
||
if (sBuf == NULL || *sBuf == 0)
|
||
RETURN (-1);
|
||
|
||
iLen = strlen(sBuf);
|
||
if (m_bTrans)
|
||
Trans(sBuf); // <20><>ʼת<CABC><D7AA>
|
||
else if (strstr(psPath, ".html") != NULL)
|
||
Restore(sBuf);
|
||
else
|
||
RETURN (0);
|
||
|
||
ACL_VSTREAM *fp;
|
||
int ret;
|
||
|
||
fp = acl_vstream_fopen(psPath, O_RDWR | O_TRUNC | O_BINARY | O_APPEND, 0600, 1024);
|
||
if (fp == NULL)
|
||
RETURN (-1);
|
||
ret = acl_vstream_writen(fp, sBuf, iLen);
|
||
acl_vstream_close(fp);
|
||
RETURN (ret == ACL_VSTREAM_EOF ? -1 : 0);
|
||
}
|
||
|
||
int CAclTrans::ScanPath(CString *psPath)
|
||
{
|
||
ACL_SCAN_DIR *scan_src;
|
||
|
||
scan_src = acl_scan_dir_open(psPath->GetString(), 1);
|
||
if (scan_src == NULL)
|
||
{
|
||
CString msg;
|
||
|
||
msg.Format("Open src path %s error", psPath->GetString());
|
||
MessageBox(NULL, msg, "Open path", 0);
|
||
return (-1);
|
||
}
|
||
|
||
while (1)
|
||
{
|
||
const char *fName;
|
||
CString fPath;
|
||
|
||
fName = acl_scan_dir_next_file(scan_src);
|
||
if (fName == NULL)
|
||
break;
|
||
fPath = acl_scan_dir_path(scan_src);
|
||
fPath += "\\";
|
||
fPath += fName;
|
||
TransFile(fPath.GetString());
|
||
}
|
||
acl_scan_dir_close(scan_src);
|
||
return (0);
|
||
}
|