90 lines
3.8 KiB
C
90 lines
3.8 KiB
C
#pragma once
|
|
#include "dqn.h"
|
|
|
|
#if !defined(SHEREDOM_JSON_H_INCLUDED)
|
|
#error Sheredom json.h (github.com/sheredom/json.h) must be included before this file
|
|
#endif
|
|
|
|
// NOTE: DN_JSON //////////////////////////////////////////////////////////////////////////////////
|
|
|
|
void *DN_JSON_ArenaAllocFunc (void *user_data, size_t count);
|
|
char const *DN_JSON_TypeEnumCString(json_type_e type, size_t *size);
|
|
bool DN_JSON_String8Cmp (json_string_s const *lhs, DN_Str8 rhs);
|
|
|
|
// NOTE: DN_JSON_It /////////////////////////////////////////////////////////////////////////
|
|
enum DN_JSONItEntryType
|
|
{
|
|
DN_JSON_ItEntryTypeObjElement,
|
|
DN_JSON_ItEntryTypeObj,
|
|
DN_JSON_ItEntryTypeArrayElement,
|
|
DN_JSON_ItEntryTypeArray,
|
|
DN_JSON_ItEntryTypeString,
|
|
DN_JSON_ItEntryTypeNumber,
|
|
};
|
|
|
|
struct DN_JSONItEntry
|
|
{
|
|
DN_JSONItEntryType type;
|
|
void *value;
|
|
};
|
|
|
|
struct DN_JSONIt
|
|
{
|
|
DN_JSONItEntry stack[128];
|
|
int stack_count;
|
|
size_t flags;
|
|
};
|
|
|
|
DN_JSONIt DN_JSON_LoadFileToIt(DN_Arena *arena, DN_Str8 json);
|
|
|
|
// NOTE: DN_JSON_ItPush/Pop /////////////////////////////////////////////////////////////////
|
|
bool DN_JSON_ItPushObjElement (DN_JSONIt *it, json_object_element_s *element);
|
|
bool DN_JSON_ItPushObj (DN_JSONIt *it, json_object_s *obj);
|
|
bool DN_JSON_ItPushArrayElement(DN_JSONIt *it, json_array_element_s *element);
|
|
bool DN_JSON_ItPushArray (DN_JSONIt *it, json_value_s *value);
|
|
bool DN_JSON_ItPushValue (DN_JSONIt *it, json_value_s *value);
|
|
void DN_JSON_ItPop (DN_JSONIt *it);
|
|
|
|
// NOTE: DN_JSON_It tree navigation /////////////////////////////////////////////////////////
|
|
json_value_s *DN_JSON_ItPushCurrValue(DN_JSONIt *it);
|
|
bool DN_JSON_ItNext(DN_JSONIt *it);
|
|
|
|
#define DN_JSON_ItPushCurrValueIterateThenPop(it) \
|
|
for(void *DN_UNIQUE_NAME(ptr) = DN_JSON_ItPushCurrValue(it); DN_UNIQUE_NAME(ptr); DN_JSON_ItPop(it), DN_UNIQUE_NAME(ptr) = nullptr) \
|
|
while (DN_JSON_ItNext(it))
|
|
|
|
// NOTE: DN_JSON_ItCurr /////////////////////////////////////////////////////////////////////
|
|
DN_JSONItEntry *DN_JSON_ItCurr(DN_JSONIt *it);
|
|
json_value_s *DN_JSON_ItCurrValue(DN_JSONIt *it);
|
|
json_object_element_s *DN_JSON_ItCurrObjElement(DN_JSONIt *it);
|
|
|
|
// NOTE: DN_JSON_ItValueIs //////////////////////////////////////////////////////////////////
|
|
json_value_s *DN_JSON_ItValueIs(DN_JSONIt *it, json_type_e type);
|
|
json_object_s *DN_JSON_ItValueIsObj(DN_JSONIt *it);
|
|
json_array_s *DN_JSON_ItValueIsArray(DN_JSONIt *it);
|
|
json_string_s *DN_JSON_ItValueIsString(DN_JSONIt *it);
|
|
json_number_s *DN_JSON_ItValueIsNumber(DN_JSONIt *it);
|
|
json_value_s *DN_JSON_ItValueIsBool(DN_JSONIt *it);
|
|
json_value_s *DN_JSON_ItValueIsNull(DN_JSONIt *it);
|
|
|
|
size_t DN_JSON_ItValueArraySize(DN_JSONIt *it);
|
|
|
|
// NOTE: DN_JSON_ItKeyValueIs ///////////////////////////////////////////////////////////////
|
|
DN_Str8 DN_JSON_ItKey(DN_JSONIt *it);
|
|
bool DN_JSON_ItKeyIs(DN_JSONIt *it, DN_Str8 key);
|
|
json_object_s *DN_JSON_ItKeyValueIsObj(DN_JSONIt *it, DN_Str8 key);
|
|
json_array_s *DN_JSON_ItKeyValueIsArray(DN_JSONIt *it, DN_Str8 key);
|
|
json_string_s *DN_JSON_ItKeyValueIsString(DN_JSONIt *it, DN_Str8 key);
|
|
json_number_s *DN_JSON_ItKeyValueIsNumber(DN_JSONIt *it, DN_Str8 key);
|
|
json_value_s *DN_JSON_ItKeyValueIsBool(DN_JSONIt *it, DN_Str8 key);
|
|
json_value_s *DN_JSON_ItKeyValueIsNull(DN_JSONIt *it, DN_Str8 key);
|
|
|
|
// NOTE: DN_JSON_ItValueTo //////////////////////////////////////////////////////////////////
|
|
DN_Str8 DN_JSON_ItValueToString(DN_JSONIt *it);
|
|
int64_t DN_JSON_ItValueToI64(DN_JSONIt *it);
|
|
uint64_t DN_JSON_ItValueToU64(DN_JSONIt *it);
|
|
bool DN_JSON_ItValueToBool(DN_JSONIt *it);
|
|
|
|
#define DN_JSON_ItErrorUnknownKeyValue(it) DN_JSON_ItErrorUnknownKeyValue_(it, DN_CALL_SITE)
|
|
void DN_JSON_ItErrorUnknownKeyValue_(DN_JSONIt *it, DN_CallSite call_site);
|