mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-05 05:18:53 +08:00
177 lines
3.1 KiB
C++
177 lines
3.1 KiB
C++
#include "StdAfx.h"
|
|
#include "IdxTrans.h"
|
|
|
|
CIdxTrans::CIdxTrans(void)
|
|
: m_nMsgTransing(0)
|
|
, m_nMsgTransEnd(0)
|
|
, m_hWnd(0)
|
|
, m_sPath(_T(""))
|
|
{
|
|
}
|
|
|
|
CIdxTrans::~CIdxTrans(void)
|
|
{
|
|
}
|
|
|
|
void CIdxTrans::Init(HWND hWnd, CString &sPath)
|
|
{
|
|
m_hWnd = hWnd;
|
|
m_sPath = sPath;
|
|
}
|
|
|
|
void CIdxTrans::Run(void)
|
|
{
|
|
acl_pthread_t tid;
|
|
|
|
if (m_sPath.GetLength() == 0)
|
|
return;
|
|
acl_pthread_create(&tid, NULL, RunThread, this);
|
|
}
|
|
|
|
void CIdxTrans::OnTransing(int nMsg)
|
|
{
|
|
m_nMsgTransing = nMsg;
|
|
}
|
|
|
|
void CIdxTrans::OnTransEnd(int nMsg)
|
|
{
|
|
m_nMsgTransEnd = nMsg;
|
|
}
|
|
|
|
void CIdxTrans::Trans(void)
|
|
{
|
|
char *sBuf;
|
|
size_t size, size_saved;
|
|
struct acl_stat stat_buf;
|
|
|
|
if (m_sPath.GetLength() == 0)
|
|
{
|
|
MessageBox(NULL, "文件路径为空!", "Error", 0);
|
|
return;
|
|
}
|
|
if (acl_stat(m_sPath, &stat_buf) < 0)
|
|
{
|
|
MessageBox(NULL, "无法获得文件长度!", "Error", 0);
|
|
return;
|
|
}
|
|
size = (size_t) stat_buf.st_size;
|
|
size_saved = size;
|
|
|
|
sBuf = acl_vstream_loadfile(m_sPath);
|
|
if (sBuf == NULL)
|
|
return;
|
|
|
|
char *ptr, *pBuf = sBuf;
|
|
|
|
ptr = pBuf;
|
|
while (1)
|
|
{
|
|
if (size <= 4)
|
|
break;
|
|
if (*ptr == '_' && *(ptr + 1) == 'a' && *(ptr + 2) == 'c' && *(ptr + 3) == 'l')
|
|
{
|
|
char *ptr1 = ptr, *pBegin = NULL;
|
|
|
|
while (ptr1 > pBuf)
|
|
{
|
|
char ch = *(ptr1 - 1);
|
|
|
|
if (ch == 'p')
|
|
{
|
|
if (ptr1 - 2 <= pBuf)
|
|
break;
|
|
ch = *(ptr1 - 2);
|
|
if ((ch >= 'a' && ch <= 'z') || ch == '_' || ch == ' ')
|
|
{
|
|
ptr1--;
|
|
}
|
|
else
|
|
{
|
|
pBegin = ptr1;
|
|
break;
|
|
}
|
|
}
|
|
else if (ch == 'L' || ch == 'X')
|
|
{
|
|
pBegin = ptr1;
|
|
break;
|
|
}
|
|
else if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
|
|
|| ch == '1' || ch == '2' || ch == '_')
|
|
{
|
|
ptr1--;
|
|
}
|
|
else
|
|
{
|
|
pBegin = ptr1;
|
|
break;
|
|
}
|
|
}
|
|
if (pBegin != NULL)
|
|
{
|
|
memcpy(pBegin + 4, pBegin, ptr - pBegin);
|
|
memcpy(pBegin, "acl_", 4);
|
|
pBuf = ptr + 4;
|
|
}
|
|
ptr += 4;
|
|
size -= 4;
|
|
}
|
|
else if (*ptr == '_' && *(ptr + 1) == 'A' && *(ptr + 2) == 'C' && *(ptr + 3) == 'L')
|
|
{
|
|
char *ptr1 = ptr, *pBegin = NULL;
|
|
|
|
while (ptr1 > pBuf)
|
|
{
|
|
char ch = *(ptr1 - 1);
|
|
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
|
|
|| ch == '1' || ch == '2' || ch == '_')
|
|
{
|
|
ptr1--;
|
|
}
|
|
else
|
|
{
|
|
pBegin = ptr1;
|
|
break;
|
|
}
|
|
}
|
|
if (pBegin != NULL)
|
|
{
|
|
memcpy(pBegin + 4, pBegin, ptr - pBegin);
|
|
memcpy(pBegin, "ACL_", 4);
|
|
pBuf = ptr + 4;
|
|
}
|
|
ptr += 4;
|
|
size -= 4;
|
|
}
|
|
else
|
|
{
|
|
ptr++;
|
|
size--;
|
|
}
|
|
}
|
|
|
|
ACL_VSTREAM *fp;
|
|
|
|
fp = acl_vstream_fopen("result.idx", O_CREAT | O_TRUNC | O_RDWR | O_BINARY, 0600, 1024);
|
|
if (fp == NULL)
|
|
{
|
|
MessageBox(NULL, "创建文件失败!", "Error", 0);
|
|
}
|
|
else
|
|
{
|
|
if (acl_vstream_writen(fp, sBuf, size_saved) == ACL_VSTREAM_EOF) {
|
|
MessageBox(NULL, "写文件失败!", "Error", 0);
|
|
}
|
|
acl_vstream_close(fp);
|
|
}
|
|
acl_myfree(sBuf);
|
|
}
|
|
|
|
void *CIdxTrans::RunThread(void *arg)
|
|
{
|
|
CIdxTrans *pIdxTrans = (CIdxTrans*) arg;
|
|
|
|
pIdxTrans->Trans();
|
|
::PostMessage(pIdxTrans->m_hWnd, pIdxTrans->m_nMsgTransEnd, 0, 0);
|
|
return (NULL);
|
|
} |