home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / Tools / lynx-2.4 / WWW / Library / Implementation / HTChunk.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-28  |  2.0 KB  |  99 lines

  1. /*        Chunk handling:    Flexible arrays
  2. **        ===============================
  3. **
  4. */
  5.  
  6. #include "HTUtils.h"
  7. #include "HTChunk.h"
  8. /*#include <stdio.h> included by HTUtils.h -- FM */
  9.  
  10. #include "LYLeaks.h"
  11.  
  12. /*    Create a chunk with a certain allocation unit
  13. **    --------------
  14. */
  15. PUBLIC HTChunk * HTChunkCreate ARGS1 (int,grow)
  16. {
  17.     HTChunk * ch = (HTChunk *) malloc(sizeof(HTChunk));
  18.     if (ch == NULL) outofmem(__FILE__, "cretion of chunk");
  19.  
  20.     ch->data = 0;
  21.     ch->growby = grow;
  22.     ch->size = 0;
  23.     ch->allocated = 0;
  24.     return ch;
  25. }
  26.  
  27.  
  28. /*    Clear a chunk of all data
  29. **    --------------------------
  30. */
  31. PUBLIC void HTChunkClear ARGS1 (HTChunk *,ch)
  32. {
  33.     if (ch->data) {
  34.     free(ch->data);
  35.     ch->data = 0;
  36.     }
  37.     ch->size = 0;
  38.     ch->allocated = 0;
  39. }
  40.  
  41.  
  42. /*    Free a chunk
  43. **    ------------
  44. */
  45. PUBLIC void HTChunkFree ARGS1 (HTChunk *,ch)
  46. {
  47.     if (ch->data) free(ch->data);
  48.     free(ch);
  49. }
  50.  
  51.  
  52. /*    Append a character
  53. **    ------------------
  54. */
  55. PUBLIC void HTChunkPutc ARGS2 (HTChunk *,ch, char,c)
  56. {
  57.     if (ch->size >= ch->allocated) {
  58.     ch->allocated = ch->allocated + ch->growby;
  59.         ch->data = ch->data ? (char *)realloc(ch->data, ch->allocated)
  60.                 : (char *)malloc(ch->allocated);
  61.       if (!ch->data) outofmem(__FILE__, "HTChunkPutc");
  62.     }
  63.     ch->data[ch->size++] = c;
  64. }
  65.  
  66.  
  67. /*    Ensure a certain size
  68. **    ---------------------
  69. */
  70. PUBLIC void HTChunkEnsure ARGS2 (HTChunk *,ch, int,needed)
  71. {
  72.     if (needed <= ch->allocated) return;
  73.     ch->allocated = needed-1 - ((needed-1) % ch->growby)
  74.                      + ch->growby; /* Round up */
  75.     ch->data = ch->data ? (char *)realloc(ch->data, ch->allocated)
  76.             : (char *)malloc(ch->allocated);
  77.     if (ch->data == NULL) outofmem(__FILE__, "HTChunkEnsure");
  78. }
  79.  
  80.  
  81. /*    Terminate a chunk
  82. **    -----------------
  83. */
  84. PUBLIC void HTChunkTerminate ARGS1 (HTChunk *,ch)
  85. {
  86.     HTChunkPutc(ch, (char)0);
  87. }
  88.  
  89.  
  90. /*    Append a string
  91. **    ---------------
  92. */
  93. PUBLIC void HTChunkPuts ARGS2 (HTChunk *,ch, CONST char *,s)
  94. {
  95.     CONST char * p;
  96.     for (p=s; *p; p++)
  97.         HTChunkPutc(ch, *p);
  98. }
  99.