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 } |