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