Parcourir la source

JSONToken has a pointer to the string that refers, TODO: better and more usable interface for accessing json document

mikymod il y a 12 ans
Parent
commit
a64ab48be9
2 fichiers modifiés avec 64 ajouts et 53 suppressions
  1. 31 33
      src/JSONParser.cpp
  2. 33 20
      src/JSONParser.h

+ 31 - 33
src/JSONParser.cpp

@@ -1,11 +1,17 @@
 #include "JSONParser.h"
 #include "DiskFile.h"
+#include "String.h"
+#include "OS.h"
 
 namespace crown
 {
 
 //--------------------------------------------------------------------------
-JSONParser::JSONParser(File* file, size_t size)
+JSONParser::JSONParser(File* file, size_t size) :
+	m_file(file),
+	m_next_token(0),
+	m_prev_token(-1),
+	m_key_set(false)
 {
 	if (size > 1024)
 	{
@@ -18,50 +24,29 @@ JSONParser::JSONParser(File* file, size_t size)
 
 	m_size = size;
 
-	m_file = file;
+	// m_file = file;
 
 	m_pos = m_file->position();
 
-	m_next_token = 0;
+	// m_next_token = 0;
 
-	m_prev_token = -1;
-
-	is_init = true;
+	// m_prev_token = -1;
 }
 
 //--------------------------------------------------------------------------
 JSONParser::~JSONParser()
 {
-	if (m_size > 1024)
+	if (m_size > 1024 && m_tokens != NULL)
 	{
 		delete m_tokens;
 	}
-	else
-	{
-		delete [] m_tokens_list;
-	}
-}
 
-//--------------------------------------------------------------------------
-// void
-// JSONParser::shutdown()
-// {
-// 	m_pos = 0;
-// 	m_next_token = 0;
-// 	m_prev_token = -1;
-
-// 	is_init = false;
-// }
+}
 
 //--------------------------------------------------------------------------
 JSONError 
 JSONParser::parse()
 {
-	if (!is_init)
-	{
-		return JSON_NO_INIT; 
-	}
-
 	JSONError error;
 	JSONToken* token;
 
@@ -130,8 +115,8 @@ JSONParser::parse()
 					token = &m_tokens[token->m_parent];
 				}
 
-				token->m_size = token->m_end - token->m_start;
-
+				// token->m_size = token->m_end - token->m_start;
+				fill_token(token, type, token->m_start, token->m_end);
 				break;
 			}
 			case '\"':
@@ -143,10 +128,13 @@ JSONParser::parse()
             	}
 				break;
 			}
+			case ':':
+			{
+				break;
+			}
             case '\t': 
             case '\r': 
             case '\n': 
-            case ':': 
             case ',': 
             case ' ': 
             {
@@ -321,22 +309,32 @@ JSONParser::allocate_token()
 //--------------------------------------------------------------------------
 void JSONParser::fill_token(JSONToken* token, JSONType type, int32_t start, int32_t end)
 {
+	uint32_t cur_pos = m_file->position();
+
 	token->m_type = type;
 	token->m_start = start;
 	token->m_end = end;
 	token->m_size = token->m_end - token->m_start;
+
+	char tmp[token->m_size+1];
+	m_file->seek(token->m_start-1);
+	m_file->read(tmp, token->m_size);
+	tmp[token->m_size] = '\0';
+	string::strcpy(token->m_value, tmp);
+	os:printf("%d\n", string::strlen(token->m_value));
+
+	m_file->seek(cur_pos);
 }
 
-//--------------------------------------------------------------------------
 JSONToken* JSONParser::get_tokens()
 {
-	return m_tokens;
+	return m_tokens_list;
 }
 
-//--------------------------------------------------------------------------
 int32_t JSONParser::get_tokens_number()
 {
 	return m_next_token;
 }
 
+
 } //namespace crown

+ 33 - 20
src/JSONParser.h

@@ -22,30 +22,33 @@ enum JSONError
 	JSON_NO_MEMORY	= 0,	// Not enough token provided
 	JSON_INV_CHAR	= 1,	// Invalid character inside JSON string
 	JSON_INV_PART	= 2,	// JSON string is incompleted
-	JSON_NO_INIT	= 3,	// JSON parser not initialized
-	JSON_SUCCESS	= 4		// Everything OK!
+	JSON_SUCCESS	= 3		// Everything OK!
 };
 
 /// JSONToken is a container which have pointer to a single json entity 
 /// (primitive, object, array or string) of a json file.
 struct JSONToken
 {
-	JSONType	m_type;
-	int32_t 	m_start;
-	int32_t 	m_end;
-	size_t 		m_size;
-	int32_t 	m_parent;
+	static const uint32_t MAX_TOKEN_LEN = 1024;
+
+	JSONType	m_type;					// Token's type
+	char 		m_value[MAX_TOKEN_LEN];	// Token's value
+	int32_t 	m_start;				// Starting byte
+	int32_t 	m_end;					// Ending byte
+	size_t 		m_size;					// Token's dimension
+	int32_t 	m_parent;				// Token's parent
+
 
 	inline void print()
 	{
-		os::printf("Type:\t%d\n",m_type);
-		os::printf("Start:\t%d\n",m_start);
-		os::printf("End:\t%d\n",m_end);
-		os::printf("Parent:\t%d\n",m_parent);
-		os::printf("Size:\t%d\n",m_size);
+		os::printf("Value:\t%s\n", m_value);
+		os::printf("Type:\t%d\n", m_type);
+		os::printf("Start:\t%d\n", m_start);
+		os::printf("End:\t%d\n", m_end);
+		os::printf("Parent:\t%d\n", m_parent);
+		os::printf("Size:\t%d\n", m_size);
 		os::printf("\n");		
 	}
-
 };
 
 /// JSONParser parses JSON file and stores all relative tokens.
@@ -58,18 +61,27 @@ public:
 					JSONParser(File* file, size_t size = 1024);
 	/// Destructor
 					~JSONParser();
-	// /// Init JSON parser, must be called for each different JSON string
-	// void 			init();
-	// /// Shutdown JSON parser
-	// void			shutdown();
-	/// Parse JSON data
+	/// Parse JSON data and fill tokens
 	JSONError 		parse();
 	/// Get all tokens
 	JSONToken*		get_tokens();
 	/// Get next token
 	int32_t			get_tokens_number();
 
+	bool 			get_bool(const char* name);
+
+	int32_t 		get_int(const char* name);
+
+	float			get_float(const char* name);
+
+	// void			get_string(const char* name, List<char>& string);
+
+	// void			get_array(const char* name, List<const char*>& array);
+
+	// void			get_object(const char* name, Dictionary<String, const char*>& obj);
+
 private:
+
 	/// Parse string in JSON data
 	JSONError		parse_string();
 	/// Parse number or boolean in JSON data
@@ -87,6 +99,8 @@ private:
 	int32_t			m_next_token;
 	/// Previous token e.g parent or array		
 	int32_t			m_prev_token;
+	/// true if the current token is a key, false otherwise
+	bool 			m_key_set;
 
 	/// JSON tokens list, used as default
 	JSONToken		m_tokens_list[1024];
@@ -95,8 +109,7 @@ private:
 	/// m_tokens default size, default 1024
 	size_t			m_size;
 
-	// is JSON parser initilized
-	bool 			is_init;		
+
 };
 
 } // namespace crown