naRef naInit_io(naContext c) { naRef ns = naGenLib(c, funcs); naAddSym(c, ns, "SEEK_SET", naNum(SEEK_SET)); naAddSym(c, ns, "SEEK_CUR", naNum(SEEK_CUR)); naAddSym(c, ns, "SEEK_END", naNum(SEEK_END)); naAddSym(c, ns, "stdin", naIOGhost(c, stdin)); naAddSym(c, ns, "stdout", naIOGhost(c, stdout)); naAddSym(c, ns, "stderr", naIOGhost(c, stderr)); return ns; }
static naRef dofld(naContext c, int argc, naRef* args, int sign) { naRef s = argc > 0 ? args[0] : naNil(); int bit = argc > 1 ? (int)naNumValue(args[1]).num : -1; int len = argc > 2 ? (int)naNumValue(args[2]).num : -1; unsigned int f; if(!naIsString(s) || !MUTABLE(args[0]) || bit < 0 || len < 0) naRuntimeError(c, "missing/bad argument to fld/sfld"); f = fld(c, (void*)naStr_data(s), naStr_len(s), bit, len); if(!sign) return naNum(f); if(f & (1 << (len-1))) f |= ~((1<<len)-1); // sign extend return naNum((signed int)f); }
static naRef f_tell(naContext c, naRef me, int argc, naRef* args) { struct naIOGhost* g = argc==1 ? ioghost(args[0]) : 0; if(!g) naRuntimeError(c, "bad argument to tell()"); return naNum(g->type->tell(c, g->handle)); }
static naRef f_write(naContext c, naRef me, int argc, naRef* args) { struct naIOGhost* g = argc > 0 ? ioghost(args[0]) : 0; naRef str = argc > 1 ? args[1] : naNil(); if(!g || !IS_STR(str)) naRuntimeError(c, "bad argument to write()"); return naNum(g->type->write(c, g->handle, naStr_data(str), naStr_len(str))); }
static naRef f_read(naContext c, naRef me, int argc, naRef* args) { struct naIOGhost* g = argc > 0 ? ioghost(args[0]) : 0; naRef str = argc > 1 ? args[1] : naNil(); naRef len = argc > 2 ? naNumValue(args[2]) : naNil(); if(!g || !MUTABLE(str) || !IS_NUM(len)) naRuntimeError(c, "bad argument to read()"); if(naStr_len(str) < (int)len.num) naRuntimeError(c, "string not big enough for read"); return naNum(g->type->read(c, g->handle, naStr_data(str), (int)len.num)); }