home *** CD-ROM | disk | FTP | other *** search
- /**********************************************************************
- *
- * NAME: strpool.c
- *
- * DESCRIPTION: implementation of "string pool" type
- *
- * M O D I F I C A T I O N H I S T O R Y
- *
- * when who what
- * -------------------------------------------------------------------
- * 04/10/90 J. Alan Eldridge created
- *
- *********************************************************************/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <stdarg.h>
- #include <string.h>
-
- #include "strpool.h"
-
- STRPOOL *
- strpool_new(
- int nbufs,
- int bsize)
- {
- int n;
- STRPOOL *p;
- int psz,
- bsz;
-
- psz = sizeof(STRPOOL) + (nbufs - 1) * sizeof(struct strbuf *);
- if (bsize < 8) bsize = 8;
- bsz = sizeof(struct strbuf) + bsize - 8;
- p = malloc(psz);
- if (p) {
- memset(p,0,psz);
- for (n = 0; n < nbufs; n++) {
- if(!(p->bufs[n] = malloc(bsz))) {
- while (--n >= 0)
- free(p->bufs[n]);
- free(p);
- return NULL;
- } else {
- memset(p->bufs[n]->buf,0,bsize);
- p->bufs[n]->size =
- p->bufs[n]->free = bsize;
- }
- }
- p->nbufs = nbufs;
- }
- return p;
- }
-
- int
- strpool_put(
- STRPOOL *p,
- int bcnt,
- char *bytes,
- STRADDR addr)
- {
- int n;
-
- for (n = 0; n < p->nbufs; n++) {
- if (p->bufs[n]->free >= (bcnt+sizeof(int)))
- break;
- }
- if (n == p->nbufs) {
- return addr[0] = addr[1] = -1;
- }
- addr[0] = n;
- addr[1] = p->bufs[n]->size - p->bufs[n]->free;
- *(int*)&(p->bufs[n]->buf[addr[1]]) = bcnt;
- memcpy(&(p->bufs[n]->buf[addr[1]+sizeof(int)]), bytes, bcnt);
- if (bcnt % 2) bcnt++;
- p->bufs[n]->free -= (bcnt+sizeof(int));
- if (p->bufs[n]->free == -1)
- p->bufs[n]->free = 0;
- return 0;
- }
-
- void
- strpool_free(STRPOOL *p)
- {
- int n;
-
- for (n = 0; n < p->nbufs; n++)
- free(p->bufs[n]);
- free(p);
- }
-
- char *
- strpool_get(
- STRPOOL *p,
- STRADDR addr,
- int *bcnt)
- {
- char *cp = &(p->bufs[addr[0]]->buf[addr[1]]);
-
- if (bcnt)
- *bcnt = *(int*)cp;
- return cp+sizeof(int);
- }
-
-
-