1
0
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:
David Schmenk 2023-12-13 10:31:50 -08:00
parent 929678269f
commit 9a7593fafe

View File

@ -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