// 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 symbol lookup function.
  final ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
      _lookup;

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

  /// The symbols are looked up with [lookup].
  CJson.fromLookup(
      ffi.Pointer<T> Function<T extends ffi.NativeType>(String symbolName)
          lookup)
      : _lookup = lookup;

  ffi.Pointer<ffi.Int8> cJSON_Version() {
    return (_cJSON_Version ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Version>>('cJSON_Version')
            .asFunction<_dart_cJSON_Version>())();
  }

  _dart_cJSON_Version? _cJSON_Version;

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

  _dart_cJSON_InitHooks? _cJSON_InitHooks;

  ffi.Pointer<cJSON> cJSON_Parse(
    ffi.Pointer<ffi.Int8> value,
  ) {
    return (_cJSON_Parse ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Parse>>('cJSON_Parse')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_ParseWithOpts>>(
                'cJSON_ParseWithOpts')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Print>>('cJSON_Print')
            .asFunction<_dart_cJSON_Print>())(
      item,
    );
  }

  _dart_cJSON_Print? _cJSON_Print;

  ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_PrintUnformatted ??=
        _lookup<ffi.NativeFunction<_c_cJSON_PrintUnformatted>>(
                'cJSON_PrintUnformatted')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_PrintBuffered>>(
                'cJSON_PrintBuffered')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_PrintPreallocated>>(
                'cJSON_PrintPreallocated')
            .asFunction<_dart_cJSON_PrintPreallocated>())(
      item,
      buffer,
      length,
      format,
    );
  }

  _dart_cJSON_PrintPreallocated? _cJSON_PrintPreallocated;

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

  _dart_cJSON_Delete? _cJSON_Delete;

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

  _dart_cJSON_GetArraySize? _cJSON_GetArraySize;

  ffi.Pointer<cJSON> cJSON_GetArrayItem(
    ffi.Pointer<cJSON> array,
    int index,
  ) {
    return (_cJSON_GetArrayItem ??=
        _lookup<ffi.NativeFunction<_c_cJSON_GetArrayItem>>('cJSON_GetArrayItem')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_GetObjectItem>>(
                'cJSON_GetObjectItem')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_GetObjectItemCaseSensitive>>(
                'cJSON_GetObjectItemCaseSensitive')
            .asFunction<_dart_cJSON_GetObjectItemCaseSensitive>())(
      object,
      string,
    );
  }

  _dart_cJSON_GetObjectItemCaseSensitive? _cJSON_GetObjectItemCaseSensitive;

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

  _dart_cJSON_HasObjectItem? _cJSON_HasObjectItem;

  ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
    return (_cJSON_GetErrorPtr ??=
        _lookup<ffi.NativeFunction<_c_cJSON_GetErrorPtr>>('cJSON_GetErrorPtr')
            .asFunction<_dart_cJSON_GetErrorPtr>())();
  }

  _dart_cJSON_GetErrorPtr? _cJSON_GetErrorPtr;

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

  _dart_cJSON_GetStringValue? _cJSON_GetStringValue;

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

  _dart_cJSON_IsInvalid? _cJSON_IsInvalid;

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

  _dart_cJSON_IsFalse? _cJSON_IsFalse;

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

  _dart_cJSON_IsTrue? _cJSON_IsTrue;

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

  _dart_cJSON_IsBool? _cJSON_IsBool;

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

  _dart_cJSON_IsNull? _cJSON_IsNull;

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

  _dart_cJSON_IsNumber? _cJSON_IsNumber;

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

  _dart_cJSON_IsString? _cJSON_IsString;

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

  _dart_cJSON_IsArray? _cJSON_IsArray;

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

  _dart_cJSON_IsObject? _cJSON_IsObject;

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

  _dart_cJSON_IsRaw? _cJSON_IsRaw;

  ffi.Pointer<cJSON> cJSON_CreateNull() {
    return (_cJSON_CreateNull ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateNull>>('cJSON_CreateNull')
            .asFunction<_dart_cJSON_CreateNull>())();
  }

  _dart_cJSON_CreateNull? _cJSON_CreateNull;

  ffi.Pointer<cJSON> cJSON_CreateTrue() {
    return (_cJSON_CreateTrue ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateTrue>>('cJSON_CreateTrue')
            .asFunction<_dart_cJSON_CreateTrue>())();
  }

  _dart_cJSON_CreateTrue? _cJSON_CreateTrue;

  ffi.Pointer<cJSON> cJSON_CreateFalse() {
    return (_cJSON_CreateFalse ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateFalse>>('cJSON_CreateFalse')
            .asFunction<_dart_cJSON_CreateFalse>())();
  }

  _dart_cJSON_CreateFalse? _cJSON_CreateFalse;

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

  _dart_cJSON_CreateBool? _cJSON_CreateBool;

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

  _dart_cJSON_CreateNumber? _cJSON_CreateNumber;

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

  _dart_cJSON_CreateString? _cJSON_CreateString;

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

  _dart_cJSON_CreateRaw? _cJSON_CreateRaw;

  ffi.Pointer<cJSON> cJSON_CreateArray() {
    return (_cJSON_CreateArray ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateArray>>('cJSON_CreateArray')
            .asFunction<_dart_cJSON_CreateArray>())();
  }

  _dart_cJSON_CreateArray? _cJSON_CreateArray;

  ffi.Pointer<cJSON> cJSON_CreateObject() {
    return (_cJSON_CreateObject ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateObject>>('cJSON_CreateObject')
            .asFunction<_dart_cJSON_CreateObject>())();
  }

  _dart_cJSON_CreateObject? _cJSON_CreateObject;

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

  _dart_cJSON_CreateStringReference? _cJSON_CreateStringReference;

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

  _dart_cJSON_CreateObjectReference? _cJSON_CreateObjectReference;

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

  _dart_cJSON_CreateArrayReference? _cJSON_CreateArrayReference;

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

  _dart_cJSON_CreateIntArray? _cJSON_CreateIntArray;

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

  _dart_cJSON_CreateFloatArray? _cJSON_CreateFloatArray;

  ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
    ffi.Pointer<ffi.Double> numbers,
    int count,
  ) {
    return (_cJSON_CreateDoubleArray ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateDoubleArray>>(
                'cJSON_CreateDoubleArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_CreateStringArray>>(
                'cJSON_CreateStringArray')
            .asFunction<_dart_cJSON_CreateStringArray>())(
      strings,
      count,
    );
  }

  _dart_cJSON_CreateStringArray? _cJSON_CreateStringArray;

  void cJSON_AddItemToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemToArray ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddItemToArray>>(
                'cJSON_AddItemToArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddItemToObject>>(
                'cJSON_AddItemToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddItemToObjectCS>>(
                'cJSON_AddItemToObjectCS')
            .asFunction<_dart_cJSON_AddItemToObjectCS>())(
      object,
      string,
      item,
    );
  }

  _dart_cJSON_AddItemToObjectCS? _cJSON_AddItemToObjectCS;

  void cJSON_AddItemReferenceToArray(
    ffi.Pointer<cJSON> array,
    ffi.Pointer<cJSON> item,
  ) {
    return (_cJSON_AddItemReferenceToArray ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddItemReferenceToArray>>(
                'cJSON_AddItemReferenceToArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddItemReferenceToObject>>(
                'cJSON_AddItemReferenceToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_DetachItemViaPointer>>(
                'cJSON_DetachItemViaPointer')
            .asFunction<_dart_cJSON_DetachItemViaPointer>())(
      parent,
      item,
    );
  }

  _dart_cJSON_DetachItemViaPointer? _cJSON_DetachItemViaPointer;

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

  _dart_cJSON_DetachItemFromArray? _cJSON_DetachItemFromArray;

  void cJSON_DeleteItemFromArray(
    ffi.Pointer<cJSON> array,
    int which,
  ) {
    return (_cJSON_DeleteItemFromArray ??=
        _lookup<ffi.NativeFunction<_c_cJSON_DeleteItemFromArray>>(
                'cJSON_DeleteItemFromArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_DetachItemFromObject>>(
                'cJSON_DetachItemFromObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_DetachItemFromObjectCaseSensitive>>(
                'cJSON_DetachItemFromObjectCaseSensitive')
            .asFunction<_dart_cJSON_DetachItemFromObjectCaseSensitive>())(
      object,
      string,
    );
  }

  _dart_cJSON_DetachItemFromObjectCaseSensitive?
      _cJSON_DetachItemFromObjectCaseSensitive;

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

  _dart_cJSON_DeleteItemFromObject? _cJSON_DeleteItemFromObject;

  void cJSON_DeleteItemFromObjectCaseSensitive(
    ffi.Pointer<cJSON> object,
    ffi.Pointer<ffi.Int8> string,
  ) {
    return (_cJSON_DeleteItemFromObjectCaseSensitive ??=
        _lookup<ffi.NativeFunction<_c_cJSON_DeleteItemFromObjectCaseSensitive>>(
                'cJSON_DeleteItemFromObjectCaseSensitive')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_InsertItemInArray>>(
                'cJSON_InsertItemInArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_ReplaceItemViaPointer>>(
                'cJSON_ReplaceItemViaPointer')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_ReplaceItemInArray>>(
                'cJSON_ReplaceItemInArray')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_ReplaceItemInObject>>(
                'cJSON_ReplaceItemInObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_ReplaceItemInObjectCaseSensitive>>(
                'cJSON_ReplaceItemInObjectCaseSensitive')
            .asFunction<_dart_cJSON_ReplaceItemInObjectCaseSensitive>())(
      object,
      string,
      newitem,
    );
  }

  _dart_cJSON_ReplaceItemInObjectCaseSensitive?
      _cJSON_ReplaceItemInObjectCaseSensitive;

  ffi.Pointer<cJSON> cJSON_Duplicate(
    ffi.Pointer<cJSON> item,
    int recurse,
  ) {
    return (_cJSON_Duplicate ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Duplicate>>('cJSON_Duplicate')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Compare>>('cJSON_Compare')
            .asFunction<_dart_cJSON_Compare>())(
      a,
      b,
      case_sensitive,
    );
  }

  _dart_cJSON_Compare? _cJSON_Compare;

  void cJSON_Minify(
    ffi.Pointer<ffi.Int8> json,
  ) {
    return (_cJSON_Minify ??=
        _lookup<ffi.NativeFunction<_c_cJSON_Minify>>('cJSON_Minify')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddNullToObject>>(
                'cJSON_AddNullToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddTrueToObject>>(
                'cJSON_AddTrueToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddFalseToObject>>(
                'cJSON_AddFalseToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddBoolToObject>>(
                'cJSON_AddBoolToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddNumberToObject>>(
                'cJSON_AddNumberToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddStringToObject>>(
                'cJSON_AddStringToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddRawToObject>>(
                'cJSON_AddRawToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddObjectToObject>>(
                'cJSON_AddObjectToObject')
            .asFunction<_dart_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 ??=
        _lookup<ffi.NativeFunction<_c_cJSON_AddArrayToObject>>(
                'cJSON_AddArrayToObject')
            .asFunction<_dart_cJSON_AddArrayToObject>())(
      object,
      name,
    );
  }

  _dart_cJSON_AddArrayToObject? _cJSON_AddArrayToObject;

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

  _dart_cJSON_SetNumberHelper? _cJSON_SetNumberHelper;

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

  _dart_cJSON_malloc? _cJSON_malloc;

  void cJSON_free(
    ffi.Pointer<ffi.Void> object,
  ) {
    return (_cJSON_free ??=
        _lookup<ffi.NativeFunction<_c_cJSON_free>>('cJSON_free')
            .asFunction<_dart_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>,
);
