230 lines
6.3 KiB
C++
230 lines
6.3 KiB
C++
|
#include <mvopsys.h>
|
||
|
|
||
|
#ifdef _DEBUG
|
||
|
static char s_aszModule[] = __FILE__; /* For error report */
|
||
|
#endif
|
||
|
|
||
|
#include <windows.h>
|
||
|
#include <itpropl.h>
|
||
|
#include <atlinc.h>
|
||
|
|
||
|
#include "wwumain.h"
|
||
|
|
||
|
|
||
|
// CompareKeys ****************************************************************
|
||
|
HRESULT PASCAL ScanTempFile(LPFBI lpfbi, LPB lpbOut, LPV lpv)
|
||
|
{
|
||
|
LPB lpbLimit = lpfbi->lrgbBuf + lpfbi->cbBuf;
|
||
|
LPB lpbIn = lpfbi->lrgbBuf + lpfbi->ibBuf;
|
||
|
|
||
|
#define STATE_KEYSIZE 1
|
||
|
#define STATE_KEY 2
|
||
|
#define STATE_DATATYPE 3
|
||
|
#define STATE_SORTORDER 4
|
||
|
#define STATE_PROPSIZE 5
|
||
|
#define STATE_PROPLIST 6
|
||
|
|
||
|
DWORD dwState = STATE_KEYSIZE;
|
||
|
DWORD dwSize;
|
||
|
DWORD dwTemp = sizeof (DWORD);
|
||
|
|
||
|
LPB lpbSaved = lpbOut;
|
||
|
*(LPW)lpbOut = 0;
|
||
|
lpbOut += sizeof (WORD);
|
||
|
|
||
|
for (;; dwState++)
|
||
|
{
|
||
|
if (STATE_KEY == dwState || STATE_PROPLIST == dwState)
|
||
|
dwTemp = dwSize;
|
||
|
|
||
|
if (lpbIn + dwTemp >= lpbLimit)
|
||
|
{
|
||
|
HRESULT hResult;
|
||
|
lpfbi->ibBuf = (WORD)(lpbIn - lpfbi->lrgbBuf);
|
||
|
if (FileBufFill (lpfbi, &hResult) == cbIO_ERROR)
|
||
|
return hResult;
|
||
|
|
||
|
lpfbi->ibBuf = 0;
|
||
|
lpbIn = lpfbi->lrgbBuf;
|
||
|
lpbLimit = lpfbi->lrgbBuf + lpfbi->cbBuf;
|
||
|
|
||
|
/* EOF */
|
||
|
if (lpfbi->ibBuf == lpfbi->cbBuf)
|
||
|
{
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (STATE_DATATYPE == dwState)
|
||
|
{
|
||
|
*lpbOut = *lpbIn;
|
||
|
lpbIn++;
|
||
|
lpbOut++;
|
||
|
} else if (STATE_KEY != dwState && STATE_PROPLIST != dwState)
|
||
|
{
|
||
|
MEMCPY(lpbOut, lpbIn, sizeof (DWORD));
|
||
|
dwSize = *(DWORD UNALIGNED *)lpbIn;
|
||
|
lpbIn += sizeof(DWORD);
|
||
|
lpbOut += sizeof(DWORD);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
MEMCPY(lpbOut, lpbIn, dwSize);
|
||
|
lpbIn += dwSize;
|
||
|
lpbOut += dwSize;
|
||
|
if (STATE_PROPLIST == dwState)
|
||
|
break;
|
||
|
dwTemp = sizeof (DWORD);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
*(LPW)lpbSaved = (WORD)(lpbOut - lpbSaved - sizeof(WORD));
|
||
|
lpfbi->ibBuf = (WORD)(lpbIn - lpfbi->lrgbBuf);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
// CompareKeys ****************************************************************
|
||
|
int PASCAL CompareKeys(LPSTR pWord1, LPSTR pWord2, LPV pSortInfo)
|
||
|
{
|
||
|
// Format:
|
||
|
// <dwSize><Key><Data Type><2nd Sort Order><prop size><prop list>
|
||
|
// DWORD n CHAR DWORD DWORD n
|
||
|
IITSortKey *piitsk = (IITSortKey *)pSortInfo;
|
||
|
ITASSERT(piitsk);
|
||
|
|
||
|
// Compare keys
|
||
|
pWord1 += sizeof (WORD);
|
||
|
pWord2 += sizeof (WORD);
|
||
|
|
||
|
CHAR cKey1[2084], cKey2[2048];
|
||
|
ITASSERT(*(DWORD UNALIGNED *)pWord1 <= 2048);
|
||
|
ITASSERT(*(DWORD UNALIGNED *)pWord2 <= 2048);
|
||
|
MEMCPY(cKey1, pWord1 + sizeof (DWORD), *(DWORD UNALIGNED *)pWord1);
|
||
|
MEMCPY(cKey2, pWord2 + sizeof (DWORD), *(DWORD UNALIGNED *)pWord2);
|
||
|
|
||
|
LONG lResult;
|
||
|
if (FAILED(piitsk->Compare(cKey1, cKey2, &lResult, NULL))) {
|
||
|
ITASSERT(0);
|
||
|
}
|
||
|
|
||
|
if (lResult)
|
||
|
return lResult;
|
||
|
|
||
|
// Keys are equal - Compare data type
|
||
|
pWord1 += sizeof(DWORD) + *(DWORD UNALIGNED *)pWord1;
|
||
|
pWord2 += sizeof(DWORD) + *(DWORD UNALIGNED *)pWord2;
|
||
|
|
||
|
if (lResult = *(BYTE UNALIGNED *)pWord1 - *(BYTE UNALIGNED *)pWord2)
|
||
|
return lResult;
|
||
|
pWord1++;
|
||
|
pWord2++;
|
||
|
|
||
|
// Data types are equal - Compare secondary sort ordinal
|
||
|
lResult = *(DWORD UNALIGNED *)pWord1 - *(DWORD UNALIGNED *)pWord2;
|
||
|
return lResult;
|
||
|
} /* CompareKeys */
|
||
|
|
||
|
|
||
|
// PackBytes ******************************************************************
|
||
|
int PASCAL PackBytes(LPB lpbOut, DWORD dwIn)
|
||
|
{
|
||
|
LPB lpbOldOut;
|
||
|
|
||
|
/* Save the old offset */
|
||
|
lpbOldOut = lpbOut;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
*lpbOut =(BYTE)(dwIn & 0x7F); /* Get 7 bits. */
|
||
|
dwIn >>= 7;
|
||
|
if (dwIn)
|
||
|
*lpbOut |= 0x80; /* To be continued... */
|
||
|
lpbOut++;
|
||
|
} while (dwIn);
|
||
|
return (int)(lpbOut - lpbOldOut); /* Return compressed width */
|
||
|
} /* PackBytes */
|
||
|
|
||
|
/***************************************************************************
|
||
|
*
|
||
|
* Name FWriteData
|
||
|
*
|
||
|
* Purpose
|
||
|
* Writes the extra data to the keyword data file.
|
||
|
*
|
||
|
* Arguments
|
||
|
* IStorage* pStream: Destination stream
|
||
|
* PLKW pKW: Pointer to keyword info structure
|
||
|
* LPDWORD pdwWritten: Pointer to return number of bytes written
|
||
|
*
|
||
|
* Returns
|
||
|
* S_OK on success or
|
||
|
* ERR_FAILED, indicating compilation should be aborted.
|
||
|
*
|
||
|
* Notes:
|
||
|
* DWORD : Extra data byte count
|
||
|
* n : Extra data
|
||
|
*
|
||
|
**************************************************************************/
|
||
|
HRESULT FWriteData(IStream *pStream,
|
||
|
const PLKW pKW, LPDWORD pdwWritten, LPBYTE pTempBuffer)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
DWORD dwTemp;
|
||
|
DWORD dwDataSize = pKW->cbPropData;
|
||
|
// Encode data size byte count
|
||
|
if (FAILED(hr = pStream->Write(&dwDataSize, sizeof(DWORD), &dwTemp)))
|
||
|
return hr;
|
||
|
|
||
|
if (FAILED(hr = pStream->Write(pKW->pPropData, dwDataSize, &dwTemp)))
|
||
|
return hr;
|
||
|
|
||
|
*pdwWritten += sizeof (DWORD) + dwDataSize;
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* ParseKeywordLine ***********************************************************
|
||
|
* @comm
|
||
|
* Input file format:
|
||
|
* DWORD : Key byte length
|
||
|
* BINARY: Key
|
||
|
* %c : PropDest ID
|
||
|
* %08X : Entry order
|
||
|
* %lu : Property List size %c : DELIMITER(\x0E)
|
||
|
* %s : Property List %c : "\n"
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
|
||
|
LPSTR WINAPI ParseKeywordLine(LPSTR pBuffer, PLKW pKw)
|
||
|
{
|
||
|
// Extract the keyword size
|
||
|
DWORD dwKeySize = *(DWORD UNALIGNED *)pBuffer;
|
||
|
pBuffer += sizeof(DWORD);
|
||
|
*(DWORD UNALIGNED *UNALIGNED)pKw->szKeyword = dwKeySize;
|
||
|
|
||
|
// Extract the keyword string
|
||
|
ITASSERT(dwKeySize <= CBMAX_KWENTRY);
|
||
|
MEMCPY(pKw->szKeyword + sizeof(DWORD), pBuffer, dwKeySize);
|
||
|
pBuffer += dwKeySize;
|
||
|
|
||
|
// Extract the property destination
|
||
|
pKw->bPropDest= *pBuffer++;
|
||
|
ITASSERT(pKw->bPropDest == C_PROPDEST_KEY
|
||
|
|| pKw->bPropDest == C_PROPDEST_OCC);
|
||
|
|
||
|
// Skip the Entry Order (it's only used to manipulate sorting)
|
||
|
pBuffer += sizeof(DWORD);
|
||
|
|
||
|
// Extract the property list size
|
||
|
pKw->cbPropData = *(DWORD UNALIGNED *UNALIGNED)pBuffer;
|
||
|
pBuffer += sizeof(DWORD);
|
||
|
|
||
|
// Make sure we don't read past the end of buffer
|
||
|
ITASSERT(!IsBadReadPtr(pBuffer, pKw->cbPropData));
|
||
|
|
||
|
pKw->pPropData = pBuffer;
|
||
|
pBuffer += pKw->cbPropData;
|
||
|
|
||
|
return pBuffer;
|
||
|
}
|