#include #ifdef _DEBUG static char s_aszModule[] = __FILE__; /* For error report */ #endif #include #include #include #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: // <2nd Sort Order> // 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; }