summaryrefslogtreecommitdiff
path: root/chapter25/src/main/smp/sys/io.smp
diff options
context:
space:
mode:
Diffstat (limited to 'chapter25/src/main/smp/sys/io.smp')
-rw-r--r--chapter25/src/main/smp/sys/io.smp65
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);
};