+TIB_CFA = defConst("TIB", TIB)
+NUMTIB, NUMTIB_CFA = defNewVar("#TIB", 0)
+
+FIB_CFA = defConst("FIB", TIB)
+NUMFIB, NUMFIB_CFA = defNewVar("#FIB", 0)
+
+TOIN, TOIN_CFA = defNewVar(">IN", 0)
+
+QUERY_CFA = defWord("QUERY",
+ [TIB_CFA, LIT_CFA, 160, EXPECT_CFA,
+ SPAN_CFA, FETCH_CFA, NUMTIB_CFA, STORE_CFA,
+ LIT_CFA, 0, TOIN_CFA, STORE_CFA,
+ EXIT_CFA])
+
+QUERY_FILE_CFA = defWord("QUERY-FILE",
+ [FIB_CFA, LIT_CFA, 160, ROT_CFA, READ_LINE_CFA,
+ DROP_CFA, SWAP_CFA,
+ NUMFIB_CFA, STORE_CFA,
+ EXIT_CFA])
+
+WORD_CFA = defPrimWord("WORD", () -> begin
+ delim = popPS()
+
+ if mem[SOURCE_ID] == 0
+ bufferAddr = TIB
+ sizeAddr = NUMTIB
+ else
+ bufferAddr = FIB
+ sizeAddr = NUMFIB
+ end
+
+ # Chew up initial occurrences of delim
+ while (mem[TOIN]<mem[sizeAddr] && mem[bufferAddr+mem[TOIN]] == delim)
+ mem[TOIN] += 1
+ end
+
+ countAddr = mem[H]
+ addr = mem[H]+1
+
+ # Start reading in word
+ count = 0
+ while (mem[TOIN]<mem[sizeAddr])
+ mem[addr] = mem[bufferAddr+mem[TOIN]]
+ mem[TOIN] += 1
+
+ if (mem[addr] == delim)
+ break
+ end
+
+ count += 1
+ addr += 1
+ end
+
+ # Record count
+ mem[countAddr] = count
+ pushPS(countAddr)