00001 #include <stdio.h>
00002 #include <string.h>
00003 #include <malloc.h>
00004 #include <neuro/nsrealloc.h>
00005
00006 #define STARTINGBUFSIZE 256
00007
00008 struct NSByteHolder
00009 {
00010 int alloc, used;
00011 char *buf;
00012 };
00013
00014 static void ensureMoreSpace(struct NSByteHolder *nsb)
00015 {
00016 if (nsb->used == nsb->alloc)
00017 {
00018 int newSize;
00019 void *newbuf;
00020 newSize = nsb->alloc * 2;
00021 newbuf = calloc(1, newSize);
00022 memcpy(newbuf, nsb->buf, nsb->used);
00023 free(nsb->buf);
00024 nsb->buf = newbuf;
00025 nsb->alloc = newSize;
00026 }
00027 }
00028
00029 struct NSByteHolder *newNSByteHolder(void)
00030 {
00031 struct NSByteHolder *nsb;
00032 nsb = calloc(1, sizeof(struct NSByteHolder));
00033 nsb->buf = calloc(1, STARTINGBUFSIZE);
00034 nsb->alloc = STARTINGBUFSIZE;
00035 nsb->used = 0;
00036 return nsb;
00037 }
00038
00039 void addBlock(struct NSByteHolder *nsb, char *buf, int len)
00040 {
00041 int i;
00042 for (i = 0; i < len; i += 1)
00043 addCharacter(nsb, buf[i])
00044 }
00045
00046 void addCharacter(struct NSByteHolder *nsb, char c)
00047 {
00048 ensureMoreSpace(nsb);
00049 nsb->buf[nsb->used] = c;
00050 nsb->used += 1;
00051 }
00052
00053 int getSize(struct NSByteHolder *nsb)
00054 {
00055 return nsb->used;
00056 }
00057
00058 const char *getData(struct NSByteHolder *nsb)
00059 {
00060 return nsb->buf;
00061 }
00062
00063 void freeNSByteHolder(struct NSByteHolder *nsb)
00064 {
00065 nsb->alloc = 0;
00066 nsb->used = 0;
00067 free(nsb->buf);
00068 nsb->buf = NULL;
00069 free(nsb);
00070 }
00071