コード例 #1
0
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);
}
コード例 #2
0
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);
	}
	*/
}
コード例 #3
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);
		}
		*/
	}
}
コード例 #4
0
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);
	}
}
コード例 #5
0
ファイル: test.cpp プロジェクト: GHScan/DailyProjects
    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();
    }
コード例 #6
0
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];
	}
}