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

/// Holds the Dynamic library.
ffi.DynamicLibrary _dylib;

/// Initialises the Dynamic library.
void init(ffi.DynamicLibrary dynamicLibrary) {
  _dylib = dynamicLibrary;
}

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;
}

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

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

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

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

ffi.Pointer<ffi.Int8> cJSON_Version() {
  return _cJSON_Version();
}

final _dart_cJSON_Version _cJSON_Version = _dylib
    .lookupFunction<_c_cJSON_Version, _dart_cJSON_Version>('cJSON_Version');

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

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

void cJSON_InitHooks(
  ffi.Pointer<cJSON_Hooks> hooks,
) {
  return _cJSON_InitHooks(
    hooks,
  );
}

final _dart_cJSON_InitHooks _cJSON_InitHooks =
    _dylib.lookupFunction<_c_cJSON_InitHooks, _dart_cJSON_InitHooks>(
        'cJSON_InitHooks');

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

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

ffi.Pointer<cJSON> cJSON_Parse(
  ffi.Pointer<ffi.Int8> value,
) {
  return _cJSON_Parse(
    value,
  );
}

final _dart_cJSON_Parse _cJSON_Parse =
    _dylib.lookupFunction<_c_cJSON_Parse, _dart_cJSON_Parse>('cJSON_Parse');

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

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(
    value,
    return_parse_end,
    require_null_terminated,
  );
}

final _dart_cJSON_ParseWithOpts _cJSON_ParseWithOpts =
    _dylib.lookupFunction<_c_cJSON_ParseWithOpts, _dart_cJSON_ParseWithOpts>(
        'cJSON_ParseWithOpts');

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

ffi.Pointer<ffi.Int8> cJSON_Print(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_Print(
    item,
  );
}

final _dart_cJSON_Print _cJSON_Print =
    _dylib.lookupFunction<_c_cJSON_Print, _dart_cJSON_Print>('cJSON_Print');

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

ffi.Pointer<ffi.Int8> cJSON_PrintUnformatted(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_PrintUnformatted(
    item,
  );
}

final _dart_cJSON_PrintUnformatted _cJSON_PrintUnformatted = _dylib
    .lookupFunction<_c_cJSON_PrintUnformatted, _dart_cJSON_PrintUnformatted>(
        'cJSON_PrintUnformatted');

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

ffi.Pointer<ffi.Int8> cJSON_PrintBuffered(
  ffi.Pointer<cJSON> item,
  int prebuffer,
  int fmt,
) {
  return _cJSON_PrintBuffered(
    item,
    prebuffer,
    fmt,
  );
}

final _dart_cJSON_PrintBuffered _cJSON_PrintBuffered =
    _dylib.lookupFunction<_c_cJSON_PrintBuffered, _dart_cJSON_PrintBuffered>(
        'cJSON_PrintBuffered');

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

int cJSON_PrintPreallocated(
  ffi.Pointer<cJSON> item,
  ffi.Pointer<ffi.Int8> buffer,
  int length,
  int format,
) {
  return _cJSON_PrintPreallocated(
    item,
    buffer,
    length,
    format,
  );
}

final _dart_cJSON_PrintPreallocated _cJSON_PrintPreallocated = _dylib
    .lookupFunction<_c_cJSON_PrintPreallocated, _dart_cJSON_PrintPreallocated>(
        'cJSON_PrintPreallocated');

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

void cJSON_Delete(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_Delete(
    item,
  );
}

final _dart_cJSON_Delete _cJSON_Delete =
    _dylib.lookupFunction<_c_cJSON_Delete, _dart_cJSON_Delete>('cJSON_Delete');

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

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

int cJSON_GetArraySize(
  ffi.Pointer<cJSON> array,
) {
  return _cJSON_GetArraySize(
    array,
  );
}

final _dart_cJSON_GetArraySize _cJSON_GetArraySize =
    _dylib.lookupFunction<_c_cJSON_GetArraySize, _dart_cJSON_GetArraySize>(
        'cJSON_GetArraySize');

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

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

ffi.Pointer<cJSON> cJSON_GetArrayItem(
  ffi.Pointer<cJSON> array,
  int index,
) {
  return _cJSON_GetArrayItem(
    array,
    index,
  );
}

final _dart_cJSON_GetArrayItem _cJSON_GetArrayItem =
    _dylib.lookupFunction<_c_cJSON_GetArrayItem, _dart_cJSON_GetArrayItem>(
        'cJSON_GetArrayItem');

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

ffi.Pointer<cJSON> cJSON_GetObjectItem(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_GetObjectItem(
    object,
    string,
  );
}

final _dart_cJSON_GetObjectItem _cJSON_GetObjectItem =
    _dylib.lookupFunction<_c_cJSON_GetObjectItem, _dart_cJSON_GetObjectItem>(
        'cJSON_GetObjectItem');

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

ffi.Pointer<cJSON> cJSON_GetObjectItemCaseSensitive(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_GetObjectItemCaseSensitive(
    object,
    string,
  );
}

final _dart_cJSON_GetObjectItemCaseSensitive _cJSON_GetObjectItemCaseSensitive =
    _dylib.lookupFunction<_c_cJSON_GetObjectItemCaseSensitive,
            _dart_cJSON_GetObjectItemCaseSensitive>(
        'cJSON_GetObjectItemCaseSensitive');

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

int cJSON_HasObjectItem(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_HasObjectItem(
    object,
    string,
  );
}

final _dart_cJSON_HasObjectItem _cJSON_HasObjectItem =
    _dylib.lookupFunction<_c_cJSON_HasObjectItem, _dart_cJSON_HasObjectItem>(
        'cJSON_HasObjectItem');

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

ffi.Pointer<ffi.Int8> cJSON_GetErrorPtr() {
  return _cJSON_GetErrorPtr();
}

final _dart_cJSON_GetErrorPtr _cJSON_GetErrorPtr =
    _dylib.lookupFunction<_c_cJSON_GetErrorPtr, _dart_cJSON_GetErrorPtr>(
        'cJSON_GetErrorPtr');

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

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

ffi.Pointer<ffi.Int8> cJSON_GetStringValue(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_GetStringValue(
    item,
  );
}

final _dart_cJSON_GetStringValue _cJSON_GetStringValue =
    _dylib.lookupFunction<_c_cJSON_GetStringValue, _dart_cJSON_GetStringValue>(
        'cJSON_GetStringValue');

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

int cJSON_IsInvalid(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsInvalid(
    item,
  );
}

final _dart_cJSON_IsInvalid _cJSON_IsInvalid =
    _dylib.lookupFunction<_c_cJSON_IsInvalid, _dart_cJSON_IsInvalid>(
        'cJSON_IsInvalid');

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

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

int cJSON_IsFalse(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsFalse(
    item,
  );
}

final _dart_cJSON_IsFalse _cJSON_IsFalse = _dylib
    .lookupFunction<_c_cJSON_IsFalse, _dart_cJSON_IsFalse>('cJSON_IsFalse');

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

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

int cJSON_IsTrue(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsTrue(
    item,
  );
}

final _dart_cJSON_IsTrue _cJSON_IsTrue =
    _dylib.lookupFunction<_c_cJSON_IsTrue, _dart_cJSON_IsTrue>('cJSON_IsTrue');

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

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

int cJSON_IsBool(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsBool(
    item,
  );
}

final _dart_cJSON_IsBool _cJSON_IsBool =
    _dylib.lookupFunction<_c_cJSON_IsBool, _dart_cJSON_IsBool>('cJSON_IsBool');

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

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

int cJSON_IsNull(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsNull(
    item,
  );
}

final _dart_cJSON_IsNull _cJSON_IsNull =
    _dylib.lookupFunction<_c_cJSON_IsNull, _dart_cJSON_IsNull>('cJSON_IsNull');

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

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

int cJSON_IsNumber(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsNumber(
    item,
  );
}

final _dart_cJSON_IsNumber _cJSON_IsNumber = _dylib
    .lookupFunction<_c_cJSON_IsNumber, _dart_cJSON_IsNumber>('cJSON_IsNumber');

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

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

int cJSON_IsString(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsString(
    item,
  );
}

final _dart_cJSON_IsString _cJSON_IsString = _dylib
    .lookupFunction<_c_cJSON_IsString, _dart_cJSON_IsString>('cJSON_IsString');

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

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

int cJSON_IsArray(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsArray(
    item,
  );
}

final _dart_cJSON_IsArray _cJSON_IsArray = _dylib
    .lookupFunction<_c_cJSON_IsArray, _dart_cJSON_IsArray>('cJSON_IsArray');

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

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

int cJSON_IsObject(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsObject(
    item,
  );
}

final _dart_cJSON_IsObject _cJSON_IsObject = _dylib
    .lookupFunction<_c_cJSON_IsObject, _dart_cJSON_IsObject>('cJSON_IsObject');

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

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

int cJSON_IsRaw(
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_IsRaw(
    item,
  );
}

final _dart_cJSON_IsRaw _cJSON_IsRaw =
    _dylib.lookupFunction<_c_cJSON_IsRaw, _dart_cJSON_IsRaw>('cJSON_IsRaw');

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

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

ffi.Pointer<cJSON> cJSON_CreateNull() {
  return _cJSON_CreateNull();
}

final _dart_cJSON_CreateNull _cJSON_CreateNull =
    _dylib.lookupFunction<_c_cJSON_CreateNull, _dart_cJSON_CreateNull>(
        'cJSON_CreateNull');

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

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

ffi.Pointer<cJSON> cJSON_CreateTrue() {
  return _cJSON_CreateTrue();
}

final _dart_cJSON_CreateTrue _cJSON_CreateTrue =
    _dylib.lookupFunction<_c_cJSON_CreateTrue, _dart_cJSON_CreateTrue>(
        'cJSON_CreateTrue');

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

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

ffi.Pointer<cJSON> cJSON_CreateFalse() {
  return _cJSON_CreateFalse();
}

final _dart_cJSON_CreateFalse _cJSON_CreateFalse =
    _dylib.lookupFunction<_c_cJSON_CreateFalse, _dart_cJSON_CreateFalse>(
        'cJSON_CreateFalse');

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

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

ffi.Pointer<cJSON> cJSON_CreateBool(
  int boolean,
) {
  return _cJSON_CreateBool(
    boolean,
  );
}

final _dart_cJSON_CreateBool _cJSON_CreateBool =
    _dylib.lookupFunction<_c_cJSON_CreateBool, _dart_cJSON_CreateBool>(
        'cJSON_CreateBool');

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

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

ffi.Pointer<cJSON> cJSON_CreateNumber(
  double num,
) {
  return _cJSON_CreateNumber(
    num,
  );
}

final _dart_cJSON_CreateNumber _cJSON_CreateNumber =
    _dylib.lookupFunction<_c_cJSON_CreateNumber, _dart_cJSON_CreateNumber>(
        'cJSON_CreateNumber');

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

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

ffi.Pointer<cJSON> cJSON_CreateString(
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_CreateString(
    string,
  );
}

final _dart_cJSON_CreateString _cJSON_CreateString =
    _dylib.lookupFunction<_c_cJSON_CreateString, _dart_cJSON_CreateString>(
        'cJSON_CreateString');

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

ffi.Pointer<cJSON> cJSON_CreateRaw(
  ffi.Pointer<ffi.Int8> raw,
) {
  return _cJSON_CreateRaw(
    raw,
  );
}

final _dart_cJSON_CreateRaw _cJSON_CreateRaw =
    _dylib.lookupFunction<_c_cJSON_CreateRaw, _dart_cJSON_CreateRaw>(
        'cJSON_CreateRaw');

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

ffi.Pointer<cJSON> cJSON_CreateArray() {
  return _cJSON_CreateArray();
}

final _dart_cJSON_CreateArray _cJSON_CreateArray =
    _dylib.lookupFunction<_c_cJSON_CreateArray, _dart_cJSON_CreateArray>(
        'cJSON_CreateArray');

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

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

ffi.Pointer<cJSON> cJSON_CreateObject() {
  return _cJSON_CreateObject();
}

final _dart_cJSON_CreateObject _cJSON_CreateObject =
    _dylib.lookupFunction<_c_cJSON_CreateObject, _dart_cJSON_CreateObject>(
        'cJSON_CreateObject');

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

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

ffi.Pointer<cJSON> cJSON_CreateStringReference(
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_CreateStringReference(
    string,
  );
}

final _dart_cJSON_CreateStringReference _cJSON_CreateStringReference =
    _dylib.lookupFunction<_c_cJSON_CreateStringReference,
        _dart_cJSON_CreateStringReference>('cJSON_CreateStringReference');

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

ffi.Pointer<cJSON> cJSON_CreateObjectReference(
  ffi.Pointer<cJSON> child,
) {
  return _cJSON_CreateObjectReference(
    child,
  );
}

final _dart_cJSON_CreateObjectReference _cJSON_CreateObjectReference =
    _dylib.lookupFunction<_c_cJSON_CreateObjectReference,
        _dart_cJSON_CreateObjectReference>('cJSON_CreateObjectReference');

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

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

ffi.Pointer<cJSON> cJSON_CreateArrayReference(
  ffi.Pointer<cJSON> child,
) {
  return _cJSON_CreateArrayReference(
    child,
  );
}

final _dart_cJSON_CreateArrayReference _cJSON_CreateArrayReference =
    _dylib.lookupFunction<_c_cJSON_CreateArrayReference,
        _dart_cJSON_CreateArrayReference>('cJSON_CreateArrayReference');

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

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

ffi.Pointer<cJSON> cJSON_CreateIntArray(
  ffi.Pointer<ffi.Int32> numbers,
  int count,
) {
  return _cJSON_CreateIntArray(
    numbers,
    count,
  );
}

final _dart_cJSON_CreateIntArray _cJSON_CreateIntArray =
    _dylib.lookupFunction<_c_cJSON_CreateIntArray, _dart_cJSON_CreateIntArray>(
        'cJSON_CreateIntArray');

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

ffi.Pointer<cJSON> cJSON_CreateFloatArray(
  ffi.Pointer<ffi.Float> numbers,
  int count,
) {
  return _cJSON_CreateFloatArray(
    numbers,
    count,
  );
}

final _dart_cJSON_CreateFloatArray _cJSON_CreateFloatArray = _dylib
    .lookupFunction<_c_cJSON_CreateFloatArray, _dart_cJSON_CreateFloatArray>(
        'cJSON_CreateFloatArray');

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

ffi.Pointer<cJSON> cJSON_CreateDoubleArray(
  ffi.Pointer<ffi.Double> numbers,
  int count,
) {
  return _cJSON_CreateDoubleArray(
    numbers,
    count,
  );
}

final _dart_cJSON_CreateDoubleArray _cJSON_CreateDoubleArray = _dylib
    .lookupFunction<_c_cJSON_CreateDoubleArray, _dart_cJSON_CreateDoubleArray>(
        'cJSON_CreateDoubleArray');

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

ffi.Pointer<cJSON> cJSON_CreateStringArray(
  ffi.Pointer<ffi.Pointer<ffi.Int8>> strings,
  int count,
) {
  return _cJSON_CreateStringArray(
    strings,
    count,
  );
}

final _dart_cJSON_CreateStringArray _cJSON_CreateStringArray = _dylib
    .lookupFunction<_c_cJSON_CreateStringArray, _dart_cJSON_CreateStringArray>(
        'cJSON_CreateStringArray');

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

void cJSON_AddItemToArray(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_AddItemToArray(
    array,
    item,
  );
}

final _dart_cJSON_AddItemToArray _cJSON_AddItemToArray =
    _dylib.lookupFunction<_c_cJSON_AddItemToArray, _dart_cJSON_AddItemToArray>(
        'cJSON_AddItemToArray');

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

void cJSON_AddItemToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_AddItemToObject(
    object,
    string,
    item,
  );
}

final _dart_cJSON_AddItemToObject _cJSON_AddItemToObject = _dylib
    .lookupFunction<_c_cJSON_AddItemToObject, _dart_cJSON_AddItemToObject>(
        'cJSON_AddItemToObject');

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

void cJSON_AddItemToObjectCS(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_AddItemToObjectCS(
    object,
    string,
    item,
  );
}

final _dart_cJSON_AddItemToObjectCS _cJSON_AddItemToObjectCS = _dylib
    .lookupFunction<_c_cJSON_AddItemToObjectCS, _dart_cJSON_AddItemToObjectCS>(
        'cJSON_AddItemToObjectCS');

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

void cJSON_AddItemReferenceToArray(
  ffi.Pointer<cJSON> array,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_AddItemReferenceToArray(
    array,
    item,
  );
}

final _dart_cJSON_AddItemReferenceToArray _cJSON_AddItemReferenceToArray =
    _dylib.lookupFunction<_c_cJSON_AddItemReferenceToArray,
        _dart_cJSON_AddItemReferenceToArray>('cJSON_AddItemReferenceToArray');

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

void cJSON_AddItemReferenceToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_AddItemReferenceToObject(
    object,
    string,
    item,
  );
}

final _dart_cJSON_AddItemReferenceToObject _cJSON_AddItemReferenceToObject =
    _dylib.lookupFunction<_c_cJSON_AddItemReferenceToObject,
        _dart_cJSON_AddItemReferenceToObject>('cJSON_AddItemReferenceToObject');

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

ffi.Pointer<cJSON> cJSON_DetachItemViaPointer(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
) {
  return _cJSON_DetachItemViaPointer(
    parent,
    item,
  );
}

final _dart_cJSON_DetachItemViaPointer _cJSON_DetachItemViaPointer =
    _dylib.lookupFunction<_c_cJSON_DetachItemViaPointer,
        _dart_cJSON_DetachItemViaPointer>('cJSON_DetachItemViaPointer');

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

ffi.Pointer<cJSON> cJSON_DetachItemFromArray(
  ffi.Pointer<cJSON> array,
  int which,
) {
  return _cJSON_DetachItemFromArray(
    array,
    which,
  );
}

final _dart_cJSON_DetachItemFromArray _cJSON_DetachItemFromArray =
    _dylib.lookupFunction<_c_cJSON_DetachItemFromArray,
        _dart_cJSON_DetachItemFromArray>('cJSON_DetachItemFromArray');

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

void cJSON_DeleteItemFromArray(
  ffi.Pointer<cJSON> array,
  int which,
) {
  return _cJSON_DeleteItemFromArray(
    array,
    which,
  );
}

final _dart_cJSON_DeleteItemFromArray _cJSON_DeleteItemFromArray =
    _dylib.lookupFunction<_c_cJSON_DeleteItemFromArray,
        _dart_cJSON_DeleteItemFromArray>('cJSON_DeleteItemFromArray');

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

ffi.Pointer<cJSON> cJSON_DetachItemFromObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_DetachItemFromObject(
    object,
    string,
  );
}

final _dart_cJSON_DetachItemFromObject _cJSON_DetachItemFromObject =
    _dylib.lookupFunction<_c_cJSON_DetachItemFromObject,
        _dart_cJSON_DetachItemFromObject>('cJSON_DetachItemFromObject');

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

ffi.Pointer<cJSON> cJSON_DetachItemFromObjectCaseSensitive(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_DetachItemFromObjectCaseSensitive(
    object,
    string,
  );
}

final _dart_cJSON_DetachItemFromObjectCaseSensitive
    _cJSON_DetachItemFromObjectCaseSensitive = _dylib.lookupFunction<
            _c_cJSON_DetachItemFromObjectCaseSensitive,
            _dart_cJSON_DetachItemFromObjectCaseSensitive>(
        'cJSON_DetachItemFromObjectCaseSensitive');

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

void cJSON_DeleteItemFromObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_DeleteItemFromObject(
    object,
    string,
  );
}

final _dart_cJSON_DeleteItemFromObject _cJSON_DeleteItemFromObject =
    _dylib.lookupFunction<_c_cJSON_DeleteItemFromObject,
        _dart_cJSON_DeleteItemFromObject>('cJSON_DeleteItemFromObject');

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

void cJSON_DeleteItemFromObjectCaseSensitive(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_DeleteItemFromObjectCaseSensitive(
    object,
    string,
  );
}

final _dart_cJSON_DeleteItemFromObjectCaseSensitive
    _cJSON_DeleteItemFromObjectCaseSensitive = _dylib.lookupFunction<
            _c_cJSON_DeleteItemFromObjectCaseSensitive,
            _dart_cJSON_DeleteItemFromObjectCaseSensitive>(
        'cJSON_DeleteItemFromObjectCaseSensitive');

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

void cJSON_InsertItemInArray(
  ffi.Pointer<cJSON> array,
  int which,
  ffi.Pointer<cJSON> newitem,
) {
  return _cJSON_InsertItemInArray(
    array,
    which,
    newitem,
  );
}

final _dart_cJSON_InsertItemInArray _cJSON_InsertItemInArray = _dylib
    .lookupFunction<_c_cJSON_InsertItemInArray, _dart_cJSON_InsertItemInArray>(
        'cJSON_InsertItemInArray');

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

int cJSON_ReplaceItemViaPointer(
  ffi.Pointer<cJSON> parent,
  ffi.Pointer<cJSON> item,
  ffi.Pointer<cJSON> replacement,
) {
  return _cJSON_ReplaceItemViaPointer(
    parent,
    item,
    replacement,
  );
}

final _dart_cJSON_ReplaceItemViaPointer _cJSON_ReplaceItemViaPointer =
    _dylib.lookupFunction<_c_cJSON_ReplaceItemViaPointer,
        _dart_cJSON_ReplaceItemViaPointer>('cJSON_ReplaceItemViaPointer');

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

void cJSON_ReplaceItemInArray(
  ffi.Pointer<cJSON> array,
  int which,
  ffi.Pointer<cJSON> newitem,
) {
  return _cJSON_ReplaceItemInArray(
    array,
    which,
    newitem,
  );
}

final _dart_cJSON_ReplaceItemInArray _cJSON_ReplaceItemInArray =
    _dylib.lookupFunction<_c_cJSON_ReplaceItemInArray,
        _dart_cJSON_ReplaceItemInArray>('cJSON_ReplaceItemInArray');

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

void cJSON_ReplaceItemInObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
) {
  return _cJSON_ReplaceItemInObject(
    object,
    string,
    newitem,
  );
}

final _dart_cJSON_ReplaceItemInObject _cJSON_ReplaceItemInObject =
    _dylib.lookupFunction<_c_cJSON_ReplaceItemInObject,
        _dart_cJSON_ReplaceItemInObject>('cJSON_ReplaceItemInObject');

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

void cJSON_ReplaceItemInObjectCaseSensitive(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> string,
  ffi.Pointer<cJSON> newitem,
) {
  return _cJSON_ReplaceItemInObjectCaseSensitive(
    object,
    string,
    newitem,
  );
}

final _dart_cJSON_ReplaceItemInObjectCaseSensitive
    _cJSON_ReplaceItemInObjectCaseSensitive = _dylib.lookupFunction<
            _c_cJSON_ReplaceItemInObjectCaseSensitive,
            _dart_cJSON_ReplaceItemInObjectCaseSensitive>(
        'cJSON_ReplaceItemInObjectCaseSensitive');

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

ffi.Pointer<cJSON> cJSON_Duplicate(
  ffi.Pointer<cJSON> item,
  int recurse,
) {
  return _cJSON_Duplicate(
    item,
    recurse,
  );
}

final _dart_cJSON_Duplicate _cJSON_Duplicate =
    _dylib.lookupFunction<_c_cJSON_Duplicate, _dart_cJSON_Duplicate>(
        'cJSON_Duplicate');

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

int cJSON_Compare(
  ffi.Pointer<cJSON> a,
  ffi.Pointer<cJSON> b,
  int case_sensitive,
) {
  return _cJSON_Compare(
    a,
    b,
    case_sensitive,
  );
}

final _dart_cJSON_Compare _cJSON_Compare = _dylib
    .lookupFunction<_c_cJSON_Compare, _dart_cJSON_Compare>('cJSON_Compare');

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

void cJSON_Minify(
  ffi.Pointer<ffi.Int8> json,
) {
  return _cJSON_Minify(
    json,
  );
}

final _dart_cJSON_Minify _cJSON_Minify =
    _dylib.lookupFunction<_c_cJSON_Minify, _dart_cJSON_Minify>('cJSON_Minify');

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

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

ffi.Pointer<cJSON> cJSON_AddNullToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
) {
  return _cJSON_AddNullToObject(
    object,
    name,
  );
}

final _dart_cJSON_AddNullToObject _cJSON_AddNullToObject = _dylib
    .lookupFunction<_c_cJSON_AddNullToObject, _dart_cJSON_AddNullToObject>(
        'cJSON_AddNullToObject');

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

ffi.Pointer<cJSON> cJSON_AddTrueToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
) {
  return _cJSON_AddTrueToObject(
    object,
    name,
  );
}

final _dart_cJSON_AddTrueToObject _cJSON_AddTrueToObject = _dylib
    .lookupFunction<_c_cJSON_AddTrueToObject, _dart_cJSON_AddTrueToObject>(
        'cJSON_AddTrueToObject');

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

ffi.Pointer<cJSON> cJSON_AddFalseToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
) {
  return _cJSON_AddFalseToObject(
    object,
    name,
  );
}

final _dart_cJSON_AddFalseToObject _cJSON_AddFalseToObject = _dylib
    .lookupFunction<_c_cJSON_AddFalseToObject, _dart_cJSON_AddFalseToObject>(
        'cJSON_AddFalseToObject');

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

ffi.Pointer<cJSON> cJSON_AddBoolToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  int boolean,
) {
  return _cJSON_AddBoolToObject(
    object,
    name,
    boolean,
  );
}

final _dart_cJSON_AddBoolToObject _cJSON_AddBoolToObject = _dylib
    .lookupFunction<_c_cJSON_AddBoolToObject, _dart_cJSON_AddBoolToObject>(
        'cJSON_AddBoolToObject');

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

ffi.Pointer<cJSON> cJSON_AddNumberToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  double number,
) {
  return _cJSON_AddNumberToObject(
    object,
    name,
    number,
  );
}

final _dart_cJSON_AddNumberToObject _cJSON_AddNumberToObject = _dylib
    .lookupFunction<_c_cJSON_AddNumberToObject, _dart_cJSON_AddNumberToObject>(
        'cJSON_AddNumberToObject');

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

ffi.Pointer<cJSON> cJSON_AddStringToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> string,
) {
  return _cJSON_AddStringToObject(
    object,
    name,
    string,
  );
}

final _dart_cJSON_AddStringToObject _cJSON_AddStringToObject = _dylib
    .lookupFunction<_c_cJSON_AddStringToObject, _dart_cJSON_AddStringToObject>(
        'cJSON_AddStringToObject');

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

ffi.Pointer<cJSON> cJSON_AddRawToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
  ffi.Pointer<ffi.Int8> raw,
) {
  return _cJSON_AddRawToObject(
    object,
    name,
    raw,
  );
}

final _dart_cJSON_AddRawToObject _cJSON_AddRawToObject =
    _dylib.lookupFunction<_c_cJSON_AddRawToObject, _dart_cJSON_AddRawToObject>(
        'cJSON_AddRawToObject');

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

ffi.Pointer<cJSON> cJSON_AddObjectToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
) {
  return _cJSON_AddObjectToObject(
    object,
    name,
  );
}

final _dart_cJSON_AddObjectToObject _cJSON_AddObjectToObject = _dylib
    .lookupFunction<_c_cJSON_AddObjectToObject, _dart_cJSON_AddObjectToObject>(
        'cJSON_AddObjectToObject');

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

ffi.Pointer<cJSON> cJSON_AddArrayToObject(
  ffi.Pointer<cJSON> object,
  ffi.Pointer<ffi.Int8> name,
) {
  return _cJSON_AddArrayToObject(
    object,
    name,
  );
}

final _dart_cJSON_AddArrayToObject _cJSON_AddArrayToObject = _dylib
    .lookupFunction<_c_cJSON_AddArrayToObject, _dart_cJSON_AddArrayToObject>(
        'cJSON_AddArrayToObject');

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

double cJSON_SetNumberHelper(
  ffi.Pointer<cJSON> object,
  double number,
) {
  return _cJSON_SetNumberHelper(
    object,
    number,
  );
}

final _dart_cJSON_SetNumberHelper _cJSON_SetNumberHelper = _dylib
    .lookupFunction<_c_cJSON_SetNumberHelper, _dart_cJSON_SetNumberHelper>(
        'cJSON_SetNumberHelper');

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

ffi.Pointer<ffi.Void> cJSON_malloc(
  int size,
) {
  return _cJSON_malloc(
    size,
  );
}

final _dart_cJSON_malloc _cJSON_malloc =
    _dylib.lookupFunction<_c_cJSON_malloc, _dart_cJSON_malloc>('cJSON_malloc');

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

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

void cJSON_free(
  ffi.Pointer<ffi.Void> object,
) {
  return _cJSON_free(
    object,
  );
}

final _dart_cJSON_free _cJSON_free =
    _dylib.lookupFunction<_c_cJSON_free, _dart_cJSON_free>('cJSON_free');

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

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