3 * Copyright (C) 2000-2002 A.J. van Os; Released under GPL
6 * Find the blocks that contain the data of MS Word files
15 * bAddDataBlocks - Add the blocks to the data block list
17 * Returns TRUE when successful, otherwise FALSE
20 bAddDataBlocks(ULONG ulDataPosFirst
, ULONG ulTotalLength
,
21 ULONG ulStartBlock
, const ULONG
*aulBBD
, size_t tBBDLen
)
23 data_block_type tDataBlock
;
24 ULONG ulDataPos
, ulOffset
, ulIndex
;
28 fail(ulTotalLength
> (ULONG
)LONG_MAX
);
29 fail(ulStartBlock
> MAX_BLOCKNUMBER
&& ulStartBlock
!= END_OF_CHAIN
);
32 NO_DBG_HEX(ulDataPosFirst
);
33 NO_DBG_DEC(ulTotalLength
);
35 lToGo
= (long)ulTotalLength
;
37 ulDataPos
= ulDataPosFirst
;
38 ulOffset
= ulDataPosFirst
;
39 for (ulIndex
= ulStartBlock
;
40 ulIndex
!= END_OF_CHAIN
&& lToGo
> 0;
41 ulIndex
= aulBBD
[ulIndex
]) {
42 if (ulIndex
== UNUSED_BLOCK
|| ulIndex
>= (ULONG
)tBBDLen
) {
47 if (ulOffset
>= BIG_BLOCK_SIZE
) {
48 ulOffset
-= BIG_BLOCK_SIZE
;
51 tDataBlock
.ulFileOffset
=
52 (ulIndex
+ 1) * BIG_BLOCK_SIZE
+ ulOffset
;
53 tDataBlock
.ulDataPos
= ulDataPos
;
54 tDataBlock
.ulLength
= min(BIG_BLOCK_SIZE
- ulOffset
,
56 fail(tDataBlock
.ulLength
> BIG_BLOCK_SIZE
);
58 if (!bAdd2DataBlockList(&tDataBlock
)) {
59 DBG_HEX(tDataBlock
.ulFileOffset
);
60 DBG_HEX(tDataBlock
.ulDataPos
);
61 DBG_DEC(tDataBlock
.ulLength
);
64 ulDataPos
+= tDataBlock
.ulLength
;
65 lToGo
-= (long)tDataBlock
.ulLength
;
67 bSuccess
= lToGo
== 0 ||
68 (ulTotalLength
== (ULONG
)LONG_MAX
&& ulIndex
== END_OF_CHAIN
);
69 DBG_DEC_C(!bSuccess
, lToGo
);
70 DBG_DEC_C(!bSuccess
, ulTotalLength
);
71 DBG_DEC_C(!bSuccess
, ulIndex
);
73 } /* end of bAddDataBlocks */
76 * bGet6DocumentData - make a list of the data blocks of Word 6/7 files
78 * Code for "fast saved" files.
80 * Returns TRUE when successful, otherwise FALSE
83 bGet6DocumentData(FILE *pFile
, ULONG ulStartBlock
,
84 const ULONG
*aulBBD
, size_t tBBDLen
, const UCHAR
*aucHeader
)
87 ULONG ulBeginTextInfo
, ulOffset
, ulTotLength
;
89 int iIndex
, iOff
, iType
, iLen
, iPieces
;
91 DBG_MSG("bGet6DocumentData");
95 fail(aucHeader
== NULL
);
97 ulBeginTextInfo
= ulGetLong(0x160, aucHeader
);
98 DBG_HEX(ulBeginTextInfo
);
99 tTextInfoLen
= (size_t)ulGetLong(0x164, aucHeader
);
100 DBG_DEC(tTextInfoLen
);
102 aucBuffer
= xmalloc(tTextInfoLen
);
103 if (!bReadBuffer(pFile
, ulStartBlock
,
104 aulBBD
, tBBDLen
, BIG_BLOCK_SIZE
,
105 aucBuffer
, ulBeginTextInfo
, tTextInfoLen
)) {
106 aucBuffer
= xfree(aucBuffer
);
109 NO_DBG_PRINT_BLOCK(aucBuffer
, tTextInfoLen
);
112 while (iOff
< (int)tTextInfoLen
) {
113 iType
= (int)ucGetByte(iOff
, aucBuffer
);
119 iLen
= (int)usGetWord(iOff
, aucBuffer
);
126 werr(0, "Unknown type of 'fastsaved' format");
127 aucBuffer
= xfree(aucBuffer
);
133 iPieces
= (iLen
- 4) / 12;
135 for (iIndex
= 0; iIndex
< iPieces
; iIndex
++) {
136 ulOffset
= ulGetLong(
137 iOff
+ (iPieces
+ 1) * 4 + iIndex
* 8 + 2,
139 ulTotLength
= ulGetLong(iOff
+ (iIndex
+ 1) * 4,
141 ulGetLong(iOff
+ iIndex
* 4,
143 if (!bAddDataBlocks(ulOffset
, ulTotLength
,
146 aucBuffer
= xfree(aucBuffer
);
152 aucBuffer
= xfree(aucBuffer
);
154 } /* end of bGet6DocumentData */