summaryrefslogtreecommitdiff
path: root/src/main/smp/sys.smp
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);
        };
    };
};