home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / HARDDISK / BADCLU.ZIP / AE.ZIP / STRPOOL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-04-10  |  2.4 KB  |  106 lines

  1. /**********************************************************************
  2.  *  
  3.  *  NAME:           strpool.c
  4.  *  
  5.  *  DESCRIPTION:    implementation of "string pool" type
  6.  *  
  7.  *  M O D I F I C A T I O N   H I S T O R Y
  8.  *
  9.  *  when        who                 what
  10.  *  -------------------------------------------------------------------
  11.  *  04/10/90    J. Alan Eldridge    created
  12.  *
  13.  *********************************************************************/
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <stdarg.h>
  18. #include <string.h>
  19.  
  20. #include "strpool.h"
  21.  
  22. STRPOOL *
  23. strpool_new(
  24.     int     nbufs,
  25.     int     bsize)
  26. {
  27.     int         n;
  28.     STRPOOL     *p;
  29.     int         psz,
  30.                 bsz;        
  31.     
  32.     psz = sizeof(STRPOOL) + (nbufs - 1) * sizeof(struct strbuf *);
  33.     if (bsize < 8) bsize = 8;
  34.     bsz = sizeof(struct strbuf) + bsize - 8;
  35.     p = malloc(psz);
  36.     if (p) {
  37.         memset(p,0,psz);
  38.         for (n = 0; n < nbufs; n++) {
  39.             if(!(p->bufs[n] = malloc(bsz))) {
  40.                 while (--n >= 0)
  41.                     free(p->bufs[n]);
  42.                 free(p);
  43.                 return NULL;
  44.             } else {
  45.                 memset(p->bufs[n]->buf,0,bsize);
  46.                 p->bufs[n]->size = 
  47.                 p->bufs[n]->free = bsize;
  48.             }
  49.         }                
  50.         p->nbufs = nbufs;
  51.     }
  52.     return p;
  53. }
  54.  
  55. int
  56. strpool_put(
  57.     STRPOOL *p,
  58.     int     bcnt,
  59.     char    *bytes,
  60.     STRADDR addr)
  61. {
  62.     int     n;
  63.  
  64.     for (n = 0; n < p->nbufs; n++) {
  65.         if (p->bufs[n]->free >= (bcnt+sizeof(int)))
  66.             break;
  67.     }
  68.     if (n == p->nbufs) {
  69.         return addr[0] = addr[1] = -1;
  70.     }
  71.     addr[0] = n;
  72.     addr[1] = p->bufs[n]->size - p->bufs[n]->free;
  73.     *(int*)&(p->bufs[n]->buf[addr[1]]) = bcnt;
  74.     memcpy(&(p->bufs[n]->buf[addr[1]+sizeof(int)]), bytes, bcnt);
  75.     if (bcnt % 2) bcnt++;
  76.     p->bufs[n]->free -= (bcnt+sizeof(int));
  77.     if (p->bufs[n]->free == -1)
  78.         p->bufs[n]->free = 0;
  79.     return 0;
  80. }
  81.  
  82. void
  83. strpool_free(STRPOOL *p)
  84. {
  85.     int n;
  86.     
  87.     for (n = 0; n < p->nbufs; n++)
  88.         free(p->bufs[n]);
  89.     free(p);
  90. }
  91.  
  92. char *
  93. strpool_get(
  94.     STRPOOL *p,
  95.     STRADDR addr,
  96.     int     *bcnt)
  97. {
  98.     char *cp = &(p->bufs[addr[0]]->buf[addr[1]]);
  99.  
  100.     if (bcnt)
  101.         *bcnt = *(int*)cp;
  102.     return cp+sizeof(int);
  103. }
  104.     
  105.     
  106.