diff -r 59758314f811 -r d4524d6a4472 Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/finddata_8c_source.html --- a/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/finddata_8c_source.html Fri Jun 11 15:24:34 2010 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ - - -
- -00001 /* -00002 * finddata.c -00003 * Copyright (C) 2000-2002 A.J. van Os; Released under GPL -00004 * -00005 * Description: -00006 * Find the blocks that contain the data of MS Word files -00007 */ -00008 -00009 #include <stdio.h> -00010 #include <stdlib.h> -00011 #include "antiword.h" -00012 -00013 -00014 /* -00015 * bAddDataBlocks - Add the blocks to the data block list -00016 * -00017 * Returns TRUE when successful, otherwise FALSE -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 } /* end of bAddDataBlocks */ -00074 -00075 /* -00076 * bGet6DocumentData - make a list of the data blocks of Word 6/7 files -00077 * -00078 * Code for "fast saved" files. -00079 * -00080 * Returns TRUE when successful, otherwise FALSE -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 /* Type 2 */ -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 } /* end of bGet6DocumentData */ -