1 #include "pbuffer.h"
2 
3 /* reentrant pbuffer functions */
4 
5 TMPLPRO_LOCAL
pbuffer_size(const pbuffer * pBuffer)6 size_t pbuffer_size(const pbuffer* pBuffer) {
7   return pBuffer->bufsize;
8 }
9 TMPLPRO_LOCAL
pbuffer_preinit(pbuffer * pBuffer)10 void pbuffer_preinit(pbuffer* pBuffer) {
11   pBuffer->bufsize=0;
12   pBuffer->buffer=NULL;
13 }
14 TMPLPRO_LOCAL
pbuffer_init(pbuffer * pBuffer)15 char* pbuffer_init(pbuffer* pBuffer) {
16   pBuffer->bufsize=256;
17   pBuffer->buffer=(char*) malloc (pBuffer->bufsize * sizeof(char));
18   return pBuffer->buffer;
19 }
20 TMPLPRO_LOCAL
pbuffer_init_as(pbuffer * pBuffer,size_t size)21 char* pbuffer_init_as(pbuffer* pBuffer,size_t size) {
22   pBuffer->bufsize=PBUFFER_MULTIPLICATOR*size;
23   pBuffer->buffer=(char*) malloc (pBuffer->bufsize * sizeof(char));
24   return pBuffer->buffer;
25 }
26 TMPLPRO_LOCAL
pbuffer_string(const pbuffer * pBuffer)27 char* pbuffer_string(const pbuffer* pBuffer) {
28   return pBuffer->buffer;
29 }
30 TMPLPRO_LOCAL
pbuffer_resize(pbuffer * pBuffer,size_t size)31 char* pbuffer_resize(pbuffer* pBuffer, size_t size) {
32   if (pBuffer->bufsize==0) {
33     pbuffer_init_as(pBuffer, size);
34   } else if (pBuffer->bufsize< size) {
35     pBuffer->bufsize=PBUFFER_MULTIPLICATOR*size; /* aggresive memory allocation to prevent frequent requests*/
36     pBuffer->buffer=(char*) realloc (pBuffer->buffer,pBuffer->bufsize * sizeof(char));
37   }
38   return pBuffer->buffer;
39 }
40 
41 TMPLPRO_LOCAL
pbuffer_free(pbuffer * pBuffer)42 void pbuffer_free(pbuffer* pBuffer) {
43   if (pBuffer->bufsize!=0) {
44     pBuffer->bufsize=0;
45     free(pBuffer->buffer);
46     pBuffer->buffer=NULL;
47   }
48 }
49 TMPLPRO_LOCAL
pbuffer_fill_from_pstring(pbuffer * pBuffer,PSTRING pstr)50 void pbuffer_fill_from_pstring(pbuffer* pBuffer, PSTRING pstr) {
51   size_t size = pstr.endnext - pstr.begin;
52   const char* from = pstr.begin;
53   char* dest;
54   if (pBuffer->bufsize==0) {
55     pbuffer_init_as(pBuffer, size+1);
56   } else if (pBuffer->bufsize<size) {
57     pbuffer_resize(pBuffer, size+1);
58   }
59   dest = pBuffer->buffer;
60   while (from<pstr.endnext) {
61     *(dest++)=*(from++);
62   }
63   *dest='\0';
64 }
65 TMPLPRO_LOCAL
pbuffer_swap(pbuffer * buf1,pbuffer * buf2)66 void pbuffer_swap(pbuffer* buf1, pbuffer* buf2) {
67   pbuffer tmpbuf = *buf1;
68   *buf1 = *buf2;
69   *buf2 = tmpbuf;
70 }
71 
72 /*
73  * Local Variables:
74  * mode: c
75  * End:
76  */
77