int picolGetToken(picolInterp *i, picolParser *p) { int rc; while(1) { if (!p->len) { if (p->type != PT_EOL && p->type != PT_EOF) p->type = PT_EOL; else p->type = PT_EOF; return PICOL_OK; } switch(*p->p) { case ' ': case '\t': if (p->insidequote) return picolParseString(p); else return picolParseSep(p); case '\n': case '\r': case ';': if (p->insidequote) return picolParseString(p); else return picolParseEol(p); case '[': rc = picolParseCmd(p); if(rc == PICOL_ERR) return picolErr(i,"missing close-bracket"); return rc; case '$': return picolParseVar(p); // case '#': if (p->type == PT_EOL) {picolParseComment(p);continue;} default: return picolParseString(p); } } }
int picolGetToken(struct picolParser *p) { while(1) { if (!p->len) { if (p->type != PT_EOL && p->type != PT_EOF) p->type = PT_EOL; else p->type = PT_EOF; return PICOL_OK; } switch(*p->p) { case ' ': case '\t': case '\r': if (p->insidequote) return picolParseString(p); return picolParseSep(p); case '\n': case ';': if (p->insidequote) return picolParseString(p); return picolParseEol(p); case '[': return picolParseCommand(p); case '$': return picolParseVar(p); case '#': if (p->type == PT_EOL) { picolParseComment(p); continue; } return picolParseString(p); default: return picolParseString(p); } } return PICOL_OK; /* unreached */ }
int picolParseVar(picolParser *p) { int parened = 0; p->start = ++p->p; p->len--; /* skip the $ */ if (*p->p == '{') { picolParseBrace(p); p->type = PT_VAR; return PICOL_OK; } if(COLONED(p->p)) {p->p += 2; p->len -= 2;} /* while(isalnum(*p->p) || strchr("()_",*p->p)) { p->p++; p->len--; }*/ #if 1 while(myisalnum(*p->p) || *p->p == '_' || *p->p=='('||*p->p==')') { if(*p->p=='(') parened = 1; p->p++; p->len--; } if(!parened && *(p->p-1)==')') {p->p--; p->len++;} #endif if (p->start == p->p) { /* It's just a single char string "$" */ picolParseString(p); p->start--; p->len++; /* back to the $ sign */ p->type = PT_VAR; return PICOL_OK; } else RETURN_PARSED(PT_VAR); }