//////////////////////////////////////////////////////////////////////////////// /// @brief json objects /// /// @file /// /// DISCLAIMER /// /// Copyright 2014 ArangoDB GmbH, Cologne, Germany /// Copyright 2004-2014 triAGENS GmbH, Cologne, Germany /// /// Licensed under the Apache License, Version 2.0 (the "License"); /// you may not use this file except in compliance with the License. /// You may obtain a copy of the License at /// /// http://www.apache.org/licenses/LICENSE-2.0 /// /// Unless required by applicable law or agreed to in writing, software /// distributed under the License is distributed on an "AS IS" BASIS, /// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. /// See the License for the specific language governing permissions and /// limitations under the License. /// /// Copyright holder is ArangoDB GmbH, Cologne, Germany /// /// @author Dr. Frank Celler /// @author Copyright 2014, ArangoDB GmbH, Cologne, Germany /// @author Copyright 2011-2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// #ifndef ARANGODB_BASICS_C_JSON_H #define ARANGODB_BASICS_C_JSON_H 1 #include "Basics/Common.h" #include "Basics/associative.h" #include "Basics/vector.h" // ----------------------------------------------------------------------------- // --SECTION-- forward declarations // ----------------------------------------------------------------------------- struct TRI_string_buffer_s; // ----------------------------------------------------------------------------- // --SECTION-- JSON // ----------------------------------------------------------------------------- // ----------------------------------------------------------------------------- // --SECTION-- public types // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief json type //////////////////////////////////////////////////////////////////////////////// typedef enum { TRI_JSON_UNUSED = 0, TRI_JSON_NULL = 1, TRI_JSON_BOOLEAN = 2, TRI_JSON_NUMBER = 3, TRI_JSON_STRING = 4, TRI_JSON_STRING_REFERENCE = 5, TRI_JSON_ARRAY = 6, TRI_JSON_LIST = 7 } TRI_json_type_e; //////////////////////////////////////////////////////////////////////////////// /// @brief json object //////////////////////////////////////////////////////////////////////////////// typedef struct TRI_json_t { TRI_json_type_e _type; union { bool _boolean; double _number; TRI_blob_t _string; TRI_vector_t _objects; } _value; } TRI_json_t; // ----------------------------------------------------------------------------- // --SECTION-- constructors and destructors // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief creates a null object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateNullJson (TRI_memory_zone_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a null object //////////////////////////////////////////////////////////////////////////////// void TRI_InitNullJson (TRI_json_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a boolean object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateBooleanJson (TRI_memory_zone_t*, bool); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a boolean object //////////////////////////////////////////////////////////////////////////////// void TRI_InitBooleanJson (TRI_json_t*, bool); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a number object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateNumberJson (TRI_memory_zone_t*, double); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a number object //////////////////////////////////////////////////////////////////////////////// void TRI_InitNumberJson (TRI_json_t*, double); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateStringJson (TRI_memory_zone_t*, char*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string object with given length //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateString2Json (TRI_memory_zone_t*, char* value, size_t length); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string object, copying the string //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateStringCopyJson (TRI_memory_zone_t*, char const* value); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string object with given length, copying the string //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateString2CopyJson (TRI_memory_zone_t*, char const*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a string object //////////////////////////////////////////////////////////////////////////////// void TRI_InitStringJson (TRI_json_t*, char*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string object //////////////////////////////////////////////////////////////////////////////// void TRI_InitString2Json (TRI_json_t*, char*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a string object //////////////////////////////////////////////////////////////////////////////// int TRI_InitStringCopyJson (TRI_memory_zone_t*, TRI_json_t*, char const*); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a string object //////////////////////////////////////////////////////////////////////////////// int TRI_InitString2CopyJson (TRI_memory_zone_t*, TRI_json_t*, char const*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string reference object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateStringReferenceJson (TRI_memory_zone_t*, const char*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string reference object with given length //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateStringReference2Json (TRI_memory_zone_t*, const char* value, size_t length); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a string reference object //////////////////////////////////////////////////////////////////////////////// void TRI_InitStringReferenceJson (TRI_json_t*, const char*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a string reference object //////////////////////////////////////////////////////////////////////////////// void TRI_InitStringReference2Json (TRI_json_t*, const char*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a list object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateListJson (TRI_memory_zone_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates a list object, with the specified initial size //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateList2Json (TRI_memory_zone_t*, const size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a list object //////////////////////////////////////////////////////////////////////////////// void TRI_InitListJson (TRI_memory_zone_t*, TRI_json_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises a list object with a given size //////////////////////////////////////////////////////////////////////////////// void TRI_InitList2Json (TRI_memory_zone_t*, TRI_json_t*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief creates an array //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateArrayJson (TRI_memory_zone_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief creates an array //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CreateArray2Json (TRI_memory_zone_t*, const size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises an array //////////////////////////////////////////////////////////////////////////////// void TRI_InitArrayJson (TRI_memory_zone_t*, TRI_json_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief initialises an array, using a specific initial size //////////////////////////////////////////////////////////////////////////////// void TRI_InitArray2Json (TRI_memory_zone_t*, TRI_json_t*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief destroys a json object, but does not free the pointer //////////////////////////////////////////////////////////////////////////////// void TRI_DestroyJson (TRI_memory_zone_t*, TRI_json_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief destroys a json object and frees the pointer //////////////////////////////////////////////////////////////////////////////// void TRI_FreeJson (TRI_memory_zone_t*, TRI_json_t*); // ----------------------------------------------------------------------------- // --SECTION-- public functions // ----------------------------------------------------------------------------- //////////////////////////////////////////////////////////////////////////////// /// @brief returns a user printeable string //////////////////////////////////////////////////////////////////////////////// char const* TRI_GetTypeString(TRI_json_t* object); //////////////////////////////////////////////////////////////////////////////// /// @brief determines the length of a list json //////////////////////////////////////////////////////////////////////////////// size_t TRI_LengthListJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief determines whether the JSON passed is of type array //////////////////////////////////////////////////////////////////////////////// bool TRI_IsArrayJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief determines whether the JSON passed is of type list //////////////////////////////////////////////////////////////////////////////// bool TRI_IsListJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief determines whether the JSON passed is of type string //////////////////////////////////////////////////////////////////////////////// bool TRI_IsStringJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief determines whether the JSON passed is of type number //////////////////////////////////////////////////////////////////////////////// bool TRI_IsNumberJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief determines whether the JSON passed is of type boolean //////////////////////////////////////////////////////////////////////////////// bool TRI_IsBooleanJson (TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new sub-object to a list object, copying it //////////////////////////////////////////////////////////////////////////////// void TRI_PushBackListJson (TRI_memory_zone_t*, TRI_json_t* list, TRI_json_t const* object); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new sub-object to a list object, not copying it //////////////////////////////////////////////////////////////////////////////// int TRI_PushBack2ListJson (TRI_json_t* list, TRI_json_t const* object); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new sub-object, not copying it but freeing the pointer //////////////////////////////////////////////////////////////////////////////// int TRI_PushBack3ListJson (TRI_memory_zone_t*, TRI_json_t* list, TRI_json_t* object); //////////////////////////////////////////////////////////////////////////////// /// @brief looks up a value in a json list //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_LookupListJson (TRI_json_t const*, size_t); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new attribute to an object, using copy //////////////////////////////////////////////////////////////////////////////// void TRI_InsertArrayJson (TRI_memory_zone_t*, TRI_json_t* object, char const* name, TRI_json_t const* subobject); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new attribute to an object, not copying it //////////////////////////////////////////////////////////////////////////////// void TRI_Insert2ArrayJson (TRI_memory_zone_t*, TRI_json_t* object, char const* name, TRI_json_t* subobject); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new attribute, not copying it but freeing the pointer //////////////////////////////////////////////////////////////////////////////// void TRI_Insert3ArrayJson (TRI_memory_zone_t*, TRI_json_t* object, char const* name, TRI_json_t* subobject); //////////////////////////////////////////////////////////////////////////////// /// @brief adds a new attribute, not copying it but freeing the pointer /// /// the JSON struct created takes ownership of the name* passed //////////////////////////////////////////////////////////////////////////////// void TRI_Insert4ArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char* name, size_t nameLength, TRI_json_t* subobject, bool); //////////////////////////////////////////////////////////////////////////////// /// @brief looks up an attribute in a json array //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_LookupArrayJson (const TRI_json_t* const object, char const* name); //////////////////////////////////////////////////////////////////////////////// /// @brief deletes an element from a json array //////////////////////////////////////////////////////////////////////////////// bool TRI_DeleteArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name); //////////////////////////////////////////////////////////////////////////////// /// @brief replaces an element in a json array //////////////////////////////////////////////////////////////////////////////// bool TRI_ReplaceArrayJson (TRI_memory_zone_t* zone, TRI_json_t* object, char const* name, TRI_json_t* replacement); //////////////////////////////////////////////////////////////////////////////// /// @brief stringifies a json object //////////////////////////////////////////////////////////////////////////////// int TRI_StringifyJson (struct TRI_string_buffer_s*, TRI_json_t const* object); //////////////////////////////////////////////////////////////////////////////// /// @brief stringifies a json object skiping the outer braces //////////////////////////////////////////////////////////////////////////////// int TRI_Stringify2Json (struct TRI_string_buffer_s*, TRI_json_t const* object); //////////////////////////////////////////////////////////////////////////////// /// @brief prints a json object //////////////////////////////////////////////////////////////////////////////// bool TRI_PrintJson (int fd, TRI_json_t const*, bool); //////////////////////////////////////////////////////////////////////////////// /// @brief saves a json object //////////////////////////////////////////////////////////////////////////////// bool TRI_SaveJson (char const*, TRI_json_t const*, bool); //////////////////////////////////////////////////////////////////////////////// /// @brief copies a json object into a given buffer //////////////////////////////////////////////////////////////////////////////// int TRI_CopyToJson (TRI_memory_zone_t*, TRI_json_t* dst, TRI_json_t const* src); //////////////////////////////////////////////////////////////////////////////// /// @brief copies a json object //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_CopyJson (TRI_memory_zone_t*, TRI_json_t const*); //////////////////////////////////////////////////////////////////////////////// /// @brief parses a json string //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_JsonString (TRI_memory_zone_t*, char const* text); //////////////////////////////////////////////////////////////////////////////// /// @brief parses a json string and returns error message //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_Json2String (TRI_memory_zone_t*, char const* text, char** error); //////////////////////////////////////////////////////////////////////////////// /// @brief parses a json file and returns error message //////////////////////////////////////////////////////////////////////////////// TRI_json_t* TRI_JsonFile (TRI_memory_zone_t*, char const* path, char** error); //////////////////////////////////////////////////////////////////////////////// /// @brief converts a json object into a number //////////////////////////////////////////////////////////////////////////////// int64_t TRI_ToInt64Json (TRI_json_t*); //////////////////////////////////////////////////////////////////////////////// /// @brief converts a json object into a number //////////////////////////////////////////////////////////////////////////////// double TRI_ToDoubleJson (TRI_json_t*); #endif // ----------------------------------------------------------------------------- // --SECTION-- END-OF-FILE // ----------------------------------------------------------------------------- // Local Variables: // mode: outline-minor // outline-regexp: "/// @brief\\|/// {@inheritDoc}\\|/// @page\\|// --SECTION--\\|/// @\\}" // End: