コード例 #1
0
ファイル: json.cpp プロジェクト: urdvr/vabamorf
CFSVar CJSONReader::Read()
{
	m_iCollectData=1;
	GetChar(true);
	CFSVar Data=ReadVal("");
	if (m_cCh) throw CJSONException(FSTSTR("Partially parsed file"));
	return Data;
}
コード例 #2
0
ファイル: json.cpp プロジェクト: urdvr/vabamorf
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;
}
コード例 #3
0
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;
			}
		}
	}
}