mirror of
https://github.com/nineties/planckforth
synced 2025-01-13 08:01:10 +01:00
read-file and write-file worked
This commit is contained in:
parent
11f8e6fb9f
commit
56eb6c7586
3 changed files with 64 additions and 8 deletions
|
@ -2011,12 +2011,12 @@ need-defined (read-file)
|
||||||
tuck file>name !
|
tuck file>name !
|
||||||
['] (read-file) over file>read-file !
|
['] (read-file) over file>read-file !
|
||||||
['] (write-file) over file>write-file !
|
['] (write-file) over file>write-file !
|
||||||
|
success
|
||||||
;
|
;
|
||||||
|
|
||||||
: close-file ( file -- e )
|
: close-file ( file -- e )
|
||||||
file>obj (close-file) throw
|
file>obj (close-file) throw
|
||||||
|
success
|
||||||
;
|
;
|
||||||
|
|
||||||
s" bootstrap.fs" R/O open-file
|
|
||||||
|
|
||||||
." Ready" cr
|
." Ready" cr
|
||||||
|
|
|
@ -157,18 +157,42 @@ defbinary("|", or, |, uintptr_t)
|
||||||
defbinary("^", xor, ^, uintptr_t)
|
defbinary("^", xor, ^, uintptr_t)
|
||||||
defbinary("<", lt, <, intptr_t)
|
defbinary("<", lt, <, intptr_t)
|
||||||
defbinary("=", eq, ==, intptr_t)
|
defbinary("=", eq, ==, intptr_t)
|
||||||
|
|
||||||
|
/* File IO */
|
||||||
|
#define SUCCESS 0
|
||||||
|
#define CLOSE_FILE_ERROR -62
|
||||||
|
#define OPEN_FILE_ERROR -69
|
||||||
|
#define READ_FILE_ERROR -70
|
||||||
|
#define WRITE_FILE_ERROR -75
|
||||||
defcode("(open-file)", openfile) {
|
defcode("(open-file)", openfile) {
|
||||||
int flags = pop();
|
int flags = pop();
|
||||||
char *name = (char*) pop();
|
char *name = (char*) pop();
|
||||||
int fd = open(name, flags);
|
int fd = open(name, flags);
|
||||||
push(fd);
|
push(fd);
|
||||||
push(fd >= 0);
|
push((fd >= 0) ? SUCCESS : OPEN_FILE_ERROR);
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
defcode("(close-file)", closefile) {
|
defcode("(close-file)", closefile) {
|
||||||
int fd = pop();
|
int fd = pop();
|
||||||
int r = close(fd);
|
int r = close(fd);
|
||||||
push(r >= 0);
|
push((r >= 0) ? SUCCESS : CLOSE_FILE_ERROR);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
defcode("(read-file)", readfile) {
|
||||||
|
int fd = pop();
|
||||||
|
int size = pop();
|
||||||
|
char *buf = (char*) pop();
|
||||||
|
int r = read(fd, buf, size);
|
||||||
|
push(r);
|
||||||
|
push((r >= 0) ? SUCCESS : READ_FILE_ERROR);
|
||||||
|
next();
|
||||||
|
}
|
||||||
|
defcode("(write-file)", writefile) {
|
||||||
|
int fd = pop();
|
||||||
|
int size = pop();
|
||||||
|
char *buf = (char*) pop();
|
||||||
|
int r = write(fd, buf, size);
|
||||||
|
push((r == size) ? SUCCESS : WRITE_FILE_ERROR);
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -38,14 +38,12 @@ def comma(v):
|
||||||
write(HERE_CELL, here + 4)
|
write(HERE_CELL, here + 4)
|
||||||
|
|
||||||
def read_byte(addr):
|
def read_byte(addr):
|
||||||
#return memory[addr]
|
|
||||||
i = addr>>2
|
i = addr>>2
|
||||||
m = (addr&0x3)*8
|
m = (addr&0x3)*8
|
||||||
v = memory[i]
|
v = memory[i]
|
||||||
return (v >> m) & 0xff
|
return (v >> m) & 0xff
|
||||||
|
|
||||||
def write_byte(addr, c):
|
def write_byte(addr, c):
|
||||||
#memory[addr] = v
|
|
||||||
i = addr>>2
|
i = addr>>2
|
||||||
m = (addr&0x3)*8
|
m = (addr&0x3)*8
|
||||||
v = memory[i]
|
v = memory[i]
|
||||||
|
@ -61,6 +59,11 @@ def comma_string(s):
|
||||||
comma_byte(ord(c))
|
comma_byte(ord(c))
|
||||||
comma_byte(0)
|
comma_byte(0)
|
||||||
|
|
||||||
|
def write_string(addr, s):
|
||||||
|
for c in s:
|
||||||
|
write_byte(addr, c)
|
||||||
|
addr += 1
|
||||||
|
|
||||||
def read_string(addr):
|
def read_string(addr):
|
||||||
s = ""
|
s = ""
|
||||||
while True:
|
while True:
|
||||||
|
@ -70,6 +73,13 @@ def read_string(addr):
|
||||||
addr += 1
|
addr += 1
|
||||||
return s
|
return s
|
||||||
|
|
||||||
|
def read_bytes(addr, n):
|
||||||
|
data = []
|
||||||
|
for i in range(n):
|
||||||
|
data.append(read_byte(addr))
|
||||||
|
addr += 1
|
||||||
|
return bytes(data)
|
||||||
|
|
||||||
def find(c):
|
def find(c):
|
||||||
it = read(LATEST_CELL)
|
it = read(LATEST_CELL)
|
||||||
while it != 0:
|
while it != 0:
|
||||||
|
@ -207,18 +217,40 @@ def argv():
|
||||||
push(ARGV_ADDR)
|
push(ARGV_ADDR)
|
||||||
push(len(sys.argv))
|
push(len(sys.argv))
|
||||||
add_simple_operator('v', argv)
|
add_simple_operator('v', argv)
|
||||||
|
|
||||||
|
SUCCESS = 0
|
||||||
|
CLOSE_FILE_ERROR = -62
|
||||||
|
OPEN_FILE_ERROR = -69
|
||||||
|
READ_FILE_ERROR = -70
|
||||||
|
WRITE_FILE_ERROR = -75
|
||||||
def openfile():
|
def openfile():
|
||||||
flag = pop()
|
flag = pop()
|
||||||
name = read_string(pop())
|
name = read_string(pop())
|
||||||
fd = os.open(name, flag)
|
fd = os.open(name, flag)
|
||||||
push(fd)
|
push(fd)
|
||||||
push(fd >= 0)
|
push(SUCCESS if (fd >= 0) else OPEN_FILE_ERROR)
|
||||||
def closefile():
|
def closefile():
|
||||||
fd = pop()
|
fd = pop()
|
||||||
os.close(fd)
|
os.close(fd)
|
||||||
push(fd >= 0)
|
push(SUCCESS if (fd >= 0) else CLOSE_FILE_ERROR)
|
||||||
|
def readfile():
|
||||||
|
fd = pop()
|
||||||
|
size = pop()
|
||||||
|
addr = pop()
|
||||||
|
s = os.read(fd, size)
|
||||||
|
write_string(addr, s)
|
||||||
|
push(len(s))
|
||||||
|
push(SUCCESS if (len(s) > 0) else READ_FILE_ERROR)
|
||||||
|
def writefile():
|
||||||
|
fd = pop()
|
||||||
|
size = pop()
|
||||||
|
addr = pop()
|
||||||
|
n = os.write(fd, read_bytes(addr, size))
|
||||||
|
push(SUCCESS if (n == size) else WRITE_FILE_ERROR)
|
||||||
add_simple_operator('(open-file)', openfile)
|
add_simple_operator('(open-file)', openfile)
|
||||||
add_simple_operator('(close-file)', closefile)
|
add_simple_operator('(close-file)', closefile)
|
||||||
|
add_simple_operator('(write-file)', writefile)
|
||||||
|
add_simple_operator('(read-file)', readfile)
|
||||||
|
|
||||||
start = read(HERE_CELL)
|
start = read(HERE_CELL)
|
||||||
comma(find('k'))
|
comma(find('k'))
|
||||||
|
|
Loading…
Reference in a new issue