diff options
Diffstat (limited to 'chapter25/src/main/smp/sys/io.smp')
| -rw-r--r-- | chapter25/src/main/smp/sys/io.smp | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/chapter25/src/main/smp/sys/io.smp b/chapter25/src/main/smp/sys/io.smp index b94e89fa..3d6be512 100644 --- a/chapter25/src/main/smp/sys/io.smp +++ b/chapter25/src/main/smp/sys/io.smp @@ -3,30 +3,63 @@ // Simple I/O Library // Write byte array to stdout -val p = { u8[~] str -> - i64 ptr = str; // cast array base to i64 - return libc.write(1,ptr,str#); -}; - -val p_noInline = { u8[~] str -> - i64 ptr = str; // cast array base to i64 - return libc.write(1,ptr,str#); -}; +val p = { u8[~] str -> write(1,str); }; +val p_noInline = { u8[~] str -> write(1,str); }; -// Return stdin as a u8[]. -val stdin = { -> +// Return fd contents as a u8[]. +val read = { i32 fd -> var buf = new u8[8*1024]; i64 ptr = buf; int len = 0; while( true ) { - int rez = libc.read(0,ptr,buf#); - if( rez < 0 ) libc._exit(libc.errno); + i32 rez = libc.read(fd,ptr,buf#); + if( rez > buf# ) libc._exit(libc.errno); len += rez; if( rez < buf# ) break; libc._exit(-2); // Need to implement for more than 8K input } - // Compress - var dst = new u8[len]; - return Ary.copy(dst,0,buf,0,len); + var out = new u8[len]; + ary.copy(out,0,buf,0,len); +}; + +// Write all of str to fd. +val write = { i32 fd, u8[~] str -> + i64 ptr = str; // Convert array pointer to a i64 for the native call + libc.write(fd,ptr,str#); +}; + +// Write all of str to fd. +val writeOff = { i32 fd, u8[~] str, u32 off, u32 len -> + i64 ptr = str; // Convert array pointer to a i64 for the native call + ptr += off; // Skip offset + // Cap at available length + if( len > str# - off ) len = str# - off; + // Do the write + libc.write(fd,ptr,len); +}; + +// Return stdin as a u8[]. +val stdin = { -> read(0); }; + +// Create file for writing. Return fd, or -1 and errno has the error code +val create = { u8[~] str -> + i64 ptr = sys.aryu8.str0(str); + i32 perms = 6*64 + 6*8 + 6; // 0666 + return libc.creat(ptr, perms); +}; + +// Open file for reading. Return fd, or -1 and errno has the error code +val open = { u8[~] str -> + i64 ptr = sys.aryu8.str0(str); + return libc.open(ptr, sys.libc.O_RDONLY, 0); +}; + +// Close an open fd. Return 0, or -1 and errno has the error code +val close = { i32 fd -> return libc.close(fd); }; + +// Remove a file. Return 0, or -1 and errno has the error code +val remove = { u8[~] str -> + i64 ptr = sys.aryu8.str0(str); + return libc.unlink(ptr); }; |
