BOOL LoadIDs(LPCTSTR szFilename) { BOOL bSuccess = FALSE; FILE* pFile = NULL; if ( _tfopen_s( &pFile, szFilename, _T("rb") ) == 0 ) { for (;;) { CStringA sLine; CHAR* res = fgets( sLine.GetBuffer( 4096 ), 4096, pFile ); sLine.ReleaseBuffer(); if ( ! res ) break; // End of file sLine.Trim( " \t\r\n" ); if ( sLine.IsEmpty() || sLine.GetAt( 0 ) != '#' ) continue; // Skip empty lines int nPos = sLine.FindOneOf( " \t" ); if ( nPos == -1 || sLine.Left( nPos ) != "#define" ) continue; // Skip unknown line sLine = sLine.Mid( nPos + 1 ).TrimLeft( " \t" ); nPos = sLine.FindOneOf( " \t" ); if ( nPos == -1 ) continue; // Skip unknown line CStringA sID = sLine.Left( nPos ); sLine = sLine.Mid( nPos + 1 ).TrimLeft( " \t" ); UINT nID = 0; if ( sLine.Left( 2 ).CompareNoCase( "0x" ) == 0 ) { if ( sscanf_s( sLine, "%x", &nID ) != 1 ) continue; // Skip unknown line } else { if ( sscanf_s( sLine, "%u", &nID ) != 1 ) continue; // Skip unknown line } if ( g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID %hs\n"), sID ); continue; } g_oIDs.SetAt( sID, nID ); bSuccess = TRUE; } fclose( pFile ); } return bSuccess; }
BOOL LoadResources(LPCTSTR szFilename) { FILE* pFile = NULL; if ( _tfopen_s( &pFile, szFilename, _T("rb") ) == 0 ) { CStringA sID; for ( States nState = stFile ; nState != stError ; ) { CStringA sLine; CHAR* res = fgets( sLine.GetBuffer( 4096 ), 4096, pFile ); sLine.ReleaseBuffer(); if ( ! res ) { if ( nState != stFile ) _tprintf( _T("Error: Unexpected end of file\n") ); break; // End of file } sLine.Trim( ", \t\r\n" ); if ( sLine.IsEmpty() || sLine.GetAt( 0 ) == '/' || sLine.GetAt( 0 ) == '#' ) continue; // Skip empty line, comment and pragma switch ( nState ) { case stFile: if ( sLine == "STRINGTABLE" ) nState = stStringTable; else if ( sLine == "GUIDELINES DESIGNINFO" ) nState = stGuidelines; else { int nPos = sLine.Find( " DIALOG" ); // DIALOG or DIALOGEX if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" inside DIALOG\n"), sID ); return 2; } if ( g_oDialogs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" inside DIALOG\n"), sID ); return 2; } g_oDialogs.SetAt( sID, nID ); } nPos = sLine.Find( " ICON " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of ICON\n"), sID ); return 2; } if ( g_oIcons.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of ICON\n"), sID ); return 2; } g_oIcons.SetAt( sID, nID ); } nPos = sLine.Find( " HTML " ); if ( nPos == -1 ) nPos = sLine.Find( " GZIP " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of HTML\n"), sID ); return 2; } if ( g_oHtmls.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of HTML\n"), sID ); return 2; } g_oHtmls.SetAt( sID, nID ); } nPos = sLine.Find( " BITMAP " ); if ( nPos == -1 ) nPos = sLine.Find( " JPEG " ); if ( nPos == -1 ) nPos = sLine.Find( " PNG " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of BITMAP\n"), sID ); return 2; } if ( g_oBitmaps.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of BITMAP\n"), sID ); return 2; } g_oBitmaps.SetAt( sID, nID ); } } break; case stGuidelines: if ( sLine == "BEGIN" ) nState = stGuidelinesContent; else { _tprintf( _T("Error: BEGIN not found after GUIDELINES DESIGNINFO\n") ); return 2; } break; case stGuidelinesContent: if ( sLine == "END" ) nState = stFile; else if ( sLine.Right( 6 ) == "DIALOG" ) { nState = stGuidelinesDialog; CStringA sID = sLine.SpanExcluding( "," ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } if ( g_oGuidelines.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } if ( ! g_oDialogs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Orphan dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } g_oGuidelines.SetAt( sID, nID ); } else { _tprintf( _T("Error: Unknown line \"%hs\" inside GUIDELINES\n"), sLine ); return 2; } break; case stGuidelinesDialog: if ( sLine == "END" ) nState = stGuidelinesContent; break; case stStringTable: if ( sLine == "BEGIN" ) nState = stContent; else { _tprintf( _T("Error: BEGIN not found after STRINGTABLE\n") ); return 2; } break; case stContent: if ( sLine == "END" ) nState = stFile; else { int nPos = sLine.FindOneOf( ", \t" ); if ( nPos != -1 ) { if ( ProcessString( sLine.Left( nPos ), sLine.Mid( nPos + 1 ).TrimLeft( ", \t" ) ) ) nState = stContent; else nState = stError; } else { sID = sLine; nState = stString; } } break; case stString: if ( ProcessString( sID, sLine ) ) nState = stContent; else nState = stError; sID.Empty(); break; } } fclose( pFile ); } return TRUE; }