X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?p=forth.jl.git;a=blobdiff_plain;f=src%2Fforth.jl;h=aa93c2dccaf145a70322a91dee50b4b20db08447;hp=628f3798e70bb78ba74b82d8647eb38504672c43;hb=d7ff8db7577277539dcc447df305cdf44e816d5f;hpb=ab1ea50ecc71a0d472d20eb986d2b49ffb08a37f diff --git a/src/forth.jl b/src/forth.jl index 628f379..aa93c2d 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -604,7 +604,6 @@ end) openFiles = Dict{Int64,IOStream}() nextFileID = 1 -SOURCE_ID, SOURCE_ID_CFA = defNewVar("SOURCE-ID", 0) ## File access modes @@ -666,6 +665,22 @@ CLOSE_FILES_CFA = defPrimWord("CLOSE-FILES", () -> begin end) READ_LINE_CFA = defPrimWord("READ-LINE", () -> begin + fid = popPS() + maxSize = popPS() + addr = popPS() + + fh = openFiles[fid] + line = readline(fh) + + eofFlag = endswith(line, '\n') ? 0 : -1 + line = chomp(line) + + putString(line, addr, maxSize) + + pushPS(length(line)) + pushPS(eofFlag) + pushPS(0) + return NEXT end) @@ -945,6 +960,19 @@ NUMFIB, NUMFIB_CFA = defNewVar("#FIB", 0) TOIN, TOIN_CFA = defNewVar(">IN", 0) +SOURCE_ID, SOURCE_ID_CFA = defNewVar("SOURCE-ID", 0) + +SOURCE_CFA = defPrimWord("SOURCE", () -> begin + if mem[SOURCE_ID] == 0 + pushPS(TIB) + pushPS(NUMTIB) + else + pushPS(FIB) + pushPS(NUMFIB) + end + return NEXT +end) + QUERY_CFA = defWord("QUERY", [TIB_CFA, LIT_CFA, 160, EXPECT_CFA, SPAN_CFA, FETCH_CFA, NUMTIB_CFA, STORE_CFA, @@ -960,13 +988,9 @@ QUERY_FILE_CFA = defWord("QUERY-FILE", WORD_CFA = defPrimWord("WORD", () -> begin delim = popPS() - if mem[SOURCE_ID] == 0 - bufferAddr = TIB - sizeAddr = NUMTIB - else - bufferAddr = FIB - sizeAddr = NUMFIB - end + callPrim(mem[SOURCE_CFA]) + sizeAddr = popPS() + bufferAddr = popPS() # Chew up initial occurrences of delim while (mem[TOIN]