char *aa_rx_errstr( struct aa_mem_region *reg, int e ) { size_t n = 0; const char *strs[sizeof(e) * 8 + 1]; strs[0] = "OK";; strs[1] = NULL; for( size_t i = 0; i < sizeof(errstrs) / sizeof(*errstrs); i ++ ) { if( e & (1<<i) ) { strs[n] = errstrs[i]; n++; strs[n] = NULL; } } if( 0 == n ) { n++; } /* TODO: compute exact size */ char *buf = (char*)aa_mem_region_alloc(reg, 256); *buf = '\0'; for( size_t i = 0; i < n; i ++ ) { strcat(buf, strs[i]); if(strs[i+1]) { strcat(buf, ":"); } } return buf; }
size_t aa_io_d_parse( const char *str, struct aa_mem_region *reg, double **X, char **lendptr ) { char *ptr = (char*)str; // promise not to change str size_t i = 0; for(; ; i ++ ) { if( NULL == ptr || AA_IO_ISCOMMENT(*ptr) ) break; errno = 0; char *endptr; double x = strtod(ptr, &endptr); if( ptr == endptr ) break; *X = (double*)aa_mem_region_tmprealloc(reg, (1+i)*sizeof(double)); (*X)[i] = x; endptr = aa_io_skipblank(endptr); ptr = endptr; } void *a_ptr = aa_mem_region_alloc(reg, i*sizeof(double)); assert( 0 == i || a_ptr == *X ); if( lendptr ) *lendptr = ptr; return i; }
/*-- Cons --*/ aa_mem_cons_t *aa_mem_cons_cpy( aa_mem_region_t *reg, void *p, size_t n, aa_mem_cons_t *next ) { aa_mem_cons_t *node = (aa_mem_cons_t*) aa_mem_region_alloc( reg, sizeof(aa_mem_cons_t) + n ); node->data = node+1; node->next = next; memcpy( node->data, p, n ); return node; }
void *aa_mem_pool_alloc( aa_mem_pool_t *pool ) { if( pool->top ) { // allocate from freed pool void *p = pool->top; pool->top = *((void**)p); return p; } else { // allocate from region return aa_mem_region_alloc( &pool->region, pool->size ); } }
char* aa_mem_region_vprintf(aa_mem_region_t *reg, const char *fmt, va_list ap ) { int r; do { va_list ap1; va_copy(ap1, ap); // r is one less than needed buffer size, (doesn't count '\0') r = vsnprintf((char*)aa_mem_region_ptr(reg), aa_mem_region_freesize(reg), fmt, ap1); va_end(ap1); }while( (r >= (int)aa_mem_region_freesize(reg) ) && aa_mem_region_tmpalloc( reg, (size_t)r + 1) ); return (char*)aa_mem_region_alloc(reg,(size_t)r + 1); }
char *aa_io_getline( FILE *fin, struct aa_mem_region *reg ) { size_t n = 0; do { int i = fgetc(fin); if( '\n' == i || EOF == i ) { char * str = (char*)aa_mem_region_alloc( reg, n+1 ); str[n] = '\0'; return str; } n++; char *ptr = (char*)aa_mem_region_tmprealloc(reg, n); ptr[n-1] = (char)i; } while(1); }
void *aa_mem_region_local_alloc(size_t size) { return aa_mem_region_alloc( aa_mem_region_local_get(), size ); }
AA_API void *aa_mem_region_dup( aa_mem_region_t *region, const void *p, size_t size ) { void *n = aa_mem_region_alloc(region, size); memcpy( n, p, size ); return n; }
void *aa_mem_region_zalloc( aa_mem_region_t *region, size_t size ) { void *p = aa_mem_region_alloc(region,size); memset(p, 0, size ); return p; }