Mercurial > hg > dmlib
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 |