blob: ede08d631fc67751b317b51dfe02f07a9d50dc24 (
plain)
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
|
// -*- mode: java; -*-
// top-level default import
struct sys {
// libc bindings
/** https://www.man7.org/linux/man-pages/man2/<libc call>.2.html */
struct libc {
i32 errno = "C";
// fd buf len -> len
{ i32 i64 u32 -> u32 } write = "C";
// fd buf len -> len
{ i32 i64 u32 -> u32 } read = "C";
// status
{ i32 -> i32 } _exit = "C";
// addr len prot flags fd off -> void*
{ i64 i64 i32 i32 i32 i32 -> i64 } mmap = "C";
// mmap flags
i32 PROT_EXEC = 4;
i32 PROT_READ = 1;
i32 PROT_WRITE= 2;
i32 PROT_NONE = 0;
i32 MAP_PRIVATE = 2;
i32 MAP_ANON = 32;
};
struct ary {
val copy = { u8[] dst, int doff, u8[~] src, int soff, int len ->
for( int i=0; i<len; i++ )
dst[i+doff] = src[i+soff];
return dst;
};
};
struct io {
// Print string to stdout
val p = { u8[~] str ->
i64 ptr = str; // cast array base to i64
return sys.libc.write(1,ptr,str#);
};
// Return stdin as a u8[]
val stdin = { ->
var buf = new u8[8*1024];
i64 ptr = buf;
int len = 0;
while( true ) {
int rez = sys.libc.read(0,ptr,buf#);
if( rez < 0 ) sys.libc._exit(sys.libc.errno);
len += rez;
if( rez < buf# )
break;
sys.libc._exit(-2); // Need to implement
}
// Compress
var dst = new u8[len];
return sys.ary.copy(dst,0,buf,0,len);
};
};
};
|