// Copyright (c) 2009-2017 Dave Gamble and cJSON contributors
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

// AUTO GENERATED FILE, DO NOT EDIT.
//
// Generated by `package:ffigen`.
import 'dart:ffi' as ffi;

/// Holds bindings to cJSON.
class CJson {
  /// Holds the Dynamic library.
  final ffi.DynamicLibrary _dylib;

  /// The symbols are looked up in [dynamicLibrary].
  CJson(ffi.DynamicLibrary dynamicLibrary) : _dylib = dynamicLibrary;

  ffi.Pointer<ffi.Int8> cJSON_Version() {
    return (_cJSON_Version ??=
        _dylib.lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>(
            'cJSON_Version'))();
  }

  _dart_cJSON_Version? _cJSON_Version;

  void cJSON_InitHooks(
    ffi.Pointer<cJSON_Hooks> hooks,
  ) {
    return (_cJSON_InitHooks ??=
        _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
            'cJSON_InitHooks'))(
      hooks,
    );
  }

  _dart_cJSON_InitHooks? _cJSON_InitHooks;

  ffi.Pointer<cJSON> cJSON_Parse(
    ffi.Pointer<ffi.Int8> value,
  ) {
    return (_cJSON_Parse ??= _dylib
        .lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse'))(
      value,
    );
  }

  _dart_cJSON_Parse? _cJSON_Parse;

  ffi.Pointer<cJSON> cJSON_ParseWithOpts(
    ffi.Pointer<ffi.Int8> value,
    ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
    int require_null_terminated,
  ) {
    return (_cJSON_ParseWithOpts ??= _dylib.lookupFunction<
        _c_cJSON_ParseWithOpts,
        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts'))(
      value,
      return_parse_end,
      require_null_terminated,
    );
  }

  _dart_cJSON_ParseWithOpts? _cJSON_ParseWithOpts;

  ffi.Pointer<ffi.Int8> cJSON_Print(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_Print ??= _dylib
        .lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print'))(
      item,
    );
  }

  _dart_cJSON_Print? _cJSON_Print;

  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_PrintUnformatted ??= _dylib.lookupFunction<
        _c_cJSON_PrintUnformatted,
        _dart_cJSON_PrintUnformatted>('cJSON_PrintUnformatted'))(
      item,
    );
  }

  _dart_cJSON_PrintUnformatted? _cJSON_PrintUnformatted;

  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
    ffi.Pointer<cJSON> item,
    int prebuffer,
    int fmt,
  ) {
    return (_cJSON_PrintBuffered ??= _dylib.lookupFunction<
        _c_cJSON_PrintBuffered,
        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered'))(
      item,
      prebuffer,
      fmt,
    );
  }

  _dart_cJSON_PrintBuffered? _cJSON_PrintBuffered;

  int cJSON_PrintPreallocated(
    ffi.Pointer<cJSON> item,
    ffi.Pointer<ffi.Int8> buffer,
    int length,
    int format,
  ) {
    return (_cJSON_PrintPreallocated ??= _dylib.lookupFunction<
        _c_cJSON_PrintPreallocated,
        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated'))(
      item,
      buffer,
      length,
      format,
    );
  }

  _dart_cJSON_PrintPreallocated? _cJSON_PrintPreallocated;

  void cJSON_Delete(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_Delete ??= _dylib
        .lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete'))(
      item,
    );
  }

  _dart_cJSON_Delete? _cJSON_Delete;

  int cJSON_GetArraySize(
    ffi.Pointer<cJSON> array,
  ) {
    return (_cJSON_GetArraySize ??=
        _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
            'cJSON_GetArraySize'))(
      array,
    );
  }

  _dart_cJSON_GetArraySize? _cJSON_GetArraySize;

  ffi.Pointer<cJSON> cJSON_GetArrayItem(
    ffi.Pointer<cJSON> array,
    int index,
  ) {
    return (_cJSON_GetArrayItem ??=
        _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
            'cJSON_GetArrayItem'))(
      array,
      index,
    );
  }

  _dart_cJSON_GetArrayItem? _cJSON_GetArrayItem;

  ffi.Pointer<cJSON> cJSON_GetObjectItem(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_GetObjectItem ??= _dylib.lookupFunction<
        _c_cJSON_GetObjectItem,
        _dart_cJSON_GetObjectItem>('cJSON_GetObjectItem'))(
      object,
      string,
    );
  }

  _dart_cJSON_GetObjectItem? _cJSON_GetObjectItem;

  ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_GetObjectItemCaseSensitive ??= _dylib.lookupFunction<
            _c_cJSON_GetObjectItemCaseSensitive,
            _dart_cJSON_GetObjectItemCaseSensitive>(
        'cJSON_GetObjectItemCaseSensitive'))(
      object,
      string,
    );
  }

  _dart_cJSON_GetObjectItemCaseSensitive? _cJSON_GetObjectItemCaseSensitive;

  int cJSON_HasObjectItem(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_HasObjectItem ??= _dylib.lookupFunction<
        _c_cJSON_HasObjectItem,
        _dart_cJSON_HasObjectItem>('cJSON_HasObjectItem'))(
      object,
      string,
    );
  }

  _dart_cJSON_HasObjectItem? _cJSON_HasObjectItem;

  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
    return (_cJSON_GetErrorPtr ??=
        _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
            'cJSON_GetErrorPtr'))();
  }

  _dart_cJSON_GetErrorPtr? _cJSON_GetErrorPtr;

  ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_GetStringValue ??= _dylib.lookupFunction<
        _c_cJSON_GetStringValue,
        _dart_cJSON_GetStringValue>('cJSON_GetStringValue'))(
      item,
    );
  }

  _dart_cJSON_GetStringValue? _cJSON_GetStringValue;

  int cJSON_IsInvalid(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsInvalid ??=
        _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
            'cJSON_IsInvalid'))(
      item,
    );
  }

  _dart_cJSON_IsInvalid? _cJSON_IsInvalid;

  int cJSON_IsFalse(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsFalse ??=
        _dylib.lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>(
            'cJSON_IsFalse'))(
      item,
    );
  }

  _dart_cJSON_IsFalse? _cJSON_IsFalse;

  int cJSON_IsTrue(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsTrue ??= _dylib
        .lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue'))(
      item,
    );
  }

  _dart_cJSON_IsTrue? _cJSON_IsTrue;

  int cJSON_IsBool(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsBool ??= _dylib
        .lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool'))(
      item,
    );
  }

  _dart_cJSON_IsBool? _cJSON_IsBool;

  int cJSON_IsNull(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsNull ??= _dylib
        .lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull'))(
      item,
    );
  }

  _dart_cJSON_IsNull? _cJSON_IsNull;

  int cJSON_IsNumber(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsNumber ??=
        _dylib.lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>(
            'cJSON_IsNumber'))(
      item,
    );
  }

  _dart_cJSON_IsNumber? _cJSON_IsNumber;

  int cJSON_IsString(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsString ??=
        _dylib.lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>(
            'cJSON_IsString'))(
      item,
    );
  }

  _dart_cJSON_IsString? _cJSON_IsString;

  int cJSON_IsArray(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsArray ??=
        _dylib.lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>(
            'cJSON_IsArray'))(
      item,
    );
  }

  _dart_cJSON_IsArray? _cJSON_IsArray;

  int cJSON_IsObject(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsObject ??=
        _dylib.lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>(
            'cJSON_IsObject'))(
      item,
    );
  }

  _dart_cJSON_IsObject? _cJSON_IsObject;

  int cJSON_IsRaw(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_IsRaw ??= _dylib
        .lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw'))(
      item,
    );
  }

  _dart_cJSON_IsRaw? _cJSON_IsRaw;

  ffi.Pointer<cJSON> cJSON_CreateNull() {
    return (_cJSON_CreateNull ??=
        _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
            'cJSON_CreateNull'))();
  }

  _dart_cJSON_CreateNull? _cJSON_CreateNull;

  ffi.Pointer<cJSON> cJSON_CreateTrue() {
    return (_cJSON_CreateTrue ??=
        _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
            'cJSON_CreateTrue'))();
  }

  _dart_cJSON_CreateTrue? _cJSON_CreateTrue;

  ffi.Pointer<cJSON> cJSON_CreateFalse() {
    return (_cJSON_CreateFalse ??=
        _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
            'cJSON_CreateFalse'))();
  }

  _dart_cJSON_CreateFalse? _cJSON_CreateFalse;

  ffi.Pointer<cJSON> cJSON_CreateBool(
    int boolean,
  ) {
    return (_cJSON_CreateBool ??=
        _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
            'cJSON_CreateBool'))(
      boolean,
    );
  }

  _dart_cJSON_CreateBool? _cJSON_CreateBool;

  ffi.Pointer<cJSON> cJSON_CreateNumber(
    double num,
  ) {
    return (_cJSON_CreateNumber ??=
        _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
            'cJSON_CreateNumber'))(
      num,
    );
  }

  _dart_cJSON_CreateNumber? _cJSON_CreateNumber;

  ffi.Pointer<cJSON> cJSON_CreateString(
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_CreateString ??=
        _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
            'cJSON_CreateString'))(
      string,
    );
  }

  _dart_cJSON_CreateString? _cJSON_CreateString;

  ffi.Pointer<cJSON> cJSON_CreateRaw(
    ffi.Pointer<ffi.Int8> raw,
  ) {
    return (_cJSON_CreateRaw ??=
        _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
            'cJSON_CreateRaw'))(
      raw,
    );
  }

  _dart_cJSON_CreateRaw? _cJSON_CreateRaw;

  ffi.Pointer<cJSON> cJSON_CreateArray() {
    return (_cJSON_CreateArray ??=
        _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
            'cJSON_CreateArray'))();
  }

  _dart_cJSON_CreateArray? _cJSON_CreateArray;

  ffi.Pointer<cJSON> cJSON_CreateObject() {
    return (_cJSON_CreateObject ??=
        _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
            'cJSON_CreateObject'))();
  }

  _dart_cJSON_CreateObject? _cJSON_CreateObject;

  ffi.Pointer<cJSON> cJSON_CreateStringReference(
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_CreateStringReference ??= _dylib.lookupFunction<
        _c_cJSON_CreateStringReference,
        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference'))(
      string,
    );
  }

  _dart_cJSON_CreateStringReference? _cJSON_CreateStringReference;

  ffi.Pointer<cJSON> cJSON_CreateObjectReference(
    ffi.Pointer<cJSON> child,
  ) {
    return (_cJSON_CreateObjectReference ??= _dylib.lookupFunction<
        _c_cJSON_CreateObjectReference,
        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference'))(
      child,
    );
  }

  _dart_cJSON_CreateObjectReference? _cJSON_CreateObjectReference;

  ffi.Pointer<cJSON> cJSON_CreateArrayReference(
    ffi.Pointer<cJSON> child,
  ) {
    return (_cJSON_CreateArrayReference ??= _dylib.lookupFunction<
        _c_cJSON_CreateArrayReference,
        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference'))(
      child,
    );
  }

  _dart_cJSON_CreateArrayReference? _cJSON_CreateArrayReference;

  ffi.Pointer<cJSON> cJSON_CreateIntArray(
    ffi.Pointer<ffi.Int32> numbers,
    int count,
  ) {
    return (_cJSON_CreateIntArray ??= _dylib.lookupFunction<
        _c_cJSON_CreateIntArray,
        _dart_cJSON_CreateIntArray>('cJSON_CreateIntArray'))(
      numbers,
      count,
    );
  }

  _dart_cJSON_CreateIntArray? _cJSON_CreateIntArray;

  ffi.Pointer<cJSON> cJSON_CreateFloatArray(
    ffi.Pointer<ffi.Float> numbers,
    int count,
  ) {
    return (_cJSON_CreateFloatArray ??= _dylib.lookupFunction<
        _c_cJSON_CreateFloatArray,
        _dart_cJSON_CreateFloatArray>('cJSON_CreateFloatArray'))(
      numbers,
      count,
    );
  }

  _dart_cJSON_CreateFloatArray? _cJSON_CreateFloatArray;

  ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
    ffi.Pointer<ffi.Double> numbers,
    int count,
  ) {
    return (_cJSON_CreateDoubleArray ??= _dylib.lookupFunction<
        _c_cJSON_CreateDoubleArray,
        _dart_cJSON_CreateDoubleArray>('cJSON_CreateDoubleArray'))(
      numbers,
      count,
    );
  }

  _dart_cJSON_CreateDoubleArray? _cJSON_CreateDoubleArray;

  ffi.Pointer<cJSON> cJSON_CreateStringArray(
    ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
    int count,
  ) {
    return (_cJSON_CreateStringArray ??= _dylib.lookupFunction<
        _c_cJSON_CreateStringArray,
        _dart_cJSON_CreateStringArray>('cJSON_CreateStringArray'))(
      strings,
      count,
    );
  }

  _dart_cJSON_CreateStringArray? _cJSON_CreateStringArray;

  void cJSON_AddItemToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemToArray ??= _dylib.lookupFunction<
        _c_cJSON_AddItemToArray,
        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray'))(
      array,
      item,
    );
  }

  _dart_cJSON_AddItemToArray? _cJSON_AddItemToArray;

  void cJSON_AddItemToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddItemToObject,
        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject'))(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemToObject? _cJSON_AddItemToObject;

  void cJSON_AddItemToObjectCS(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
        _c_cJSON_AddItemToObjectCS,
        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS'))(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemToObjectCS? _cJSON_AddItemToObjectCS;

  void cJSON_AddItemReferenceToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
        _c_cJSON_AddItemReferenceToArray,
        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray'))(
      array,
      item,
    );
  }

  _dart_cJSON_AddItemReferenceToArray? _cJSON_AddItemReferenceToArray;

  void cJSON_AddItemReferenceToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
            _c_cJSON_AddItemReferenceToObject,
            _dart_cJSON_AddItemReferenceToObject>(
        'cJSON_AddItemReferenceToObject'))(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemReferenceToObject? _cJSON_AddItemReferenceToObject;

  ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
    ffi.Pointer<cJSON> parent,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_DetachItemViaPointer ??= _dylib.lookupFunction<
        _c_cJSON_DetachItemViaPointer,
        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer'))(
      parent,
      item,
    );
  }

  _dart_cJSON_DetachItemViaPointer? _cJSON_DetachItemViaPointer;

  ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
    ffi.Pointer<cJSON> array,
    int which,
  ) {
    return (_cJSON_DetachItemFromArray ??= _dylib.lookupFunction<
        _c_cJSON_DetachItemFromArray,
        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray'))(
      array,
      which,
    );
  }

  _dart_cJSON_DetachItemFromArray? _cJSON_DetachItemFromArray;

  void cJSON_DeleteItemFromArray(
    ffi.Pointer<cJSON> array,
    int which,
  ) {
    return (_cJSON_DeleteItemFromArray ??= _dylib.lookupFunction<
        _c_cJSON_DeleteItemFromArray,
        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray'))(
      array,
      which,
    );
  }

  _dart_cJSON_DeleteItemFromArray? _cJSON_DeleteItemFromArray;

  ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_DetachItemFromObject ??= _dylib.lookupFunction<
        _c_cJSON_DetachItemFromObject,
        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject'))(
      object,
      string,
    );
  }

  _dart_cJSON_DetachItemFromObject? _cJSON_DetachItemFromObject;

  ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_DetachItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
            _c_cJSON_DetachItemFromObjectCaseSensitive,
            _dart_cJSON_DetachItemFromObjectCaseSensitive>(
        'cJSON_DetachItemFromObjectCaseSensitive'))(
      object,
      string,
    );
  }

  _dart_cJSON_DetachItemFromObjectCaseSensitive?
      _cJSON_DetachItemFromObjectCaseSensitive;

  void cJSON_DeleteItemFromObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_DeleteItemFromObject ??= _dylib.lookupFunction<
        _c_cJSON_DeleteItemFromObject,
        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject'))(
      object,
      string,
    );
  }

  _dart_cJSON_DeleteItemFromObject? _cJSON_DeleteItemFromObject;

  void cJSON_DeleteItemFromObjectCaseSensitive(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_DeleteItemFromObjectCaseSensitive ??= _dylib.lookupFunction<
            _c_cJSON_DeleteItemFromObjectCaseSensitive,
            _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
        'cJSON_DeleteItemFromObjectCaseSensitive'))(
      object,
      string,
    );
  }

  _dart_cJSON_DeleteItemFromObjectCaseSensitive?
      _cJSON_DeleteItemFromObjectCaseSensitive;

  void cJSON_InsertItemInArray(
    ffi.Pointer<cJSON> array,
    int which,
    ffi.Pointer<cJSON> newitem,
  ) {
    return (_cJSON_InsertItemInArray ??= _dylib.lookupFunction<
        _c_cJSON_InsertItemInArray,
        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray'))(
      array,
      which,
      newitem,
    );
  }

  _dart_cJSON_InsertItemInArray? _cJSON_InsertItemInArray;

  int cJSON_ReplaceItemViaPointer(
    ffi.Pointer<cJSON> parent,
    ffi.Pointer<cJSON> item,
    ffi.Pointer<cJSON> replacement,
  ) {
    return (_cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemViaPointer,
        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer'))(
      parent,
      item,
      replacement,
    );
  }

  _dart_cJSON_ReplaceItemViaPointer? _cJSON_ReplaceItemViaPointer;

  void cJSON_ReplaceItemInArray(
    ffi.Pointer<cJSON> array,
    int which,
    ffi.Pointer<cJSON> newitem,
  ) {
    return (_cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemInArray,
        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray'))(
      array,
      which,
      newitem,
    );
  }

  _dart_cJSON_ReplaceItemInArray? _cJSON_ReplaceItemInArray;

  void cJSON_ReplaceItemInObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
    ffi.Pointer<cJSON> newitem,
  ) {
    return (_cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemInObject,
        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject'))(
      object,
      string,
      newitem,
    );
  }

  _dart_cJSON_ReplaceItemInObject? _cJSON_ReplaceItemInObject;

  void cJSON_ReplaceItemInObjectCaseSensitive(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
    ffi.Pointer<cJSON> newitem,
  ) {
    return (_cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
            _c_cJSON_ReplaceItemInObjectCaseSensitive,
            _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
        'cJSON_ReplaceItemInObjectCaseSensitive'))(
      object,
      string,
      newitem,
    );
  }

  _dart_cJSON_ReplaceItemInObjectCaseSensitive?
      _cJSON_ReplaceItemInObjectCaseSensitive;

  ffi.Pointer<cJSON> cJSON_Duplicate(
    ffi.Pointer<cJSON> item,
    int recurse,
  ) {
    return (_cJSON_Duplicate ??=
        _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
            'cJSON_Duplicate'))(
      item,
      recurse,
    );
  }

  _dart_cJSON_Duplicate? _cJSON_Duplicate;

  int cJSON_Compare(
    ffi.Pointer<cJSON> a,
    ffi.Pointer<cJSON> b,
    int case_sensitive,
  ) {
    return (_cJSON_Compare ??=
        _dylib.lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>(
            'cJSON_Compare'))(
      a,
      b,
      case_sensitive,
    );
  }

  _dart_cJSON_Compare? _cJSON_Compare;

  void cJSON_Minify(
    ffi.Pointer<ffi.Int8> json,
  ) {
    return (_cJSON_Minify ??= _dylib
        .lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify'))(
      json,
    );
  }

  _dart_cJSON_Minify? _cJSON_Minify;

  ffi.Pointer<cJSON> cJSON_AddNullToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return (_cJSON_AddNullToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddNullToObject,
        _dart_cJSON_AddNullToObject>('cJSON_AddNullToObject'))(
      object,
      name,
    );
  }

  _dart_cJSON_AddNullToObject? _cJSON_AddNullToObject;

  ffi.Pointer<cJSON> cJSON_AddTrueToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return (_cJSON_AddTrueToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddTrueToObject,
        _dart_cJSON_AddTrueToObject>('cJSON_AddTrueToObject'))(
      object,
      name,
    );
  }

  _dart_cJSON_AddTrueToObject? _cJSON_AddTrueToObject;

  ffi.Pointer<cJSON> cJSON_AddFalseToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return (_cJSON_AddFalseToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddFalseToObject,
        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject'))(
      object,
      name,
    );
  }

  _dart_cJSON_AddFalseToObject? _cJSON_AddFalseToObject;

  ffi.Pointer<cJSON> cJSON_AddBoolToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
    int boolean,
  ) {
    return (_cJSON_AddBoolToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddBoolToObject,
        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject'))(
      object,
      name,
      boolean,
    );
  }

  _dart_cJSON_AddBoolToObject? _cJSON_AddBoolToObject;

  ffi.Pointer<cJSON> cJSON_AddNumberToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
    double number,
  ) {
    return (_cJSON_AddNumberToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddNumberToObject,
        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject'))(
      object,
      name,
      number,
    );
  }

  _dart_cJSON_AddNumberToObject? _cJSON_AddNumberToObject;

  ffi.Pointer<cJSON> cJSON_AddStringToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_AddStringToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddStringToObject,
        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject'))(
      object,
      name,
      string,
    );
  }

  _dart_cJSON_AddStringToObject? _cJSON_AddStringToObject;

  ffi.Pointer<cJSON> cJSON_AddRawToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
    ffi.Pointer<ffi.Int8> raw,
  ) {
    return (_cJSON_AddRawToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddRawToObject,
        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject'))(
      object,
      name,
      raw,
    );
  }

  _dart_cJSON_AddRawToObject? _cJSON_AddRawToObject;

  ffi.Pointer<cJSON> cJSON_AddObjectToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return (_cJSON_AddObjectToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddObjectToObject,
        _dart_cJSON_AddObjectToObject>('cJSON_AddObjectToObject'))(
      object,
      name,
    );
  }

  _dart_cJSON_AddObjectToObject? _cJSON_AddObjectToObject;

  ffi.Pointer<cJSON> cJSON_AddArrayToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    return (_cJSON_AddArrayToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddArrayToObject,
        _dart_cJSON_AddArrayToObject>('cJSON_AddArrayToObject'))(
      object,
      name,
    );
  }

  _dart_cJSON_AddArrayToObject? _cJSON_AddArrayToObject;

  double cJSON_SetNumberHelper(
    ffi.Pointer<cJSON> object,
    double number,
  ) {
    return (_cJSON_SetNumberHelper ??= _dylib.lookupFunction<
        _c_cJSON_SetNumberHelper,
        _dart_cJSON_SetNumberHelper>('cJSON_SetNumberHelper'))(
      object,
      number,
    );
  }

  _dart_cJSON_SetNumberHelper? _cJSON_SetNumberHelper;

  ffi.Pointer<ffi.Void> cJSON_malloc(
    int size,
  ) {
    return (_cJSON_malloc ??= _dylib
        .lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc'))(
      size,
    );
  }

  _dart_cJSON_malloc? _cJSON_malloc;

  void cJSON_free(
    ffi.Pointer<ffi.Void> object,
  ) {
    return (_cJSON_free ??=
        _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free'))(
      object,
    );
  }

  _dart_cJSON_free? _cJSON_free;
}

class cJSON extends ffi.Struct {
  external ffi.Pointer<cJSON> next;

  external ffi.Pointer<cJSON> prev;

  external ffi.Pointer<cJSON> child;

  @ffi.Int32()
  external int type;

  external ffi.Pointer<ffi.Int8> valuestring;

  @ffi.Int32()
  external int valueint;

  @ffi.Double()
  external double valuedouble;

  external ffi.Pointer<ffi.Int8> string;
}

class cJSON_Hooks extends ffi.Struct {
  external ffi.Pointer<ffi.NativeFunction<_typedefC_1>> malloc_fn;

  external ffi.Pointer<ffi.NativeFunction<_typedefC_2>> free_fn;
}

const int CJSON_VERSION_MAJOR = 1;

const int CJSON_VERSION_MINOR = 7;

const int CJSON_VERSION_PATCH = 12;

const int cJSON_Invalid = 0;

const int cJSON_False = 1;

const int cJSON_True = 2;

const int cJSON_NULL = 4;

const int cJSON_Number = 8;

const int cJSON_String = 16;

const int cJSON_Array = 32;

const int cJSON_Object = 64;

const int cJSON_Raw = 128;

const int cJSON_IsReference = 256;

const int cJSON_StringIsConst = 512;

const int CJSON_NESTING_LIMIT = 1000;

const double CJSON_DOUBLE_PRECISION = 1e-16;

typedef _c_cJSON_Version = ffi.Pointer<ffi.Int8> Function();

typedef _dart_cJSON_Version = ffi.Pointer<ffi.Int8> Function();

typedef _c_cJSON_InitHooks = ffi.Void Function(
  ffi.Pointer<cJSON_Hooks> hooks,
);

typedef _dart_cJSON_InitHooks = void Function(
  ffi.Pointer<cJSON_Hooks> hooks,
);

typedef _c_cJSON_Parse = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> value,
);

typedef _dart_cJSON_Parse = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> value,
);

typedef _c_cJSON_ParseWithOpts = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> value,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
  ffi.Int32 require_null_terminated,
);

typedef _dart_cJSON_ParseWithOpts = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> value,
  ffi.Pointer<ffi.Pointer<ffi.Int8>> return_parse_end,
  int require_null_terminated,
);

typedef _c_cJSON_Print = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_Print = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_PrintUnformatted = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_PrintUnformatted = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_PrintBuffered = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
  ffi.Int32 prebuffer,
  ffi.Int32 fmt,
);

typedef _dart_cJSON_PrintBuffered = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
  int prebuffer,
  int fmt,
);

typedef _c_cJSON_PrintPreallocated = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
  ffi.Pointer<ffi.Int8> buffer,
  ffi.Int32 length,
  ffi.Int32 format,
);

typedef _dart_cJSON_PrintPreallocated = int Function(
  ffi.Pointer<cJSON> item,
  ffi.Pointer<ffi.Int8> buffer,
  int length,
  int format,
);

typedef _c_cJSON_Delete = ffi.Void Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_Delete = void Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_GetArraySize = ffi.Int32 Function(
  ffi.Pointer<cJSON> array,
);

typedef _dart_cJSON_GetArraySize = int Function(
  ffi.Pointer<cJSON> array,
);

typedef _c_cJSON_GetArrayItem = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> array,
  ffi.Int32 index,
);

typedef _dart_cJSON_GetArrayItem = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> array,
  int index,
);

typedef _c_cJSON_GetObjectItem = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_GetObjectItem = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_GetObjectItemCaseSensitive = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_GetObjectItemCaseSensitive = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_HasObjectItem = ffi.Int32 Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_HasObjectItem = int Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_GetErrorPtr = ffi.Pointer<ffi.Int8> Function();

typedef _dart_cJSON_GetErrorPtr = ffi.Pointer<ffi.Int8> Function();

typedef _c_cJSON_GetStringValue = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_GetStringValue = ffi.Pointer<ffi.Int8> Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsInvalid = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsInvalid = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsFalse = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsFalse = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsTrue = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsTrue = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsBool = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsBool = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsNull = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsNull = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsNumber = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsNumber = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsString = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsString = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsArray = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsArray = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsObject = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsObject = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_IsRaw = ffi.Int32 Function(
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_IsRaw = int Function(
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_CreateNull = ffi.Pointer<cJSON> Function();

typedef _dart_cJSON_CreateNull = ffi.Pointer<cJSON> Function();

typedef _c_cJSON_CreateTrue = ffi.Pointer<cJSON> Function();

typedef _dart_cJSON_CreateTrue = ffi.Pointer<cJSON> Function();

typedef _c_cJSON_CreateFalse = ffi.Pointer<cJSON> Function();

typedef _dart_cJSON_CreateFalse = ffi.Pointer<cJSON> Function();

typedef _c_cJSON_CreateBool = ffi.Pointer<cJSON> Function(
  ffi.Int32 boolean,
);

typedef _dart_cJSON_CreateBool = ffi.Pointer<cJSON> Function(
  int boolean,
);

typedef _c_cJSON_CreateNumber = ffi.Pointer<cJSON> Function(
  ffi.Double num,
);

typedef _dart_cJSON_CreateNumber = ffi.Pointer<cJSON> Function(
  double num,
);

typedef _c_cJSON_CreateString = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_CreateString = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_CreateRaw = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> raw,
);

typedef _dart_cJSON_CreateRaw = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> raw,
);

typedef _c_cJSON_CreateArray = ffi.Pointer<cJSON> Function();

typedef _dart_cJSON_CreateArray = ffi.Pointer<cJSON> Function();

typedef _c_cJSON_CreateObject = ffi.Pointer<cJSON> Function();

typedef _dart_cJSON_CreateObject = ffi.Pointer<cJSON> Function();

typedef _c_cJSON_CreateStringReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_CreateStringReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_CreateObjectReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> child,
);

typedef _dart_cJSON_CreateObjectReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> child,
);

typedef _c_cJSON_CreateArrayReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> child,
);

typedef _dart_cJSON_CreateArrayReference = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> child,
);

typedef _c_cJSON_CreateIntArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int32> numbers,
  ffi.Int32 count,
);

typedef _dart_cJSON_CreateIntArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Int32> numbers,
  int count,
);

typedef _c_cJSON_CreateFloatArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Float> numbers,
  ffi.Int32 count,
);

typedef _dart_cJSON_CreateFloatArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Float> numbers,
  int count,
);

typedef _c_cJSON_CreateDoubleArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Double> numbers,
  ffi.Int32 count,
);

typedef _dart_cJSON_CreateDoubleArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Double> numbers,
  int count,
);

typedef _c_cJSON_CreateStringArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
  ffi.Int32 count,
);

typedef _dart_cJSON_CreateStringArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
  int count,
);

typedef _c_cJSON_AddItemToArray = ffi.Void Function(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_AddItemToArray = void Function(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_AddItemToObject = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_AddItemToObject = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_AddItemToObjectCS = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_AddItemToObjectCS = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_AddItemReferenceToArray = ffi.Void Function(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_AddItemReferenceToArray = void Function(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_AddItemReferenceToObject = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_AddItemReferenceToObject = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_DetachItemViaPointer = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
);

typedef _dart_cJSON_DetachItemViaPointer = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
);

typedef _c_cJSON_DetachItemFromArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> array,
  ffi.Int32 which,
);

typedef _dart_cJSON_DetachItemFromArray = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> array,
  int which,
);

typedef _c_cJSON_DeleteItemFromArray = ffi.Void Function(
  ffi.Pointer<cJSON> array,
  ffi.Int32 which,
);

typedef _dart_cJSON_DeleteItemFromArray = void Function(
  ffi.Pointer<cJSON> array,
  int which,
);

typedef _c_cJSON_DetachItemFromObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_DetachItemFromObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_DetachItemFromObjectCaseSensitive = ffi.Pointer<cJSON>
    Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_DetachItemFromObjectCaseSensitive = ffi.Pointer<cJSON>
    Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_DeleteItemFromObject = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_DeleteItemFromObject = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_DeleteItemFromObjectCaseSensitive = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_DeleteItemFromObjectCaseSensitive = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_InsertItemInArray = ffi.Void Function(
  ffi.Pointer<cJSON> array,
  ffi.Int32 which,
  ffi.Pointer<cJSON> newitem,
);

typedef _dart_cJSON_InsertItemInArray = void Function(
  ffi.Pointer<cJSON> array,
  int which,
  ffi.Pointer<cJSON> newitem,
);

typedef _c_cJSON_ReplaceItemViaPointer = ffi.Int32 Function(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
  ffi.Pointer<cJSON> replacement,
);

typedef _dart_cJSON_ReplaceItemViaPointer = int Function(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
  ffi.Pointer<cJSON> replacement,
);

typedef _c_cJSON_ReplaceItemInArray = ffi.Void Function(
  ffi.Pointer<cJSON> array,
  ffi.Int32 which,
  ffi.Pointer<cJSON> newitem,
);

typedef _dart_cJSON_ReplaceItemInArray = void Function(
  ffi.Pointer<cJSON> array,
  int which,
  ffi.Pointer<cJSON> newitem,
);

typedef _c_cJSON_ReplaceItemInObject = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
);

typedef _dart_cJSON_ReplaceItemInObject = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
);

typedef _c_cJSON_ReplaceItemInObjectCaseSensitive = ffi.Void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
);

typedef _dart_cJSON_ReplaceItemInObjectCaseSensitive = void Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
);

typedef _c_cJSON_Duplicate = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> item,
  ffi.Int32 recurse,
);

typedef _dart_cJSON_Duplicate = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> item,
  int recurse,
);

typedef _c_cJSON_Compare = ffi.Int32 Function(
  ffi.Pointer<cJSON> a,
  ffi.Pointer<cJSON> b,
  ffi.Int32 case_sensitive,
);

typedef _dart_cJSON_Compare = int Function(
  ffi.Pointer<cJSON> a,
  ffi.Pointer<cJSON> b,
  int case_sensitive,
);

typedef _c_cJSON_Minify = ffi.Void Function(
  ffi.Pointer<ffi.Int8> json,
);

typedef _dart_cJSON_Minify = void Function(
  ffi.Pointer<ffi.Int8> json,
);

typedef _c_cJSON_AddNullToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _dart_cJSON_AddNullToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _c_cJSON_AddTrueToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _dart_cJSON_AddTrueToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _c_cJSON_AddFalseToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _dart_cJSON_AddFalseToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _c_cJSON_AddBoolToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Int32 boolean,
);

typedef _dart_cJSON_AddBoolToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  int boolean,
);

typedef _c_cJSON_AddNumberToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Double number,
);

typedef _dart_cJSON_AddNumberToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  double number,
);

typedef _c_cJSON_AddStringToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> string,
);

typedef _dart_cJSON_AddStringToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> string,
);

typedef _c_cJSON_AddRawToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> raw,
);

typedef _dart_cJSON_AddRawToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> raw,
);

typedef _c_cJSON_AddObjectToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _dart_cJSON_AddObjectToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _c_cJSON_AddArrayToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _dart_cJSON_AddArrayToObject = ffi.Pointer<cJSON> Function(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
);

typedef _c_cJSON_SetNumberHelper = ffi.Double Function(
  ffi.Pointer<cJSON> object,
  ffi.Double number,
);

typedef _dart_cJSON_SetNumberHelper = double Function(
  ffi.Pointer<cJSON> object,
  double number,
);

typedef _c_cJSON_malloc = ffi.Pointer<ffi.Void> Function(
  ffi.Uint64 size,
);

typedef _dart_cJSON_malloc = ffi.Pointer<ffi.Void> Function(
  int size,
);

typedef _c_cJSON_free = ffi.Void Function(
  ffi.Pointer<ffi.Void> object,
);

typedef _dart_cJSON_free = void Function(
  ffi.Pointer<ffi.Void> object,
);

typedef _typedefC_1 = ffi.Pointer<ffi.Void> Function(
  ffi.Uint64,
);

typedef _typedefC_2 = ffi.Void Function(
  ffi.Pointer<ffi.Void>,
);
