src/stack.c

changeset 301
0f83916c1639
parent 259
2f5dea574a75
equal deleted inserted replaced
299:e7dfcf229625 301:0f83916c1639
118 void ucx_stack_popn(UcxStack *stack, void *dest, size_t n) { 118 void ucx_stack_popn(UcxStack *stack, void *dest, size_t n) {
119 if (ucx_stack_empty(stack)) { 119 if (ucx_stack_empty(stack)) {
120 return; 120 return;
121 } 121 }
122 122
123 size_t len = ucx_stack_topsize(stack); 123 if (dest) {
124 if (len > n) { 124 size_t len = ucx_stack_topsize(stack);
125 len = n; 125 if (len > n) {
126 len = n;
127 }
128
129 memcpy(dest, stack->top, len);
126 } 130 }
127
128 memcpy(dest, stack->top, len);
129 131
130 ucx_stack_free(stack, stack->top); 132 ucx_stack_free(stack, stack->top);
131 } 133 }
132 134
133 size_t ucx_stack_avail(UcxStack *stack) { 135 size_t ucx_stack_avail(UcxStack *stack) {
140 return avail - sizeof(struct ucx_stack_metadata); 142 return avail - sizeof(struct ucx_stack_metadata);
141 } else { 143 } else {
142 return 0; 144 return 0;
143 } 145 }
144 } 146 }
147
148 void *ucx_stack_push(UcxStack *stack, size_t n, const void *data) {
149 void *space = ucx_stack_malloc(stack, n);
150 if (space) {
151 memcpy(space, data, n);
152 }
153 return space;
154 }
155
156 void *ucx_stack_pusharr(UcxStack *stack,
157 size_t nelem, size_t elsize, const void *data) {
158
159 // skip the memset by using malloc
160 void *space = ucx_stack_malloc(stack, nelem*elsize);
161 if (space) {
162 memcpy(space, data, nelem*elsize);
163 }
164 return space;
165 }

mercurial