Przeglądaj źródła

rework JSON parser

mikymod 12 lat temu
rodzic
commit
cc01ddcb60
3 zmienionych plików z 175 dodań i 0 usunięć
  1. 2 0
      engine/CMakeLists.txt
  2. 132 0
      engine/JSON.cpp
  3. 41 0
      engine/JSON.h

+ 2 - 0
engine/CMakeLists.txt

@@ -57,6 +57,7 @@ set (CROWN_INCLUDES
 )
 )
 
 
 set (SRC
 set (SRC
+	JSON.cpp
 	Camera.cpp
 	Camera.cpp
 	Device.cpp
 	Device.cpp
 	MaterialResource.cpp
 	MaterialResource.cpp
@@ -77,6 +78,7 @@ set (SRC
 )
 )
 
 
 set (HEADERS
 set (HEADERS
+	JSON.h
 	Camera.h
 	Camera.h
 	Config.h
 	Config.h
 	Crown.h
 	Crown.h

+ 132 - 0
engine/JSON.cpp

@@ -0,0 +1,132 @@
+#include "Assert.h"
+#include "JSON.h"
+#include "Types.h"
+
+namespace crown
+{
+
+/// This function is EPIC. Love it. Now.
+//-----------------------------------------------------------------------------
+CE_EXPORT void JSON::next(const char* str, const char c, bool force_reset)
+{
+	static char* current_str = (char*)str;
+	static size_t index = 0;
+	static char current = str[index];
+
+	if (current_str != str || force_reset == true)
+	{
+		current_str = (char*)str;
+		index = 0;
+		current = str[index];
+	}
+
+	if (c && c != current)
+	{
+		CE_ASSERT(false, "Expected '%c' got '%c'", c, current);
+	}
+
+	index++;
+	current = str[index];
+}
+
+//-----------------------------------------------------------------------------
+CE_EXPORT bool JSON::parse_bool(const char* token)
+{
+	CE_ASSERT_NOT_NULL(token);
+
+	switch(token[0])
+	{
+		case 't':
+		{
+			next(token, 't');
+			next(token, 'r');
+			next(token, 'u');
+			next(token, 'e');
+			return true;
+		}
+		case 'f':
+		{
+			next(token, 'f');
+			next(token, 'a');
+			next(token, 'l');
+			next(token, 's');			
+			next(token, 'e');
+			return false;
+		}
+		default:
+		{
+			CE_ASSERT(false, "Current token is not a boolean");
+		}
+	}
+}
+
+//-----------------------------------------------------------------------------
+CE_EXPORT int32_t	JSON::parse_int(const char* token)
+{
+	// uint32_t index = 0;
+
+	// uint32_t start = index;
+
+	// uint32_t end = -1;
+
+	// while(token[index] != '\0' || end == -1)
+	// {
+	// 	switch(token[index])
+	// 	{
+	//         case '-':
+	//         {
+	        	
+	//         }
+ //            case '0':
+ //            case '1':
+ //            case '2':
+ //            case '3':
+ //            case '4':
+ //            case '5':
+ //            case '6':
+ //            case '7':
+ //            case '8':
+ //            case '9':
+ //            {
+ //            	index++;
+ //            }
+	// 		case '\t': 
+	// 		case '\r': 
+	// 		case '\n': 
+	// 		case ' ':
+	// 		case ',': 
+	// 		case '}':
+	// 		case ']':
+	// 		{
+	// 			end = index - 1;
+	// 		}
+	// 	}
+	// }
+}
+
+//-----------------------------------------------------------------------------
+CE_EXPORT float JSON::parse_float(const char* token)
+{
+
+}
+
+// //-----------------------------------------------------------------------------
+// void JSON::parse_string(const char* token, List<char>& str)
+// {
+
+// }
+
+// //-----------------------------------------------------------------------------
+// void JSON::parse_array(const char* token, List<const char*>& array)
+// {
+
+// }
+
+// //-----------------------------------------------------------------------------
+// void JSON::parse_object(const char* token, Dictionary<const char* key, const char* val>& dict)
+// {
+
+// }
+
+
+} // namespace crown

+ 41 - 0
engine/JSON.h

@@ -0,0 +1,41 @@
+#pragma once
+
+#include "Types.h"
+
+namespace crown
+{
+
+enum JSONValue
+{
+	JSON_NULL,
+	JSON_BOOL,
+	JSON_NUMBER
+};
+
+class JSON
+{
+public:
+						JSON();
+
+	void 				skip_whitespace();
+
+	static void			next(const char* str, const char c = 0, bool force_reset = false);
+
+	static bool			parse_bool(const char* token);
+	static int32_t 		parse_int(const char* token);
+	static float		parse_float(const char* token);
+	// static void			parse_string(const char* token, List<char>& str);
+	
+	// static void			parse_array(const char* token, List<const char*>& array);
+	// static void			parse_object(const char* token, Dictionary<const char* key, const char* val>& dict);
+
+private:
+
+	char			m_buffer[1024];
+
+	uint32_t		m_index;
+
+	char			m_current;
+};
+
+} // namespace crown