Просмотр исходного кода

JSON interface api prototype implemented, it needs additional work

mikymod 12 лет назад
Родитель
Сommit
4da94894eb
3 измененных файлов с 103 добавлено и 18 удалено
  1. 2 1
      src/Device.cpp
  2. 82 15
      src/JSONParser.cpp
  3. 19 2
      src/JSONParser.h

+ 2 - 1
src/Device.cpp

@@ -533,9 +533,10 @@ void Device::read_engine_settings()
 
 
 	for (int i = 0; i < json.get_tokens_number(); i++)
 	for (int i = 0; i < json.get_tokens_number(); i++)
 	{
 	{
-		os::printf("id: %d\n", i);
 		tokens[i].print();
 		tokens[i].print();
 	}
 	}
+
+	json.get_array("crown").get_object("boot").get_string("file");
 }
 }
 
 
 
 

+ 82 - 15
src/JSONParser.cpp

@@ -2,6 +2,7 @@
 #include "DiskFile.h"
 #include "DiskFile.h"
 #include "OS.h"
 #include "OS.h"
 #include "String.h"
 #include "String.h"
+#include <cassert>
 
 
 namespace crown
 namespace crown
 {
 {
@@ -10,7 +11,9 @@ namespace crown
 JSONParser::JSONParser(File* file, size_t size) :
 JSONParser::JSONParser(File* file, size_t size) :
 	m_file(file),
 	m_file(file),
 	m_next_token(0),
 	m_next_token(0),
-	m_prev_token(-1)
+	m_prev_token(-1),
+	m_fetching_node(0),
+	m_fetching_step(0)
 {
 {
 	if (size > 1024)
 	if (size > 1024)
 	{
 	{
@@ -297,7 +300,10 @@ JSONParser::allocate_token()
 		return NULL;
 		return NULL;
 	}	
 	}	
 
 
-	token = &m_tokens[m_next_token++];
+	int32_t id = m_next_token++;
+
+	token = &m_tokens[id];
+	token->m_id = id;
 	token->m_start = token->m_end = -1;
 	token->m_start = token->m_end = -1;
 	token->m_size = 0;
 	token->m_size = 0;
 	token->m_parent = -1;
 	token->m_parent = -1;
@@ -324,33 +330,94 @@ void JSONParser::fill_token(JSONToken* token, JSONType type, int32_t start, int3
 	m_file->seek(cur_pos);
 	m_file->seek(cur_pos);
 }
 }
 
 
+//--------------------------------------------------------------------------
 JSONToken* JSONParser::get_tokens()
 JSONToken* JSONParser::get_tokens()
 {
 {
 	return m_tokens_list;
 	return m_tokens_list;
 }
 }
 
 
+//--------------------------------------------------------------------------
 int32_t JSONParser::get_tokens_number()
 int32_t JSONParser::get_tokens_number()
 {
 {
 	return m_next_token;
 	return m_next_token;
 }
 }
 
 
-// const char** JSONParser::parse_arguments(const char* first, ...)
-// {
-	// va_list args;
+//--------------------------------------------------------------------------
+JSONParser&	JSONParser::get_object(const char* key)
+{
+	for (int i = m_fetching_node; i < m_next_token; i++)
+	{
+		if ((string::strcmp(m_tokens[i].m_value, key) == 0)	&& m_tokens[i].m_type == JSON_STRING)
+		{
+			assert(m_tokens[i+1].m_type == JSON_OBJECT);
+			
+			m_fetching_node = m_tokens[i+1].m_id;	
 
 
-	// va_start(args, first);
+			os::printf("FOUND IT! node:%d\n", m_fetching_node);
 
 
-	// const char* arg;
+			break;
+		}
+	}
 
 
-	// arg = va_arg(first, const char*);
-	// os::printf("%s\n", arg);
+	return *this;
+}
 
 
-	// while ((arg = va_arg(args, const char*)) != 0)
-	// {
-	// 	os::printf("%s\n", arg);
-	// }
-	// va_end(args);
-// }
+//--------------------------------------------------------------------------
+JSONParser& JSONParser::get_array(const char* key)
+{
+	for (int i = m_fetching_node; i < m_next_token; i++)
+	{
+		if ((string::strcmp(m_tokens[i].m_value, key) == 0)	&& m_tokens[i].m_type == JSON_STRING)
+		{
+			assert(m_tokens[i+1].m_type == JSON_ARRAY);
+			
+			m_fetching_node = m_tokens[i+1].m_id;	
+
+			os::printf("FOUND IT! node:%d\n", m_fetching_node);
+
+			break;
+		}
+	}
 
 
+	return *this;
+}
+
+//--------------------------------------------------------------------------
+JSONParser&	JSONParser::get_string(const char* key)
+{
+	for (int i = m_fetching_node; i < m_next_token; i++)
+	{
+		if ((string::strcmp(m_tokens[i].m_value, key) == 0)	&& m_tokens[i].m_type == JSON_STRING)
+		{
+			assert(m_tokens[i+1].m_type == JSON_STRING);
+			
+			m_fetching_node = m_tokens[i+1].m_id;	
+
+			os::printf("FOUND IT! node:%d\n", m_fetching_node);
+
+			break;
+		}
+	}
+
+	return *this;
+}
+
+//--------------------------------------------------------------------------
+JSONParser& JSONParser::get_float(const char* key)
+{
+
+}
+
+//--------------------------------------------------------------------------
+JSONParser&	JSONParser::get_int(const char* key)
+{
+
+}
+
+//--------------------------------------------------------------------------
+JSONParser& JSONParser::get_bool(const char* key)
+{
+
+}
 
 
 } //namespace crown
 } //namespace crown

+ 19 - 2
src/JSONParser.h

@@ -35,6 +35,7 @@ struct JSONToken
 	static const uint32_t MAX_TOKEN_LEN = 1024;
 	static const uint32_t MAX_TOKEN_LEN = 1024;
 
 
 	JSONType	m_type;					// Token's type
 	JSONType	m_type;					// Token's type
+	int32_t		m_id;					// Token's id
 	char 		m_value[MAX_TOKEN_LEN];	// Token's value
 	char 		m_value[MAX_TOKEN_LEN];	// Token's value
 	int32_t 	m_start;				// Starting byte
 	int32_t 	m_start;				// Starting byte
 	int32_t 	m_end;					// Ending byte
 	int32_t 	m_end;					// Ending byte
@@ -43,6 +44,7 @@ struct JSONToken
 
 
 	inline void print()
 	inline void print()
 	{
 	{
+		os::printf("Id:\t%d\n", m_id);
 		os::printf("Value:\t%s\n", m_value);
 		os::printf("Value:\t%s\n", m_value);
 		os::printf("Type:\t%d\n", m_type);
 		os::printf("Type:\t%d\n", m_type);
 		os::printf("Start:\t%d\n", m_start);
 		os::printf("Start:\t%d\n", m_start);
@@ -70,6 +72,18 @@ public:
 	/// Get next token
 	/// Get next token
 	int32_t			get_tokens_number();
 	int32_t			get_tokens_number();
 
 
+	JSONParser&		get_object(const char* key);
+
+	JSONParser&		get_array(const char* key);
+
+	JSONParser& 	get_string(const char* key);
+
+	JSONParser&		get_float(const char* key);
+
+	JSONParser&		get_int(const char* key);
+
+	JSONParser&		get_bool(const char* key);
+
 private:
 private:
 	/// Parse string in JSON data
 	/// Parse string in JSON data
 	JSONError		parse_string();
 	JSONError		parse_string();
@@ -80,8 +94,6 @@ private:
 	/// Fill token and set boundaries
 	/// Fill token and set boundaries
 	void			fill_token(JSONToken* token, JSONType type, int32_t start, int32_t end);
 	void			fill_token(JSONToken* token, JSONType type, int32_t start, int32_t end);
 
 
-	// const char**	parse_arguments(const char* first, ...);
-
 	/// JSON file of data
 	/// JSON file of data
 	File*			m_file;
 	File*			m_file;
 	/// JSON string offset
 	/// JSON string offset
@@ -97,6 +109,11 @@ private:
 	JSONToken* 		m_tokens;
 	JSONToken* 		m_tokens;
 	/// m_tokens default size, default 1024
 	/// m_tokens default size, default 1024
 	size_t			m_size;
 	size_t			m_size;
+
+	/// Stores the id of current node while fetching data
+	uint32_t		m_fetching_node;
+	/// Stores the number of steps while fetching data
+	uint32_t		m_fetching_step;
 };
 };
 
 
 } // namespace crown
 } // namespace crown