mirror of
https://github.com/dschmenk/PLASMA.git
synced 2025-02-22 15:29:01 +00:00
proper input line processing
This commit is contained in:
parent
929678269f
commit
9a7593fafe
@ -14,37 +14,41 @@ include "inc/cmdsys.plh"
|
|||||||
//
|
//
|
||||||
// Predefine instrinsics
|
// Predefine instrinsics
|
||||||
//
|
//
|
||||||
predef _drop_(a)#0, _add_(a,b)#1, _vlist_#0
|
predef _drop_(a)#0, _swap_(a,b)#2
|
||||||
predef _exit_#0
|
predef _add_(a,b)#1, _sub_(a,b)#1, _mul_(a,b)#1, _div_(a,b)#1
|
||||||
//
|
predef _vlist_#0, _exit_#0
|
||||||
// DROP
|
// DROP
|
||||||
//
|
|
||||||
char d_drop = "drop"
|
char d_drop = "drop"
|
||||||
word = 0, @_drop_, 0
|
word = 0, @_drop_, 0
|
||||||
//
|
// SWAP
|
||||||
|
char d_swap = "swap"
|
||||||
|
word = @d_drop, @_swap_
|
||||||
// ADD
|
// ADD
|
||||||
//
|
|
||||||
char d_add = "+"
|
char d_add = "+"
|
||||||
word = @d_drop, @_add_, 0
|
word = @d_swap, @_add_
|
||||||
//
|
// SUB
|
||||||
|
char d_sub = "-"
|
||||||
|
word = @d_add, @_sub_
|
||||||
|
// MUL
|
||||||
|
char d_mul = "*"
|
||||||
|
word = @d_sub, @_mul_
|
||||||
|
// DIV
|
||||||
|
char d_div = "/"
|
||||||
|
word = @d_mul, @_div_
|
||||||
// PRINT TOS
|
// PRINT TOS
|
||||||
//
|
|
||||||
char d_prtos = "."
|
char d_prtos = "."
|
||||||
word = @d_add, @puti, 0
|
word = @d_div, @puti
|
||||||
//
|
// EXIT
|
||||||
// EXIT FORTH
|
|
||||||
//
|
|
||||||
char d_exit = "exit"
|
char d_exit = "exit"
|
||||||
word = @d_prtos, @_exit_, 0
|
word = @d_prtos, @_exit_
|
||||||
//
|
// LIST VOCAB
|
||||||
// List vocabulary
|
|
||||||
//
|
|
||||||
char d_vlist = "vlist"
|
char d_vlist = "vlist"
|
||||||
word = @d_exit, @_vlist_, 0
|
word = @d_exit, @_vlist_
|
||||||
//
|
//
|
||||||
// Vocabulary
|
// Internal variables
|
||||||
//
|
//
|
||||||
word vocab=@d_vlist
|
word vocab=@d_vlist
|
||||||
|
word inptr
|
||||||
char exit = 0
|
char exit = 0
|
||||||
//
|
//
|
||||||
// Intrinsics
|
// Intrinsics
|
||||||
@ -52,9 +56,21 @@ char exit = 0
|
|||||||
def _drop_(a)#0
|
def _drop_(a)#0
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
def _swap_(a,b)#2
|
||||||
|
return b,a
|
||||||
|
end
|
||||||
def _add_(a,b)#1
|
def _add_(a,b)#1
|
||||||
return a+b
|
return a+b
|
||||||
end
|
end
|
||||||
|
def _sub_(a,b)#1
|
||||||
|
return a-b
|
||||||
|
end
|
||||||
|
def _mul_(a,b)#1
|
||||||
|
return a*b
|
||||||
|
end
|
||||||
|
def _div_(a,b)#1
|
||||||
|
return a/b
|
||||||
|
end
|
||||||
def _exit_#0
|
def _exit_#0
|
||||||
exit = 1
|
exit = 1
|
||||||
end
|
end
|
||||||
@ -70,26 +86,27 @@ end
|
|||||||
//
|
//
|
||||||
// Find match in vocabulary
|
// Find match in vocabulary
|
||||||
//
|
//
|
||||||
def find(name)#1
|
def find#1
|
||||||
word v
|
word v
|
||||||
byte len
|
byte len
|
||||||
|
|
||||||
name--
|
inptr--
|
||||||
v = vocab
|
v = vocab
|
||||||
while v
|
while v
|
||||||
for len = 1 to ^v
|
for len = 1 to ^v
|
||||||
putc(^(name+len)); putc('='); putc(^(v+len))
|
if ^(inptr+len) <> ^(v+len)
|
||||||
if ^(name+len) <> ^(v+len)
|
|
||||||
putln
|
|
||||||
break
|
break
|
||||||
fin
|
fin
|
||||||
next
|
next
|
||||||
if len > ^v and ^(name+len) <= ' '
|
if len > ^v and ^(inptr+len) <= ' '
|
||||||
puts("[Found name = "); puts(v); puts("]\n")
|
//puts("[Found name = "); puts(v); puts("]\n")
|
||||||
|
inptr = inptr + len
|
||||||
return v + ^v + 3
|
return v + ^v + 3
|
||||||
fin
|
fin
|
||||||
v = *(v + ^v + 1)
|
v = *(v + ^v + 1)
|
||||||
loop
|
loop
|
||||||
|
// Not found
|
||||||
|
inptr++
|
||||||
return 0
|
return 0
|
||||||
end
|
end
|
||||||
//
|
//
|
||||||
@ -104,20 +121,24 @@ end
|
|||||||
//
|
//
|
||||||
// Convert input into number
|
// Convert input into number
|
||||||
//
|
//
|
||||||
def isnum(inbuf)#2
|
def isnum#2
|
||||||
word num
|
word num, sign
|
||||||
|
|
||||||
|
sign = 1
|
||||||
if ^inbuf >= '0' and ^inbuf <= '9'
|
if ^inptr == '-'
|
||||||
num = 0
|
sign = -1
|
||||||
while ^inbuf >= '0' and ^inbuf <= '9'
|
inptr++
|
||||||
num = num * 10 + ^inbuf - '0'
|
|
||||||
putc(^inbuf); inbuf++
|
|
||||||
loop
|
|
||||||
if ^inbuf <= ' '
|
|
||||||
puts("[Found number = "); puti(num); puts("]\n")
|
|
||||||
fin
|
fin
|
||||||
return num, inbuf <= ' '
|
if ^inptr >= '0' and ^inptr <= '9'
|
||||||
|
num = 0
|
||||||
|
repeat
|
||||||
|
num = num * 10 + ^inptr - '0'
|
||||||
|
inptr++
|
||||||
|
until ^inptr < '0' or ^inptr > '9'
|
||||||
|
//if ^inptr <= ' '
|
||||||
|
// puts("[Found number = "); puti(num); puts("]\n")
|
||||||
|
//fin
|
||||||
|
return num * sign, ^inptr <= ' '
|
||||||
fin
|
fin
|
||||||
return 0, FALSE
|
return 0, FALSE
|
||||||
end
|
end
|
||||||
@ -125,34 +146,36 @@ end
|
|||||||
// Quit and look for user input
|
// Quit and look for user input
|
||||||
//
|
//
|
||||||
def _quit_#0
|
def _quit_#0
|
||||||
word instr, cfa, __drop, __isnum
|
word cfa, __drop, __isnum
|
||||||
|
|
||||||
__drop = @_drop_
|
__drop = @_drop_
|
||||||
__isnum = @isnum
|
__isnum = @isnum
|
||||||
repeat
|
repeat
|
||||||
puts("OK")
|
puts("\nOK")
|
||||||
instr = gets(':'|$80)
|
inptr = gets(':'|$80)
|
||||||
if ^instr
|
if ^inptr
|
||||||
^(instr + ^instr + 1) = 0
|
^(inptr + ^inptr + 1) = 0
|
||||||
//
|
//
|
||||||
// Clear high bit of input buffer
|
// Clear high bit of input buffer
|
||||||
//
|
//
|
||||||
for cfa = 1 to ^instr
|
for cfa = 1 to ^inptr
|
||||||
^(instr + cfa) = ^(instr + cfa) & $7F
|
^(inptr + cfa) = ^(inptr + cfa) & $7F
|
||||||
next
|
next
|
||||||
instr++
|
inptr++
|
||||||
while ^instr == ' '
|
repeat
|
||||||
instr++
|
while ^inptr == ' '
|
||||||
|
inptr++
|
||||||
loop
|
loop
|
||||||
if ^instr > ' '
|
if ^inptr > ' '
|
||||||
cfa = find(instr)
|
cfa = find
|
||||||
if cfa
|
if cfa
|
||||||
(*cfa)()#0 //exec(*cfa)
|
(*cfa)()#0 //exec(*cfa)
|
||||||
elsif not __isnum(instr)#1
|
elsif not __isnum()#1
|
||||||
__drop()#0
|
__drop()#0
|
||||||
puts("? No match\n")
|
puts("? No match\n")
|
||||||
fin
|
fin
|
||||||
fin
|
fin
|
||||||
|
until ^inptr < ' '
|
||||||
fin
|
fin
|
||||||
until exit
|
until exit
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user