int picolParseString(picolParser *p) { int newword = (p->type == PT_SEP || p->type == PT_EOL || p->type == PT_STR); if(p->len >= 3 && !mystrncmp(p->p,"{*}",3)) { p->expand = 1; p->p += 3; p->len -= 3; /* skip the {*} expand indicator */ } if (newword && *p->p == '{') {return picolParseBrace(p);} else if (newword && *p->p == '"') { p->insidequote = 1; p->p++; p->len--; } for(p->start = p->p; 1; p->p++, p->len--) { if (p->len == 0) RETURN_PARSED(PT_ESC); switch(*p->p) { case '\\': if (p->len >= 2) { p->p++; p->len--; }; break; case '$': case '[': RETURN_PARSED(PT_ESC); case ' ': case '\t': case '\n': case '\r': case ';': if (!p->insidequote) RETURN_PARSED(PT_ESC); break; case '"': if (p->insidequote) { p->end = p->p-1; p->type = PT_ESC; p->p++; p->len--; p->insidequote = 0; return PICOL_OK; } break; } } }
int picolParseString(struct picolParser *p) { int newword = (p->type == PT_SEP || p->type == PT_EOL || p->type == PT_STR); if (newword && *p->p == '{') return picolParseBrace(p); else if (newword && *p->p == '"') { p->insidequote = 1; p->p++; p->len--; } p->start = p->p; while (1) { if (p->len == 0) { p->end = p->p - 1; p->type = PT_ESC; return PICOL_OK; } switch (*p->p) { case '\\': if (p->len >= 2) { p->p++; p->len--; } break; case '$': case '[': p->end = p->p - 1; p->type = PT_ESC; return PICOL_OK; case ' ': case '\t': case '\n': case '\r': case ';': if (!p->insidequote) { p->end = p->p - 1; p->type = PT_ESC; return PICOL_OK; } break; case '"': if (p->insidequote) { p->end = p->p - 1; p->type = PT_ESC; p->p++; p->len--; p->insidequote = 0; return PICOL_OK; } break; } p->p++; p->len--; } 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); }