JLDString* JLDIO::parseString(std::istringstream& iss) { ignoreWhiteSpace(iss); char charBuffer, matchedChar; iss.get(charBuffer); assert((charBuffer == '\'' || charBuffer == '"') && "Input is not a string"); matchedChar = charBuffer; std::string text = ""; iss.get(charBuffer); while(charBuffer != matchedChar) { text += charBuffer; iss.get(charBuffer); if(!iss.good()) { assert(0 && "No matching quote for a string"); break; } } ignoreWhiteSpace(iss); if(iss.peek() == '+') { iss.get(charBuffer); auto concatObj = parseString(iss); text += concatObj->getValue(); delete concatObj; } // std::cout<<"parseString found: '"<<text<<"'\n"; // std::cout<<"Cursor now on: '"<<(char)iss.peek()<<"'\n"; return new JLDString(text); }
JLDDoc* JLDIO::parseDoc(std::istringstream& iss) { ignoreWhiteSpace(iss); char charBuffer; iss.get(charBuffer); assert(charBuffer == '{' && "Input is not a doc"); JLDDoc* out = new JLDDoc(); // empty list ignoreWhiteSpace(iss); if(iss.peek() == '}') { iss.get(charBuffer); return out; } do { auto keyObj = parseString(iss); std::string key = keyObj->getValue(); delete keyObj; ignoreWhiteSpace(iss); assert(iss.peek() == ':' && ": expected after a keyword"); iss.get(charBuffer); ignoreWhiteSpace(iss); JLDData* valueObj; switch (iss.peek()) { case '{': valueObj = parseDoc(iss); break; case '[': valueObj = parseList(iss); break; case '\'': case '\"': valueObj = parseString(iss); break; default: assert(0 && "Unexpected value"); break; } out->push_back(key, valueObj); } while(moreItems(iss, '}')); iss.get(charBuffer); return out; }
JLDList* JLDIO::parseList(std::istringstream& iss) { ignoreWhiteSpace(iss); char charBuffer; iss.get(charBuffer); assert(charBuffer == '[' && "Input is not a list"); JLDList* out = new JLDList(); // empty list ignoreWhiteSpace(iss); if(iss.peek() == ']') { iss.get(charBuffer); return out; } do { ignoreWhiteSpace(iss); JLDData* valueObj; switch (iss.peek()) { case '{': valueObj = parseDoc(iss); break; case '[': valueObj = parseList(iss); break; case '\'': case '\"': valueObj = parseString(iss); break; default: assert(0 && "Unexpected value"); break; } out->push_back(valueObj); } while(moreItems(iss, ']')); iss.get(charBuffer); return out; }
bool JLDIO::moreItems(std::istringstream& iss, char delim) { char charBuffer; ignoreWhiteSpace(iss); if(iss.peek() == ',') { iss.get(charBuffer); return true; } else if(iss.peek() != delim) { std::cout<<"Expected '"<<delim<<"' but found '"<<(char)iss.peek()<<"'\n"; assert(0 && "Unexpected char"); } return false; }
int readNextToken(char **t, int *tlen, int (*get_next_byte) (void *), void *get_next_byte_argument) { char c; char *token; int len = 0; int maxLen = BUF_SIZE; TOKENTYPE type = NOT_DEFINED; if (*tlen) { len = strlen(*t); token = *t; maxLen = *tlen; } else { token = malloc(BUF_SIZE); len = 0; maxLen = BUF_SIZE; } ignoreWhiteSpace(get_next_byte, get_next_byte_argument); while ((c = get_next_byte(get_next_byte_argument)) != EOF) { type = getTokenType(c); if (type == ALPHANUM) { if (c == '`') { backquote = !backquote; } token[len++] = c; if (len + 1 == maxLen) { maxLen *= 2; token = realloc(token, maxLen); } } else if (type == SPACE) { int val; while ((c = get_next_byte(get_next_byte_argument)) != EOF && c == ' ') { ; } val = getTokenType(c); if (val == ALPHANUM || val == O_PAR || val == PIPE) { _rewind(get_next_byte_argument, -1); } else if (val == REDIRECTION1 || val == REDIRECTION2) { _rewind(get_next_byte_argument, -1); type = val; } else { type = val; } break; } else if (type == O_PAR) { *t = token; *tlen += 1; return type; } else if (type == REDIRECTION1 || type == REDIRECTION2) { _rewind(get_next_byte_argument, -1); break; } else { break; } } /* if (len == 0) { */ /* *t = NULL; */ /* free(token); */ /* } else { */ token[len] = '\0'; *t = token; *tlen = maxLen; // } return type; }