// 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() {
    _cJSON_Version ??= _dylib
        .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');
    return _cJSON_Version();
  }

  _dart_cJSON_Version _cJSON_Version;

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

  _dart_cJSON_InitHooks _cJSON_InitHooks;

  ffi.Pointer<cJSON> cJSON_Parse(
    ffi.Pointer<ffi.Int8> value,
  ) {
    _cJSON_Parse ??=
        _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');
    return _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,
  ) {
    _cJSON_ParseWithOpts ??= _dylib.lookupFunction<_c_cJSON_ParseWithOpts,
        _dart_cJSON_ParseWithOpts>('cJSON_ParseWithOpts');
    return _cJSON_ParseWithOpts(
      value,
      return_parse_end,
      require_null_terminated,
    );
  }

  _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts;

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

  _dart_cJSON_Print _cJSON_Print;

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

  _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted;

  ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
    ffi.Pointer<cJSON> item,
    int prebuffer,
    int fmt,
  ) {
    _cJSON_PrintBuffered ??= _dylib.lookupFunction<_c_cJSON_PrintBuffered,
        _dart_cJSON_PrintBuffered>('cJSON_PrintBuffered');
    return _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,
  ) {
    _cJSON_PrintPreallocated ??= _dylib.lookupFunction<
        _c_cJSON_PrintPreallocated,
        _dart_cJSON_PrintPreallocated>('cJSON_PrintPreallocated');
    return _cJSON_PrintPreallocated(
      item,
      buffer,
      length,
      format,
    );
  }

  _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated;

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

  _dart_cJSON_Delete _cJSON_Delete;

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

  _dart_cJSON_GetArraySize _cJSON_GetArraySize;

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

  _dart_cJSON_GetArrayItem _cJSON_GetArrayItem;

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

  _dart_cJSON_GetObjectItem _cJSON_GetObjectItem;

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

  _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive;

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

  _dart_cJSON_HasObjectItem _cJSON_HasObjectItem;

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

  _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr;

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

  _dart_cJSON_GetStringValue _cJSON_GetStringValue;

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

  _dart_cJSON_IsInvalid _cJSON_IsInvalid;

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

  _dart_cJSON_IsFalse _cJSON_IsFalse;

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

  _dart_cJSON_IsTrue _cJSON_IsTrue;

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

  _dart_cJSON_IsBool _cJSON_IsBool;

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

  _dart_cJSON_IsNull _cJSON_IsNull;

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

  _dart_cJSON_IsNumber _cJSON_IsNumber;

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

  _dart_cJSON_IsString _cJSON_IsString;

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

  _dart_cJSON_IsArray _cJSON_IsArray;

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

  _dart_cJSON_IsObject _cJSON_IsObject;

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

  _dart_cJSON_IsRaw _cJSON_IsRaw;

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

  _dart_cJSON_CreateNull _cJSON_CreateNull;

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

  _dart_cJSON_CreateTrue _cJSON_CreateTrue;

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

  _dart_cJSON_CreateFalse _cJSON_CreateFalse;

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

  _dart_cJSON_CreateBool _cJSON_CreateBool;

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

  _dart_cJSON_CreateNumber _cJSON_CreateNumber;

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

  _dart_cJSON_CreateString _cJSON_CreateString;

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

  _dart_cJSON_CreateRaw _cJSON_CreateRaw;

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

  _dart_cJSON_CreateArray _cJSON_CreateArray;

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

  _dart_cJSON_CreateObject _cJSON_CreateObject;

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

  _dart_cJSON_CreateStringReference _cJSON_CreateStringReference;

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

  _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference;

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

  _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference;

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

  _dart_cJSON_CreateIntArray _cJSON_CreateIntArray;

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

  _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray;

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

  _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray;

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

  _dart_cJSON_CreateStringArray _cJSON_CreateStringArray;

  void cJSON_AddItemToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    _cJSON_AddItemToArray ??= _dylib.lookupFunction<_c_cJSON_AddItemToArray,
        _dart_cJSON_AddItemToArray>('cJSON_AddItemToArray');
    return _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,
  ) {
    _cJSON_AddItemToObject ??= _dylib.lookupFunction<_c_cJSON_AddItemToObject,
        _dart_cJSON_AddItemToObject>('cJSON_AddItemToObject');
    return _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,
  ) {
    _cJSON_AddItemToObjectCS ??= _dylib.lookupFunction<
        _c_cJSON_AddItemToObjectCS,
        _dart_cJSON_AddItemToObjectCS>('cJSON_AddItemToObjectCS');
    return _cJSON_AddItemToObjectCS(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS;

  void cJSON_AddItemReferenceToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    _cJSON_AddItemReferenceToArray ??= _dylib.lookupFunction<
        _c_cJSON_AddItemReferenceToArray,
        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');
    return _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,
  ) {
    _cJSON_AddItemReferenceToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddItemReferenceToObject,
        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');
    return _cJSON_AddItemReferenceToObject(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject;

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

  _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer;

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

  _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray;

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

  _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray;

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

  _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject;

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

  _dart_cJSON_DetachItemFromObjectCaseSensitive
      _cJSON_DetachItemFromObjectCaseSensitive;

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

  _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject;

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

  _dart_cJSON_DeleteItemFromObjectCaseSensitive
      _cJSON_DeleteItemFromObjectCaseSensitive;

  void cJSON_InsertItemInArray(
    ffi.Pointer<cJSON> array,
    int which,
    ffi.Pointer<cJSON> newitem,
  ) {
    _cJSON_InsertItemInArray ??= _dylib.lookupFunction<
        _c_cJSON_InsertItemInArray,
        _dart_cJSON_InsertItemInArray>('cJSON_InsertItemInArray');
    return _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,
  ) {
    _cJSON_ReplaceItemViaPointer ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemViaPointer,
        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');
    return _cJSON_ReplaceItemViaPointer(
      parent,
      item,
      replacement,
    );
  }

  _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer;

  void cJSON_ReplaceItemInArray(
    ffi.Pointer<cJSON> array,
    int which,
    ffi.Pointer<cJSON> newitem,
  ) {
    _cJSON_ReplaceItemInArray ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemInArray,
        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');
    return _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,
  ) {
    _cJSON_ReplaceItemInObject ??= _dylib.lookupFunction<
        _c_cJSON_ReplaceItemInObject,
        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');
    return _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,
  ) {
    _cJSON_ReplaceItemInObjectCaseSensitive ??= _dylib.lookupFunction<
            _c_cJSON_ReplaceItemInObjectCaseSensitive,
            _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
        'cJSON_ReplaceItemInObjectCaseSensitive');
    return _cJSON_ReplaceItemInObjectCaseSensitive(
      object,
      string,
      newitem,
    );
  }

  _dart_cJSON_ReplaceItemInObjectCaseSensitive
      _cJSON_ReplaceItemInObjectCaseSensitive;

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

  _dart_cJSON_Duplicate _cJSON_Duplicate;

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

  _dart_cJSON_Compare _cJSON_Compare;

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

  _dart_cJSON_Minify _cJSON_Minify;

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

  _dart_cJSON_AddNullToObject _cJSON_AddNullToObject;

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

  _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject;

  ffi.Pointer<cJSON> cJSON_AddFalseToObject(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> name,
  ) {
    _cJSON_AddFalseToObject ??= _dylib.lookupFunction<_c_cJSON_AddFalseToObject,
        _dart_cJSON_AddFalseToObject>('cJSON_AddFalseToObject');
    return _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,
  ) {
    _cJSON_AddBoolToObject ??= _dylib.lookupFunction<_c_cJSON_AddBoolToObject,
        _dart_cJSON_AddBoolToObject>('cJSON_AddBoolToObject');
    return _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,
  ) {
    _cJSON_AddNumberToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddNumberToObject,
        _dart_cJSON_AddNumberToObject>('cJSON_AddNumberToObject');
    return _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,
  ) {
    _cJSON_AddStringToObject ??= _dylib.lookupFunction<
        _c_cJSON_AddStringToObject,
        _dart_cJSON_AddStringToObject>('cJSON_AddStringToObject');
    return _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,
  ) {
    _cJSON_AddRawToObject ??= _dylib.lookupFunction<_c_cJSON_AddRawToObject,
        _dart_cJSON_AddRawToObject>('cJSON_AddRawToObject');
    return _cJSON_AddRawToObject(
      object,
      name,
      raw,
    );
  }

  _dart_cJSON_AddRawToObject _cJSON_AddRawToObject;

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

  _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject;

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

  _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject;

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

  _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper;

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

  _dart_cJSON_malloc _cJSON_malloc;

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

  _dart_cJSON_free _cJSON_free;
}

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

  ffi.Pointer<cJSON> prev;

  ffi.Pointer<cJSON> child;

  @ffi.Int32()
  int type;

  ffi.Pointer<ffi.Int8> valuestring;

  @ffi.Int32()
  int valueint;

  @ffi.Double()
  double valuedouble;

  ffi.Pointer<ffi.Int8> string;
}

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

  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>,
);
