00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010 #include <stdlib.h>
00011 #include "antiword.h"
00012
00013
00014
00015
00016
00017
00018
00019 BOOL
00020 bAddDataBlocks(ULONG ulDataPosFirst, ULONG ulTotalLength,
00021 ULONG ulStartBlock, const ULONG *aulBBD, size_t tBBDLen)
00022 {
00023 data_block_type tDataBlock;
00024 ULONG ulDataPos, ulOffset, ulIndex;
00025 long lToGo;
00026 BOOL bSuccess;
00027
00028 fail(ulTotalLength > (ULONG)LONG_MAX);
00029 fail(ulStartBlock > MAX_BLOCKNUMBER && ulStartBlock != END_OF_CHAIN);
00030 fail(aulBBD == NULL);
00031
00032 NO_DBG_HEX(ulDataPosFirst);
00033 NO_DBG_DEC(ulTotalLength);
00034
00035 lToGo = (long)ulTotalLength;
00036
00037 ulDataPos = ulDataPosFirst;
00038 ulOffset = ulDataPosFirst;
00039 for (ulIndex = ulStartBlock;
00040 ulIndex != END_OF_CHAIN && lToGo > 0;
00041 ulIndex = aulBBD[ulIndex]) {
00042 if (ulIndex == UNUSED_BLOCK || ulIndex >= (ULONG)tBBDLen) {
00043 DBG_DEC(ulIndex);
00044 DBG_DEC(tBBDLen);
00045 return FALSE;
00046 }
00047 if (ulOffset >= BIG_BLOCK_SIZE) {
00048 ulOffset -= BIG_BLOCK_SIZE;
00049 continue;
00050 }
00051 tDataBlock.ulFileOffset =
00052 (ulIndex + 1) * BIG_BLOCK_SIZE + ulOffset;
00053 tDataBlock.ulDataPos = ulDataPos;
00054 tDataBlock.ulLength = min(BIG_BLOCK_SIZE - ulOffset,
00055 (ULONG)lToGo);
00056 fail(tDataBlock.ulLength > BIG_BLOCK_SIZE);
00057 ulOffset = 0;
00058 if (!bAdd2DataBlockList(&tDataBlock)) {
00059 DBG_HEX(tDataBlock.ulFileOffset);
00060 DBG_HEX(tDataBlock.ulDataPos);
00061 DBG_DEC(tDataBlock.ulLength);
00062 return FALSE;
00063 }
00064 ulDataPos += tDataBlock.ulLength;
00065 lToGo -= (long)tDataBlock.ulLength;
00066 }
00067 bSuccess = lToGo == 0 ||
00068 (ulTotalLength == (ULONG)LONG_MAX && ulIndex == END_OF_CHAIN);
00069 DBG_DEC_C(!bSuccess, lToGo);
00070 DBG_DEC_C(!bSuccess, ulTotalLength);
00071 DBG_DEC_C(!bSuccess, ulIndex);
00072 return bSuccess;
00073 }
00074
00075
00076
00077
00078
00079
00080
00081
00082 BOOL
00083 bGet6DocumentData(FILE *pFile, ULONG ulStartBlock,
00084 const ULONG *aulBBD, size_t tBBDLen, const UCHAR *aucHeader)
00085 {
00086 UCHAR *aucBuffer;
00087 ULONG ulBeginTextInfo, ulOffset, ulTotLength;
00088 size_t tTextInfoLen;
00089 int iIndex, iOff, iType, iLen, iPieces;
00090
00091 DBG_MSG("bGet6DocumentData");
00092
00093 fail(pFile == NULL);
00094 fail(aulBBD == NULL);
00095 fail(aucHeader == NULL);
00096
00097 ulBeginTextInfo = ulGetLong(0x160, aucHeader);
00098 DBG_HEX(ulBeginTextInfo);
00099 tTextInfoLen = (size_t)ulGetLong(0x164, aucHeader);
00100 DBG_DEC(tTextInfoLen);
00101
00102 aucBuffer = xmalloc(tTextInfoLen);
00103 if (!bReadBuffer(pFile, ulStartBlock,
00104 aulBBD, tBBDLen, BIG_BLOCK_SIZE,
00105 aucBuffer, ulBeginTextInfo, tTextInfoLen)) {
00106 aucBuffer = xfree(aucBuffer);
00107 return FALSE;
00108 }
00109 NO_DBG_PRINT_BLOCK(aucBuffer, tTextInfoLen);
00110
00111 iOff = 0;
00112 while (iOff < (int)tTextInfoLen) {
00113 iType = (int)ucGetByte(iOff, aucBuffer);
00114 iOff++;
00115 if (iType == 0) {
00116 iOff++;
00117 continue;
00118 }
00119 iLen = (int)usGetWord(iOff, aucBuffer);
00120 iOff += 2;
00121 if (iType == 1) {
00122 iOff += iLen;
00123 continue;
00124 }
00125 if (iType != 2) {
00126 werr(0, "Unknown type of 'fastsaved' format");
00127 aucBuffer = xfree(aucBuffer);
00128 return FALSE;
00129 }
00130
00131 NO_DBG_DEC(iLen);
00132 iOff += 2;
00133 iPieces = (iLen - 4) / 12;
00134 DBG_DEC(iPieces);
00135 for (iIndex = 0; iIndex < iPieces; iIndex++) {
00136 ulOffset = ulGetLong(
00137 iOff + (iPieces + 1) * 4 + iIndex * 8 + 2,
00138 aucBuffer);
00139 ulTotLength = ulGetLong(iOff + (iIndex + 1) * 4,
00140 aucBuffer) -
00141 ulGetLong(iOff + iIndex * 4,
00142 aucBuffer);
00143 if (!bAddDataBlocks(ulOffset, ulTotLength,
00144 ulStartBlock,
00145 aulBBD, tBBDLen)) {
00146 aucBuffer = xfree(aucBuffer);
00147 return FALSE;
00148 }
00149 }
00150 break;
00151 }
00152 aucBuffer = xfree(aucBuffer);
00153 return TRUE;
00154 }