1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
// Simple I/O Library
// Write byte array to stdout
val p = { u8[~] str -> write(1,str); };
val p_noInline = { u8[~] str -> write(1,str); };
// Return fd contents as a u8[].
val read = { i32 fd ->
var buf = new u8[8*1024];
i64 ptr = buf;
int len = 0;
while( true ) {
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
}
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);
};
|