Esempio n. 1
0
/****************************************************************************
Function        : _CliCmdParser
Description     : Command Parser
*****************************************************************************/
static INT32 _CliCmdParser(INT32 i4Argc, const CHAR**  szArgv, CLI_EXEC_T * prCmdTbl, INT32 fgNoChk)
{
    const CHAR *szStr;
    CLI_EXEC_T *pCmdTbl;

    if ((szArgv == NULL) || (prCmdTbl == NULL))
    {
        return CLI_UNKNOWN_CMD;
    }

    szStr = szArgv[0];
    while (!IsDot(*szStr) &&
        (*szStr != ASCII_NULL))
    {
        szStr++;
    }

    pCmdTbl = _CliCmdSearch(szArgv[0], prCmdTbl);

    // execute command
    if ((pCmdTbl != NULL) &&
        (fgNoChk || (pCmdTbl->eAccessRight >= _eCliMode)))
    {
        if ((pCmdTbl->prCmdNextLevel == NULL) && (pCmdTbl->pfExecFun == NULL))
        {
            //ASSERT(0);
            assert(0);
        }

        if (pCmdTbl->pfExecFun != NULL)
        {
            if ((pCmdTbl->prCmdNextLevel == NULL) ||
                (!IsDot(*szStr) && (i4Argc > 1)))       // entry can be a directory or a command
            {
                INT32 i4Return = pCmdTbl->pfExecFun(i4Argc, szArgv);

                return i4Return;
            }
        }

        if (pCmdTbl->prCmdNextLevel != NULL)
        {
            if (*szStr == ASCII_NULL)
            {
                // cli help
                _CliShowHelp(pCmdTbl->prCmdNextLevel);
                return CLI_COMMAND_OK;
            }

            szStr++;
            szArgv[0] = szStr;  // skip dot
            return _CliCmdParser(i4Argc, szArgv, pCmdTbl->prCmdNextLevel, fgNoChk); // go to next level
        }
    }

    return CLI_UNKNOWN_CMD;
}
Esempio n. 2
0
/****************************************************************************
Function        : _CliCmdSearch
Description     : Search Command
*****************************************************************************/
static CLI_EXEC_T* _CliCmdSearch(const char*  szArgv, CLI_EXEC_T * prCmdTbl)
{
    UINT32 u4CmdIdx;
    UINT32 u4StrLen;
    UINT32 u4CmdLen;
    UINT32 u4CmdAbbrLen;
    const char *szStr;
    UINT8 ucFound = 0;

    if ((szArgv == NULL) || (prCmdTbl == NULL))
    {
        return NULL;
    }

    szStr = szArgv;
    u4StrLen = 0;
    while (!IsDot(*szStr) &&
        (*szStr != ASCII_NULL))
    {
        szStr++;
        u4StrLen++;
    }

    // search commmad from command table. If found, run command
    u4CmdIdx = 0;
    while (prCmdTbl[u4CmdIdx].pszCmdStr != NULL)
    {
        if (prCmdTbl[u4CmdIdx].pszCmdAbbrStr != NULL)
        {
            u4CmdAbbrLen = strlen(prCmdTbl[u4CmdIdx].pszCmdAbbrStr);

            if ((u4StrLen == u4CmdAbbrLen) &&
                (strncmp(prCmdTbl[u4CmdIdx].pszCmdAbbrStr, szArgv, u4StrLen) == 0))
            {
                ucFound = 1;
                break;
            }
        }

        u4CmdLen = strlen(prCmdTbl[u4CmdIdx].pszCmdStr);

        if ((u4StrLen == u4CmdLen) &&
            (strncmp(prCmdTbl[u4CmdIdx].pszCmdStr, szArgv, u4StrLen) == 0))
        {
            ucFound = 1;
            break;
        }

        u4CmdIdx++;
    }

    // execute command
    if (ucFound)
    {
        return &prCmdTbl[u4CmdIdx];
    }

    return NULL;
}
Esempio n. 3
0
Token* Scanner::GetNumber(char currentChar) {
	string s = "";
	int pos = currentPos, line = currentLine, dot = 0, E = 0;
	s += currentChar;

	while( (currentChar = GetChar()) != '\0' && !IsSpace(currentChar)) {
		if(dot && IsDot(currentChar)) 
			throw ScannerException(currentLine, currentPos, "Too many dots in real number: \"" + GetInvalidToken(pos) + "\"");

		if(E) {
			if(IsE(currentChar)) 
				throw ScannerException(currentLine, currentPos, "Too many symbol \"E\" in real number: \"" + GetInvalidToken(pos) + "\"");

			if(IsNumber(currentChar) || currentChar == '-' || currentChar == '+') {
				s += currentChar;
				continue;
			}
			else
				throw ScannerException(currentLine, currentPos, "Invalid real number: \"" + GetInvalidToken(pos) + "\"");
		}

		if( IsNumber(currentChar) || IsE(currentChar) || IsDot(currentChar) ) {
			E += IsE(currentChar);
			dot += IsDot(currentChar);
			s += currentChar;
		}
		else {
			if(IsLetter(currentChar)) 
				throw ScannerException(currentLine, currentPos, "Invalid identificator: \"" + GetInvalidToken(pos) + "\"");

			BackToPreviousChar();
			break;
		}
	}
	if(IsE(s[s.length() - 1]) || IsDot(s[s.length() - 1])) 
		throw ScannerException(currentLine, currentPos, "Invalid real number: \"" + s + "\"");

	return new Token(line, pos, dot || E ? CONST_REAL : CONST_INTEGER, DEFAULT, s);
}
Esempio n. 4
0
BOOL CDFSFinder::FindSubDirFirst(void)
{
    if (IsDirectory() && !IsDot())
    {
        int nCurFolderLen = m_nFolderLen;
        m_nFolderLen += _tcslen(m_fileInfo.cFileName);
        BOOL bRet = FindCurDirFirst();
        if (!bRet)
        {
            m_nFolderLen = nCurFolderLen;
        }
        return bRet;
    }

    return FALSE;
}
Token LexicalAnalysis::GetNumber(string& _string)
{
	if (*m_bufferMoved == '0')
	{
		//get the hexadecimal number beginning "0x" or "0X"
		if (*(m_bufferMoved + 1) == 'x' || *(m_bufferMoved + 1) == 'X')
		{
			_string += *m_bufferMoved;
			if (!Forward())
				return ERROR;
			_string += *m_bufferMoved;
			if (!Forward())
				return ERROR;
			//0x(0~f)+
			if (IsHexadecimalNumber(*m_bufferMoved))
			{
				while (IsHexadecimalNumber(*m_bufferMoved))
				{
					_string += *m_bufferMoved;
					if (!Forward())
						return ERROR;
				}
			}
			else
			{
				_string = "there is only a 0x, whitch is illegal";
				return ERROR;
			}
			if (IsAlphaOrUnderline(*m_bufferMoved))
			{
				_string += " with alpha or underline is illegal";
				return ERROR;
			}
			return HEXADECIMALNUM;
		}
	}

	//(0~9)+
	while (IsDecimalNumber(*m_bufferMoved))
	{
		_string += *m_bufferMoved;
		if (!Forward())
			return ERROR;
	}
	//(0~9)+(.)?
	if (IsDot(*m_bufferMoved))
	{
		_string += *m_bufferMoved;
		if (!Forward())
			return ERROR;
		//(0~9)+(.(0~9)*)?
		while (IsDecimalNumber(*m_bufferMoved))
		{
			_string += *m_bufferMoved;
			if (!Forward())
				return ERROR;
		}
	}
	if (IsAlphaOrUnderline(*m_bufferMoved))
	{
		_string += " with alpha or underline is illegal";
		return ERROR;
	}
	return DECIMALNUM;
}
Esempio n. 6
0
/******************************************************************************
* Function      : CLI_CmdChangeDirectory
* Description   : CLI Command to change current command level
******************************************************************************/
INT32 CLI_CmdChangeDirectory(INT32 i4Argc, const char ** szArgv)
{
    const char *szStr;
    const char *szCmd;
    UINT32 u4Idx;
    CLI_EXEC_T* pCmdTbl = NULL;

    if ((i4Argc < 2) || (szArgv == NULL) || (szArgv[1] == NULL))    // show alias
    {
        _CliShowHelp(_prCurrentCmdTbl);
        return 1;
    }

    szStr = szArgv[1];

    while (*szStr != ASCII_NULL)
    {
        if (IsDot(*szStr))
        {
            szStr++;
            if (IsDot(*szStr))  // cd ..
            {
                szStr++;
                if (_u4CmdTblLinkIdx > 0)
                {
                    _u4CmdTblLinkIdx --;

                    if (_u4CmdTblLinkIdx == 0)
                    {
                        _prCurrentCmdTbl = NULL;
                    }
                    else
                    {
                        _prCurrentCmdTbl = _aprCmdTblLinkBuf[_u4CmdTblLinkIdx]->prCmdNextLevel;
                    }
                    _CliGeneratePrompt();
                }
            }
            else
            {
                return -1;
            }
        }
        else
        if (IsRoot(*szStr))     // cd root
        {
            szStr++;

            _u4CmdTblLinkIdx = 0;
            _prCurrentCmdTbl = NULL;
            _CliGeneratePrompt();
        }
        else
        {
            szCmd = szStr;
            while (!IsDot(*szStr) &&
                (*szStr != ASCII_NULL))
            {
                szStr++;
            }

            if (_prCurrentCmdTbl == NULL)   // root
            {
				for (u4Idx = (CLI_MANDA_CMD_TBL_IDX + 1); u4Idx < _u4CmdTblNum; u4Idx++)
				{
					pCmdTbl = _CliCmdSearch(szCmd, _aprCmdTblBuf[u4Idx]);

					if (pCmdTbl != NULL)
					{
						break;
					}
				}
            }
            else
            {
                pCmdTbl = _CliCmdSearch(szCmd, _prCurrentCmdTbl);
            }

            if ((pCmdTbl != NULL) && (pCmdTbl->prCmdNextLevel != NULL) &&
                (pCmdTbl->eAccessRight >= _eCliMode))
            {
                if (_u4CmdTblLinkIdx < (CLI_MAX_CMD_TBL_LEVEL - 2))
                {
                    _u4CmdTblLinkIdx++;
                    _aprCmdTblLinkBuf[_u4CmdTblLinkIdx] = pCmdTbl;
                    _prCurrentCmdTbl = _aprCmdTblLinkBuf[_u4CmdTblLinkIdx]->prCmdNextLevel;

                    _CliGeneratePrompt();
                }
                else
                {
                    cli_print("CLI fatal error!\n");
                    while(1) {}
                }
            }
            else
            {
                return -1;
            }

            if (IsDot(*szStr))
            {
                szStr++;    // skip 'dot' character
            }
        }
    }

    return 1;
}
Esempio n. 7
0
BOOL CFilePath::IsDotty() const
{
    return IsDot() || IsDotDot();
}