Created
February 26, 2019 18:00
-
-
Save leha-bot/8e7bf3ed42e88d92b7bad167f3e3d7a7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
SYNTAXFILE* StackLoadSyntaxFile(STACKSYNTAXFILE *hStack, SYNTAXFILE *lpSyntaxFile) | |
{ | |
HANDLE hFile; | |
DELIMITERINFO *lpDelimElement=NULL; | |
WORDINFO *lpWordElement=NULL; | |
QUOTEINFO *lpQuoteElement=NULL; | |
WILDCARDINFO *lpWildElement=NULL; | |
FOLDINFO *lpFoldInfo=NULL; | |
SKIPINFO *lpSkipInfo=NULL; | |
STACKVAR *lpVarStack; | |
wchar_t wszFile[MAX_PATH]; | |
const wchar_t *wpFileName; | |
wchar_t *wszText; | |
const wchar_t *wpText; | |
const wchar_t *wpTextStart; | |
const wchar_t *wpSectionStart; | |
const wchar_t *wpLineStart; | |
wchar_t *wpWildcard; | |
wchar_t *wpDelimiter; | |
wchar_t *wpWord; | |
wchar_t *wpQuoteStart; | |
wchar_t *wpQuoteEnd; | |
wchar_t *wpQuoteInclude; | |
wchar_t *wpQuoteExclude; | |
wchar_t *wpSkipStart; | |
wchar_t *wpSkipEnd; | |
wchar_t *wpFoldStart; | |
wchar_t *wpFoldEnd; | |
wchar_t *wpFoldDelimiters; | |
wchar_t *wpRuleFile; | |
wchar_t wchEscape; | |
DWORD dwFileSize; | |
DWORD dwBytesRead; | |
DWORD dwUnicodeLen; | |
int nWildcardLen; | |
int nDelimiterLen; | |
int nWordLen; | |
int nQuoteStartLen; | |
int nQuoteEndLen; | |
int nQuoteIncludeLen; | |
int nQuoteExcludeLen; | |
int nSkipStartLen; | |
int nSkipEndLen; | |
int nFoldStartLen; | |
int nFoldEndLen; | |
int nDelimitersLen; | |
int nRuleLen; | |
int nBlockLen; | |
int nBlockParsedLen; | |
int nLinesInBlock; | |
INT_PTR nExpandLen; | |
DWORD dwFlags; | |
DWORD dwFontStyle; | |
DWORD dwColor1; | |
DWORD dwColor2; | |
int nParentID; | |
int nRuleID; | |
BOOL bQuoteString; | |
BOOL bExactTitle; | |
xprintfW(wszFile, L"%s\\%s", wszCoderDir, lpSyntaxFile->wszSyntaxFileName); | |
if ((hFile=CreateFileWide(wszFile, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL)) == INVALID_HANDLE_VALUE) | |
return NULL; | |
if ((dwFileSize=GetFileSize(hFile, NULL)) != INVALID_FILE_SIZE) | |
{ | |
xmemset(&lpSyntaxFile->ftTimeStamp, 0, sizeof(FILETIME)); | |
GetFileTime(hFile, NULL, NULL, &lpSyntaxFile->ftTimeStamp); | |
if (dwFileSize >= 2) | |
{ | |
if (wszText=(wchar_t *)GlobalAlloc(GPTR, dwFileSize + 2)) | |
{ | |
if (ReadFile(hFile, wszText, dwFileSize, &dwBytesRead, NULL)) | |
{ | |
wpText=(const wchar_t *)wszText; | |
dwUnicodeLen=dwBytesRead / sizeof(wchar_t); | |
wszText[dwUnicodeLen++]=L'\0'; | |
if (wszText[0] == 0xFEFF) | |
{ | |
++wpText; | |
--dwUnicodeLen; | |
} | |
wpTextStart=wpText; | |
lpLoadSyntaxFile=lpSyntaxFile; | |
bSyntaxFileLoadError=FALSE; | |
//Set variable theme associated with syntax file | |
wpFileName=GetFileName(wszFile, -1); | |
if (!lpSyntaxFile->lpVarThemeLink) | |
lpVarStack=&lpVarThemeActive->hVarStack; | |
else | |
lpVarStack=&lpSyntaxFile->lpVarThemeLink->hVarStack; | |
if (lpSyntaxFile) | |
{ | |
SectionStart: | |
if (!SkipComment(&wpText)) goto FreeText; | |
if (*wpText == L'\r' || *wpText == L'\n') | |
{ | |
do | |
{ | |
++wpText; | |
} | |
while (*wpText == L'\r' || *wpText == L'\n'); | |
goto SectionStart; | |
} | |
wpSectionStart=wpText; | |
GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack); | |
if (!NextLine(&wpText)) goto FreeText; | |
if (!SkipComment(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
if (!xstrcmpiW(wszBuffer, L"Files:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpWildElement=NULL; | |
wpWildcard=NULL; | |
for (;;) | |
{ | |
//Wildcard | |
if ((nWildcardLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (!bQuoteString && wszBuffer[0] == L';') break; | |
if (lpSyntaxFile->bReserveCacheWildcard) break; | |
if (wpWildcard=(wchar_t *)GlobalAlloc(GPTR, (nWildcardLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpWildcard, wszBuffer, (nWildcardLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else goto SectionStart; | |
//Add to stack | |
if (lpWildElement=StackInsertWildcard(&lpSyntaxFile->hWildcardStack, nWildcardLen)) | |
{ | |
lpWildElement->wpWildcard=wpWildcard; | |
lpWildElement->nWildcardLen=nWildcardLen; | |
} | |
break; | |
} | |
if (!lpWildElement && wpWildcard) GlobalFree((HGLOBAL)wpWildcard); | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
//HighLight | |
else if (!xstrcmpiW(wszBuffer, L"Delimiters:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpDelimElement=NULL; | |
wpDelimiter=NULL; | |
dwFlags=AEHLF_MATCHCASE; | |
dwFontStyle=0; | |
dwColor1=(DWORD)-1; | |
dwColor2=(DWORD)-1; | |
nParentID=0; | |
for (;;) | |
{ | |
//Highlight flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
else goto SectionStart; | |
//Font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
else break; | |
//Color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor1=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor2=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Delimiter | |
if (nDelimiterLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (wpDelimiter=(wchar_t *)GlobalAlloc(GPTR, (nDelimiterLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpDelimiter, wszBuffer, (nDelimiterLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Parent ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nParentID=(int)xatoiW(wszBuffer, NULL); | |
} | |
//Add to stack | |
if (lpDelimElement=StackInsertDelimiter(&lpSyntaxFile->hDelimiterStack, nDelimiterLen)) | |
{ | |
lpDelimElement->wpDelimiter=wpDelimiter; | |
lpDelimElement->nDelimiterLen=nDelimiterLen; | |
lpDelimElement->dwFlags=dwFlags; | |
lpDelimElement->dwFontStyle=dwFontStyle; | |
lpDelimElement->dwColor1=dwColor1; | |
lpDelimElement->dwColor2=dwColor2; | |
lpDelimElement->nParentID=nParentID; | |
} | |
break; | |
} | |
if (!lpDelimElement && wpDelimiter) GlobalFree((HGLOBAL)wpDelimiter); | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Font:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
HDC hDC; | |
int nFontPointSize=0; | |
lpSyntaxFile->dwFontFlags=0; | |
lpSyntaxFile->lfFont.lfHeight=0; | |
lpSyntaxFile->lfFont.lfWidth=0; | |
lpSyntaxFile->lfFont.lfEscapement=0; | |
lpSyntaxFile->lfFont.lfOrientation=0; | |
lpSyntaxFile->lfFont.lfWeight=0; | |
lpSyntaxFile->lfFont.lfItalic=FALSE; | |
lpSyntaxFile->lfFont.lfUnderline=FALSE; | |
lpSyntaxFile->lfFont.lfStrikeOut=FALSE; | |
lpSyntaxFile->lfFont.lfCharSet=DEFAULT_CHARSET; | |
lpSyntaxFile->lfFont.lfOutPrecision=OUT_DEFAULT_PRECIS; | |
lpSyntaxFile->lfFont.lfClipPrecision=CLIP_DEFAULT_PRECIS; | |
lpSyntaxFile->lfFont.lfQuality=DEFAULT_QUALITY; | |
lpSyntaxFile->lfFont.lfPitchAndFamily=DEFAULT_PITCH; | |
lpSyntaxFile->lfFont.lfFaceName[0]=L'\0'; | |
//Font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFontStyle) | |
{ | |
lpSyntaxFile->dwFontFlags|=FF_FONTSTYLE; | |
lpSyntaxFile->lfFont.lfWeight=(dwFontStyle == AEHLS_FONTBOLD || dwFontStyle == AEHLS_FONTBOLDITALIC)?FW_BOLD:FW_NORMAL; | |
lpSyntaxFile->lfFont.lfItalic=(dwFontStyle == AEHLS_FONTITALIC || dwFontStyle == AEHLS_FONTBOLDITALIC)?TRUE:FALSE; | |
} | |
else if (wszBuffer[0] != L'0') break; | |
} | |
//Font size | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nFontPointSize=(int)xatoiW(wszBuffer, NULL); | |
if (nFontPointSize) | |
{ | |
if (hDC=GetDC(hMainWnd)) | |
{ | |
lpSyntaxFile->dwFontFlags|=FF_FONTSIZE; | |
lpSyntaxFile->lfFont.lfHeight=-MulDiv(nFontPointSize, GetDeviceCaps(hDC, LOGPIXELSY), 72); | |
ReleaseDC(hMainWnd, hDC); | |
} | |
} | |
else if (wszBuffer[0] != L'0') break; | |
} | |
//Face name | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwFontFlags|=FF_FONTFACE; | |
xstrcpynW(lpSyntaxFile->lfFont.lfFaceName, wszBuffer, LF_FACESIZE); | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Colors:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->aecColors.dwFlags=0; | |
//Basic text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crBasicText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_BASICTEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Basic bkgrnd color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crBasicBk=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_BASICBK; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Sel text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crSelText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_SELTEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Sel bkgrnd color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crSelBk=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_SELBK; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Line text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crActiveLineText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ACTIVELINETEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Line bkgrnd color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crActiveLineBk=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ACTIVELINEBK; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Line border color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crActiveLineBorder=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ACTIVELINEBORDER; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Alt line text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crAltLineText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ALTLINETEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Alt line bkgrnd color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crAltLineBk=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ALTLINEBK; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Alt border color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crAltLineBorder=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ALTLINEBORDER; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Column color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crActiveColumn=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_ACTIVECOLUMN; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Marker color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crColumnMarker=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_COLUMNMARKER; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Caret color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crCaret=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_CARET; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//URL color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crUrlText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_URLTEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active URL color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crUrlCursorText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_URLCURSORTEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Visit URL color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->aecColors.crUrlVisitText=GetColorFromStr(wszBuffer + 1, NULL); | |
lpSyntaxFile->aecColors.dwFlags|=AECLR_URLVISITTEXT; | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"BkImage:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
//BkImage file | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
xstrcpynW(lpSyntaxFile->wszBkImageFile, wszBuffer, BUFFER_SIZE); | |
} | |
//BkImage alpha transparency | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->nBkImageAlpha=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"AutoMark:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->dwAutoMarkFlags=AEHLF_MATCHCASE; | |
lpSyntaxFile->dwAutoMarkFontStyle=AEHLS_NONE; | |
lpSyntaxFile->dwAutoMarkTextColor=(DWORD)-1; | |
lpSyntaxFile->dwAutoMarkBkColor=(DWORD)-1; | |
//AutoMark flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwAutoMarkFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (lpSyntaxFile->dwAutoMarkFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
//AutoMark font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwAutoMarkFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
//AutoMark text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwAutoMarkTextColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//AutoMark background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwAutoMarkBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Quotes:") || | |
!xstrcmpiW(wszBuffer, L"QuotesRE:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpQuoteElement=NULL; | |
wpQuoteStart=NULL; | |
wpQuoteEnd=NULL; | |
wpQuoteInclude=NULL; | |
nQuoteIncludeLen=0; | |
wpQuoteExclude=NULL; | |
nQuoteExcludeLen=0; | |
wchEscape=0; | |
dwFlags=AEHLF_MATCHCASE; | |
dwFontStyle=0; | |
dwColor1=(DWORD)-1; | |
dwColor2=(DWORD)-1; | |
nParentID=0; | |
nRuleID=0; | |
for (;;) | |
{ | |
//Highlight flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
else goto SectionStart; | |
//Regular expression pattern, if quoted or font style, if number. | |
if (!(nQuoteStartLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack))) | |
break; | |
if (bQuoteString) | |
{ | |
dwFlags|=AEHLF_REGEXP; | |
//Pattern | |
if (wpQuoteStart=(wchar_t *)GlobalAlloc(GPTR, (nQuoteStartLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpQuoteStart, wszBuffer, (nQuoteStartLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
//Match map | |
if ((nQuoteEndLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (nExpandLen=ExpandVars(wszBuffer, nQuoteEndLen, NULL, 0, lpVarStack)) | |
if (wpQuoteEnd=(wchar_t *)GlobalAlloc(GPTR, nExpandLen * sizeof(wchar_t))) | |
nQuoteEndLen=(int)ExpandVars(wszBuffer, nQuoteEndLen, wpQuoteEnd, nExpandLen, lpVarStack); | |
} | |
else break; | |
} | |
else | |
{ | |
//Font style | |
dwFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
//Color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor1=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor2=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Quote start | |
if ((nQuoteStartLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpQuoteStart=(wchar_t *)GlobalAlloc(GPTR, (nQuoteStartLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpQuoteStart, wszBuffer, (nQuoteStartLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Quote end | |
if ((nQuoteEndLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpQuoteEnd=(wchar_t *)GlobalAlloc(GPTR, (nQuoteEndLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpQuoteEnd, wszBuffer, (nQuoteEndLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Escape | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack) || bQuoteString) | |
wchEscape=wszBuffer[0]; | |
else | |
break; | |
//Quote include | |
if ((nQuoteIncludeLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpQuoteInclude=(wchar_t *)GlobalAlloc(GPTR, (nQuoteIncludeLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpQuoteInclude, wszBuffer, (nQuoteIncludeLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Quote exclude | |
if ((nQuoteExcludeLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpQuoteExclude=(wchar_t *)GlobalAlloc(GPTR, (nQuoteExcludeLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpQuoteExclude, wszBuffer, (nQuoteExcludeLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
} | |
//Parent ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nParentID=(int)xatoiW(wszBuffer, NULL); | |
//Rule ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nRuleID=(int)xatoiW(wszBuffer, NULL); | |
} | |
} | |
//Add to stack | |
if (lpQuoteElement=StackInsertQuote(&lpSyntaxFile->hQuoteStack, nQuoteStartLen)) | |
{ | |
lpQuoteElement->wpQuoteStart=wpQuoteStart; | |
lpQuoteElement->nQuoteStartLen=nQuoteStartLen; | |
lpQuoteElement->wpQuoteEnd=wpQuoteEnd; | |
lpQuoteElement->nQuoteEndLen=nQuoteEndLen; | |
lpQuoteElement->wchEscape=wchEscape; | |
lpQuoteElement->wpQuoteInclude=wpQuoteInclude; | |
lpQuoteElement->nQuoteIncludeLen=nQuoteIncludeLen; | |
lpQuoteElement->wpQuoteExclude=wpQuoteExclude; | |
lpQuoteElement->nQuoteExcludeLen=nQuoteExcludeLen; | |
lpQuoteElement->dwFlags=dwFlags; | |
lpQuoteElement->dwFontStyle=dwFontStyle; | |
lpQuoteElement->dwColor1=dwColor1; | |
lpQuoteElement->dwColor2=dwColor2; | |
lpQuoteElement->nParentID=nParentID; | |
lpQuoteElement->nRuleID=nRuleID; | |
} | |
break; | |
} | |
if (!lpQuoteElement) | |
{ | |
if (wpQuoteStart) GlobalFree((HGLOBAL)wpQuoteStart); | |
if (wpQuoteEnd) GlobalFree((HGLOBAL)wpQuoteEnd); | |
if (wpQuoteInclude) GlobalFree((HGLOBAL)wpQuoteInclude); | |
if (wpQuoteExclude) GlobalFree((HGLOBAL)wpQuoteExclude); | |
} | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Words:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpWordElement=NULL; | |
wpWord=NULL; | |
dwFlags=AEHLF_MATCHCASE; | |
dwFontStyle=0; | |
dwColor1=(DWORD)-1; | |
dwColor2=(DWORD)-1; | |
nParentID=0; | |
for (;;) | |
{ | |
//Highlight flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
else goto SectionStart; | |
//Font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
else break; | |
//Color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor1=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor2=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Word | |
if (nWordLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (wpWord=(wchar_t *)GlobalAlloc(GPTR, (nWordLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpWord, wszBuffer, (nWordLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Parent ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nParentID=(int)xatoiW(wszBuffer, NULL); | |
} | |
//Add to stack | |
if (lpWordElement=StackInsertWord(&lpSyntaxFile->hWordStack, &lpSyntaxFile->hWordAlphaStack, &lpSyntaxFile->hWordOrderStack, wpWord, nWordLen)) | |
{ | |
lpWordElement->wpWord=wpWord; | |
lpWordElement->nWordLen=nWordLen; | |
lpWordElement->dwFlags=dwFlags; | |
lpWordElement->dwFontStyle=dwFontStyle; | |
lpWordElement->dwColor1=dwColor1; | |
lpWordElement->dwColor2=dwColor2; | |
lpWordElement->nParentID=nParentID; | |
} | |
break; | |
} | |
if (!lpWordElement && wpWord) GlobalFree((HGLOBAL)wpWord); | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
//CodeFold | |
else if (!xstrcmpiW(wszBuffer, L"FoldPanel:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->dwFoldPanelFirstBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelSecondBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelNormalFoldColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelActiveFoldColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelNormalNodeOpenBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelNormalNodeCloseBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelActiveNodeOpenBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelActiveNodeCloseBkColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelNormalNodeOpenSignColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelNormalNodeCloseSignColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelActiveNodeOpenSignColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldPanelActiveNodeCloseSignColor=(DWORD)-1; | |
//First background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelFirstBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Second background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelSecondBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Normal fold color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelNormalFoldColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active fold color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelActiveFoldColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Normal node open background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelNormalNodeOpenBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Normal node close background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelNormalNodeCloseBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active node open background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelActiveNodeOpenBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active node close background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelActiveNodeCloseBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Normal node open sign color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelNormalNodeOpenSignColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Normal node close sign color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelNormalNodeCloseSignColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active node open sign color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelActiveNodeOpenSignColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//Active node close sign color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldPanelActiveNodeCloseSignColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"FoldList:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->dwFoldListTextColor=(DWORD)-1; | |
lpSyntaxFile->dwFoldListBkColor=(DWORD)-1; | |
//List text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldListTextColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//List background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwFoldListBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"TagMark:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->dwTagMarkFlags=0; | |
lpSyntaxFile->dwTagMarkFontStyle=AEHLS_NONE; | |
lpSyntaxFile->dwTagMarkTextColor=(DWORD)-1; | |
lpSyntaxFile->dwTagMarkBkColor=(DWORD)-1; | |
//TagMark flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwTagMarkFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (lpSyntaxFile->dwTagMarkFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
//TagMark font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwTagMarkFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
//TagMark text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwTagMarkTextColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//TagMark background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwTagMarkBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Skips:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpSkipInfo=NULL; | |
wpSkipStart=NULL; | |
wpSkipEnd=NULL; | |
dwFlags=FIF_MATCHCASE; | |
for (;;) | |
{ | |
//Skip flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
else goto SectionStart; | |
//Skip start | |
if ((nSkipStartLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpSkipStart=(wchar_t *)GlobalAlloc(GPTR, (nSkipStartLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpSkipStart, wszBuffer, (nSkipStartLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Skip end | |
if ((nSkipEndLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpSkipEnd=(wchar_t *)GlobalAlloc(GPTR, (nSkipEndLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpSkipEnd, wszBuffer, (nSkipEndLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Escape | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack) || bQuoteString) | |
wchEscape=wszBuffer[0]; | |
else | |
break; | |
//Add to stack | |
if (lpSkipInfo=StackInsertSkipInfo(&lpSyntaxFile->hSkipStack)) | |
{ | |
lpSkipInfo->dwFlags=dwFlags; | |
if (!(lpSkipInfo->lpSkipStart=StackInsertSkipStart(&lpSyntaxFile->hSkipStartStack, lpSkipInfo, wpSkipStart, nSkipStartLen))) | |
goto FreeSkip; | |
if (dwFlags & FIF_REGEXPEND) | |
{ | |
lpSkipInfo->sregEnd.dwOptions=REO_MULTILINE|(dwFlags & FIF_MATCHCASE?REO_MATCHCASE:0); | |
lpSkipInfo->sregEnd.ref100=&lpSkipInfo->lpSkipStart->sregStart; | |
if (nSkipEndLen && !PatCompile(&lpSkipInfo->sregEnd, wpSkipEnd, wpSkipEnd + nSkipEndLen)) | |
{ | |
lpSkipInfo->sregEnd.first->dwFlags&=~REGF_ROOTANY; | |
nSkipEndLen=(int)lpSkipInfo->sregEnd.first->nGroupLen; | |
} | |
else | |
{ | |
xprintfW(wszMessage, GetLangStringW(wLangModule, STRID_REGEXP_COMPILEERROR), lpSyntaxFile->wszSyntaxFileName, nSkipEndLen, wpSkipEnd); | |
MessageBoxW(hMainWnd, wszMessage, wszPluginTitle, MB_OK|MB_ICONEXCLAMATION); | |
goto FreeSkip; | |
} | |
} | |
lpSkipInfo->wpSkipEnd=wpSkipEnd; | |
lpSkipInfo->nSkipEndLen=nSkipEndLen; | |
lpSkipInfo->wchEscape=wchEscape; | |
break; | |
FreeSkip: | |
StackDelete((stack **)&lpSyntaxFile->hSkipStack.first, (stack **)&lpSyntaxFile->hSkipStack.last, (stack *)lpSkipInfo); | |
lpSkipInfo=NULL; | |
} | |
break; | |
} | |
if (!lpSkipInfo) | |
{ | |
if (wpSkipStart) GlobalFree((HGLOBAL)wpSkipStart); | |
if (wpSkipEnd) GlobalFree((HGLOBAL)wpSkipEnd); | |
} | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Folds:")) | |
{ | |
for (;;) | |
{ | |
//Parse line | |
lpFoldInfo=NULL; | |
wpFoldStart=NULL; | |
wpFoldEnd=NULL; | |
wpFoldDelimiters=NULL; | |
wpRuleFile=NULL; | |
dwFlags=FIF_MATCHCASE; | |
dwFontStyle=0; | |
dwColor1=(DWORD)-1; | |
dwColor2=(DWORD)-1; | |
nParentID=0; | |
nRuleID=0; | |
wpLineStart=wpText; | |
for (;;) | |
{ | |
//Fold flags | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFlags=(DWORD)xatoiW(wszBuffer, NULL); | |
if (dwFlags == 0 && wszBuffer[0] != L'0') break; | |
} | |
else goto SectionStart; | |
//Font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
dwFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
else break; | |
//Color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor1=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
dwColor2=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
else break; | |
//Fold start | |
if ((nFoldStartLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpFoldStart=(wchar_t *)GlobalAlloc(GPTR, (nFoldStartLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpFoldStart, wszBuffer, (nFoldStartLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Fold end | |
if ((nFoldEndLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpFoldEnd=(wchar_t *)GlobalAlloc(GPTR, (nFoldEndLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpFoldEnd, wszBuffer, (nFoldEndLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Delimiters | |
if ((nDelimitersLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, &bQuoteString, lpVarStack)) || bQuoteString) | |
{ | |
if (wpFoldDelimiters=(wchar_t *)GlobalAlloc(GPTR, (nDelimitersLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpFoldDelimiters, wszBuffer, (nDelimitersLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
else break; | |
//Parent ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nParentID=(int)xatoiW(wszBuffer, NULL); | |
//Rule ID | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
nRuleID=(int)xatoiW(wszBuffer, NULL); | |
//Rule file | |
if ((nRuleLen=GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack))) | |
{ | |
if (wpRuleFile=(wchar_t *)GlobalAlloc(GPTR, (nRuleLen + 1) * sizeof(wchar_t))) | |
xmemcpy(wpRuleFile, wszBuffer, (nRuleLen + 1) * sizeof(wchar_t)); | |
else | |
break; | |
} | |
} | |
} | |
//Add to stack | |
if (lpFoldInfo=StackInsertFoldInfo(&lpSyntaxFile->hFoldStack)) | |
{ | |
if (dwFlags & FIF_XMLTAG) | |
{ | |
if (*wpFoldStart == L'<') | |
{ | |
if (nFoldStartLen == 1) | |
{ | |
if (!xstrcmpW(wpFoldEnd, L"</")) | |
dwFlags|=FIF_XMLNONAME_TWOTAG; | |
else if (!xstrcmpW(wpFoldEnd, L"/>")) | |
dwFlags|=FIF_XMLNONAME_ONETAG; | |
} | |
else if (nFoldEndLen > 0) | |
{ | |
if (!xstrcmpnW(wpFoldEnd, L"</", 2)) | |
dwFlags|=FIF_XMLNAMED_TWOTAG; | |
else if (wpFoldEnd[nFoldEndLen - 1] == L'>') | |
dwFlags|=FIF_XMLNAMED_ONETAG; | |
} | |
} | |
else if (nParentID) | |
{ | |
dwFlags|=FIF_XMLCHILD; | |
} | |
} | |
lpFoldInfo->dwFlags=dwFlags; | |
lpFoldInfo->wpFoldEnd=wpFoldEnd; | |
lpFoldInfo->nFoldEndLen=nFoldEndLen; | |
lpFoldInfo->wpDelimiters=wpFoldDelimiters; | |
lpFoldInfo->dwFontStyle=dwFontStyle; | |
lpFoldInfo->dwColor1=dwColor1; | |
lpFoldInfo->dwColor2=dwColor2; | |
lpFoldInfo->nParentID=nParentID; | |
lpFoldInfo->nRuleID=nRuleID; | |
lpFoldInfo->wpRuleFile=wpRuleFile; | |
lpFoldInfo->crSyntaxFileLine.cpMin=wpLineStart - wpTextStart; | |
lpFoldInfo->crSyntaxFileLine.cpMax=wpText - wpTextStart; | |
if (!(lpFoldInfo->lpFoldStart=StackInsertFoldStart(&lpSyntaxFile->hFoldStartStack, lpFoldInfo, wpFoldStart, nFoldStartLen))) | |
goto FreeFold; | |
if (dwFlags & FIF_REGEXPEND) | |
{ | |
lpFoldInfo->sregEnd.dwOptions=REO_MULTILINE|(dwFlags & FIF_MATCHCASE?REO_MATCHCASE:0); | |
lpFoldInfo->sregEnd.ref100=&lpFoldInfo->lpFoldStart->sregStart; | |
if (nFoldEndLen && !PatCompile(&lpFoldInfo->sregEnd, wpFoldEnd, wpFoldEnd + nFoldEndLen)) | |
{ | |
lpFoldInfo->sregEnd.first->dwFlags&=~REGF_ROOTANY; | |
lpFoldInfo->nFoldEndPointLen=(int)lpFoldInfo->sregEnd.first->nGroupLen; | |
} | |
else | |
{ | |
xprintfW(wszMessage, GetLangStringW(wLangModule, STRID_REGEXP_COMPILEERROR), lpSyntaxFile->wszSyntaxFileName, nFoldEndLen, wpFoldEnd); | |
MessageBoxW(hMainWnd, wszMessage, wszPluginTitle, MB_OK|MB_ICONEXCLAMATION); | |
goto FreeFold; | |
} | |
} | |
else lpFoldInfo->nFoldEndPointLen=nFoldEndLen; | |
if (dwFlags & FIF_REGEXPSTART) | |
lpSyntaxFile->hFoldStack.nCommonFirstChar=-1; | |
else if (lpSyntaxFile->hFoldStack.nCommonFirstChar != -1) | |
{ | |
if (!lpSyntaxFile->hFoldStack.nCommonFirstChar) | |
lpSyntaxFile->hFoldStack.nCommonFirstChar=*wpFoldStart; | |
else if ((wchar_t)lpSyntaxFile->hFoldStack.nCommonFirstChar != *lpFoldInfo->lpFoldStart->wpFoldStart) | |
lpSyntaxFile->hFoldStack.nCommonFirstChar=-1; | |
} | |
if (!(dwFlags & FIF_NOLISTFOLD)) | |
lpSyntaxFile->hFoldStack.bVisible=TRUE; | |
if (lpFoldInfo->wpRuleFile) | |
++lpSyntaxFile->hFoldStack.nFoldWithThemeCount; | |
break; | |
FreeFold: | |
StackDeleteFoldInfo(&lpSyntaxFile->hFoldStack, &lpSyntaxFile->hFoldStartStack, lpFoldInfo); | |
lpFoldInfo=NULL; | |
wpFoldStart=NULL; | |
wpFoldEnd=NULL; | |
wpFoldDelimiters=NULL; | |
} | |
break; | |
} | |
if (!lpFoldInfo) | |
{ | |
if (wpFoldStart) GlobalFree((HGLOBAL)wpFoldStart); | |
if (wpFoldEnd) GlobalFree((HGLOBAL)wpFoldEnd); | |
if (wpFoldDelimiters) GlobalFree((HGLOBAL)wpFoldDelimiters); | |
} | |
if (!NextLine(&wpText)) goto FreeText; | |
if (bSyntaxFileLoadError) goto FreeText; | |
} | |
} | |
//AutoComplete | |
else if (!xstrcmpiW(wszBuffer, L"CompleteList:")) | |
{ | |
//Parse line | |
for (;;) | |
{ | |
lpSyntaxFile->dwCompleteListFontStyle=0; | |
lpSyntaxFile->nCompleteListFontSize=0; | |
lpSyntaxFile->wszCompleteListFaceName[0]=L'\0'; | |
lpSyntaxFile->nCompleteListLineGap=0; | |
lpSyntaxFile->wszCompleteListBlockIcon[0]=L'\0'; | |
lpSyntaxFile->dwCompleteListBlockIconMargins=0; | |
lpSyntaxFile->wszCompleteListHlBaseIcon[0]=L'\0'; | |
lpSyntaxFile->dwCompleteListHlBaseIconMargins=0; | |
lpSyntaxFile->wszCompleteListDocWordIcon[0]=L'\0'; | |
lpSyntaxFile->dwCompleteListDocWordIconMargins=0; | |
lpSyntaxFile->dwCompleteListIcons=0; | |
lpSyntaxFile->dwCompleteListBasicTextColor=(DWORD)-1; | |
lpSyntaxFile->dwCompleteListBasicBkColor=(DWORD)-1; | |
lpSyntaxFile->dwCompleteListSelTextColor=(DWORD)-1; | |
lpSyntaxFile->dwCompleteListSelBkColor=(DWORD)-1; | |
//Font style | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->dwCompleteListFontStyle=(DWORD)xatoiW(wszBuffer, NULL); | |
} | |
//Font size | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->nCompleteListFontSize=(int)xatoiW(wszBuffer, NULL); | |
} | |
//Face name | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
xstrcpynW(lpSyntaxFile->wszCompleteListFaceName, wszBuffer, LF_FACESIZE); | |
} | |
//Line gap | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
lpSyntaxFile->nCompleteListLineGap=(int)xatoiW(wszBuffer, NULL); | |
} | |
//Block icon | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
xstrcpynW(lpSyntaxFile->wszCompleteListBlockIcon, wszBuffer, MAX_PATH); | |
if (*lpSyntaxFile->wszCompleteListBlockIcon) | |
lpSyntaxFile->dwCompleteListIcons|=BIT_BLOCK; | |
} | |
//Block icon margins | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
StrToArray(wszBuffer, &lpSyntaxFile->dwCompleteListBlockIconMargins, sizeof(DWORD), sizeof(WORD), NULL); | |
} | |
//HighLight base icon | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
xstrcpynW(lpSyntaxFile->wszCompleteListHlBaseIcon, wszBuffer, MAX_PATH); | |
if (*lpSyntaxFile->wszCompleteListHlBaseIcon) | |
lpSyntaxFile->dwCompleteListIcons|=BIT_HLBASE; | |
} | |
//HighLight base icon margins | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
StrToArray(wszBuffer, &lpSyntaxFile->dwCompleteListHlBaseIconMargins, sizeof(DWORD), sizeof(WORD), NULL); | |
} | |
//Document word icon | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
xstrcpynW(lpSyntaxFile->wszCompleteListDocWordIcon, wszBuffer, MAX_PATH); | |
if (*lpSyntaxFile->wszCompleteListDocWordIcon) | |
lpSyntaxFile->dwCompleteListIcons|=BIT_DOCWORD; | |
} | |
//Document word icon margins | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
StrToArray(wszBuffer, &lpSyntaxFile->dwCompleteListDocWordIconMargins, sizeof(DWORD), sizeof(WORD), NULL); | |
} | |
//List basic text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwCompleteListBasicTextColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//List basic background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwCompleteListBasicBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//List sel text color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwCompleteListSelTextColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
//List sel background color | |
if (GetWord(wpText, wszBuffer, BUFFER_SIZE, &wpText, NULL, lpVarStack)) | |
{ | |
if (*wszBuffer == L'#') | |
{ | |
lpSyntaxFile->dwCompleteListSelBkColor=GetColorFromStr(wszBuffer + 1, NULL); | |
} | |
else if (*wszBuffer != L'0') break; | |
} | |
break; | |
} | |
} | |
else if (!xstrcmpiW(wszBuffer, L"Blocks:")) | |
{ | |
BLOCKINFO *lpBlockMaster; | |
BLOCKINFO *lpBlockInfo; | |
BLOCKINFOHANDLE *lpBlockInfoHandle; | |
TITLEINFO *lpTitleInfo; | |
STACKREGROUP *sregTitle; | |
const wchar_t *wpTitleBegin; | |
wchar_t *wszTitle; | |
const wchar_t *wpBlockBegin; | |
const wchar_t *wpBlockEnd; | |
wchar_t *wszBlockParsed; | |
STACKTITLE hTitleStack; | |
HSTACK hHotSpotStack; | |
DWORD dwTitleFlags; | |
int nTitleLen; | |
while (*wpText) | |
{ | |
lpBlockMaster=NULL; | |
lpBlockInfo=NULL; | |
lpTitleInfo=NULL; | |
sregTitle=NULL; | |
wpTitleBegin=NULL; | |
wszTitle=NULL; | |
wszBlockParsed=NULL; | |
hTitleStack.first=0; | |
hTitleStack.last=0; | |
hHotSpotStack.first=0; | |
hHotSpotStack.last=0; | |
dwTitleFlags=0; | |
bExactTitle=-1; | |
//Title | |
while (*wpText) | |
{ | |
if (*wpText == L'$') | |
{ | |
if (*++wpText == L';' || *wpText == L'#') | |
{ | |
//Skip comment | |
if (!NextLine(&wpText)) | |
break; | |
continue; | |
} | |
if (*wpText == L'(') | |
{ | |
dwTitleFlags=(DWORD)xatoiW(wpText + 1, &wpText); | |
if (*wpText == L')') | |
++wpText; | |
else | |
break; | |
} | |
if (*wpText == L'~' || *wpText == L'=') | |
{ | |
if (*wpText == L'~') | |
bExactTitle=FALSE; | |
else | |
bExactTitle=TRUE; | |
wpTitleBegin=++wpText; | |
while (*wpText != L' ' && *wpText != L'\t' && *wpText != L'\r' && *wpText != L'\0') ++wpText; | |
nTitleLen=(int)(wpText - wpTitleBegin); | |
if (nTitleLen) | |
{ | |
if (wszTitle=(wchar_t *)GlobalAlloc(GPTR, (nTitleLen + 1) * sizeof(wchar_t))) | |
{ | |
xmemcpy(wszTitle, wpTitleBegin, nTitleLen * sizeof(wchar_t)); | |
wszTitle[nTitleLen]=L'\0'; | |
if (lpTitleInfo=StackInsertTitle(&hTitleStack)) | |
{ | |
if (bExactTitle && (dwTitleFlags & TF_REGEXP)) | |
{ | |
if (sregTitle=(STACKREGROUP *)GlobalAlloc(GPTR, sizeof(STACKREGROUP))) | |
{ | |
sregTitle->dwOptions=REO_MULTILINE; | |
if (bCompleteCaseSensitive) | |
sregTitle->dwOptions|=REO_MATCHCASE; | |
if (dwTitleFlags & TF_FORCECASESENSITIVE) | |
sregTitle->dwOptions|=REO_MATCHCASE; | |
else if (dwTitleFlags & TF_FORCECASEINSENSITIVE) | |
sregTitle->dwOptions&=~REO_MATCHCASE; | |
if (PatCompile(sregTitle, wszTitle, wszTitle + nTitleLen)) | |
{ | |
xprintfW(wszMessage, GetLangStringW(wLangModule, STRID_REGEXP_COMPILEERROR), lpSyntaxFile->wszSyntaxFileName, nTitleLen, wszTitle); | |
MessageBoxW(hMainWnd, wszMessage, wszPluginTitle, MB_OK|MB_ICONEXCLAMATION); | |
goto FreeBlock; | |
} | |
//sregTitle->first->dwFlags&=~REGF_ROOTANY; | |
lpTitleInfo->sregTitle=sregTitle; | |
sregTitle=NULL; | |
} | |
else goto FreeBlock; | |
} | |
lpTitleInfo->wpTitle=wszTitle; | |
lpTitleInfo->nTitleLen=nTitleLen; | |
lpTitleInfo->dwTitleFlags=dwTitleFlags; | |
lpTitleInfo->bExactTitle=bExactTitle; | |
} | |
else break; | |
wszTitle=NULL; | |
} | |
else break; | |
} | |
} | |
else break; | |
} | |
if (*wpText == L'\r') | |
{ | |
NextLine(&wpText); | |
break; | |
} | |
++wpText; | |
} | |
//Title block | |
if (*wpText && hTitleStack.first) | |
{ | |
wpBlockBegin=wpText; | |
while (*wpText) | |
{ | |
if (*wpText == L'$') | |
{ | |
//Find next abbreviation definition | |
if (*++wpText == L'~' || *wpText == L'=' || *wpText == L'(') | |
{ | |
--wpText; | |
break; | |
} | |
} | |
if (!NextLine(&wpText)) | |
break; | |
} | |
wpBlockEnd=wpText; | |
nBlockLen=(int)(wpBlockEnd - wpBlockBegin); | |
if (nBlockParsedLen=ParseBlock(lpSyntaxFile, &hHotSpotStack, wpBlockBegin, nBlockLen, NULL, NULL)) | |
{ | |
if (wszBlockParsed=(wchar_t *)GlobalAlloc(GPTR, nBlockParsedLen * sizeof(wchar_t))) | |
{ | |
nBlockParsedLen=ParseBlock(lpSyntaxFile, &hHotSpotStack, wpBlockBegin, nBlockLen, wszBlockParsed, &nLinesInBlock); | |
if (nBlockParsedLen > 0 && wszBlockParsed[nBlockParsedLen - 1] == L'\r') wszBlockParsed[--nBlockParsedLen]=L'\0'; | |
if (nBlockParsedLen > 0 && wszBlockParsed[nBlockParsedLen - 1] == L'\r') wszBlockParsed[--nBlockParsedLen]=L'\0'; | |
for (lpTitleInfo=(TITLEINFO *)hTitleStack.first; lpTitleInfo; lpTitleInfo=lpTitleInfo->next) | |
{ | |
if (lpTitleInfo->bExactTitle) | |
lpBlockInfo=StackInsertExactBlock(&lpSyntaxFile->hExactBlockStack); | |
else | |
lpBlockInfo=StackInsertBlock(&lpSyntaxFile->hBlockStack, &lpSyntaxFile->hBlockOrderStack, lpTitleInfo->wpTitle); | |
if (lpBlockInfo) | |
{ | |
lpBlockInfo->wpTitle=lpTitleInfo->wpTitle; | |
lpBlockInfo->nTitleLen=lpTitleInfo->nTitleLen; | |
lpBlockInfo->dwTitleFlags=lpTitleInfo->dwTitleFlags; | |
lpBlockInfo->bExactTitle=lpTitleInfo->bExactTitle; | |
lpBlockInfo->sregTitle=lpTitleInfo->sregTitle; | |
if (lpTitleInfo == (TITLEINFO *)hTitleStack.first) | |
{ | |
lpBlockMaster=lpBlockInfo; | |
lpBlockInfo->master=NULL; | |
lpBlockInfo->wpBlock=wszBlockParsed; | |
lpBlockInfo->nBlockLen=nBlockParsedLen; | |
lpBlockInfo->nLinesInBlock=nLinesInBlock; | |
lpBlockInfo->hHotSpotStack=hHotSpotStack; | |
} | |
else lpBlockInfo->master=lpBlockMaster; | |
if (hTitleStack.first != hTitleStack.last) | |
{ | |
//Multiple abbreviations | |
if (!StackInsertIndex((stack **)&lpBlockMaster->firstHandle, (stack **)&lpBlockMaster->lastHandle, (stack **)&lpBlockInfoHandle, -1, sizeof(BLOCKINFOHANDLE))) | |
{ | |
lpBlockInfoHandle->lpBlockInfo=lpBlockInfo; | |
} | |
} | |
} | |
} | |
wszBlockParsed=NULL; | |
} | |
} | |
} | |
//Free | |
FreeBlock: | |
if (!lpBlockInfo) | |
StackFreeHotSpot(&hHotSpotStack); | |
StackFreeTitle(&hTitleStack); | |
if (sregTitle) GlobalFree((HGLOBAL)sregTitle); | |
if (wszTitle) GlobalFree((HGLOBAL)wszTitle); | |
if (wszBlockParsed) GlobalFree((HGLOBAL)wszBlockParsed); | |
} | |
} | |
else | |
{ | |
xprintfW(wszMessage, GetLangStringW(wLangModule, STRID_UNKNOWNSECTION), lpSyntaxFile->wszSyntaxFileName, wpSectionStart - wpTextStart, wszBuffer); | |
MessageBoxW(hMainWnd, wszMessage, wszPluginTitle, MB_OK|MB_ICONEXCLAMATION); | |
goto FreeText; | |
} | |
goto SectionStart; | |
} | |
lpLoadSyntaxFile=NULL; | |
} | |
FreeText: | |
GlobalFree((HGLOBAL)wszText); | |
} | |
} | |
} | |
CloseHandle(hFile); | |
return lpSyntaxFile; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment