Mercurial > repos > tabletprog
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/modules/os.tp Thu Jul 24 21:58:26 2014 -0700 @@ -0,0 +1,125 @@ +{ + _constant <- macro: :name { + quote: (llMessage: name withVars: { + uintret <- obj_int32 ptr + } andCode: { + uintret <- make_object: (addr_of: obj_int32_meta) NULL 0 + uintret num!: name + uintret + }) + } + #{ + includeSystemHeader: "sys/stat.h" + includeSystemHeader: "fcntl.h" + includeSystemHeader: "stdlib.h" + includeSystemHeader: "time.h" + includeSystemHeader: "unistd.h" + + llMessage: write withVars: { + str <- string ptr + intret <- obj_int32 ptr + filedes <- obj_int32 ptr + } andCode: :filedes str { + intret <- make_object: (addr_of: obj_int32_meta) NULL 0 + intret num!: (write: (filedes num) (str data) (str bytes)) + intret + } + + llMessage: read withVars: { + str <- string ptr + size <- obj_int32 ptr + filedes <- obj_int32 ptr + } andCode: :filedes size { + str <- make_object: (addr_of: string_meta) NULL 0 + str data!: (GC_MALLOC_ATOMIC: (size num) + 1) + str bytes!: (read: (filedes num) (str data) (size num)) + if: (str bytes) < 0 { + str bytes!: 0 + } + str len!: (str bytes) + (str data) set: (str bytes) 0 + str + } + + llMessage: readFrom:to withVars: { + buffer <- object ptr + bufOpaque <- cpointer ptr + size <- obj_int32 ptr + filedes <- obj_int32 ptr + intret <- obj_int32 ptr + } andCode: :filedes buffer { + bufOpaque <- (mcall: _buf_ptr 1 buffer) castTo: (cpointer ptr) + size <- (mcall: length 1 buffer) castTo: (obj_int32 ptr) + intret <- make_object: (addr_of: obj_int32_meta) NULL 0 + intret num!: (read: (filedes num) (bufOpaque val) (size num)) + intret + } + + open <- :filename flags { + open: filename flags createPerm: 0b110110110 + } + + llMessage: open:createPerm withVars: { + filename <- string ptr + flags <- obj_int32 ptr + perm <- obj_int32 ptr + filedes <- obj_int32 ptr + } andCode: :filename flags :perm { + filedes <- make_object: (addr_of: obj_int32_meta) NULL 0 + filedes num!: (open: (filename data) (flags num) (perm num)) + filedes + } + + llMessage: close withVars: { + filedes <- obj_int32 ptr + intret <- obj_int32 ptr + } andCode: :filedes { + intret <- make_object: (addr_of: obj_int32_meta) NULL 0 + intret num!: (close: (filedes num)) + intret + } + + _constant: O_RDONLY + _constant: O_WRONLY + _constant: O_RDWR + _constant: O_CREAT + _constant: O_APPEND + _constant: O_TRUNC + + llMessage: rand withVars: { + intret <- obj_int32 ptr + } andCode: { + intret <- make_object: (addr_of: obj_int32_meta) NULL 0 + intret num!: (rand: ) + intret + } + + llMessage: srand withVars: { + oseed <- object ptr + seed <- obj_int32 ptr + } andCode: :oseed { + seed <- (mcall: i32 1 oseed) castTo: (obj_int32 ptr) + srand: (seed num) + seed + } + + llMessage: time withVars: { + intret64 <- obj_int64 ptr + } andCode: { + intret64 <- make_object: (addr_of: obj_int64_meta) NULL 0 + intret64 num!: (time: NULL) + intret64 + } + + llMessage: sleep withVars: { + osecs <- object ptr + secs <- obj_int32 ptr + intret <- obj_int32 ptr + } andCode: :osecs { + secs <- (mcall: i32 1 osecs) castTo: (obj_int32 ptr) + intret <- make_object: (addr_of: obj_int32_meta) NULL 0 + intret num!: (sleep: (secs num)) + intret + } + } +}