1*cc4ad7daSAndroid Build Coastguard Worker #pragma once 2*cc4ad7daSAndroid Build Coastguard Worker 3*cc4ad7daSAndroid Build Coastguard Worker #include <stdbool.h> 4*cc4ad7daSAndroid Build Coastguard Worker #include <stdlib.h> 5*cc4ad7daSAndroid Build Coastguard Worker 6*cc4ad7daSAndroid Build Coastguard Worker #include <shared/macro.h> 7*cc4ad7daSAndroid Build Coastguard Worker 8*cc4ad7daSAndroid Build Coastguard Worker /* 9*cc4ad7daSAndroid Build Coastguard Worker * Buffer abstract data type 10*cc4ad7daSAndroid Build Coastguard Worker */ 11*cc4ad7daSAndroid Build Coastguard Worker struct scratchbuf { 12*cc4ad7daSAndroid Build Coastguard Worker char *bytes; 13*cc4ad7daSAndroid Build Coastguard Worker size_t size; 14*cc4ad7daSAndroid Build Coastguard Worker bool need_free; 15*cc4ad7daSAndroid Build Coastguard Worker }; 16*cc4ad7daSAndroid Build Coastguard Worker 17*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_init(struct scratchbuf *buf, char *stackbuf, size_t size); 18*cc4ad7daSAndroid Build Coastguard Worker int scratchbuf_alloc(struct scratchbuf *buf, size_t sz); 19*cc4ad7daSAndroid Build Coastguard Worker void scratchbuf_release(struct scratchbuf *buf); 20*cc4ad7daSAndroid Build Coastguard Worker 21*cc4ad7daSAndroid Build Coastguard Worker /* Return a C string */ scratchbuf_str(struct scratchbuf * buf)22*cc4ad7daSAndroid Build Coastguard Workerstatic inline char *scratchbuf_str(struct scratchbuf *buf) 23*cc4ad7daSAndroid Build Coastguard Worker { 24*cc4ad7daSAndroid Build Coastguard Worker return buf->bytes; 25*cc4ad7daSAndroid Build Coastguard Worker } 26*cc4ad7daSAndroid Build Coastguard Worker 27*cc4ad7daSAndroid Build Coastguard Worker #define SCRATCHBUF_INITIALIZER(buf_) { \ 28*cc4ad7daSAndroid Build Coastguard Worker .bytes = buf_, \ 29*cc4ad7daSAndroid Build Coastguard Worker .size = sizeof(buf_) + _array_size_chk(buf_), \ 30*cc4ad7daSAndroid Build Coastguard Worker .need_free = false, \ 31*cc4ad7daSAndroid Build Coastguard Worker } 32