diff -r f345bda72bc4 -r 43e37759235e Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/depot_8c_source.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Symbian3/Examples/guid-6013a680-57f9-415b-8851-c4fa63356636/depot_8c_source.html Tue Mar 30 16:16:55 2010 +0100 @@ -0,0 +1,130 @@ + + +
+ +00001 /* +00002 * depot.c +00003 * Copyright (C) 1998-2002 A.J. van Os; Released under GPL +00004 * +00005 * Description: +00006 * Functions to compute the depot offset +00007 */ +00008 +00009 #include "antiword.h" +00010 +00011 #define SIZE_RATIO (BIG_BLOCK_SIZE/SMALL_BLOCK_SIZE) +00012 +00013 static ULONG *aulSmallBlockList = NULL; +00014 static size_t tSmallBlockListLen = 0; +00015 +00016 +00017 /* +00018 * vDestroySmallBlockList - destroy the small block list +00019 */ +00020 void +00021 vDestroySmallBlockList(void) +00022 { +00023 DBG_MSG("vDestroySmallBlockList"); +00024 +00025 aulSmallBlockList = xfree(aulSmallBlockList); +00026 tSmallBlockListLen = 0; +00027 } /* end of vDestroySmalBlockList */ +00028 +00029 /* +00030 * vCreateSmallBlockList - create the small block list +00031 * +00032 * returns: TRUE when successful, otherwise FALSE +00033 */ +00034 BOOL +00035 bCreateSmallBlockList(ULONG ulStartblock, const ULONG *aulBBD, size_t tBBDLen) +00036 { +00037 ULONG ulTmp; +00038 size_t tSize; +00039 int iIndex; +00040 +00041 fail(aulSmallBlockList != NULL); +00042 fail(tSmallBlockListLen != 0); +00043 fail(ulStartblock > MAX_BLOCKNUMBER && ulStartblock != END_OF_CHAIN); +00044 fail(aulBBD == NULL); +00045 fail(tBBDLen == 0); +00046 +00047 /* Find the length of the small block list */ +00048 for (tSmallBlockListLen = 0, ulTmp = ulStartblock; +00049 tSmallBlockListLen < tBBDLen && ulTmp != END_OF_CHAIN; +00050 tSmallBlockListLen++, ulTmp = aulBBD[ulTmp]) { +00051 if (ulTmp >= (ULONG)tBBDLen) { +00052 DBG_DEC(ulTmp); +00053 DBG_DEC(tBBDLen); +00054 werr(1, "The Big Block Depot is damaged"); +00055 } +00056 } +00057 DBG_DEC(tSmallBlockListLen); +00058 +00059 if (tSmallBlockListLen == 0) { +00060 /* There is no small block list */ +00061 fail(ulStartblock != END_OF_CHAIN); +00062 aulSmallBlockList = NULL; +00063 return TRUE; +00064 } +00065 +00066 /* Create the small block list */ +00067 tSize = tSmallBlockListLen * sizeof(ULONG); +00068 aulSmallBlockList = xmalloc(tSize); +00069 for (iIndex = 0, ulTmp = ulStartblock; +00070 iIndex < (int)tBBDLen && ulTmp != END_OF_CHAIN; +00071 iIndex++, ulTmp = aulBBD[ulTmp]) { +00072 if (ulTmp >= (ULONG)tBBDLen) { +00073 DBG_DEC(ulTmp); +00074 DBG_DEC(tBBDLen); +00075 werr(1, "The Big Block Depot is damaged"); +00076 } +00077 aulSmallBlockList[iIndex] = ulTmp; +00078 NO_DBG_DEC(aulSmallBlockList[iIndex]); +00079 } +00080 return TRUE; +00081 } /* end of bCreateSmallBlockList */ +00082 +00083 /* +00084 * ulDepotOffset - get the depot offset the block list +00085 */ +00086 ULONG +00087 ulDepotOffset(ULONG ulIndex, size_t tBlockSize) +00088 { +00089 ULONG ulTmp; +00090 size_t tTmp; +00091 +00092 fail(ulIndex >= ULONG_MAX / BIG_BLOCK_SIZE); +00093 +00094 switch (tBlockSize) { +00095 case BIG_BLOCK_SIZE: +00096 return (ulIndex + 1) * BIG_BLOCK_SIZE; +00097 case SMALL_BLOCK_SIZE: +00098 tTmp = (size_t)(ulIndex / SIZE_RATIO); +00099 ulTmp = ulIndex % SIZE_RATIO; +00100 if (aulSmallBlockList == NULL || +00101 tTmp >= tSmallBlockListLen) { +00102 DBG_HEX(aulSmallBlockList); +00103 DBG_DEC(tSmallBlockListLen); +00104 DBG_DEC(tTmp); +00105 return 0; +00106 } +00107 return ((aulSmallBlockList[tTmp] + 1) * SIZE_RATIO + +00108 ulTmp) * SMALL_BLOCK_SIZE; +00109 default: +00110 DBG_DEC(tBlockSize); +00111 DBG_FIXME(); +00112 return 0; +00113 } +00114 } /* end of ulDepotOffset */ +