summaryrefslogtreecommitdiff
path: root/chapter25/docs/examples/FileIO.smp
blob: e48d435b0586d002e326c33937e39c748ba94863 (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

// An implementation of
// https://sampleprograms.io/projects/file-input-output/

val FILE = "output.txt";

val main = { u8[~][] args ->
    var str = new sys.aryu8();
    str.addAry("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n");
    str.addAry("Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.\n");
    str.addAry("Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.\n");
    str.addAry("Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n");

    // Create
    i32 fd = sys.io.create(FILE);
    if( fd == -1 ) return _error();
    // Write
    int wrote = sys.io.writeOff(fd,str.buf,0,str.len);
    if( wrote == -1 ) return _error();
    if( wrote != str.len ) return _error2(-2);
    // Close
    if( sys.io.close(fd) != 0 ) return _error();

    // Open
    i32 fd2 = sys.io.open(FILE);
    if( fd2 == -1 ) return _error();
    // Read
    var got = sys.io.read(fd2);
    if( got# != str.len ) return _error2(-3);
    // Close
    if( sys.io.close(fd2) != 0 ) return _error();

    // Check contents are equal
    if( sys.ary.cmp(got,0,str.buf,0,str.len) )
        return _error2(-4);

    // Remove
    if( sys.io.remove(FILE) != 0 ) return _error();

    sys.io.p("File I/O succeeded\n");
    return 0;
};

val _error2 = { i32 errno ->
    sys.io.remove(FILE);
    new sys.aryu8().addAry("Failed with error code ").num(errno).add('\n').write(sys.libc.STDERR);
    sys.libc._exit(errno);
};

val _error = { -> _error2(sys.libc.errno()); };