|
@@ -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
|