comparison modules/os.tp @ 294:d1dc2d70bdfd

Move OS module out of backend Javascript into a proper module file. Add normal bytearray to bytearray module. Add read:to method to os module for reading into a bytearray.
author Michael Pavone <pavone@retrodev.com>
date Thu, 24 Jul 2014 21:58:26 -0700
parents
children f987bb2a1911
comparison
equal deleted inserted replaced
293:2b045d5b673b 294:d1dc2d70bdfd
1 {
2 _constant <- macro: :name {
3 quote: (llMessage: name withVars: {
4 uintret <- obj_int32 ptr
5 } andCode: {
6 uintret <- make_object: (addr_of: obj_int32_meta) NULL 0
7 uintret num!: name
8 uintret
9 })
10 }
11 #{
12 includeSystemHeader: "sys/stat.h"
13 includeSystemHeader: "fcntl.h"
14 includeSystemHeader: "stdlib.h"
15 includeSystemHeader: "time.h"
16 includeSystemHeader: "unistd.h"
17
18 llMessage: write withVars: {
19 str <- string ptr
20 intret <- obj_int32 ptr
21 filedes <- obj_int32 ptr
22 } andCode: :filedes str {
23 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
24 intret num!: (write: (filedes num) (str data) (str bytes))
25 intret
26 }
27
28 llMessage: read withVars: {
29 str <- string ptr
30 size <- obj_int32 ptr
31 filedes <- obj_int32 ptr
32 } andCode: :filedes size {
33 str <- make_object: (addr_of: string_meta) NULL 0
34 str data!: (GC_MALLOC_ATOMIC: (size num) + 1)
35 str bytes!: (read: (filedes num) (str data) (size num))
36 if: (str bytes) < 0 {
37 str bytes!: 0
38 }
39 str len!: (str bytes)
40 (str data) set: (str bytes) 0
41 str
42 }
43
44 llMessage: readFrom:to withVars: {
45 buffer <- object ptr
46 bufOpaque <- cpointer ptr
47 size <- obj_int32 ptr
48 filedes <- obj_int32 ptr
49 intret <- obj_int32 ptr
50 } andCode: :filedes buffer {
51 bufOpaque <- (mcall: _buf_ptr 1 buffer) castTo: (cpointer ptr)
52 size <- (mcall: length 1 buffer) castTo: (obj_int32 ptr)
53 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
54 intret num!: (read: (filedes num) (bufOpaque val) (size num))
55 intret
56 }
57
58 open <- :filename flags {
59 open: filename flags createPerm: 0b110110110
60 }
61
62 llMessage: open:createPerm withVars: {
63 filename <- string ptr
64 flags <- obj_int32 ptr
65 perm <- obj_int32 ptr
66 filedes <- obj_int32 ptr
67 } andCode: :filename flags :perm {
68 filedes <- make_object: (addr_of: obj_int32_meta) NULL 0
69 filedes num!: (open: (filename data) (flags num) (perm num))
70 filedes
71 }
72
73 llMessage: close withVars: {
74 filedes <- obj_int32 ptr
75 intret <- obj_int32 ptr
76 } andCode: :filedes {
77 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
78 intret num!: (close: (filedes num))
79 intret
80 }
81
82 _constant: O_RDONLY
83 _constant: O_WRONLY
84 _constant: O_RDWR
85 _constant: O_CREAT
86 _constant: O_APPEND
87 _constant: O_TRUNC
88
89 llMessage: rand withVars: {
90 intret <- obj_int32 ptr
91 } andCode: {
92 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
93 intret num!: (rand: )
94 intret
95 }
96
97 llMessage: srand withVars: {
98 oseed <- object ptr
99 seed <- obj_int32 ptr
100 } andCode: :oseed {
101 seed <- (mcall: i32 1 oseed) castTo: (obj_int32 ptr)
102 srand: (seed num)
103 seed
104 }
105
106 llMessage: time withVars: {
107 intret64 <- obj_int64 ptr
108 } andCode: {
109 intret64 <- make_object: (addr_of: obj_int64_meta) NULL 0
110 intret64 num!: (time: NULL)
111 intret64
112 }
113
114 llMessage: sleep withVars: {
115 osecs <- object ptr
116 secs <- obj_int32 ptr
117 intret <- obj_int32 ptr
118 } andCode: :osecs {
119 secs <- (mcall: i32 1 osecs) castTo: (obj_int32 ptr)
120 intret <- make_object: (addr_of: obj_int32_meta) NULL 0
121 intret num!: (sleep: (secs num))
122 intret
123 }
124 }
125 }