Object::Pointer Expressions::ConvertArgument(const std::string& arg, bool result) { if (!result) { return Object::Pointer(); } else if (arg.length() == 0) { ObjectString::Pointer var(new ObjectString(arg)); return var; } else if (arg.at(0) == '\'' && arg.at(arg.size() - 1) == '\'') { ObjectString::Pointer var(new ObjectString(UnEscapeString(arg.substr(1, arg.size() - 2)))); return var; } else if ("true" == arg) { ObjectBool::Pointer var(new ObjectBool(true)); return var; } else if ("false" == arg) { ObjectBool::Pointer var(new ObjectBool(false)); return var; } else if (arg.find('.') != std::string::npos) { try { double num = Poco::NumberParser::parseFloat(arg); ObjectFloat::Pointer var(new ObjectFloat((float) num)); return var; } catch (Poco::SyntaxException) { ObjectString::Pointer var(new ObjectString(arg)); return var; } } else { try { int num = Poco::NumberParser::parse(arg); ObjectInt::Pointer var(new ObjectInt(num)); return var; } catch (Poco::SyntaxException e) { ObjectString::Pointer var(new ObjectString(arg)); return var; } } }
static int FBALocaliseParseFile(TCHAR* pszFilename) { LocaliseResourceInfo CurrentResource; wchar_t wszBuffer[5120]; int nTemplateVersion = 0; wchar_t szLine[5120]; wchar_t* s; wchar_t* t; int nLen; int nLine = 0; int nInside = 0; TCHAR* nResourceType = 0; if (pszFilename == 0 || _tcslen(pszFilename) == 0) { return -1; } memset(&CurrentResource, 0, sizeof(LocaliseResourceInfo)); FILE* h = _tfopen(pszFilename, _T("rb")); if (h == NULL) { return 1; } { unsigned char szBOM[4] = { 0, }; fread(szBOM, 1, sizeof(szBOM), h); // See if it's a UTF-8 file if (szBOM[0] == 0xEF && szBOM[1] == 0xBB && szBOM[2] == 0xBF) { nFBACodepage = CP_UTF8; } #ifdef _UNICODE // See if it's a UTF-16 file if (szBOM[0] == 0xFF && szBOM[1] == 0xFE) { nFBACodepage = CP_WINUNICODE; fseek(h, 2, SEEK_SET); } #endif } if (nFBACodepage != CP_WINUNICODE) { fclose(h); h = _tfopen(pszFilename, _T("rt")); if (h == NULL) { return 1; } if (nFBACodepage == CP_UTF8) { fseek(h, 3, SEEK_SET); } } while (1) { char szTemp[1024]; #ifdef _UNICODE if (nFBACodepage != CP_WINUNICODE) { #endif if (fgets(szTemp, sizeof(szTemp), h) == NULL) { break; } MultiByteToWideChar(nFBACodepage, 0, szTemp, -1, szLine, sizeof(szLine) / sizeof(TCHAR)); #ifdef _UNICODE } else { if (_fgetts(szLine, sizeof(szLine), h) == NULL) { break; } } #endif nLine++; nLen = wcslen(szLine); // Get rid of the linefeed at the end while (szLine[nLen - 1] == 0x0A || szLine[nLen - 1] == 0x0D) { szLine[nLen - 1] = 0; nLen--; } s = szLine; // Start parsing WSKIP_WS(s); if (s[0] == _T('/') && s[1] == _T('/')) { // Comment continue; } if ((t = LabelCheckW(s, L"version")) != 0) { // Version s = t; WSKIP_WS(s); nTemplateVersion = wcstol(s, &t, 0); if (s != t) { if (nTemplateVersion != nBurnVer) { break; } } #ifdef PRINT_TRANSLATION_INFO dprintf(_T("version\n"), nTemplateVersion); #endif s = t; continue; } if ((t = LabelCheckW(s, L"codepage")) != 0) { // Set codepage s = t; WSKIP_WS(s); nFBACodepage = wcstol(s, &t, 0); #ifdef PRINT_TRANSLATION_INFO dprintf(_T("codepage\n"), nFBACodepage); #endif s = t; continue; } if ((t = LabelCheckW(s, L"menu")) != 0) { s = t; nResourceType = RT_MENU; WSKIP_WS(s); unsigned int nID = wcstol(s, &t, 0); #ifdef PRINT_TRANSLATION_INFO dprintf(_T("menu %i\n"), nID); #endif s = t; WSKIP_WS(s); if (nInside) { FBALocaliseError(pszFilename, nLine, _T("missing closing bracket"), NULL); break; } if (*s != _T('{')) { FBALocaliseError(pszFilename, nLine, _T("missing opening bracket"), NULL); break; } nInside = 1; CurrentResource.nID = nID; continue; } if ((t = LabelCheckW(s, L"dialog")) != 0) { // Add new resource s = t; nResourceType = RT_DIALOG; WSKIP_WS(s); unsigned int nID = wcstol(s, &t, 0); #ifdef PRINT_TRANSLATION_INFO dprintf(_T("dialog %i\n"), nID); #endif s = t; // Read dialog caption wchar_t* szQuote = NULL; wchar_t* szEnd = NULL; QuoteReadW(&szQuote, &szEnd, s); s = szEnd; WSKIP_WS(s); if (nInside) { FBALocaliseError(pszFilename, nLine, _T("missing closing bracket"), NULL); break; } if (*s != L'{') { FBALocaliseError(pszFilename, nLine, _T("missing opening bracket"), NULL); break; } nInside = 1; CurrentResource.nID = nID; if (wcslen(szQuote)) { memcpy(CurrentResource.szCaption, szQuote, QUOTE_MAX * sizeof(TCHAR)); } continue; } if ((t = LabelCheckW(s, L"string")) != 0) { s = t; if (nInside) { FBALocaliseError(pszFilename, nLine, _T("missing closing bracket"), NULL); break; } WSKIP_WS(s); unsigned int nID = wcstol(s, &t, 0); s = t; // Read dialog caption WFIND_QT(s); s++; wchar_t* szQuote = s; WFIND_QT(s); wchar_t* szEnd = s; if (nID < nMaxResources) { #ifdef PRINT_TRANSLATION_INFO { TCHAR szFormat[256]; _stprintf(szFormat, _T("string %%5i \"%%.%ils\"\n"), szEnd - szQuote); dprintf(szFormat, nID, szQuote); } #endif if (szEnd - szQuote > 0) { UnEscapeString(wszBuffer, szQuote, szEnd - szQuote); FBAResourceInfo[nID].nResourceFlags = RES_DEALLOCATE; #ifdef _UNICODE FBAResourceInfo[nID].pResourceTranslation = malloc((wcslen(wszBuffer) + 1) * sizeof(wchar_t)); wcscpy((wchar_t*)FBAResourceInfo[nID].pResourceTranslation, wszBuffer); #else { char szStringBuffer[5120]; memset(szStringBuffer, 0, sizeof(szStringBuffer)); WideCharToMultiByte(CP_ACP, 0, wszBuffer, -1, szStringBuffer, 5120, NULL, NULL); FBAResourceInfo[nID].pResourceTranslation = malloc((strlen(szStringBuffer) + 1)); strcpy((char*)FBAResourceInfo[nID].pResourceTranslation, szStringBuffer); } #endif } } } int n = wcstol(s, &t, 0); bool bPopup = false; if (t == s) { t = LabelCheckW(s, L"popup"); bPopup = true; } if (t && t != s) { // New control if (nInside == 0) { FBALocaliseError(pszFilename, nLine, _T("rogue control statement"), szLine); break; } s = t; n = wcstol(s, &t, 0); // Link a new control info structure if (n < 256) { s = t; // Read option name wchar_t* szQuote = NULL; wchar_t* szEnd = NULL; if (QuoteReadW(&szQuote, &szEnd, s)) { FBALocaliseError(pszFilename, nLine, _T("control name omitted"), szLine); break; } s = szEnd; if (bPopup) { WSKIP_WS(s); if (*s != L'{') { FBALocaliseError(pszFilename, nLine, _T("missing opening bracket"), NULL); break; } nInside++; } if (wcslen(szQuote)) { if (CurrentResource.pControlInfo[n] == NULL) { CurrentResource.pControlInfo[n] = (LocaliseControlInfo*)malloc(sizeof(LocaliseControlInfo)); } memset(CurrentResource.pControlInfo[n], 0, sizeof(LocaliseControlInfo)); memcpy(CurrentResource.pControlInfo[n]->szCaption, szQuote, QUOTE_MAX * sizeof(TCHAR)); } // dprintf(_T(" - %ls\n"), pCurrentResource->pControlInfo[n]->szCaption); } continue; } WSKIP_WS(s); if (*s == L'}') { if (nInside == 0) { FBALocaliseError(pszFilename, nLine, _T("rogue closing bracket"), NULL); break; } nInside--; if (nInside == 0) { if (CurrentResource.nID < nMaxResources) { if (nResourceType == RT_MENU) { MENUTEMPLATE* pTemplate; pTemplate = (MENUTEMPLATE*)LoadResource(hAppInst, FindResource(hAppInst, MAKEINTRESOURCE(CurrentResource.nID), RT_MENU)); if (LockResource((HGLOBAL)pTemplate)) { if (((MENUITEMTEMPLATEHEADER*)pTemplate)->versionNumber == 0) { // Translate the structure FBAResourceInfo[CurrentResource.nID].pResourceTranslation = TranslateMenuTemplate((MENUTEMPLATE*)pTemplate, &CurrentResource); FBAResourceInfo[CurrentResource.nID].nResourceFlags = RES_DEALLOCATE; } } } if (nResourceType == RT_DIALOG) { LPCDLGTEMPLATE pTemplate; pTemplate = (LPCDLGTEMPLATE)LoadResource(hAppInst, FindResource(hAppInst, MAKEINTRESOURCE(CurrentResource.nID), RT_DIALOG)); if (LockResource((HGLOBAL)pTemplate)) { if (((DLGTEMPLATEEX*)pTemplate)->signature == 0xFFFF && ((DLGTEMPLATEEX*)pTemplate)->dlgVer == 1) { // Translate the structure FBAResourceInfo[CurrentResource.nID].pResourceTranslation = TranslateDlgTemplateEx((DLGTEMPLATEEX*)pTemplate, &CurrentResource); FBAResourceInfo[CurrentResource.nID].nResourceFlags = RES_DEALLOCATE; } } } } for (int i = 0; i < 1024; i++) { free(CurrentResource.pControlInfo[i]); } memset(&CurrentResource, 0, sizeof(LocaliseResourceInfo)); } } // Line isn't (part of) a valid cheat #if 0 if (*s) { FBALocaliseError(pszFilename, nLine, _T("rogue line"), szLine); break; } #endif } for (int i = 0; i < 1024; i++) { free(CurrentResource.pControlInfo[i]); } if (h) { fclose(h); } if (nTemplateVersion != nBurnVer) { if (nTemplateVersion == 0) { return -1; } return -2; } return 0; }