⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ectrans.c

📁 windows环境下的一套汉字处理引擎,可以对汉字进行相应的处理
💻 C
📖 第 1 页 / 共 3 页
字号:
    if (hmemECLib == NULL)
	return FALSE;

    lpECLib = GlobalLock (hmemECLib);
    if (lpECLib == NULL)
	{
	GlobalFree (hmemECLib);
	return FALSE;
	}

    if (dwCnt < 27*2)
	dwCnt = 27*2;
    else if (!WseReadFileCache (hECCache, IndexPosTab[wLen-1],
				(UINT)dwCnt, lpECLib))
	{
	GlobalUnlock (hmemECLib);
	GlobalFree (hmemECLib);
	return FALSE;
	}

    if (i == 0)
	{
	lpStr = lpECLib+27*2;
	j = *(LPINT)lpECLib;
	}
    else
	{
	lpStr = lpECLib+27*2+((UINT far *)lpECLib)[i-1]*(wLen+3);
	j = ((LPINT)lpECLib)[i] - ((LPINT)lpECLib)[i-1];
	}

    for (k = 2; j > 0 && lstrcmpi (lpEStr, lpStr+k) != NULL; j--, k += wLen+3);

    if (j == 0) 	// Not Found, Add a New String.
	{
	WseRepMovsb (lpStr+wLen+3, lpStr, (int)dwCnt-(lpStr-lpECLib));
	lstrcpy (lpStr+2, lpEStr);
	for (j = i; j < 27; j++)
	    ((LPINT)lpECLib)[j] ++;

	*(LPINT)lpStr = 27*2+((UINT far *)lpECLib)[26]*(wLen+3);
	WseRepMovsb (lpECLib+((LPINT)lpStr)[0]+lstrlen(lpCStr)+1,
		     lpECLib+((LPINT)lpStr)[0],
		     (int)dwCnt+wLen+3-((LPINT)lpStr)[0]);
	lstrcpy (lpECLib+((LPINT)lpStr)[0], lpCStr);

	*(LPINT)lpStr -= wCnt;
	for (lpStr = lpECLib+27*2, j = 0;
	     (UINT)j < ((UINT far *)lpECLib)[26];
	     j++, lpStr += wLen+3)
	    *(LPINT)lpStr += wCnt;
	}
    else			// Change the String
	{
	lpStr += k-2;
	k = lstrlen(lpECLib+((LPINT)lpStr)[0]);     // Old Chinese String Len
	wCnt = lstrlen(lpCStr)-k;
	k += ((LPINT)lpStr)[0]+1;
	WseRepMovsb (lpECLib+((LPINT)lpStr)[0]+lstrlen (lpCStr)+1,
		     lpECLib+k,
		     (int)dwCnt-k);
	lstrcpy (lpECLib+((LPINT)lpStr)[0], lpCStr);
	k = ((LPINT)lpStr)[0];
	for (lpStr = lpECLib+27*2, j = 0;
	     (UINT)j < ((UINT far *)lpECLib)[26];
	     j++, lpStr += wLen+3)
	    if (((LPINT)lpStr)[0] > k)
		*(LPINT)lpStr += wCnt;
	}
    dwCnt += wCnt;

    WseReleaseFileCache (hECCache);
    hECCache = 0;

    {
    NPSTR   szFile;
    szFile = (NPSTR)LocalAlloc (LPTR, 64);
    WseGetModuleFilePath (NULL, szFile, 63);
    lstrcat (szFile, szECWINMLR);
    hFile = _lopen (szFile, OF_READWRITE);
    LocalFree ((HANDLE)szFile);
    }

    if (hFile != HFILE_ERROR)
	{
	_llseek (hFile, 64, SEEK_SET);
	_lread	(hFile, (LPSTR)IndexPosTab, sizeof(IndexPosTab));

	if (wCnt <= 0)
	    {
	    _llseek (hFile, IndexPosTab[wLen-1], SEEK_SET);
	    if (dwCnt)
		_lwrite (hFile, lpECLib, (int)dwCnt);
	    }
	else
	    {
	    long dwSize = IndexPosTab[255]-IndexPosTab[wLen];
	    HGLOBAL hmDat = GlobalAlloc (GPTR, dwSize+16);
	    char huge *lpDat = GlobalLock (hmDat);
	    char huge *lpTmp = lpDat;
	    if (dwSize)
		{
		_llseek (hFile, IndexPosTab[wLen], SEEK_SET);
		while (lpTmp < lpDat+dwSize)
		    lpTmp += _lread  (hFile, lpTmp, (UINT)min(lpDat-lpTmp+dwSize, 0x0e000));
		_llseek (hFile, IndexPosTab[wLen]+wCnt, SEEK_SET);
		lpTmp = lpDat;
		while (lpTmp < lpDat+dwSize)
		    lpTmp += _lwrite  (hFile, lpTmp, (UINT)min(lpDat-lpTmp+dwSize, 0x0e000));
		}
	    GlobalUnlock (hmDat);
	    GlobalFree	 (hmDat);

	    for (j = wLen; j < 256; j++)
		IndexPosTab[j] += wCnt;

	    if (dwCnt)
		{
		_llseek (hFile, IndexPosTab[wLen-1], SEEK_SET);
		_lwrite (hFile, lpECLib, (int)dwCnt);
		}
	    if (wCnt)
		{
		_llseek (hFile, 0x40, SEEK_SET);
		_lwrite (hFile, (LPSTR)IndexPosTab, sizeof(IndexPosTab));
		}
	    }
	_lclose (hFile);
	i = TRUE;
	}
    else
	i = FALSE;

    GlobalUnlock (hmemECLib);
    GlobalFree (hmemECLib);

    WseResetECDict (NULL, NULL);

    return i;
}

BOOL ECDctDeleteString (LPSTR lpEStr)
{
    long    dwCnt;
    HGLOBAL hmemECLib;
    LPSTR   lpECLib, lpStr;
    int     wCnt, i, j;
    char    ch;
    HFILE   hFile;
    NPSTR   szFile;
    int     wLen = lstrlen (lpEStr);

    if (wLen < 1 || wLen > 255)
	return FALSE;

    dwCnt = IndexPosTab[wLen] - IndexPosTab[wLen-1];

    if (dwCnt <= 0 || dwCnt >= 0x10000)
	return FALSE;

    hmemECLib = GlobalAlloc (GPTR, dwCnt+10);
    if (hmemECLib == NULL)
	return FALSE;

    lpECLib = GlobalLock (hmemECLib);
    if (lpECLib == NULL)
	{
	GlobalFree (hmemECLib);
	return FALSE;
	}

    if (!WseReadFileCache (hECCache, IndexPosTab[wLen-1],
			   (UINT)dwCnt, lpECLib))
	{
	GlobalUnlock (hmemECLib);
	GlobalFree (hmemECLib);
	return FALSE;
	}

    ch = lpEStr[0] & ~0x20;
    if (ch < 'A' || ch > 'Z')
	{
	ch = lpEStr[1] & ~0x20;
	if (ch < 'A' || ch > 'Z')
	    ch = '@';
	}
    i = ch - '@';

    if (i == 0)
	{
	lpStr = lpECLib+27*2;
	wCnt = *(UINT far *)lpECLib;
	}
    else
	{
	lpStr = lpECLib+27*2+((UINT far *)lpECLib)[i-1]*(wLen+3);
	wCnt = ((UINT far *)lpECLib)[i] - ((UINT far *)lpECLib)[i-1];
	}

    while (wCnt > 0 && lstrcmpi (lpStr+2, lpEStr) != NULL)
	{
	lpStr += wLen+3;
	wCnt--;
	}

    if (wCnt <= 0)	    // NO This String.
	{
	GlobalUnlock (hmemECLib);
	GlobalFree (hmemECLib);
	return NULL;
	}

    wCnt = lstrlen(lpECLib+((LPINT)lpStr)[0]);	    // Chinese String Len
    WseRepMovsb (lpECLib+((LPINT)lpStr)[0],
		 lpECLib+((LPINT)lpStr)[0]+wCnt+1,
		 (UINT)dwCnt-(((LPINT)lpStr)[0]+wCnt+1));
    for (j = 0; j < ((LPINT)lpECLib)[26]; j++)
	{
	if (*(LPINT)(lpECLib+27*2+j*(wLen+3)) > ((LPINT)lpStr)[0])
	    *(LPINT)(lpECLib+27*2+j*(wLen+3)) -= wCnt+1;
	}
    for (j = i; j < 27; j++)
	((LPINT)lpECLib)[j]--;
    WseRepMovsb (lpStr, lpStr+wLen+3, (UINT)dwCnt-(lpStr+wLen+3-lpECLib));
    for (j = 0; j < ((LPINT)lpECLib)[26]; j++)
	*(LPINT)(lpECLib+27*2+j*(wLen+3)) -= wLen+3;

    dwCnt -= wCnt+1+wLen+3;

    WseReleaseFileCache (hECCache);
    hECCache = 0;

    szFile = (NPSTR)LocalAlloc (LPTR, 64);
    WseGetModuleFilePath (NULL, szFile, 63);
    lstrcat (szFile, szECWINMLR);
    hFile = _lopen (szFile, OF_READWRITE);
    LocalFree ((HANDLE)szFile);

    if (hFile != HFILE_ERROR)
	{
	_llseek (hFile, 0x40, SEEK_SET);
	_lread	(hFile, (LPSTR)IndexPosTab, sizeof(IndexPosTab));

	_llseek (hFile, IndexPosTab[wLen-1], SEEK_SET);
	_lwrite (hFile, lpECLib, (int)dwCnt);
	wCnt = (int)(IndexPosTab[wLen]-IndexPosTab[wLen-1]-dwCnt);
	dwCnt = IndexPosTab[255]-IndexPosTab[wLen-1];

	GlobalUnlock (hmemECLib);
	GlobalFree (hmemECLib);
	hmemECLib = GlobalAlloc (GPTR, dwCnt+16);
	lpECLib   = GlobalLock	(hmemECLib);
	if (hmemECLib && lpECLib && dwCnt)
	    {
	    long    dwSize = dwCnt;
	    char huge *lpTmp = lpECLib;
	    _llseek (hFile, IndexPosTab[wLen], SEEK_SET);
	    while (dwSize > 0)
		{
		lpTmp += _lread  (hFile, lpTmp, (UINT)min(dwSize, 0x0e000));
		dwSize -= 0xe000;
		}
	    _llseek (hFile, IndexPosTab[wLen]-wCnt, SEEK_SET);
	    lpTmp = lpECLib;
	    dwSize = dwCnt;
	    while (dwSize > 0)
		{
		lpTmp += _lwrite  (hFile, lpTmp, (UINT)min(dwSize, 0x0e000));
		dwSize -= 0xe000;
		}
	    for (i = wLen; i < 255; i++)
		IndexPosTab[i] -= wCnt;
	    _llseek (hFile, 0x40, SEEK_SET);
	    _lwrite (hFile, (LPSTR)IndexPosTab, sizeof(IndexPosTab));
	    }
	_lclose (hFile);
	}
    GlobalUnlock (hmemECLib);
    GlobalFree (hmemECLib);

    WseResetECDict (NULL, NULL);

    return (hFile != HFILE_ERROR);
}

BOOL RebuildECEdit (HWND hDlg)
{
    LPSTR   lpBuff = GlobalLock (hMemECErr);
    if (hMemECErr && lpBuff)
	{
	while (*lpBuff)
	    {
#ifndef     ___Araaa
	    SendDlgItemMessage (hDlg, IDC_STRLIST,
				 LB_ADDSTRING, NULL,
				 (LPARAM)lpSSS);
#else
	    LPSTR lpStr;

	    for (lpStr = lpBuff+1;
		 *lpStr && (*lpStr != '=' || lpStr[-1] == '\\');
		 lpStr++);
	    if (*lpStr)
		SendDlgItemMessage (hDlg, IDC_STRLIST,
				    LB_ADDSTRING, NULL,
				    (LPARAM)lpBuff);
	    else
		{
		HGLOBAL hmDat = GlobalAlloc (GPTR, 1024);
		int	wLen = lstrlen (lpBuff)+1;
		lpStr = GlobalLock (hmDat);
		lstrcat (lstrcpy (lpStr, lpBuff),"=");
		FindNearestString (lpBuff, lpStr+wLen, 256);
		if (*(lpStr+wLen) == '*' &&
		    lstrcmpi (lpStr+wLen+1, lpBuff) == NULL ||
		    lstrcmpi (lpStr+wLen,   lpBuff) == NULL)
		    lpStr = lpBuff;
		SendDlgItemMessage (hDlg, IDC_STRLIST,
				    LB_ADDSTRING, NULL,
				    (LPARAM)lpStr);
		GlobalUnlock (hmDat);
		GlobalFree   (hmDat);
		}
#endif
	    lpBuff += lstrlen (lpBuff)+1;
	    }
	GlobalUnlock (hMemECErr);
	return TRUE;
	}
    return FALSE;
}

BOOL	CALLBACK ECDctSetModeProc (hDlg, message, wParam, lParam)
HWND	 hDlg;
unsigned message;
WPARAM	 wParam;
LPARAM	 lParam;
{
    switch (message)
	{
	case WM_INITDIALOG:
	    {
	    RECT    rect;
		HWND	hWnd;
	    if (hMemECErr == NULL)
		hMemECErr = GlobalAlloc (GHND, ECERRBUFFSIZE+16);

	    hWndECDialog = hDlg;
	    SetClassLong (hDlg, GCL_HICON,
			  		  (LONG)LoadIcon (hInst, MAKEINTRESOURCE(IDD_MLREDIT)));
	    hWnd = GetDlgItem (hDlg, IDC_MIDLINE);
	    GetWindowRect (hWnd, &rect);
	    lParam = (LPARAM)rect.bottom;
	    ShowWindow (hWnd, SW_HIDE);
	    GetWindowRect (hDlg, &rect);
	    MoveWindow (hDlg, rect.left, rect.top,
					rect.right-rect.left, (long)lParam-rect.top,
					FALSE);
	    hWnd = (HWND)GetSystemMenu (hDlg, FALSE);
	    AppendMenu (hWnd, MF_SEPARATOR, NULL, NULL);
	    AppendMenu (hWnd, MF_BYCOMMAND | MF_STRING, IDC_ONTOP, szAlwaysOnTop);
	    SendMessage (hDlg, WM_SYSCOMMAND, IDC_ONTOP, NULL);
	    WseTranslateWindow (HTRANS_SYSTEM_DEFAULT, hDlg);
	    WseCenterWindow (hDlg);
	    }
	    break;

	case WM_DESTROY:
	    DestroyIcon ((HICON)SetClassLong (hDlg, GCL_HICON, NULL));
	    hWndECDialog = NULL;
	    if (hMemECErr)
		{
		GlobalFree (hMemECErr);
		hMemECErr = NULL;
		}
	    break;

	case WM_ACTIVATE:
	    if (wParam && HIWORD(lParam) == 0 && ECRecordLevel)
		{
		SendDlgItemMessage (hDlg, IDC_STRLIST,
				    LB_RESETCONTENT, NULL, NULL);
		ECRecordLevel = 0;
		RebuildECEdit (hDlg);
		if (SendDlgItemMessage (hDlg, IDC_STRLIST, LB_GETCOUNT, NULL, NULL))
		    {
		    RECT    rect;
		    HWND	hWnd = GetDlgItem (hDlg, IDC_STRLIST);
		    GetWindowRect (hWnd, &rect);
		    wParam = rect.bottom+8;
		    GetWindowRect (hDlg, &rect);
		    ShowWindow (GetDlgItem (hDlg, IDC_MIDLINE), SW_NORMAL);
		    MoveWindow (hDlg, rect.left, rect.top,
				rect.right-rect.left, wParam-rect.top,
				TRUE);
		    WseCenterWindow (hDlg);
		    }
		}
	    break;

	case WM_SYSCOMMAND:
	    if (wParam == IDC_ONTOP)
			{
			HMENU hMenu = GetSystemMenu (hDlg, NULL);
			if (GetMenuState (hMenu, IDC_ONTOP, MF_BYCOMMAND) & MF_CHECKED)
			    {
			    SetWindowPos (hDlg, HWND_NOTOPMOST,
					  0, 0, 0, 0,
					  SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
			    CheckMenuItem (hMenu, IDC_ONTOP, MF_UNCHECKED | MF_BYCOMMAND);
			    }
			else
			    {
			    SetWindowPos (hDlg, HWND_TOPMOST,
					  0, 0, 0, 0,
					  SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
			    CheckMenuItem (hMenu, IDC_ONTOP, MF_CHECKED | MF_BYCOMMAND);
			    }
			}
	    else
			return FALSE;
	    break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -