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