|
|
#include <stdafx.h>
#include "Parser.h"
#include "EventCmd.h"
#include "Errors.h"
CParser gParser;
CParser::CParser() { m_pOperList = NULL; m_fdInput = -1; m_nLineNo = 1; m_nTokenNo = 0; m_pInput = m_szInput; }
CParser::~CParser() { if (m_fdInput != -1) _close(m_fdInput); if (m_pOperList != NULL) delete m_pOperList; }
DWORD CParser::OpenInputFile() { DWORD retCode;
m_fdInput = _open(gCommandLine.m_szFileName, _O_RDONLY | _O_BINARY); retCode = GetLastError(); if (retCode != ERROR_SUCCESS) _E(retCode, IDS_ERR08, gCommandLine.m_szFileName); else retCode = ReloadInputBuffer();
return retCode; }
DWORD CParser::ReloadInputBuffer() { DWORD retCode; int nBuf;
m_pInput = m_szInput; nBuf = _read(m_fdInput, m_szInput, INPUT_BUFFER_SZ); retCode = GetLastError(); if (retCode != ERROR_SUCCESS) _E(retCode, IDS_ERR09, m_nLineNo); else if (nBuf < INPUT_BUFFER_SZ) m_szInput[nBuf] = '\0'; return retCode; }
DWORD CParser::AdvanceInputPointer() { DWORD retCode = ERROR_SUCCESS;
if (*m_pInput == '\0') { _W(WARN_TRACK, IDS_TRCK_WRN27, m_nLineNo, m_nTokenNo); return ERROR_END_OF_MEDIA; }
if (*m_pInput == TOKEN_CH_NL) { m_nLineNo++; m_nTokenNo; m_nTokenNo = 0; }
if (m_pInput < m_szInput + INPUT_BUFFER_SZ - 1) m_pInput++; else retCode = ReloadInputBuffer();
if (retCode == ERROR_SUCCESS && *m_pInput == '\0') { _W(WARN_TRACK, IDS_TRCK_WRN28, m_nLineNo, m_nTokenNo); retCode = ERROR_END_OF_MEDIA; }
return retCode; }
DWORD CParser::GetNextToken(char * pToken, int nSizeToken) { int i; DWORD nLineStrDelim; DWORD nTokenStrDelim; enum { STATE_BLANKS, STATE_COMMENT, STATE_TOKEN } state = STATE_BLANKS; DWORD retCode = ERROR_SUCCESS;
while (retCode == ERROR_SUCCESS) { if (state == STATE_BLANKS) { if (*m_pInput == TOKEN_CH_COM_DELIM) state = STATE_COMMENT; else if (strchr(TOKEN_SZ_BLANKS, *m_pInput) == NULL) break; } else if (state == STATE_COMMENT) { if (*m_pInput == TOKEN_CH_NL) state = STATE_BLANKS; }
retCode = AdvanceInputPointer(); }
i = 0; state = STATE_BLANKS; m_nTokenNo++;
while (retCode == ERROR_SUCCESS && *m_pInput != TOKEN_CH_COM_DELIM) { if (state == STATE_BLANKS) { if (strchr(TOKEN_SZ_BLANKS, *m_pInput) != NULL) break; if (*m_pInput == TOKEN_CH_STR_DELIM) { state = STATE_TOKEN; nLineStrDelim = m_nLineNo; nTokenStrDelim = m_nTokenNo; retCode = AdvanceInputPointer(); continue; } } if (state == STATE_TOKEN) { if (*m_pInput == TOKEN_CH_STR_DELIM) { state = STATE_BLANKS; retCode = AdvanceInputPointer(); break; } } pToken[i++] = *m_pInput; if (i >= nSizeToken) { return _E(ERROR_BUFFER_OVERFLOW, IDS_ERR04, m_nLineNo, m_nTokenNo, nSizeToken); } retCode = AdvanceInputPointer(); }
pToken[i] = '\0';
if (state == STATE_TOKEN) { _W(WARN_ERROR, IDS_ERRO_WRN29, nLineStrDelim, nTokenStrDelim); }
if (i > 0 && retCode == ERROR_END_OF_MEDIA) retCode = ERROR_SUCCESS;
return retCode; }
DWORD CParser::UnGetToken(char *szToken) { int nTokenLen; char *pInsertion;
nTokenLen = strlen(szToken) + 2;
if (m_pInput - m_szInput < nTokenLen) { int nDrift = nTokenLen - (int)(m_pInput - m_szInput);
memmove(m_pInput + nDrift, m_pInput, INPUT_BUFFER_SZ - (size_t)(m_pInput - m_szInput) - nDrift); m_pInput += nDrift;
if (_lseek(m_fdInput, -nDrift, SEEK_CUR) == -1) { return _E(GetLastError(), IDS_ERR10); } }
pInsertion = m_pInput = m_pInput - nTokenLen; *pInsertion++ = '\"'; strcpy(pInsertion, szToken); pInsertion += nTokenLen - 2; *pInsertion = '\"'; m_nTokenNo--; return ERROR_SUCCESS; }
DWORD CParser::CheckUnGetToken(char *pMatchToken, char *pToken) { DWORD retCode = ERROR_SUCCESS;
if (strcmp(pMatchToken, pToken) == 0 && (retCode = UnGetToken(pToken)) == ERROR_SUCCESS) retCode = ERROR_INVALID_PARAMETER; return retCode; }
DWORD CParser::ParseInputFile() { DWORD retCode; DWORD dwSkipLine; enum { STATE_READ, STATE_SKIP } state = STATE_READ;
retCode = OpenInputFile();
if (retCode == ERROR_SUCCESS) { while(1) { char szToken[INPUT_TOKEN_SZ];
retCode = GetNextToken(szToken, INPUT_TOKEN_SZ); if (retCode != ERROR_SUCCESS) break;
if (state == STATE_SKIP) { if (m_nLineNo == dwSkipLine) continue; state = STATE_READ; }
if (state == STATE_READ) { if (strcmp(szToken, KEYWORD_PRAGMA) != 0) { _W(WARN_ALERT, IDS_ALRT_WRN30, m_nLineNo, m_nTokenNo); dwSkipLine = m_nLineNo; state = STATE_SKIP; continue; }
retCode = GetNextToken(szToken, INPUT_TOKEN_SZ); if (retCode != ERROR_SUCCESS) { _W(WARN_ALERT, IDS_ALRT_WRN31, m_nLineNo, m_nTokenNo); dwSkipLine = m_nLineNo; state = STATE_SKIP; continue; }
if (_stricmp(szToken, KEYWORD_CMD_ADD_EVENT) == 0) retCode = ParseCommand(OP_ADD_EVENT); else if (_stricmp(szToken, KEYWORD_CMD_DEL_EVENT) == 0) retCode = ParseCommand(OP_DEL_EVENT); else if (_stricmp(szToken, KEYWORD_CMD_ADD_TRAP) == 0) retCode = ParseCommand(OP_ADD_TRAP); else if (_stricmp(szToken, KEYWORD_CMD_DEL_TRAP) == 0) retCode = ParseCommand(OP_DEL_TRAP); else { retCode = ERROR_INVALID_OPERATION; _W(WARN_ALERT, IDS_ALRT_WRN32, m_nLineNo, m_nTokenNo, szToken); }
if (retCode != ERROR_SUCCESS) { dwSkipLine = m_nLineNo; state = STATE_SKIP; retCode = ERROR_SUCCESS; continue; } } } }
if (retCode == ERROR_END_OF_MEDIA) retCode = ERROR_SUCCESS; return retCode; }
DWORD CParser::ParseCommand(tOperation opType) { DWORD retCode = ERROR_SUCCESS; COperation *pOperation;
switch(opType) { case OP_ADD_EVENT: case OP_DEL_EVENT: pOperation = new COpEvents(opType); break; case OP_ADD_TRAP: case OP_DEL_TRAP: pOperation = new COpTraps(opType); break; } if (pOperation == NULL) return _E(ERROR_OUTOFMEMORY, IDS_ERR01);
retCode = pOperation->ParseCmdArgs(); if (retCode == ERROR_SUCCESS) { if (m_pOperList == NULL) m_pOperList = pOperation; else m_pOperList = m_pOperList->Insert(pOperation); } else delete pOperation;
return retCode; }
DWORD CParser::ProcessCommands() { DWORD retCode = ERROR_SUCCESS; COperation *pOperation;
for (pOperation = m_pOperList; retCode == ERROR_SUCCESS && pOperation != NULL; pOperation = pOperation->GetNextOp()) retCode = pOperation->ProcessCommand();
return retCode; }
|