more source changes

master
Daniel Kolesa 2015-08-11 22:57:06 +01:00
parent 6244c5db75
commit aaf4d1581d
1 changed files with 15 additions and 10 deletions

View File

@ -1335,6 +1335,10 @@ struct GenState {
char next_char() { char next_char() {
return *source++; return *source++;
} }
char current() {
return *source;
}
}; };
static inline void compileblock(GenState &gs) { static inline void compileblock(GenState &gs) {
@ -1439,7 +1443,8 @@ static bool compilearg(GenState &gs, int wordtype, int prevargs = MAX_RESULTS, o
static void compilelookup(GenState &gs, int ltype, int prevargs = MAX_RESULTS) { static void compilelookup(GenState &gs, int ltype, int prevargs = MAX_RESULTS) {
ostd::ConstCharRange lookup; ostd::ConstCharRange lookup;
switch (*++gs.source) { gs.next_char();
switch (gs.current()) {
case '(': case '(':
case '[': case '[':
if (!compilearg(gs, VAL_CSTR, prevargs)) goto invalid; if (!compilearg(gs, VAL_CSTR, prevargs)) goto invalid;
@ -1693,7 +1698,7 @@ done:
static bool compileblocksub(GenState &gs, int prevargs) { static bool compileblocksub(GenState &gs, int prevargs) {
ostd::ConstCharRange lookup; ostd::ConstCharRange lookup;
const char *op; const char *op;
switch (*gs.source) { switch (gs.current()) {
case '(': case '(':
if (!compilearg(gs, VAL_CANY, prevargs)) return false; if (!compilearg(gs, VAL_CANY, prevargs)) return false;
break; break;
@ -1706,7 +1711,7 @@ static bool compileblocksub(GenState &gs, int prevargs) {
goto lookupid; goto lookupid;
default: { default: {
op = gs.source; op = gs.source;
while (isalnum(*gs.source) || *gs.source == '_') gs.source++; while (isalnum(gs.current()) || gs.current() == '_') gs.next_char();
lookup = ostd::ConstCharRange(op, gs.source - op); lookup = ostd::ConstCharRange(op, gs.source - op);
if (lookup.empty()) return false; if (lookup.empty()) return false;
lookupid: lookupid:
@ -1747,10 +1752,10 @@ static void compileblockmain(GenState &gs, int wordtype, int prevargs) {
goto done; goto done;
case '\"': case '\"':
gs.source = parsestring(gs.source); gs.source = parsestring(gs.source);
if (*gs.source == '\"') gs.next_char(); if (gs.current() == '\"') gs.next_char();
break; break;
case '/': case '/':
if (*gs.source == '/') gs.source += strcspn(gs.source, "\n\0"); if (gs.current() == '/') gs.source += strcspn(gs.source, "\n\0");
break; break;
case '[': case '[':
brak++; brak++;
@ -1760,7 +1765,7 @@ static void compileblockmain(GenState &gs, int wordtype, int prevargs) {
break; break;
case '@': { case '@': {
const char *esc = gs.source; const char *esc = gs.source;
while (*gs.source == '@') gs.next_char(); while (gs.current() == '@') gs.next_char();
int level = gs.source - (esc - 1); int level = gs.source - (esc - 1);
if (brak > level) continue; if (brak > level) continue;
else if (brak < level) gs.cs.debug_code_line(line, "too many @s"); else if (brak < level) gs.cs.debug_code_line(line, "too many @s");
@ -1848,12 +1853,12 @@ done:
static bool compilearg(GenState &gs, int wordtype, int prevargs, ostd::ConstCharRange &word) { static bool compilearg(GenState &gs, int wordtype, int prevargs, ostd::ConstCharRange &word) {
skipcomments(gs.source); skipcomments(gs.source);
switch (*gs.source) { switch (gs.current()) {
case '\"': case '\"':
switch (wordtype) { switch (wordtype) {
case VAL_POP: case VAL_POP:
gs.source = parsestring(gs.source + 1); gs.source = parsestring(gs.source + 1);
if (*gs.source == '\"') gs.next_char(); if (gs.current() == '\"') gs.next_char();
break; break;
case VAL_COND: { case VAL_COND: {
char *s = cutstring(gs.source); char *s = cutstring(gs.source);
@ -1969,7 +1974,7 @@ static void compilestatements(GenState &gs, int rettype, int brak, int prevargs)
bool more = compilearg(gs, VAL_WORD, prevargs, idname); bool more = compilearg(gs, VAL_WORD, prevargs, idname);
if (!more) goto endstatement; if (!more) goto endstatement;
skipcomments(gs.source); skipcomments(gs.source);
if (gs.source[0] == '=') switch (gs.source[1]) { if (gs.current() == '=') switch (gs.source[1]) {
case '/': case '/':
if (gs.source[2] != '/') break; if (gs.source[2] != '/') break;
case ';': case ';':
@ -2296,7 +2301,7 @@ endstatement:
break; break;
case '/': case '/':
if (*gs.source == '/') gs.source += strcspn(gs.source, "\n\0"); if (gs.current() == '/') gs.source += strcspn(gs.source, "\n\0");
goto endstatement; goto endstatement;
} }
} }