home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / anwor032.zip / antiword.0.32 / depot.c < prev    next >
C/C++ Source or Header  |  2000-12-23  |  2KB  |  104 lines

  1. /*
  2.  * depot.c
  3.  * Copyright (C) 1998-2000 A.J. van Os; Released under GPL
  4.  *
  5.  * Description:
  6.  * Functions to compute the depot offset
  7.  */
  8.  
  9. #include "antiword.h"
  10.  
  11. #define SIZE_RATIO    (BIG_BLOCK_SIZE/SMALL_BLOCK_SIZE)
  12.  
  13. static long    *alSmallBlockList = NULL;
  14. static int    iSmallBlockListLen = 0;
  15.  
  16.  
  17. /*
  18.  * vDestroySmallBlockList - destroy the small block list
  19.  */
  20. void
  21. vDestroySmallBlockList(void)
  22. {
  23.     DBG_MSG("vDestroySmallBlockList");
  24.  
  25.     alSmallBlockList = xfree(alSmallBlockList);
  26.     iSmallBlockListLen = 0;
  27. } /* end of vDestroySmalBlockList */
  28.  
  29. /*
  30.  * vCreateSmallBlockList - create the small block list
  31.  *
  32.  * returns: TRUE when successful, otherwise FALSE
  33.  */
  34. BOOL
  35. bCreateSmallBlockList(long lStartblock, const long *alBBD, size_t tBBDLen)
  36. {
  37.     long    lTmp;
  38.     size_t    tSize;
  39.     int    iIndex;
  40.  
  41.     fail(alSmallBlockList != NULL || iSmallBlockListLen != 0);
  42.     fail(lStartblock < 0 && lStartblock != END_OF_CHAIN);
  43.     fail(alBBD == NULL || tBBDLen == 0);
  44.  
  45.     /* Find the length of the small block list */
  46.     for (iSmallBlockListLen = 0, lTmp = lStartblock;
  47.          iSmallBlockListLen < (int)tBBDLen && lTmp != END_OF_CHAIN;
  48.          iSmallBlockListLen++, lTmp = alBBD[lTmp]) {
  49.         if (lTmp < 0 || lTmp >= (long)tBBDLen) {
  50.             werr(1, "The Big Block Depot is corrupt");
  51.         }
  52.     }
  53.     DBG_DEC(iSmallBlockListLen);
  54.  
  55.     if (iSmallBlockListLen <= 0) {
  56.         /* There is no small block list */
  57.         fail(lStartblock != END_OF_CHAIN);
  58.         alSmallBlockList = NULL;
  59.         iSmallBlockListLen = 0;
  60.         return TRUE;
  61.     }
  62.  
  63.     /* Create the small block list */
  64.     tSize = (size_t)iSmallBlockListLen * sizeof(long);
  65.     alSmallBlockList = xmalloc(tSize);
  66.     for (iIndex = 0, lTmp = lStartblock;
  67.          iIndex < (int)tBBDLen && lTmp != END_OF_CHAIN;
  68.          iIndex++, lTmp = alBBD[lTmp]) {
  69.         if (lTmp < 0 || lTmp >= (long)tBBDLen) {
  70.             werr(1, "The Big Block Depot is corrupt");
  71.         }
  72.         alSmallBlockList[iIndex] = lTmp;
  73.         NO_DBG_DEC(alSmallBlockList[iIndex]);
  74.     }
  75.     return TRUE;
  76. } /* end of bCreateSmallBlockList */
  77.  
  78. /*
  79.  * lDepotOffset - get the depot offset the block list
  80.  */
  81. long
  82. lDepotOffset(long lIndex, size_t tBlockSize)
  83. {
  84.     int    iTmp1, iTmp2;
  85.  
  86.     fail(lIndex < 0);
  87.  
  88.     switch (tBlockSize) {
  89.     case BIG_BLOCK_SIZE:
  90.         return (lIndex + 1) * BIG_BLOCK_SIZE;
  91.     case SMALL_BLOCK_SIZE:
  92.         iTmp1 = (int)(lIndex / SIZE_RATIO);
  93.         iTmp2 = (int)(lIndex % SIZE_RATIO);
  94.         if (alSmallBlockList == NULL ||
  95.             iSmallBlockListLen <= iTmp1) {
  96.             return 0;
  97.         }
  98.         return ((alSmallBlockList[iTmp1] + 1) * SIZE_RATIO +
  99.                 iTmp2) * SMALL_BLOCK_SIZE;
  100.     default:
  101.         return 0;
  102.     }
  103. } /* end of lDepotOffset */
  104.