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