static int ioread(naContext c, void* f, char* buf, unsigned int len) { int n; naModUnlock(); n = fread(buf, 1, len, f); naModLock(); if(n < len && !feof((FILE*)f)) naRuntimeError(c, strerror(errno)); return n; }
static int iowrite(naContext c, void* f, char* buf, unsigned int len) { int n; naModUnlock(); n = fwrite(buf, 1, len, f); naModLock(); if(ferror((FILE*)f)) naRuntimeError(c, strerror(errno)); return n; }
static naRef f_semdown(naContext c, naRef me, int argc, naRef* args) { if(argc > 0 && naGhost_type(args[0]) == &SemType) { naModUnlock(); naSemDown(naGhost_ptr(args[0])); naModLock(); } return naNil(); }
// frees buffer before tossing an error static int getcguard(naContext ctx, FILE* f, void* buf) { int c; naModUnlock(); c = fgetc(f); naModLock(); if(ferror(f)) { naFree(buf); naRuntimeError(ctx, strerror(errno)); } return c; }