home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / adaptor.zip / adapt.zip / adaptor / src / dynarray.c < prev    next >
C/C++ Source or Header  |  1993-03-22  |  3KB  |  96 lines

  1. /* $Id: DynArray.c,v 1.5 1992/05/05 13:19:05 grosch rel $ */
  2.  
  3. /* $Log: DynArray.c,v $
  4.  * Revision 1.5  1992/05/05  13:19:05  grosch
  5.  * added rcsid
  6.  *
  7.  * Revision 1.4  1991/11/21  14:28:16  grosch
  8.  * new version of RCS on SPARC
  9.  *
  10.  * Revision 1.3  90/09/04  17:32:07  grosch
  11.  * automatic determination of alignment
  12.  * 
  13.  * Revision 1.2  90/07/04  14:33:51  grosch
  14.  * introduced conditional include
  15.  * 
  16.  * Revision 1.1  88/10/18  17:32:05  grosch
  17.  * fixed bug: invariant must hold: ElmtCount * AlignedSize (ElmtSize) % 4 == 0
  18.  * 
  19.  * Revision 1.0  88/10/04  11:44:35  grosch
  20.  * Initial revision
  21.  * 
  22.  */
  23.  
  24. /* Ich, Doktor Josef Grosch, Informatiker, Sept. 1987 */
  25.  
  26. static char rcsid [] = "$Id: DynArray.c,v 1.5 1992/05/05 13:19:05 grosch rel $";
  27.  
  28. # include "ratc.h"
  29. # include "DynArray.h"
  30. # include "General.h"
  31. # include "Memory.h"
  32.  
  33. /* INVARIANT ElmtCount * AlignedSize (ElmtSize) % sizeof (long) == 0 */
  34.  
  35. static unsigned long AlignedSize (ElmtSize)
  36.    unsigned long    ElmtSize;
  37.    {
  38.       register unsigned long Align;
  39.  
  40.       if (ElmtSize >= yyMaxAlign) {
  41.      Align = yyMaxAlign;
  42.       } else {
  43.      Align = Exp2 (Log2 (ElmtSize + ElmtSize - 2));
  44.       }
  45.       return ElmtSize + Align - 1 - (ElmtSize - 1) % Align;
  46.    }
  47.  
  48. void MakeArray (ArrayPtr, ElmtCount, ElmtSize)
  49.    char * *    ArrayPtr    ;
  50.    unsigned long * ElmtCount    ;
  51.    unsigned long ElmtSize    ;
  52.    {
  53.       ElmtSize = AlignedSize (ElmtSize);
  54.       switch (ElmtSize % 4) {
  55.       case 0: break;
  56.       case 2: if (* ElmtCount & 1) (* ElmtCount) ++; break;
  57.       case 1:
  58.       case 3: * ElmtCount += sizeof (long) - 1 - (* ElmtCount - 1) % sizeof (long); break;
  59.       }
  60.       * ArrayPtr = Alloc (* ElmtCount * ElmtSize);
  61.    }
  62.  
  63. void ExtendArray (ArrayPtr, ElmtCount, ElmtSize)
  64.    char * *    ArrayPtr    ;
  65.    unsigned long * ElmtCount    ;
  66.    unsigned long ElmtSize    ;
  67.    {
  68.               char *    NewPtr    ;
  69.       register    long *    Source    ;
  70.       register    long *    Target    ;
  71.       register    long    i         ;
  72.  
  73.       ElmtSize = AlignedSize (ElmtSize);
  74.       NewPtr = Alloc (* ElmtCount * ElmtSize * 2);
  75.       Source = (long *) * ArrayPtr;
  76.       Target = (long *) NewPtr;
  77.       i      = * ElmtCount * ElmtSize / sizeof (long);
  78.  
  79.       do {
  80.      * Target ++ = * Source ++;
  81.       } while (i -- > 0);
  82.  
  83.       Free (* ElmtCount * ElmtSize, * ArrayPtr);
  84.       * ArrayPtr = NewPtr;
  85.       * ElmtCount += * ElmtCount;
  86.    }
  87.  
  88. void ReleaseArray (ArrayPtr, ElmtCount, ElmtSize)
  89.    char * *    ArrayPtr    ;
  90.    unsigned long * ElmtCount    ;
  91.    unsigned long ElmtSize    ;
  92.    {
  93.       ElmtSize = AlignedSize (ElmtSize);
  94.       Free (* ElmtCount * ElmtSize, * ArrayPtr);
  95.    }
  96.