CFSVar CJSONReader::Read() { m_iCollectData=1; GetChar(true); CFSVar Data=ReadVal(""); if (m_cCh) throw CJSONException(FSTSTR("Partially parsed file")); return Data; }
CFSVar CJSONReader::ReadVal(const CFSAString &szKeyPath) { OnValReadStart(szKeyPath); CFSVar Data; if (m_cCh=='[') { Data.Cast(CFSVar::VAR_ARRAY); GetChar(true); INTPTR ipPos=0; for (;;) { if (m_cCh==0) { throw CJSONException(FSTSTR("Unexpetcted EOF")); } else if (m_cCh==']') { GetChar(true); break; } else if (ipPos>0) { if (m_cCh==',') { GetChar(true); } else { throw CJSONException(FSTSTR("Missing ',' in array")); } } CFSAString szKey; szKey.Format("%zd", ipPos); CFSVar Data1=ReadVal(szKeyPath+"/"+szKey); if (m_iCollectData>0) { Data[ipPos]=Data1; } ipPos++; } } else if (m_cCh=='{') { Data.Cast(CFSVar::VAR_MAP); GetChar(true); INTPTR ipPos=0; for (;;) { if (m_cCh==0) { throw CJSONException(FSTSTR("Unexpetcted EOF")); } else if (m_cCh=='}') { GetChar(true); break; } else if (ipPos>0) { if (m_cCh==',') { GetChar(true); } else { throw CJSONException(FSTSTR("Missing ',' in map")); } } CFSAString szKey; if (m_cCh=='\"' || m_cCh=='\'') { szKey=ReadString(); } else if (FSIsLetter(m_cCh)) { szKey=ReadText(); } else { throw CJSONException(FSTSTR("Expected key")); } if (m_cCh==':') { GetChar(true); } else { throw CJSONException(FSTSTR("Expected ':'")); } CFSVar Data1=ReadVal(szKeyPath+"/"+szKey); if (m_iCollectData>0) { Data[szKey]=Data1; } ipPos++; } } else if (m_cCh=='\"' || m_cCh=='\'') { Data=ReadString(); } else if ((m_cCh>='0' && m_cCh<='9') || FSStrChr("-+.", m_cCh)) { Data=ReadNumber(); } else if (FSIsLetter(m_cCh)) { Data=ReadConst(); } else if (!m_cCh) { } else { throw CJSONException(FSTSTR("Unknown value type")); } OnValReadEnd(szKeyPath, Data); return Data; }
static void VCR_TraceEvents() { int iEvent = 0; VCREvent event; g_pTrace = g_pVCR->GetVCRTraceInterface(); while( g_pVCR->GetMode() == VCR_Playback ) { ++iEvent; printf("%5d - ", iEvent); event = g_pTrace->ReadEvent(); switch(event) { case VCREvent_Sys_FloatTime: { double ret; g_pTrace->Read(&ret, sizeof(ret)); printf("Sys_FloatTime: %f\n", ret); } break; case VCREvent_recvfrom: { int ret; char buf[8192]; g_pTrace->Read(&ret, sizeof(ret)); assert(ret < (int)sizeof(buf)); if(ret == SOCKET_ERROR) { int err; ReadVal(err); printf("recvfrom: %d (error %s)\n", ret, GetWMessageName(g_WinsockMessages, sizeof(g_WinsockMessages)/sizeof(g_WinsockMessages[0]), err)); } else { printf("recvfrom: %d\n", ret); g_pTrace->Read(buf, ret); } } break; case VCREvent_SyncToken: { char len; char buf[256]; g_pTrace->Read(&len, 1); g_pTrace->Read(buf, len); buf[len] = 0; printf("SyncToken: %s\n", buf); } break; case VCREvent_GetCursorPos: { POINT pt; ReadVal(pt); printf("GetCursorPos: (%d, %d)\n", pt.x, pt.y); } break; case VCREvent_SetCursorPos: { int x, y; g_pTrace->Read(&x, sizeof(x)); g_pTrace->Read(&y, sizeof(y)); printf("SetCursorPos: (%d, %d)\n", x, y); } break; case VCREvent_ScreenToClient: { POINT pt; ReadVal(pt); printf("ScreenToClient: (%d, %d)\n", pt.x, pt.y); } break; case VCREvent_Cmd_Exec: { int len; char *f; g_pTrace->Read(&len, sizeof(len)); if(len != -1) { f = (char*)malloc(len); g_pTrace->Read(f, len); } printf("Cmd_Exec: %d\n", len); } break; case VCREvent_CmdLine: { int len; char str[8192]; g_pTrace->Read(&len, sizeof(len)); assert(len < sizeof(str)); g_pTrace->Read(str, len); printf("CmdLine: %s\n", str); } break; case VCREvent_RegOpenKeyEx: { long ret; ReadVal(ret); printf("RegOpenKeyEx: %d\n", ret); } break; case VCREvent_RegSetValueEx: { long ret; ReadVal(ret); printf("RegSetValueEx: %d\n", ret); } break; case VCREvent_RegQueryValueEx: { long ret; unsigned long type, cbData; char dummy; ReadVal(ret); ReadVal(type); ReadVal(cbData); while(cbData) { ReadVal(dummy); cbData--; } printf("RegQueryValueEx\n"); } break; case VCREvent_RegCreateKeyEx: { long ret; ReadVal(ret); printf("RegCreateKeyEx: %d\n", ret); } break; case VCREvent_RegCloseKey: { printf("VCREvent_RegCloseKey"); } break; case VCREvent_PeekMessage: { MSG msg; int valid; g_pTrace->Read(&valid, sizeof(valid)); if(valid) { g_pTrace->Read(&msg, sizeof(MSG)); } printf("PeekMessage - msg: %s, wParam: %x, lParam: %x\n", GetWMessageName(g_WMessages, sizeof(g_WMessages)/sizeof(g_WMessages[0]), msg.message), msg.wParam, msg.lParam); } break; case VCREvent_GameMsg: { char valid; g_pTrace->Read( &valid, sizeof(valid) ); if ( valid ) { UINT uMsg; WPARAM wParam; LPARAM lParam; g_pTrace->Read( &uMsg, sizeof(uMsg) ); g_pTrace->Read( &wParam, sizeof(wParam) ); g_pTrace->Read( &lParam, sizeof(lParam) ); printf( "GameMsg - msg: %s, wParam: %x, lParam: %x\n", GetWMessageName(g_WMessages, sizeof(g_WMessages)/sizeof(g_WMessages[0]), uMsg), wParam, lParam ); } else { printf("GameMsg - <end>\n" ); } } break; case VCREvent_GetNumberOfConsoleInputEvents: { char val; unsigned long nEvents; ReadVal( val ); ReadVal( nEvents ); printf( "GetNumberOfConsoleInputEvents (returned %d, nEvents = %d)\n", val, nEvents ); } break; case VCREvent_ReadConsoleInput: { char val; unsigned long nRead; INPUT_RECORD recs[1024]; ReadVal( val ); if ( val ) { ReadVal( nRead ); g_pTrace->Read( recs, nRead * sizeof( INPUT_RECORD ) ); } else { nRead = 0; } printf( "ReadConsoleInput (returned %d, nRead = %d)\n", val, nRead ); } break; default: { printf( "***ERROR*** VCR_TraceEvent: invalid event" ); return; } } } }