#include "idris_rts.h" #include "idris_buffer.h" typedef struct { int size; uint8_t data[0]; } Buffer; void* idris_newBuffer(int bytes) { Buffer* buf = malloc(sizeof(Buffer) + bytes*sizeof(uint8_t)); if (buf == NULL) { return NULL; } buf->size = bytes; memset(buf->data, 0, bytes); return buf; } void idris_copyBuffer(void* from, int start, int len, void* to, int loc) { Buffer* bfrom = from; Buffer* bto = to; if (loc >= 0 && loc+len <= bto->size) { memcpy(bto->data + loc, bfrom->data + start, len); } } int idris_getBufferSize(void* buffer) { return ((Buffer*)buffer)->size; } void idris_setBufferByte(void* buffer, int loc, uint8_t byte) { Buffer* b = buffer; if (loc >= 0 && loc < b->size) { b->data[loc] = byte; } } void idris_setBufferInt(void* buffer, int loc, int val) { Buffer* b = buffer; if (loc >= 0 && loc+3 < b->size) { b->data[loc] = val & 0xff; b->data[loc+1] = (val >> 8) & 0xff; b->data[loc+2] = (val >> 16) & 0xff; b->data[loc+3] = (val >> 24) & 0xff; } } void idris_setBufferString(void* buffer, int loc, char* str) { Buffer* b = buffer; int len = strlen(str); if (loc >= 0 && loc+len <= b->size) { memcpy((b->data)+loc, str, len); } } uint8_t idris_getBufferByte(void* buffer, int loc) { Buffer* b = buffer; if (loc >= 0 && loc < b->size) { return b->data[loc]; } else { return 0; } } int idris_getBufferInt(void* buffer, int loc) { Buffer* b = buffer; if (loc >= 0 && loc+3 < b->size) { return b->data[loc] + (b->data[loc+1] << 8) + (b->data[loc+2] << 16) + (b->data[loc+3] << 24); } else { return 0; } } VAL idris_getBufferString(void* buffer, int loc, int len) { Buffer* b = buffer; Closure* cl = allocate(sizeof(Closure) + // Type) + sizeof(char*) + sizeof(char)*(len+1), 0); SETTY(cl, CT_STRING); cl->info.str.str = (char*)cl + sizeof(Closure); if (loc >= 0 && loc+len <= b->size) { memcpy(cl->info.str.str, (b->data)+loc, len); cl->info.str.str[len]='\0'; cl->info.str.len = len; } else { cl->info.str.str[0] = '\0'; cl->info.str.len = 0; } return cl; } int idris_readBuffer(FILE* h, void* buffer, int loc, int max) { Buffer* b = buffer; size_t len; if (loc >= 0 && loc < b->size) { if (loc + max > b->size) { max = b->size - loc; } len = fread((b->data)+loc, sizeof(uint8_t), (size_t)max, h); return len; } else { return 0; } } void idris_writeBuffer(FILE* h, void* buffer, int loc, int len) { Buffer* b = buffer; if (loc >= 0 && loc < b->size) { if (loc + len > b->size) { len = b->size - loc; } fwrite((b->data)+loc, sizeof(uint8_t), len, h); } }