comparison src/dmgrowbuf.c @ 1531:260bf529a8f2

Implement current len/offs push/pop for growbuf.
author Matti Hamalainen <ccr@tnsp.org>
date Sat, 12 May 2018 03:23:32 +0300
parents 94eb6a8a7d56
children 064fc2e3ee64
comparison
equal deleted inserted replaced
1530:94eb6a8a7d56 1531:260bf529a8f2
24 24
25 if ((res = dmGrowBufInit(buf)) != DMERR_OK) 25 if ((res = dmGrowBufInit(buf)) != DMERR_OK)
26 return res; 26 return res;
27 27
28 buf->len = 0; 28 buf->len = 0;
29 buf->offs = 0;
29 buf->size = initial; 30 buf->size = initial;
30 buf->mingrow = mingrow; 31 buf->mingrow = mingrow;
31 buf->allocated = FALSE; 32 buf->allocated = FALSE;
32 33
33 // Allocate the data 34 // Allocate the data
34 if ((buf->data = dmMalloc0(initial)) == NULL) 35 if ((buf->adata = buf->data = dmMalloc0(initial)) == NULL)
35 return DMERR_MALLOC; 36 return DMERR_MALLOC;
36 37
37 return DMERR_OK; 38 return DMERR_OK;
38 } 39 }
39 40
64 65
65 void dmGrowBufFree(DMGrowBuf *buf) 66 void dmGrowBufFree(DMGrowBuf *buf)
66 { 67 {
67 if (buf != NULL) 68 if (buf != NULL)
68 { 69 {
69 dmFreeR(&buf->data); 70 dmFreeR(&buf->adata);
71 buf->data = NULL;
72
70 if (buf->allocated) 73 if (buf->allocated)
71 dmFree(buf); 74 dmFree(buf);
72 } 75 }
73 } 76 }
74 77
75 78
79 void dmGrowBufPush(DMGrowBuf *buf)
80 {
81 if (buf != NULL && buf->adata != NULL)
82 {
83 buf->stack[buf->nstack].offs = buf->offs;
84 buf->stack[buf->nstack].len = buf->len;
85 buf->nstack++;
86
87 buf->offs = buf->len;
88 buf->data = buf->adata + buf->offs;
89 buf->len = 0;
90 }
91 }
92
93
94 void dmGrowBufPop(DMGrowBuf *buf)
95 {
96 if (buf != NULL && buf->adata != NULL && buf->nstack > 0)
97 {
98 buf->nstack--;
99 buf->offs = buf->stack[buf->nstack].offs;
100 buf->len += buf->stack[buf->nstack].len;
101
102 buf->data = buf->adata + buf->offs;
103 }
104 }
105
106
76 static BOOL dmGrowBufRealloc(DMGrowBuf *buf, const size_t nsize, const BOOL clear) 107 static BOOL dmGrowBufRealloc(DMGrowBuf *buf, const size_t nsize, const BOOL clear)
77 { 108 {
78 if ((buf->data = dmRealloc(buf->data, nsize)) == NULL) 109 if ((buf->adata = dmRealloc(buf->adata, nsize)) == NULL)
79 return FALSE; 110 return FALSE;
80 111
81 if (clear) 112 if (clear)
82 memset(buf->adata + buf->size, 0, nsize - buf->size); 113 memset(buf->adata + buf->size, 0, nsize - buf->size);
83 114
115 buf->data = buf->adata + buf->offs;
84 buf->size = nsize; 116 buf->size = nsize;
85 117
86 return TRUE; 118 return TRUE;
87 } 119 }
88 120
92 // if there is not enough space for at least that amount compared to 124 // if there is not enough space for at least that amount compared to
93 // current buffer "len". 125 // current buffer "len".
94 // 126 //
95 BOOL dmGrowBufGrow(DMGrowBuf *buf, const size_t amount) 127 BOOL dmGrowBufGrow(DMGrowBuf *buf, const size_t amount)
96 { 128 {
97 if (buf->data == NULL || buf->offs + buf->len + amount >= buf->size) 129 if (buf->adata == NULL || buf->offs + buf->len + amount >= buf->size)
98 { 130 {
99 size_t grow = (amount > buf->mingrow) ? amount : buf->mingrow; 131 size_t grow = (amount > buf->mingrow) ? amount : buf->mingrow;
100 if (!dmGrowBufRealloc(buf, buf->offs + buf->len + grow, TRUE)) 132 if (!dmGrowBufRealloc(buf, buf->offs + buf->len + grow, TRUE))
101 return FALSE; 133 return FALSE;
102 } 134 }
109 // Grow the buffer if "nsize" is larger than the current buffer size. 141 // Grow the buffer if "nsize" is larger than the current buffer size.
110 // Buffer is enlarged to nsize + mingrow. 142 // Buffer is enlarged to nsize + mingrow.
111 // 143 //
112 BOOL dmGrowBufCheckGrow(DMGrowBuf *buf, const size_t nsize) 144 BOOL dmGrowBufCheckGrow(DMGrowBuf *buf, const size_t nsize)
113 { 145 {
114 if (buf->data == NULL || buf->offs + nsize > buf->size) 146 if (buf->adata == NULL || buf->offs + nsize > buf->size)
115 { 147 {
116 if (!dmGrowBufRealloc(buf, buf->offs + nsize + buf->mingrow, TRUE)) 148 if (!dmGrowBufRealloc(buf, buf->offs + nsize + buf->mingrow, TRUE))
117 return FALSE; 149 return FALSE;
118 } 150 }
119 151