char* read_file(char* fname){ FILE* f; char* buf = GC_MALLOC_ATOMIC(8192); size_t r; str_list_t* sl = sl_create(); f = fopen(fname, "r"); DFSCH_UNWIND { if (!f){ dfsch_operating_system_error(dfsch_saprintf("Cannot open file %d", fname)); } while (!feof(f)){ r = fread(buf, 1, 8192, f); if (r != 0){ sl_nappend(sl, buf, r); buf = GC_MALLOC_ATOMIC(8192); } else { if (ferror(f)){ dfsch_operating_system_error(dfsch_saprintf("Error reading file %d", fname)); } } } } DFSCH_PROTECT { fclose(f); } DFSCH_PROTECT_END; return sl_value(sl); }
dfsch_strbuf_t* dfsch_port_read_whole(dfsch_object_t* port){ ssize_t ret; char* buf = GC_MALLOC_ATOMIC(1024); str_list_t* sl = sl_create(); while ((ret = dfsch_port_read_buf(port, buf, 1024))){ sl_nappend(sl, buf, ret); buf = GC_MALLOC_ATOMIC(1024); } return sl_value_strbuf(sl); }
static void string_output_port_write_buf(string_output_port_t* port, char*buf, size_t len){ pthread_mutex_lock(port->mutex); sl_nappend(port->list, buf, len); pthread_mutex_unlock(port->mutex); }