windows-nt/Source/XPSP1/NT/enduser/stuff/itircl/svmgr/cmdint/cistream.cpp
2020-09-26 16:20:57 +08:00

193 lines
5.6 KiB
C++

#include <mvopsys.h>
// Global debug variable
#ifdef _DEBUG
static char s_aszModule[] = __FILE__;
#endif
#include <windows.h>
#include <iterror.h>
#include "cistream.h"
#include "orkin.h"
#include "..\svutil.h"
#include "ciutil.h"
CStreamParseLine::CStreamParseLine(void)
{
MEMSET(&m_liNull, 0, sizeof(LARGE_INTEGER));
m_pistmInput = NULL;
#ifdef _DEBUG
MEMSET(m_wstrLine, 0, sizeof(m_wstrLine));
#endif
} // Constructor
STDMETHODIMP CStreamParseLine::Reset(void)
{
return m_pistmInput->Seek(m_liStartOffset, STREAM_SEEK_SET, NULL);
} // Reset
STDMETHODIMP CStreamParseLine::SetStream(IStream *pistm)
{
if (NULL == pistm)
return E_POINTER;
(m_pistmInput = pistm)->AddRef();
// Make sure this stream is Unicode
ULARGE_INTEGER uliStartOffset;
pistm->Seek(m_liNull, STREAM_SEEK_CUR, &uliStartOffset);
WORD wUnicodeWord;
HRESULT hr;
if (SUCCEEDED(hr = pistm->Read (&wUnicodeWord, sizeof (WORD), NULL)))
{
if (wUnicodeWord == 0xFEFF)
m_fASCII = FALSE;
else if (wUnicodeWord == 0xFFEF)
// This requires byte swapping on INTEL
SetErrCode(&hr, E_NOTIMPL);
else
{
LARGE_INTEGER liTemp;
liTemp.QuadPart = uliStartOffset.QuadPart;
pistm->Seek (liTemp, STREAM_SEEK_SET, NULL);
m_fASCII = TRUE;
}
}
pistm->Seek(m_liNull, STREAM_SEEK_CUR, &uliStartOffset);
m_liStartOffset.QuadPart = uliStartOffset.QuadPart;
return hr;
} // SetStream
STDMETHODIMP CStreamParseLine::Close(void)
{
if (m_pistmInput)
{
m_pistmInput->Release();
m_pistmInput = NULL;
}
return S_OK;
} // Close
STDMETHODIMP CStreamParseLine::GetLogicalLine
(LPWSTR *ppwstrLineBuffer, int *piLineCount)
{
ITASSERT(ppwstrLineBuffer);
LPWSTR pwstrCurrent;
BOOL fGotLine, fIgnore = FALSE;
BOOL fCommentStrippingOn = TRUE;
BOOL fCommentedLine;
int iQuoteNesting = 0;
int iParenNesting = 0;
int iLineCount = 0;
for (;;)
{
iLineCount += 1;
fCommentedLine = FALSE;
if (m_fASCII)
fGotLine = StreamGetLineASCII (m_pistmInput,
m_wstrLine, NULL, MAX_MVP_LINE_BYTES * sizeof(WCHAR));
else
fGotLine = StreamGetLine (m_pistmInput,
m_wstrLine, NULL, MAX_MVP_LINE_BYTES * sizeof(WCHAR));
if (fGotLine)
{
StripLeadingBlanks(StripTrailingBlanks(m_wstrLine));
if (!fIgnore)
{
/********************************
SCAN THROUGH LOOKING FOR COMMENTS
(AND NULLING THEM OUT)
*********************************/
pwstrCurrent = m_wstrLine;
while (*pwstrCurrent) {
switch (*pwstrCurrent) {
case '(':
++iParenNesting;
fCommentStrippingOn=FALSE;
++pwstrCurrent;
break;
case ')':
if ((iParenNesting == 1) && (iQuoteNesting == 0))
fCommentStrippingOn=TRUE;
if (iParenNesting > 0)
--iParenNesting;
++pwstrCurrent;
break;
case '"':
if (iQuoteNesting==0) {
iQuoteNesting=1;
fCommentStrippingOn=FALSE;
}
else
iQuoteNesting=0;
if ((iQuoteNesting==0) && (iParenNesting == 0))
fCommentStrippingOn=TRUE;
++pwstrCurrent;
break;
case '\\':
if (*(pwstrCurrent+1) == ';') {
// slash escapes comment character!
*pwstrCurrent=' '; // just put a space in the buffer!
pwstrCurrent+=2; // increment past ';'
}
else ++pwstrCurrent;
break;
case ';':
if (fCommentStrippingOn)
{
*pwstrCurrent='\0';
fCommentedLine = TRUE;
}
else
++pwstrCurrent;
break;
default:
++pwstrCurrent;
break;
}
}
}
StripTrailingBlanks(m_wstrLine);
if (*m_wstrLine)
{
if (!WSTRICMP (m_wstrLine, L"#IGNORE"))
fIgnore = TRUE;
else if (!WSTRICMP (m_wstrLine, L"#ENDIGNORE"))
fIgnore = FALSE;
else if (!fIgnore)
{
*ppwstrLineBuffer = m_wstrLine;
if (piLineCount)
*piLineCount = iLineCount;
return (S_OK);
}
}
}
else
{
if (piLineCount)
*piLineCount = iLineCount;
return (S_FALSE);
}
}
} // GetLogicalLine