#include enum aplwc_rc aplwc_new(struct aplwc **p, uint8_t *data, size_t size) { struct memory m; m = memory_init(data, size); *p = memory_alloc_aplwc(&m); if(*p == NULL) return APLWC_OUT_OF_MEMORY; (*p)->memory = m; return APLWC_OK; } enum aplwc_rc aplwc_destroy(struct aplwc *p) { if(p) memory_free_aplwc(&p->memory, p); return APLWC_OK; } const char * aplwc_errstr_rc(enum aplwc_rc rc) { switch(rc){ case APLWC_OK: return ""; case APLWC_OUT_OF_MEMORY: return "Out of memory"; default: return "(unable to produce error string)"; } } const char * aplwc_errstr(struct aplwc *aplwc) { enum { BUF_SIZE = 256 }; static char buf[BUF_SIZE]; const char *err, *msg; enum aplwc_rc rc; char *p; size_t len, i; buf[0] = 0; p = buf; err = msg = NULL; if(aplwc){ msg = aplwc->last_error_msg; rc = aplwc->last_error; }else{ rc = APLWC_RC_LAST+1; } err = aplwc_errstr_rc(rc); for(i = 0, len = strlen(err); (i <= len) && (((p+i)-buf) < (BUF_SIZE-1)); i++) p[i] = err[i]; p += i; if(msg){ if(((buf-p)+2) < BUF_SIZE){ *(p++) = ':'; *(p++) = ' '; } for(i = 0, len = strlen(msg); (i <= len) && (((p+i)-buf) < (BUF_SIZE-1)); i++) p[i] = msg[i]; p += i; *p = 0; } return buf; }