aboutsummaryrefslogtreecommitdiffstats
path: root/source/parse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/parse.cpp')
-rw-r--r--source/parse.cpp44
1 files changed, 19 insertions, 25 deletions
diff --git a/source/parse.cpp b/source/parse.cpp
index 97ae4fe..27c514d 100644
--- a/source/parse.cpp
+++ b/source/parse.cpp
@@ -57,35 +57,27 @@ static Error parseword(const char *start, const char *end)
static Error parseSource()
{
auto result = Error::none;
- char *start = nullptr;
- char *end;
- char *s;
-
- while (result == Error::none && haskey()) {
- s = (char *)DICT[DIdxSource];
-
- ++DICT[DIdxSource];
- --DICT[DIdxSrcLen];
-
- if (isspace(*s)) {
- if (start) {
- result = parseword(start, end + 1);
- start = nullptr;
- }
- } else {
- if (!start) {
- start = s;
- end = start;
+ char *start = (char *)DICT[DIdxSource];
+ char *end = start;
+ auto& i = *((char *)&DICT[DIdxInBuf]);
+
+ while (result == Error::none && i < DICT[DIdxSrcLen]) {
+ if (isspace(*end) || *end == '\0') {
+ if (end - start < 1) {
+ start = ++end;
+ ++i;
} else {
- ++end;
+ ++i; // discard the space
+ result = parseword(start, end);
+ start = (char *)DICT[DIdxSource] + i;
+ end = start;
}
+ } else {
+ ++end;
+ ++i;
}
}
- // Parse the final word if it is non-empty.
- if (start)
- result = parseword(start, s + 1);
-
return result;
}
@@ -93,9 +85,11 @@ static Error parseSource()
Error parse()
{
// Reset source buffer and try to fill it with getinput().
- DICT[DIdxSource] = (Cell)&DICT[DIdxBegin];
+ DICT[DIdxSource] = (Cell)&DICT[DIdxInBuf] + 1;
DICT[DIdxSrcLen] = 0;
+ *((char *)&DICT[DIdxInBuf]) = 0;
getinput();
+ addkey('\0');
return parseSource();
}