/************************************************* * lcfile.c * * * * Copyright (C) 1995-1999 Microsoft Inc. * * * *************************************************/ // // Change Log: // // @C001 - Use _make\splitpath insteading of _wmake\splitpath // @C002 - Untest Chinese in assoc phrases // @C003 - Create tbl files always so phrases can be activated immediately // // // 1/27/96 // @C004 Fix bug of error writing registy database #include // required for all Windows applications #include #include #include #include #include "rc.h" #include "lctool.h" #define END_PHRASE 0x8000 #define NOT_END_PHRASE 0x7fff #ifdef UNICODE #define PTRRECLEN 3 // Pointer file record length #else #define PTRRECLEN 4 // Pointer file record length #endif #define LCPTRFILE "LCPTR.TBL" #define LCPHRASEFILE "LCPHRASE.TBL" #define LCPHRASENOEXT "LCPHRASE" extern HWND subhWnd; // Local function prototypes. #ifdef UNICODE TCHAR g_szLCPhraseName[MAX_PATH]; TCHAR g_szLCPtrName[MAX_PATH]; TCHAR g_szLCUserPath[MAX_PATH]; BOOL lcAddPhrase( TCHAR *, TCHAR *, UINT *, DWORD, DWORD, DWORD); BOOL lcFOpen( HWND hWnd) { HANDLE hLCPtr,hLCPhrase; HFILE hfLCPtr,hfLCPhrase; DWORD flen_Ptr,flen_Phrase; TCHAR szLCPtrName[MAX_PATH]; TCHAR szLCPhraseName[MAX_PATH]; TCHAR *szLCPtrBuf,*szLCPhraseBuf; UCHAR szTmp[MAX_PATH]; BOOL rc; UINT i; DWORD lStart,lEnd; TCHAR szDispBuf[MAX_CHAR_NUM]; UINT nDisp,len; HKEY hkey; LONG lResult; LONG lcount, lType; // Get the path for User Dictionary. SHGetSpecialFolderPath(NULL, g_szLCUserPath, CSIDL_APPDATA , FALSE); if ( g_szLCUserPath[lstrlen(g_szLCUserPath) - 1] == TEXT('\\') ) g_szLCUserPath[lstrlen(g_szLCUserPath) - 1] = TEXT('\0'); lstrcat(g_szLCUserPath, TEXT("\\Microsoft") ); if ( GetFileAttributes(g_szLCUserPath) != FILE_ATTRIBUTE_DIRECTORY) CreateDirectory(g_szLCUserPath, NULL); lstrcat(g_szLCUserPath, TEXT("\\LCTOOL") ); if ( GetFileAttributes(g_szLCUserPath) != FILE_ATTRIBUTE_DIRECTORY) CreateDirectory(g_szLCUserPath, NULL); // Get Current User Dictionary lResult = RegOpenKeyEx(HKEY_CURRENT_USER, L"Control Panel\\Input Method", 0, KEY_ALL_ACCESS, &hkey) ; if (lResult == ERROR_SUCCESS) { lcount = 2 * MAX_PATH; lType = REG_SZ; lResult = RegQueryValueEx(hkey, L"Phrase Prediction Dictionary",0, &lType, (LPBYTE)szLCPhraseName, &lcount); if (lResult == ERROR_SUCCESS) { lcount = 2 * MAX_PATH; lType = REG_SZ; lResult = RegQueryValueEx(hkey, L"Phrase Prediction Pointer",0, &lType, (LPBYTE)szLCPtrName, &lcount); } } if (lResult != ERROR_SUCCESS) { // Get system directory len = GetSystemDirectory(szLCPtrName, sizeof(szLCPtrName)); if (szLCPtrName[len - 1] !=_TEXT('\\')) { // consider C:\ ; szLCPtrName[len++] =_TEXT('\\'); szLCPtrName[len] = 0; } lstrcpy(szLCPhraseName, szLCPtrName); lstrcat(szLCPtrName,_TEXT(LCPTRFILE)); lstrcat(szLCPhraseName,_TEXT(LCPHRASEFILE)); } // Open LC pointer file WideCharToMultiByte(CP_ACP,0,szLCPtrName,-1,szTmp,MAX_PATH,NULL,0); hfLCPtr=_lopen(szTmp,OF_READ); if(hfLCPtr == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, LCPTRFILE); return FALSE; } WideCharToMultiByte(CP_ACP,0,szLCPhraseName,-1,szTmp,MAX_PATH,NULL,0); hfLCPhrase=_lopen(szTmp,OF_READ); // Open LC phrase file if(hfLCPhrase == -1){ _lclose(hfLCPtr); lcErrIOMsg(IDS_ERR_FILEOPEN, LCPTRFILE); return FALSE; } lstrcpy(g_szLCPhraseName, szLCPhraseName); lstrcpy(g_szLCPtrName, szLCPtrName); // get file length flen_Ptr=_llseek(hfLCPtr,0L,2); /* get file length */ // Allocate Memory hLCPtr = GlobalAlloc(GMEM_FIXED, flen_Ptr); if(!hLCPtr) { lcErrMsg(IDS_ERR_MEMORY); goto error; } szLCPtrBuf = GlobalLock(hLCPtr); _llseek(hfLCPtr,0L,0); //set to beginning 4 if(flen_Ptr != _lread(hfLCPtr,szLCPtrBuf,flen_Ptr)) { lcErrIOMsg(IDS_ERR_FILEREAD, LCPTRFILE); goto error; } _lclose(hfLCPtr); //get file length flen_Phrase=_llseek(hfLCPhrase,0L,2); /* get file length */ // Allocate Memory hLCPhrase = GlobalAlloc(GMEM_MOVEABLE, flen_Phrase); if(!hLCPhrase) { lcErrMsg(IDS_ERR_MEMORY); goto error; } szLCPhraseBuf = GlobalLock(hLCPhrase); _llseek(hfLCPhrase,0L,0); //set to beginning if(flen_Phrase != _lread(hfLCPhrase,szLCPhraseBuf,flen_Phrase)) { lcErrIOMsg(IDS_ERR_FILEREAD, LCPHRASEFILE); goto error; } _lclose(hfLCPhrase); rc=TRUE; // Convert file to structured memory (WORDBUF & PHRASEBUF) // First record is Null record skip it for(i=1; i<((flen_Ptr/PTRRECLEN)>>1)-1; i++) { // If Allocated Word buffer not enough Reallocate it if(lWordBuff+1 == nWordBuffsize) if(!(rc=lcAllocWord())) break; lpWord[lWordBuff].wWord=szLCPtrBuf[i*PTRRECLEN]; // If Allocated Phrase buffer not enough Reallocate it if(lPhraseBuff+1 == nPhraseBuffsize) if(!(rc=lcAllocPhrase())) break; lpWord[lWordBuff].lFirst_Seg=lPhraseBuff; lpPhrase[lPhraseBuff].lNext_Seg=NULL_SEG; lWordBuff++; lPhraseBuff++; nDisp=0; // Add Phrase to Display buffer lStart=*((LPUNADWORD)&szLCPtrBuf[i*PTRRECLEN+1]); lEnd=*((LPUNADWORD)&szLCPtrBuf[i*PTRRECLEN+PTRRECLEN+1]); if(lStart <= lEnd) { rc=lcAddPhrase(szLCPhraseBuf, szDispBuf, &nDisp, lStart, lEnd, flen_Phrase>>1); if(!rc) break; } // Put display buffer into Phrase buffer if(nDisp == 0) szDispBuf[0]=0; else szDispBuf[nDisp-1]=0; if(!(rc=lcDisp2Mem(lWordBuff-1, szDispBuf))) break; } GlobalUnlock(hLCPtr); GlobalUnlock(hLCPhrase); GlobalFree(hLCPtr); GlobalFree(hLCPhrase); return rc; error: _lclose(hfLCPtr); _lclose(hfLCPhrase); GlobalUnlock(hLCPtr); GlobalUnlock(hLCPhrase); GlobalFree(hLCPtr); GlobalFree(hLCPhrase); return FALSE; } BOOL lcAddPhrase( TCHAR *szLCWord, // LC Phrase buffer TCHAR *szDispBuf, // Display buffer UINT *nDisp, // Display buffer length DWORD lStart, // Start address of LC Phrase DWORD lEnd, // End address of LC Phrase DWORD lLen) // Total Length of LC Phrase { DWORD i,j; // Check length if(lLen < lStart) { lcErrMsg(IDS_ERR_LCPTRFILE); return FALSE; } j=(lLen < lEnd) ? lLen:lEnd; for(i=lStart; i < j; i++) { szDispBuf[(*nDisp)++]=szLCWord[i] ? szLCWord[i]:_TEXT(' '); if( ((*nDisp)+1) >= MAX_CHAR_NUM) { szDispBuf[(*nDisp)++]=0; lcErrMsg(IDS_ERR_OVERMAX); return FALSE; } } szDispBuf[(*nDisp)++]=0; return TRUE; } // @C001 static void local_splitpath(TCHAR *szFilePath, TCHAR *szDriveBuf, TCHAR *szDirBuf, TCHAR *szFNameBuf, TCHAR *szExtBuf) { static UCHAR u_szFilePath[MAX_PATH]; static UCHAR u_szDirBuf[_MAX_DIR]; static UCHAR u_szDriveBuf[_MAX_DRIVE]; static UCHAR u_szFNameBuf[_MAX_FNAME]; static UCHAR u_szExtBuf[_MAX_EXT]; WideCharToMultiByte(CP_ACP, 0, szFilePath, -1, u_szFilePath, MAX_PATH, NULL,0); _splitpath(u_szFilePath, u_szDriveBuf, u_szDirBuf, u_szFNameBuf, u_szExtBuf); MultiByteToWideChar(CP_ACP, 0, u_szDriveBuf, -1, szDriveBuf, _MAX_DRIVE); MultiByteToWideChar(CP_ACP, 0, u_szDirBuf, -1, szDirBuf, _MAX_DIR); MultiByteToWideChar(CP_ACP, 0, u_szFNameBuf, -1, szFNameBuf, _MAX_FNAME); MultiByteToWideChar(CP_ACP, 0, u_szExtBuf, -1, szExtBuf, _MAX_EXT); } // @C001 static void local_makepath(TCHAR *szFilePath, TCHAR *szDriveBuf, TCHAR *szDirBuf, TCHAR *szFNameBuf, TCHAR *szExtBuf) { static UCHAR u_szFilePath[MAX_PATH]; static UCHAR u_szDirBuf[_MAX_DIR]; static UCHAR u_szDriveBuf[_MAX_DRIVE]; static UCHAR u_szFNameBuf[_MAX_FNAME]; static UCHAR u_szExtBuf[_MAX_EXT]; WideCharToMultiByte(CP_ACP, 0, szDriveBuf, -1, u_szDriveBuf, _MAX_DRIVE, NULL,0); WideCharToMultiByte(CP_ACP, 0, szDirBuf, -1, u_szDirBuf, _MAX_DIR, NULL,0); WideCharToMultiByte(CP_ACP, 0, szFNameBuf, -1, u_szFNameBuf, _MAX_FNAME, NULL,0); WideCharToMultiByte(CP_ACP, 0, szExtBuf, -1, u_szExtBuf, _MAX_EXT, NULL,0); _makepath(u_szFilePath, u_szDriveBuf, u_szDirBuf, u_szFNameBuf, u_szExtBuf); MultiByteToWideChar(CP_ACP, 0, u_szFilePath, -1, szFilePath, MAX_PATH); } BOOL lcFSave( HWND hwnd, BOOL bSaveAs) { HANDLE hLCPtr, hLCPhrase; HFILE hfLCPtr,hfLCPhrase; TCHAR szLCSystemName[MAX_PATH]; TCHAR szLCPtrName[MAX_PATH]; TCHAR szLCPhraseName[MAX_PATH]; TCHAR szLCPtrBuf[PTRRECLEN],szLCPhraseBuf[MAX_CHAR_NUM]; UINT i,j; DWORD lStartPhrase; DWORD lPhraseLen; UINT len; UCHAR szUStr[MAX_CHAR_NUM],*pUStr; OPENFILENAME ofn; TCHAR szFileOpen[25]; TCHAR szCustFilter[40]; TCHAR szFileName[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; TCHAR szDirBuf[_MAX_DIR]; TCHAR szDriveBuf[_MAX_DRIVE]; TCHAR szFNameBuf[_MAX_FNAME]; TCHAR szExtBuf[_MAX_EXT]; TCHAR szFilterSpec[MAX_PATH]; TCHAR szExt[10]; if(!lcSort(hwnd)) return FALSE; if(wSameCode) return FALSE; DOSAVE: // Get system directory len = GetSystemDirectory(szLCSystemName, sizeof(szLCSystemName)); if (szLCSystemName[len - 1] != _TEXT('\\')) { // consider C:\ ; szLCSystemName[len++] = _TEXT('\\'); szLCSystemName[len] = 0; } if (bSaveAs) { LoadString (hInst, IDS_DICTFILTERSPEC, szFilterSpec, sizeof(szFilterSpec)/sizeof(TCHAR)); LoadString (hInst, IDS_DICTDEFAULTFILEEXT, szExt, sizeof(szExt)/sizeof(TCHAR)); szFilterSpec[lstrlen(szFilterSpec) + 2] = 0; szFileName[0]=0; LoadString (hInst, IDS_SAVETABLE, szFileOpen, sizeof(szFileOpen)/sizeof(TCHAR) ); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); szCustFilter[lstrlen(szExt) + 2] = 0; local_splitpath(g_szLCPhraseName, szDriveBuf, szDirBuf, szFNameBuf, szExtBuf); // @C001 if (lstrcmpi(szFNameBuf, _TEXT(LCPHRASENOEXT)) == 0) { lstrcpy(szFilePath, szExt); } else { lstrcpy(szFilePath, szFNameBuf); lstrcat(szFilePath, szExtBuf); } /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = g_szLCUserPath; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+2; ofn.Flags = OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; if(!GetSaveFileName ((LPOPENFILENAME)&ofn)) return FALSE; lstrcat(szLCSystemName, _TEXT(LCPHRASEFILE)); lstrcpy(szLCPhraseName, szFilePath); if (lstrcmpi(szLCPhraseName, szLCSystemName) == 0) { lcErrMsg(IDS_ERR_SAVESYSTEMTBL); return FALSE; } local_splitpath(szFilePath, szDriveBuf, szDirBuf, szFNameBuf, szExtBuf); // @C001 len=lstrlen(szFNameBuf); if(len > 5) len=5; szFNameBuf[len]=0; lstrcat(szFNameBuf, _TEXT("PTR")); local_makepath(szLCPtrName, szDriveBuf, szDirBuf, szFNameBuf, _TEXT(".TBL")); // @C001 if (lstrcmpi(szLCPtrName, szLCPhraseName) == 0) { local_makepath(szLCPtrName, szDriveBuf, szDirBuf, szFNameBuf, _TEXT(".TB1")); // @C001 } } else { lstrcpy(szLCPhraseName, g_szLCPhraseName); lstrcpy(szLCPtrName, g_szLCPtrName); lstrcat(szLCSystemName, _TEXT(LCPHRASEFILE)); if (lstrcmpi(szLCPhraseName, szLCSystemName) == 0) { bSaveAs = TRUE; goto DOSAVE; } } // Open LC phrase file hLCPhrase = CreateFile(szLCPhraseName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, // @C003 NULL ) ; if(hLCPhrase == INVALID_HANDLE_VALUE) { lcErrMsg(IDS_ERR_FILESAVE); goto error; } hfLCPhrase = PtrToInt( hLCPhrase ); // Open LC pointer file hLCPtr = CreateFile(szLCPtrName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, // @C003 NULL ) ; if(hLCPtr == INVALID_HANDLE_VALUE) { lcErrMsg(IDS_ERR_FILESAVE); goto error; } hfLCPtr = PtrToInt( hLCPtr ); // Copy into global variable lstrcpy(g_szLCPhraseName, szLCPhraseName); lstrcpy(g_szLCPtrName, szLCPtrName); // Write a Null record into first record memset(szUStr,0,PTRRECLEN*2); if((PTRRECLEN*2) != _lwrite(hfLCPtr,szUStr,PTRRECLEN*2)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } lStartPhrase=0; // initialize szLCPtrBuf and szLCPhraseBuf for ( i=0; i< PTRRECLEN; i++) szLCPtrBuf[i] = TEXT('\0'); for ( i=0; i (0x0ffffffd-len)) { lcErrMsg(IDS_ERR_OVER_MAXLEN); goto error; } szLCPtrBuf[0]=lpWord[i].wWord; *((LPUNADWORD)&szLCPtrBuf[1])=lStartPhrase; pUStr=(UCHAR*)szLCPtrBuf; if(PTRRECLEN*2 != _lwrite(hfLCPtr,pUStr,PTRRECLEN*2)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } if(lPhraseLen){ pUStr=(UCHAR*)szLCPhraseBuf; if(len !=_lwrite(hfLCPhrase,pUStr,len)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPHRASEFILE); goto error; } } lStartPhrase+=lPhraseLen; } // Write the lasr record szLCPtrBuf[0]=0xffff; *((LPUNADWORD)&szLCPtrBuf[1])=lStartPhrase; pUStr=(UCHAR*)szLCPtrBuf; if(PTRRECLEN*2 != _lwrite(hfLCPtr,pUStr,PTRRECLEN*2)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } SetEndOfFile(hLCPtr); SetEndOfFile(hLCPhrase); _lclose(hfLCPtr); _lclose(hfLCPhrase); bSaveFile=FALSE; { HKEY hkey; DWORD dwDisposition; LONG lResult; lResult= RegCreateKeyEx(HKEY_CURRENT_USER, L"Control Panel\\Input Method", 0, L"Application Per-User Data", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwDisposition) ; lResult = RegSetValueEx(hkey, L"Phrase Prediction Dictionary",0, REG_SZ, (BYTE *)szLCPhraseName, 2 * (lstrlen(szLCPhraseName) + 1)); // <== @C004 lResult = RegSetValueEx(hkey, L"Phrase Prediction Pointer",0, REG_SZ, (BYTE *)szLCPtrName, 2 * (lstrlen(szLCPtrName) + 1)); // <== @C004 } return TRUE; error: _lclose(hfLCPtr); _lclose(hfLCPhrase); return FALSE; } BOOL lcInsline( TCHAR *szStr, UINT iWord, UINT len, BOOL *bOver) { WORD wWord; UINT iFree,nDisp; UINT i,j,buflen; TCHAR szDispBuf[MAX_CHAR_NUM]; TCHAR szBuffer[MAX_CHAR_NUM*2]; unsigned long l; szStr[len]=0; // Append Null to end of line // Skip lead spaces if exist for(i=0; (i= len) || (szStr[i+1] !=_TEXT(' ')) ) { lcErrMsg(IDS_ERR_IMP_SEPRATOR); return FALSE; } if(!is_DBCS2(*((WORD *)(&szStr[i])), TRUE)) { return FALSE; } wWord=szStr[i]; // Skip spaces after Word for(j=i+1; (j= MAX_CHAR_NUM) *bOver=TRUE; lstrcat(szBuffer, szDispBuf); return(lcDisp2Mem(i, szBuffer)); } } // Check Word buffer enough ? if(lWordBuff+1 == nWordBuffsize) if(!lcAllocWord()) return FALSE; // Allocate a Phrase Buffer iFree=lcGetSeg(); if(iFree == NULL_SEG) return FALSE; if(lWordBuff == 0) { lpWord[iWord].wWord=wWord; lpWord[iWord].lFirst_Seg=iFree; } else { for(l=lWordBuff; l >= iWord; l--) { lpWord[l+1].wWord=lpWord[l].wWord; lpWord[l+1].lFirst_Seg=lpWord[l].lFirst_Seg; } lpWord[iWord].wWord=wWord; lpWord[iWord].lFirst_Seg=iFree; } lWordBuff++; if(!lcDisp2Mem(iWord, szDispBuf)) return FALSE; return TRUE; } BOOL lcAppend( HWND hwnd) { OPENFILENAME ofn; TCHAR szFileOpen[25]; TCHAR szCustFilter[10]; TCHAR szFileName[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; UCHAR szUFilePath[MAX_PATH]; HFILE hfImport; HANDLE hImport; TCHAR szStr[MAX_CHAR_NUM+10]; UCHAR *szUBuf; TCHAR *szBuf; DWORD flen; BOOL bOver=FALSE; UINT i,len; UINT iEdit,iWord; BOOL is_WORD; iEdit=lcGetEditFocus(GetFocus(), &is_WORD); iWord=iDisp_Top+iEdit; if(iWord > lWordBuff) iWord=lWordBuff; if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; LoadString (hInst, IDS_APPENDTITLE, szFileOpen, sizeof(szFileOpen)/sizeof(TCHAR)); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = g_szLCUserPath; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+2; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetOpenFileName ((LPOPENFILENAME)&ofn)) { SetCursor(hCursorWait); WideCharToMultiByte(CP_ACP,0,szFilePath,-1,szUFilePath,MAX_PATH,NULL,0); hfImport=_lopen(szUFilePath,OF_READ); if(hfImport == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, szUFilePath); return FALSE; } // get file length flen=_llseek(hfImport,0L,2); _llseek(hfImport,0L,0); //set to beginning // Allocate Memory hImport = GlobalAlloc(GMEM_FIXED, flen + 2); if(!hImport) { lcErrMsg(IDS_ERR_MEMORY); return FALSE; } szUBuf = GlobalLock(hImport); // Read file to memory if(flen != _lread(hfImport,szUBuf,flen)) { lcErrIOMsg(IDS_ERR_FILEREAD, szUFilePath); return FALSE; } _lclose(hfImport); szUBuf[flen] = 0; if(szUBuf[1]!=0xFE && szUBuf[0]!=0xFF) //not a unicode file { HANDLE hImport2 = GlobalAlloc(GMEM_FIXED, ((flen+2)<<1)); if(!hImport2) { lcErrMsg(IDS_ERR_MEMORY); return FALSE; } szBuf = GlobalLock(hImport2); flen=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szUBuf,-1,szBuf+1,flen); GlobalUnlock(hImport); GlobalFree(hImport); hImport=hImport2; flen<<=1; flen-=2; } else szBuf=(TCHAR*)szUBuf; len=0; for(i=1; i<=((flen>>1)+1); i++) { //@D01C if((szBuf[i] == 0x000d) || (szBuf[i] == 0x000a)) { if(len != 0) { if(!lcInsline(szStr, iWord++, len, &bOver)) break; len=0; } continue; } if((szBuf[i] == 0x001a) || (i == ((flen>>1)+1))) { //@D01C if(len != 0) { if(!lcInsline(szStr, iWord++, len, &bOver)) break; } break; } if(len >= MAX_CHAR_NUM+3) bOver=TRUE; else szStr[len++]=szBuf[i]; } if(bOver) lcErrMsg(IDS_ERR_OVERMAX); SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, FALSE); SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); lcSetEditText(iDisp_Top, FALSE); GlobalUnlock(hImport); GlobalFree(hImport); bSaveFile=TRUE; } return TRUE; } BOOL lcImport( HWND hwnd) { OPENFILENAME ofn; TCHAR szFileOpen[25]; TCHAR szCustFilter[10]; TCHAR szFileName[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; UCHAR szUFilePath[MAX_PATH]; HFILE hfImport; HANDLE hImport; TCHAR szStr[MAX_CHAR_NUM+10]; TCHAR *szBuf; UCHAR *szUBuf; DWORD flen; BOOL bOver=FALSE; UINT i,len; UINT iWord; // @D04A if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; LoadString (hInst, IDS_IMPORTTITLE, szFileOpen, sizeof(szFileOpen)/sizeof(TCHAR)); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = g_szLCUserPath; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+2; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetOpenFileName ((LPOPENFILENAME)&ofn)) { SetCursor(hCursorWait); // Clear all flag first iWord=0; //@D04A iDisp_Top=0; //@D03A lWordBuff=0; //@D03A lPhraseBuff=0; //@D03A lcSetEditText(0, FALSE); //@D03A SetScrollRange(subhWnd, SB_VERT, 0, iPage_line, TRUE); //@D03A yPos=0; //@D03A SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); //@D03A bSaveFile=FALSE; //@D03A iFirstFree=NULL_SEG; //@D03A WideCharToMultiByte(CP_ACP,0,szFilePath,-1,szUFilePath,MAX_PATH,NULL,0); hfImport=_lopen(szUFilePath,OF_READ); if(hfImport == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, szUFilePath); return FALSE; } // get file length flen=_llseek(hfImport,0L,2); _llseek(hfImport,0L,0); //set to beginning // Allocate Memory hImport = GlobalAlloc(GMEM_FIXED, flen + 2); if(!hImport) { lcErrMsg(IDS_ERR_MEMORY); _lclose(hfImport); return FALSE; } szUBuf = GlobalLock(hImport); // Read file to memory if(flen != _lread(hfImport,szUBuf,flen)) { lcErrIOMsg(IDS_ERR_FILEREAD, szUFilePath); return FALSE; } _lclose(hfImport); szUBuf[flen] = 0; if(szUBuf[1]!=0xFE && szUBuf[0]!=0xFF) //not a unicode file { HANDLE hImport2 = GlobalAlloc(GMEM_FIXED, (flen+2)<<1); if(!hImport2) { lcErrMsg(IDS_ERR_MEMORY); return FALSE; } szBuf = GlobalLock(hImport2); flen=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,szUBuf,-1,szBuf+1,flen); GlobalUnlock(hImport); GlobalFree(hImport); hImport=hImport2; flen<<=1; flen-=2; } else szBuf=(TCHAR*)szUBuf; len=0; for(i=1; i<= ((flen>>1)+1); i++) { //@D01C if((szBuf[i] == 0x000d) || (szBuf[i] == 0x000a)) { if(len != 0) { if(!lcInsline(szStr, iWord++, len, &bOver)) break; len=0; } continue; } if((szBuf[i] == 0x001a) || (i == ((flen>>1)+1))) { //@D01C if(len != 0) { if(!lcInsline(szStr, iWord++, len, &bOver)) break; } break; } if(len >= MAX_CHAR_NUM+3) bOver=TRUE; else szStr[len++]=szBuf[i]; } if(bOver) lcErrMsg(IDS_ERR_OVERMAX); SetScrollRange(subhWnd, SB_VERT, 0, lWordBuff-iPage_line, FALSE); SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); lcSetEditText(iDisp_Top, FALSE); GlobalUnlock(hImport); GlobalFree(hImport); bSaveFile=TRUE; SetFocus(hwndWord[0]); // @D04A } return TRUE; } BOOL lcExport( HWND hwnd,int mode) { OPENFILENAME ofn; TCHAR szFileOpen[25]; TCHAR szCustFilter[10]; TCHAR szFileName[MAX_PATH]; TCHAR szFilePath[MAX_PATH]; UCHAR szUStr[MAX_PATH]; HFILE hfExport; UCHAR szStr[MAX_CHAR_NUM+10]; UINT i,len; TCHAR *pTchar; if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; if (mode == FILE_UNICODE) LoadString (hInst, IDS_EXPORTTITLE, szFileOpen, sizeof(szFileOpen)/sizeof(TCHAR)); else LoadString (hInst, IDS_EXPORTBIG5TITLE, szFileOpen, sizeof(szFileOpen)/sizeof(TCHAR) ); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); szCustFilter[lstrlen(szExt) + 1] = 0; lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = g_szLCUserPath; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+2; ofn.Flags = OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetSaveFileName ((LPOPENFILENAME)&ofn)) { HANDLE hExport; SetCursor(hCursorWait); hExport = CreateFile(szFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ) ; if(hExport == INVALID_HANDLE_VALUE){ WideCharToMultiByte(CP_ACP,0,szFilePath,-1,szUStr,MAX_PATH,NULL,0); lcErrIOMsg(IDS_ERR_FILEOPEN, szUStr); return FALSE; } hfExport = PtrToInt( hExport ); if(mode==FILE_UNICODE){ szStr[0]=0xFF; szStr[1]=0xFE; _lwrite(hfExport,szStr,2); szStr[2]=' '; szStr[3]=0; pTchar=(TCHAR*)(szStr+4); for(i=0; i= MAX_CHAR_NUM) { lcErrMsg(IDS_ERR_OVERMAX); return FALSE; } } return TRUE; } BOOL lcFSave( HWND hwnd) { HFILE hfLCPtr,hfLCPhrase; UCHAR szLCPtrName[MAX_PATH]; UCHAR szLCPhraseName[MAX_PATH]; UCHAR szLCPtrBuf[PTRRECLEN],szLCPhraseBuf[MAX_CHAR_NUM]; UINT i,j; WORD wStartPhrase; WORD wPhraseLen; UCHAR szStr[MAX_CHAR_NUM]; UINT len,tmplen; if(!lcSort(hwnd)) return FALSE; if(wSameCode) return FALSE; // Get system directory len = GetSystemDirectory((LPSTR)szLCPtrName, sizeof(szLCPtrName)); if (szLCPtrName[len - 1] != '\\') { // consider C:\ ; szLCPtrName[len++] = '\\'; szLCPtrName[len] = 0; } lstrcpy(szLCPhraseName, szLCPtrName); lstrcat(szLCPtrName, LCPTRFILE); lstrcat(szLCPhraseName, LCPHRASEFILE); // Open LC phrase file hfLCPhrase=(int)CreateFile(szLCPhraseName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL ) ; if(hfLCPhrase == -1) { lcErrMsg(IDS_ERR_FILESAVE); goto error; } // Open LC pointer file hfLCPtr=(int)CreateFile(szLCPtrName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL ) ; if(hfLCPtr == -1) { lcErrMsg(IDS_ERR_FILESAVE); goto error; } // Write a Null record into first record *((WORD *)(&szLCPtrBuf))=0; *((WORD *)(&szLCPtrBuf[2]))=0; if(PTRRECLEN != _lwrite(hfLCPtr,szLCPtrBuf,PTRRECLEN)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } wStartPhrase=0; for(i=0; i (0xfffd-wPhraseLen)) { lcErrMsg(IDS_ERR_OVER_MAXLEN); goto error; } *((WORD *)(&szLCPtrBuf))=lpWord[i].wWord; *((WORD *)(&szLCPtrBuf[2]))=wStartPhrase; if(PTRRECLEN != _lwrite(hfLCPtr,szLCPtrBuf,PTRRECLEN)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } if(wPhraseLen) if(((UINT)wPhraseLen*2) != _lwrite(hfLCPhrase,szLCPhraseBuf,wPhraseLen*2)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPHRASEFILE); goto error; } wStartPhrase+=wPhraseLen; } // Write the lasr record *((WORD *)(&szLCPtrBuf))=0xffff; *((WORD *)(&szLCPtrBuf[2]))=wStartPhrase; if(PTRRECLEN != _lwrite(hfLCPtr,szLCPtrBuf,PTRRECLEN)) { lcErrIOMsg(IDS_ERR_FILEWRITE, LCPTRFILE); goto error; } SetEndOfFile((HANDLE)hfLCPtr); SetEndOfFile((HANDLE)hfLCPhrase); _lclose(hfLCPtr); _lclose(hfLCPhrase); bSaveFile=FALSE; return TRUE; error: _lclose(hfLCPtr); _lclose(hfLCPhrase); return FALSE; } BOOL lcInsline( UCHAR *szStr, UINT iWord, UINT len, BOOL *bOver) { WORD wWord; UINT iFree,nDisp; UINT i,j,buflen; UCHAR szDispBuf[MAX_CHAR_NUM]; UCHAR szBuffer[MAX_CHAR_NUM*2]; int l; szStr[len]=0; // Append Null to end of line // Skip lead spaces if exist for(i=0; (i= len) || (szStr[i+2] != ' ') ) { lcErrMsg(IDS_ERR_IMP_SEPRATOR); return FALSE; } if(!is_DBCS2(*((WORD *)(&szStr[i])), TRUE)) { return FALSE; } wWord=(szStr[i] << 8)+szStr[i+1]; // Skip spaces after Word for(j=i+2; (j= MAX_CHAR_NUM) *bOver=TRUE; lstrcat(szBuffer, szDispBuf); return(lcDisp2Mem(i, szBuffer)); } } // Check Word buffer enough ? if(iWordBuff+1 == nWordBuffsize) if(!lcAllocWord()) return FALSE; // Allocate a Phrase Buffer iFree=lcGetSeg(); if(iFree == NULL_SEG) return FALSE; if(iWordBuff == 0) { lpWord[iWord].wWord=wWord; lpWord[iWord].iFirst_Seg=iFree; } else { for(l=iWordBuff; l >= (int)iWord; l--) { lpWord[l+1].wWord=lpWord[l].wWord; lpWord[l+1].iFirst_Seg=lpWord[l].iFirst_Seg; } lpWord[iWord].wWord=wWord; lpWord[iWord].iFirst_Seg=iFree; } iWordBuff++; if(!lcDisp2Mem(iWord, szDispBuf)) return FALSE; return TRUE; } BOOL lcAppend( HWND hwnd) { OPENFILENAME ofn; UCHAR szFileOpen[25]; UCHAR szCustFilter[10]; UCHAR szFileName[MAX_PATH]; UCHAR szFilePath[MAX_PATH]; HFILE hfImport; HANDLE hImport; UCHAR szStr[MAX_CHAR_NUM+10]; UCHAR *szBuf; DWORD flen; BOOL bOver=FALSE; UINT i,len; UINT iEdit,iWord; BOOL is_WORD; iEdit=lcGetEditFocus(GetFocus(), &is_WORD); iWord=iDisp_Top+iEdit; if(iWord > iWordBuff) iWord=iWordBuff; if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; LoadString (hInst, IDS_APPENDTITLE, szFileOpen, sizeof(szFileOpen)); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+3; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetOpenFileName ((LPOPENFILENAME)&ofn)) { SetCursor(hCursorWait); hfImport=_lopen(szFilePath,OF_READ); if(hfImport == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, szFilePath); return FALSE; } // get file length flen=_llseek(hfImport,0L,2); _llseek(hfImport,0L,0); //set to beginning // Allocate Memory hImport = GlobalAlloc(GMEM_FIXED, flen); if(!hImport) { lcErrMsg(IDS_ERR_MEMORY); return FALSE; } szBuf = GlobalLock(hImport); // Read file to memory if(flen != _lread(hfImport,szBuf,flen)) { lcErrIOMsg(IDS_ERR_FILEREAD, szFilePath); return FALSE; } _lclose(hfImport); len=0; //@D01D for(i=0; i= MAX_CHAR_NUM+3) bOver=TRUE; else szStr[len++]=szBuf[i]; } if(bOver) lcErrMsg(IDS_ERR_OVERMAX); SetScrollRange(subhWnd, SB_VERT, 0, iWordBuff-iPage_line, FALSE); SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); lcSetEditText(iDisp_Top, FALSE); GlobalUnlock(hImport); GlobalFree(hImport); bSaveFile=TRUE; } return TRUE; } BOOL lcImport( HWND hwnd) { OPENFILENAME ofn; UCHAR szFileOpen[25]; UCHAR szCustFilter[10]; UCHAR szFileName[MAX_PATH]; UCHAR szFilePath[MAX_PATH]; HFILE hfImport; HANDLE hImport; UCHAR szStr[MAX_CHAR_NUM+10]; UCHAR *szBuf; DWORD flen; BOOL bOver=FALSE; UINT i,len; UINT iWord; // @D04A //UINT iEdit,iWord; @D04D //BOOL is_WORD; @D04D //iEdit=lcGetEditFocus(GetFocus(), &is_WORD); @D04D //iWord=iDisp_Top+iEdit; @D04D //if(iWord > iWordBuff) @D04D // iWord=iWordBuff; @D04D if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; LoadString (hInst, IDS_IMPORTTITLE, szFileOpen, sizeof(szFileOpen)); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = NULL; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+3; ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetOpenFileName ((LPOPENFILENAME)&ofn)) { SetCursor(hCursorWait); // Clear all flag first iWord=0; //@D04A iDisp_Top=0; //@D03A iWordBuff=0; //@D03A iPhraseBuff=0; //@D03A lcSetEditText(0, FALSE); //@D03A SetScrollRange(subhWnd, SB_VERT, 0, iPage_line, TRUE); //@D03A yPos=0; //@D03A SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); //@D03A bSaveFile=FALSE; //@D03A iFirstFree=NULL_SEG; //@D03A hfImport=_lopen(szFilePath,OF_READ); if(hfImport == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, szFilePath); return FALSE; } // get file length flen=_llseek(hfImport,0L,2); _llseek(hfImport,0L,0); //set to beginning // Allocate Memory hImport = GlobalAlloc(GMEM_FIXED, flen); if(!hImport) { lcErrMsg(IDS_ERR_MEMORY); return FALSE; } szBuf = GlobalLock(hImport); // Read file to memory if(flen != _lread(hfImport,szBuf,flen)) { lcErrIOMsg(IDS_ERR_FILEREAD, szFilePath); return FALSE; } _lclose(hfImport); len=0; //@D01D for(i=0; i= MAX_CHAR_NUM+3) bOver=TRUE; else szStr[len++]=szBuf[i]; } if(bOver) lcErrMsg(IDS_ERR_OVERMAX); SetScrollRange(subhWnd, SB_VERT, 0, iWordBuff-iPage_line, FALSE); SetScrollPos(subhWnd, SB_VERT, yPos, TRUE); lcSetEditText(iDisp_Top, FALSE); GlobalUnlock(hImport); GlobalFree(hImport); bSaveFile=TRUE; SetFocus(hwndWord[0]); // @D04A } return TRUE; } BOOL lcExport( HWND hwnd) { OPENFILENAME ofn; UCHAR szFileOpen[25]; UCHAR szCustFilter[10]; UCHAR szFileName[MAX_PATH]; UCHAR szFilePath[MAX_PATH]; HFILE hfExport; UCHAR szStr[MAX_CHAR_NUM+10]; UINT i,len; if(!lcSaveEditText(iDisp_Top, 0)) return FALSE; szFileName[0]=0; LoadString (hInst, IDS_EXPORTTITLE, szFileOpen, sizeof(szFileOpen)); szCustFilter[0]=0; lstrcpy(&szCustFilter[1], szExt); lstrcpy(szFilePath, szExt); /* fill in non-variant fields of OPENFILENAME struct. */ ofn.lStructSize = sizeof(OPENFILENAME); ofn.hwndOwner = hwnd; ofn.lpstrFilter = szFilterSpec; ofn.lpstrCustomFilter = szCustFilter; ofn.nMaxCustFilter = sizeof(szCustFilter); ofn.nFilterIndex = 1; ofn.lpstrFile = szFilePath; ofn.nMaxFile = MAX_PATH; ofn.lpstrInitialDir = NULL; ofn.lpstrFileTitle = szFileName; ofn.nMaxFileTitle = MAX_PATH; ofn.lpstrTitle = szFileOpen; ofn.lpstrDefExt = szExt+3; ofn.Flags = OFN_CREATEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST; /* call common open dialog and return result */ if(GetSaveFileName ((LPOPENFILENAME)&ofn)) { SetCursor(hCursorWait); hfExport=(int)CreateFile(szFilePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, (HANDLE)NULL ) ; if(hfExport == -1){ lcErrIOMsg(IDS_ERR_FILEOPEN, szFilePath); return FALSE; } szStr[2]=' '; szStr[3]=' '; for(i=0; i