void parseLine(const char **strptr) { if (peekToken(*strptr) == END) return; char firstCmdName[MAX_CMD_SIZE + 1]; char temp[MAX_CMD_SIZE + 1]; Token next = peekToken(*strptr, firstCmdName); switch (next) { case SETENV: parseSetenv(strptr); cmdCounter++; break; case PRINTENV: parsePrintenv(strptr); cmdCounter++; break; case EXIT: closeUnclosedFd(); exit(0); break; case IDENTIFIER: parseMultiCmd(strptr); if (getPath(temp, firstCmdName)) cmdCounter++; break; case END: break; default: PARSE_ASSERT(0); } PARSE_ASSERT(getToken(NULL, strptr) == END); }
void parsePrintenv(const char **strptr) { char arg1[MAX_CMD_SIZE + 1] = ""; PARSE_ASSERT(getToken(NULL, strptr) == PRINTENV); PARSE_ASSERT(getToken(arg1, strptr) == IDENTIFIER); char temp[MAX_CMD_SIZE + 1] = ""; sprintf(temp, "%s=%s\n", arg1, getenv(arg1)); assert(write(1, temp, strlen(temp) * sizeof(char)) > 0); /* int envIndex; envIndex = searchEnv(NULL, arg1); if (envIndex >= 0) { char temp[MAX_CMD_SIZE + 1]; sprintf(temp, "%s\n", envp[envIndex]); assert(write(1, temp, strlen(temp) * sizeof(char)) > 0); } else { char temp[MAX_CMD_SIZE + 1]; sprintf(temp, "%s=\n", arg1); assert(write(1, temp, strlen(temp) * sizeof(char)) > 0); } */ }
/* int searchEnv(char *content, const char *search) { for (int i = 0; i < envc; i++) { if (strncmp(envp[i], search, strlen(search)) != 0) continue; if (envp[i][strlen(search)] != '=') continue; if (content != NULL) strcpy(content, envp[i] + strlen(search) + 1); return i; } return -1; } */ void parseSetenv(const char **strptr) { char arg1[MAX_CMD_SIZE + 1] = ""; char arg2[MAX_CMD_SIZE + 1] = ""; int envIndex; PARSE_ASSERT(getToken(NULL, strptr) == SETENV); PARSE_ASSERT(getToken(arg1, strptr) == IDENTIFIER); //envIndex = searchEnv(NULL, arg1); if (getToken(arg2, strptr) == IDENTIFIER) { assert(setenv(arg1, arg2, 1) == 0); /* if (envIndex >= 0) sprintf(envp[envIndex], "%s=%s", arg1, arg2); else { envp[envc++] = new char[MAX_CMD_SIZE + 1]; sprintf(envp[envc - 1], "%s=%s", arg1, arg2); } */ } else { assert(setenv(arg1, "", 1) == 0); /* if (envIndex >= 0) sprintf(envp[envIndex], "%s=", arg1, arg2); else { envp[envc++] = new char[MAX_CMD_SIZE + 1]; sprintf(envp[envc - 1], "%s=", arg1); } */ } }
void parseMultiCmd(const char **strptr) { parseCmd(strptr); Token nextToken = peekToken(*strptr); switch (nextToken) { case IDENTIFIER: parseMultiCmd(strptr); break; case END: break; default: PARSE_ASSERT(0); } }
NodePtr fullelem() { if (tryConsumeToken(XTT_beginelem)) { Node_Element *e = new Node_Element(); NodePtr r(e); { const std::string& s = getPreviewToken().value; ElemTagSyntax::Parser(s.substr(1, s.size() - 2), e->tag, e->attris); } elems(e->children); consumeToken(XTT_endelem); { const std::string& s = getPreviewToken().value; std::string tag; AttriMap m; ElemTagSyntax::Parser(s.substr(2, s.size() - 3), tag, m); PARSE_ASSERT(tag == e->tag && m.empty()); } return r; } return NodePtr(); }
void parseCmd(const char **strptr) { // Parse Executable Filename char exe[MAX_CMD_SIZE + 1] = ""; char path[MAX_CMD_SIZE + 1] = ""; bool exeValid; PARSE_ASSERT(getToken(exe, strptr) == IDENTIFIER); exeValid = getPath(path, exe); if (!exeValid) { char msg[MAX_CMD_SIZE + 30]; sprintf(msg, "Unknown command: [%s].", exe); throw std::string(msg); } // Parse Arguments int num_arg = 0; char *arg[16]; while (peekToken(*strptr) == IDENTIFIER) { arg[num_arg] = new char[MAX_CMD_SIZE + 1]; getToken(arg[num_arg++], strptr); } // Parse Pipe to File bool pipeToFile = false; char file[MAX_CMD_SIZE + 1]; if (peekToken(*strptr) == OUT) { pipeToFile = true; getToken(NULL, strptr); // '>' PARSE_ASSERT(getToken(file, strptr) == IDENTIFIER); } // Parse Pipe bool pipe = false; bool pipenum = false; int pipenumCount; if (peekToken(*strptr) == PIPE) { getToken(NULL, strptr); // '|' /* // Test whether this is the last process char nextCmdName[MAX_CMD_SIZE + 1]; Token token; char temp[MAX_CMD_SIZE + 1]; token = peekToken(*strptr, nextCmdName); if (token == END || token == IDENTIFIER && !getPath(temp, nextCmdName)) { // Consider '|' as '|1' pipenum = true; pipenumCount = 1; } else { */ pipe = true; //} } // Parse Pipenum if (peekToken(*strptr) == PIPENUM) { char temp[MAX_CMD_SIZE + 1]; pipenum = true; getToken(temp, strptr); // '|?' pipenumCount = atoi(temp + 1); } // Parse Pipeerrnum bool pipeerrnum = false; int pipeerrnumCount; if (peekToken(*strptr) == PIPEERRNUM) { char temp[MAX_CMD_SIZE + 1]; pipeerrnum = true; getToken(temp, strptr); // '!?' pipeerrnumCount = atoi(temp + 1); } // Parse Pipenum again if !? exists if (!pipenum && pipeerrnum) { if (peekToken(*strptr) == PIPENUM) { char temp[MAX_CMD_SIZE + 1]; pipenum = true; getToken(temp, strptr); // '|?' pipeerrnumCount = atoi(temp + 1); } } // Some assertions PARSE_ASSERT(pipeToFile + pipe + pipenum <= 1); // No multiple outputs // Execute executeCmd(exe, path, num_arg, (const char **)arg, pipeToFile, file, pipe, pipenum, pipenumCount, pipeerrnum, pipeerrnumCount); // Release Argument List for (int i = 0; i < num_arg; i++) { delete [] arg[i]; } }