You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
271 lines
6.8 KiB
271 lines
6.8 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 2001
|
|
//
|
|
// File: rxutil.cpp
|
|
//
|
|
// Contents: Regular expression based helper functions
|
|
//
|
|
// History: 1-May-2001 kumarp created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
#include "pch.cxx"
|
|
#pragma hdrstop
|
|
|
|
#pragma warning( disable : 4018 )
|
|
#define assert(a)
|
|
|
|
#include "syntax.h"
|
|
#include "regexpr.h"
|
|
|
|
|
|
using namespace regex;
|
|
|
|
typedef std::vector< rpattern_c* > rpattern_c_ptr_vector;
|
|
typedef std::vector< UINT > uint_vector;
|
|
|
|
#define MAX_LINE_SIZE 512
|
|
|
|
rpattern_c_ptr_vector* g_pRegexPatterns = NULL;
|
|
uint_vector* g_uiGroupNumbers = NULL;
|
|
|
|
DWORD
|
|
InitRegexPatterns(
|
|
IN PCWSTR pszFileName,
|
|
OUT rpattern_c_ptr_vector **ppRegexPatterns,
|
|
OUT uint_vector **ppGroupNumbers
|
|
)
|
|
{
|
|
FILE *fp;
|
|
WCHAR szLine[MAX_LINE_SIZE+1];
|
|
UINT GroupNumber;
|
|
UINT NumItemsScanned, NumCharsToSkip;
|
|
UINT cPattern = 0;
|
|
DWORD dwError = NO_ERROR;
|
|
rpattern_c* pPattern;
|
|
PCWSTR pszPattern;
|
|
UINT uiLen;
|
|
|
|
*ppRegexPatterns = new rpattern_c_ptr_vector;
|
|
if ( !*ppRegexPatterns )
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
*ppGroupNumbers = new uint_vector;
|
|
if ( !*ppGroupNumbers )
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
|
|
fp = _wfopen( pszFileName, L"r" );
|
|
|
|
if ( fp )
|
|
{
|
|
while( fgetws( szLine, MAX_LINE_SIZE, fp ) )
|
|
{
|
|
if ( szLine[0] == L';' )
|
|
{
|
|
// ignore comments
|
|
continue;
|
|
}
|
|
|
|
uiLen = wcslen(szLine);
|
|
|
|
//
|
|
// get rid of the trailing \n in the line
|
|
//
|
|
szLine[uiLen-1] = 0;
|
|
|
|
NumItemsScanned = swscanf( szLine, L"%d", &GroupNumber );
|
|
if ( NumItemsScanned == 1 )
|
|
{
|
|
//
|
|
// skip the leading number so that we know where the
|
|
// pattern starts
|
|
//
|
|
NumCharsToSkip = wcsspn( szLine, L"0123456789 \t" );
|
|
|
|
pszPattern = szLine + NumCharsToSkip;
|
|
pPattern = new rpattern_c( pszPattern );
|
|
//wprintf( L"%02d: %s\n", cPattern++, pszPattern );
|
|
g_pRegexPatterns->push_back(pPattern);
|
|
g_uiGroupNumbers->push_back( GroupNumber );
|
|
}
|
|
else
|
|
{
|
|
dwError = ERROR_INVALID_DATA;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dwError = ERROR_FILE_NOT_FOUND;
|
|
}
|
|
|
|
Cleanup:
|
|
|
|
return dwError;
|
|
}
|
|
|
|
EXTERN_C
|
|
BOOL
|
|
ParseLine(
|
|
IN PCWSTR szLine,
|
|
OUT PUINT pMatchStart,
|
|
OUT PUINT pMatchLength
|
|
)
|
|
{
|
|
BOOL fResult = FALSE;
|
|
regexpr::backref_vector_c backrefs;
|
|
UINT g;
|
|
regexpr::backref_type br;
|
|
|
|
for (int i=0; i < g_pRegexPatterns->size(); i++)
|
|
{
|
|
//wprintf(L"trying %02d for '%s'\n", i, szLine);
|
|
|
|
//wprintf(L"rp[%02d]: %s\n", i, sz);
|
|
|
|
br = regexpr::match( szLine, *(*g_pRegexPatterns)[i], &backrefs );
|
|
|
|
g = (*g_uiGroupNumbers)[i];
|
|
|
|
if( br && backrefs[g] )
|
|
{
|
|
*pMatchStart = backrefs[g].first - szLine;
|
|
*pMatchLength = backrefs[g].second - backrefs[g].first;
|
|
fResult = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return fResult;
|
|
}
|
|
|
|
#ifndef GENFLT_FILE_INIT
|
|
PCWSTR g_szPatterns[] =
|
|
{
|
|
// L"2 ^[ \t]*\\([ \t]*def(un|macro|subst|advice)[ \t]+([*+a-zA-Z0-9_-]+)[ \t]*\\(",
|
|
L"2 ^[ \t]*\\([ \t]*def(un|macro|subst|advice)[ \t]+([^ \t\n;]+)[ \t]*\\(",
|
|
// L"2 ^[ \t]*\\([ \t]*def(var|custom|group|face|const|ine-skeleton|alias)[ \t]+([*+a-zA-Z0-9_-]+)",
|
|
L"2 ^[ \t]*\\([ \t]*def(var|custom|group|face|const|ine-skeleton|alias)[ \t]+([^ \t\n;]+)",
|
|
L"1 ^[ \t]*\\([ \t]*defalias[ \t]+'([^ \t\n;]+)",
|
|
#ifdef GENFLT_PERL_SUPPORT
|
|
L"1 ^[ \t]*sub[ \t]+([a-zA-Z0-9_]+)[ \t]*",
|
|
L"1 ^[ \t]*package[ \t]+([a-zA-Z0-9_]+)[ \t]*;",
|
|
#endif
|
|
// L"2 ^[ \\t]*\\([ \\t]*def(un|macro|subst|advice)[ \\t]+([+a-zA-Z0-9_-]+)[ \\t]*\\(",
|
|
// L"2 ^[ \\t]*\\([ \\t]*def(var|custom|group|face|const|ine-skeleton|alias)[ \\t]+([+a-zA-Z0-9_-]+)",
|
|
// #ifdef GENFLT_PERL_SUPPORT
|
|
// L"1 ^[ \\t]*sub[ \\t]+([a-zA-Z0-9_]+)[ \\t]*",
|
|
// L"1 ^[ \\t]*package[ \\t]+([a-zA-Z0-9_]+)[ \\t]*;",
|
|
// #endif
|
|
};
|
|
|
|
int c_cPatterns = sizeof(g_szPatterns) / sizeof(PCWSTR);
|
|
|
|
DWORD
|
|
InitRegexPatternsList(
|
|
OUT rpattern_c_ptr_vector **ppRegexPatterns,
|
|
OUT uint_vector **ppGroupNumbers
|
|
)
|
|
{
|
|
UINT GroupNumber;
|
|
UINT NumItemsScanned, NumCharsToSkip;
|
|
UINT cPattern = 0;
|
|
DWORD dwError = NO_ERROR;
|
|
rpattern_c* pPattern;
|
|
PCWSTR pszPattern;
|
|
UINT uiLen;
|
|
PCWSTR pszPatternSpec = NULL;
|
|
|
|
*ppRegexPatterns = new rpattern_c_ptr_vector;
|
|
if ( !*ppRegexPatterns )
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
*ppGroupNumbers = new uint_vector;
|
|
if ( !*ppGroupNumbers )
|
|
{
|
|
dwError = ERROR_NOT_ENOUGH_MEMORY;
|
|
goto Cleanup;
|
|
}
|
|
|
|
for (int i=0; i < c_cPatterns; i++)
|
|
{
|
|
pszPatternSpec = g_szPatterns[i];
|
|
|
|
uiLen = wcslen(pszPatternSpec);
|
|
|
|
NumItemsScanned = swscanf( pszPatternSpec, L"%d", &GroupNumber );
|
|
if ( NumItemsScanned == 1 )
|
|
{
|
|
//
|
|
// skip the leading number so that we know where the
|
|
// pattern starts
|
|
//
|
|
NumCharsToSkip = wcsspn( pszPatternSpec, L"0123456789 \t" );
|
|
|
|
pszPattern = pszPatternSpec + NumCharsToSkip;
|
|
pPattern = new rpattern_c( pszPattern );
|
|
#if DBG
|
|
//DbgPrint( "InitRegexPatternsList: %02d: %ws\n", cPattern++, pszPattern );
|
|
#endif
|
|
g_pRegexPatterns->push_back(pPattern);
|
|
g_uiGroupNumbers->push_back( GroupNumber );
|
|
}
|
|
else
|
|
{
|
|
dwError = ERROR_INVALID_DATA;
|
|
break;
|
|
}
|
|
}
|
|
|
|
Cleanup:
|
|
|
|
return dwError;
|
|
}
|
|
#endif // GENFLT_FILE_INIT
|
|
|
|
EXTERN_C
|
|
DWORD RxInit()
|
|
{
|
|
static BOOL fRxInitialized = FALSE;
|
|
DWORD dwError = NO_ERROR;
|
|
|
|
if ( fRxInitialized )
|
|
{
|
|
return NO_ERROR;
|
|
}
|
|
|
|
#ifdef GENFLT_FILE_INIT
|
|
dwError = InitRegexPatterns(
|
|
L"c:\\rx.ini",
|
|
&g_pRegexPatterns,
|
|
&g_uiGroupNumbers );
|
|
#else
|
|
dwError = InitRegexPatternsList(
|
|
&g_pRegexPatterns,
|
|
&g_uiGroupNumbers );
|
|
#endif
|
|
|
|
if ( dwError == NO_ERROR )
|
|
{
|
|
fRxInitialized = TRUE;
|
|
}
|
|
|
|
return dwError;
|
|
}
|
|
|
|
|
|
|
|
|