/* methods_postconditions.c generated by valac, the Vala compiler
 * generated from methods_postconditions.vala, do not modify */

#include <stdlib.h>
#include <string.h>
#include <glib.h>

#if !defined(VALA_STRICT_C)
#if !defined(__clang__) && defined(__GNUC__) && (__GNUC__ >= 14)
#pragma GCC diagnostic warning "-Wincompatible-pointer-types"
#elif defined(__clang__) && (__clang_major__ >= 16)
#pragma clang diagnostic ignored "-Wincompatible-function-pointer-types"
#pragma clang diagnostic ignored "-Wincompatible-pointer-types"
#endif
#endif
#if !defined(VALA_EXTERN)
#if defined(_MSC_VER)
#define VALA_EXTERN __declspec(dllexport) extern
#elif __GNUC__ >= 4
#define VALA_EXTERN __attribute__((visibility("default"))) extern
#else
#define VALA_EXTERN extern
#endif
#endif

#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

VALA_EXTERN void foo (gchar** a,
          gint a_length1);
VALA_EXTERN void foz (gchar*** a,
          gint* a_length1);
VALA_EXTERN void fom (gchar*** a,
          gint* a_length1);
VALA_EXTERN gchar** bar (gchar** a,
             gint a_length1,
             gint* result_length1);
VALA_EXTERN gchar** baz (gchar*** a,
             gint* a_length1,
             gint* result_length1);
VALA_EXTERN gchar** bam (gchar*** a,
             gint* a_length1,
             gint* result_length1);
static void _vala_main (void);
static void _vala_array_destroy (gpointer array,
                          gssize array_length,
                          GDestroyNotify destroy_func);
static void _vala_array_free (gpointer array,
                       gssize array_length,
                       GDestroyNotify destroy_func);

void
foo (gchar** a,
     gint a_length1)
{
	const gchar* _tmp0_;
	_tmp0_ = a[1];
	_vala_warn_if_fail (g_strcmp0 (_tmp0_, "bar") == 0, "a[1] == \"bar\"");
	a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
}

void
foz (gchar*** a,
     gint* a_length1)
{
	gchar* _tmp0_;
	gchar* _tmp1_;
	gchar** _tmp2_;
	const gchar* _tmp3_;
	_tmp0_ = g_strdup ("foo");
	_tmp1_ = g_strdup ("bar");
	_tmp2_ = g_new0 (gchar*, 2 + 1);
	_tmp2_[0] = _tmp0_;
	_tmp2_[1] = _tmp1_;
	*a = (_vala_array_free (*a, *a_length1, (GDestroyNotify) g_free), NULL);
	*a = _tmp2_;
	*a_length1 = 2;
	_tmp3_ = (*a)[1];
	_vala_warn_if_fail (g_strcmp0 (_tmp3_, "bar") == 0, "a[1] == \"bar\"");
}

void
fom (gchar*** a,
     gint* a_length1)
{
	gchar** _vala_a = NULL;
	gint _vala_a_length1 = 0;
	gchar* _tmp0_;
	gchar* _tmp1_;
	gchar** _tmp2_;
	const gchar* _tmp3_;
	_tmp0_ = g_strdup ("foo");
	_tmp1_ = g_strdup ("bar");
	_tmp2_ = g_new0 (gchar*, 2 + 1);
	_tmp2_[0] = _tmp0_;
	_tmp2_[1] = _tmp1_;
	_vala_a = (_vala_array_free (_vala_a, _vala_a_length1, (GDestroyNotify) g_free), NULL);
	_vala_a = _tmp2_;
	_vala_a_length1 = 2;
	_tmp3_ = _vala_a[1];
	_vala_warn_if_fail (g_strcmp0 (_tmp3_, "bar") == 0, "a[1] == \"bar\"");
	if (a) {
		*a = _vala_a;
	} else {
		_vala_a = (_vala_array_free (_vala_a, _vala_a_length1, (GDestroyNotify) g_free), NULL);
	}
	if (a_length1) {
		*a_length1 = _vala_a_length1;
	}
}

gchar**
bar (gchar** a,
     gint a_length1,
     gint* result_length1)
{
	gchar* _tmp0_;
	gchar** _tmp1_;
	gchar** _tmp2_;
	gint _tmp2__length1;
	const gchar* _tmp3_;
	const gchar* _tmp4_;
	gchar** result;
	_tmp0_ = g_strdup ("manam");
	_tmp1_ = g_new0 (gchar*, 1 + 1);
	_tmp1_[0] = _tmp0_;
	_tmp2_ = _tmp1_;
	_tmp2__length1 = 1;
	if (result_length1) {
		*result_length1 = _tmp2__length1;
	}
	result = _tmp2_;
	_tmp3_ = result[0];
	_tmp4_ = a[1];
	_vala_warn_if_fail ((g_strcmp0 (_tmp3_, "manam") == 0) && (g_strcmp0 (_tmp4_, "foo") == 0), "result[0] == \"manam\" && a[1] == \"foo\"");
	a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
	return result;
}

gchar**
baz (gchar*** a,
     gint* a_length1,
     gint* result_length1)
{
	gchar* _tmp0_;
	gchar* _tmp1_;
	gchar** _tmp2_;
	gchar* _tmp3_;
	gchar** _tmp4_;
	gchar** _tmp5_;
	gint _tmp5__length1;
	const gchar* _tmp6_;
	const gchar* _tmp7_;
	gchar** result;
	_tmp0_ = g_strdup ("bar");
	_tmp1_ = g_strdup ("foo");
	_tmp2_ = g_new0 (gchar*, 2 + 1);
	_tmp2_[0] = _tmp0_;
	_tmp2_[1] = _tmp1_;
	*a = (_vala_array_free (*a, *a_length1, (GDestroyNotify) g_free), NULL);
	*a = _tmp2_;
	*a_length1 = 2;
	_tmp3_ = g_strdup ("manam");
	_tmp4_ = g_new0 (gchar*, 1 + 1);
	_tmp4_[0] = _tmp3_;
	_tmp5_ = _tmp4_;
	_tmp5__length1 = 1;
	if (result_length1) {
		*result_length1 = _tmp5__length1;
	}
	result = _tmp5_;
	_tmp6_ = result[0];
	_tmp7_ = (*a)[1];
	_vala_warn_if_fail ((g_strcmp0 (_tmp6_, "manam") == 0) && (g_strcmp0 (_tmp7_, "foo") == 0), "result[0] == \"manam\" && a[1] == \"foo\"");
	return result;
}

gchar**
bam (gchar*** a,
     gint* a_length1,
     gint* result_length1)
{
	gchar** _vala_a = NULL;
	gint _vala_a_length1 = 0;
	gchar* _tmp0_;
	gchar* _tmp1_;
	gchar** _tmp2_;
	gchar* _tmp3_;
	gchar** _tmp4_;
	gchar** _tmp5_;
	gint _tmp5__length1;
	const gchar* _tmp6_;
	const gchar* _tmp7_;
	gchar** result;
	_tmp0_ = g_strdup ("bar");
	_tmp1_ = g_strdup ("foo");
	_tmp2_ = g_new0 (gchar*, 2 + 1);
	_tmp2_[0] = _tmp0_;
	_tmp2_[1] = _tmp1_;
	_vala_a = (_vala_array_free (_vala_a, _vala_a_length1, (GDestroyNotify) g_free), NULL);
	_vala_a = _tmp2_;
	_vala_a_length1 = 2;
	_tmp3_ = g_strdup ("manam");
	_tmp4_ = g_new0 (gchar*, 1 + 1);
	_tmp4_[0] = _tmp3_;
	_tmp5_ = _tmp4_;
	_tmp5__length1 = 1;
	if (result_length1) {
		*result_length1 = _tmp5__length1;
	}
	result = _tmp5_;
	_tmp6_ = result[0];
	_tmp7_ = _vala_a[1];
	_vala_warn_if_fail ((g_strcmp0 (_tmp6_, "manam") == 0) && (g_strcmp0 (_tmp7_, "foo") == 0), "result[0] == \"manam\" && a[1] == \"foo\"");
	if (a) {
		*a = _vala_a;
	} else {
		_vala_a = (_vala_array_free (_vala_a, _vala_a_length1, (GDestroyNotify) g_free), NULL);
	}
	if (a_length1) {
		*a_length1 = _vala_a_length1;
	}
	return result;
}

static void
_vala_main (void)
{
	{
		gchar* _tmp0_;
		gchar* _tmp1_;
		gchar** _tmp2_;
		_tmp0_ = g_strdup ("foo");
		_tmp1_ = g_strdup ("bar");
		_tmp2_ = g_new0 (gchar*, 2 + 1);
		_tmp2_[0] = _tmp0_;
		_tmp2_[1] = _tmp1_;
		foo (_tmp2_, (gint) 2);
	}
	{
		gchar** a = NULL;
		gchar** _tmp3_;
		gint a_length1;
		gint _a_size_;
		gchar** _tmp4_;
		gint _tmp4__length1;
		const gchar* _tmp5_;
		_tmp3_ = g_new0 (gchar*, 0 + 1);
		a = _tmp3_;
		a_length1 = 0;
		_a_size_ = a_length1;
		foz (&a, (gint*) (&a_length1));
		_a_size_ = a_length1;
		_tmp4_ = a;
		_tmp4__length1 = a_length1;
		_tmp5_ = _tmp4_[0];
		_vala_assert (g_strcmp0 (_tmp5_, "foo") == 0, "a[0] == \"foo\"");
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
	}
	{
		gchar** a = NULL;
		gint a_length1 = 0;
		gint _a_size_ = 0;
		gchar** _tmp6_ = NULL;
		gint _tmp7_ = 0;
		const gchar* _tmp8_;
		fom (&_tmp6_, &_tmp7_);
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
		a = _tmp6_;
		a_length1 = _tmp7_;
		_a_size_ = a_length1;
		_tmp8_ = a[0];
		_vala_assert (g_strcmp0 (_tmp8_, "foo") == 0, "a[0] == \"foo\"");
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
	}
	{
		gchar* _tmp9_;
		gchar* _tmp10_;
		gchar** _tmp11_;
		gint _tmp12_ = 0;
		gchar** _tmp13_;
		gchar** _tmp14_;
		gint _tmp14__length1;
		const gchar* _tmp15_;
		_tmp9_ = g_strdup ("bar");
		_tmp10_ = g_strdup ("foo");
		_tmp11_ = g_new0 (gchar*, 2 + 1);
		_tmp11_[0] = _tmp9_;
		_tmp11_[1] = _tmp10_;
		_tmp13_ = bar (_tmp11_, (gint) 2, &_tmp12_);
		_tmp14_ = _tmp13_;
		_tmp14__length1 = _tmp12_;
		_tmp15_ = _tmp14_[0];
		_vala_assert (g_strcmp0 (_tmp15_, "manam") == 0, "bar ({ \"bar\", \"foo\" })[0] == \"manam\"");
		_tmp14_ = (_vala_array_free (_tmp14_, _tmp14__length1, (GDestroyNotify) g_free), NULL);
	}
	{
		gchar** a = NULL;
		gchar** _tmp16_;
		gint a_length1;
		gint _a_size_;
		gint _tmp17_ = 0;
		gchar** _tmp18_;
		gchar** _tmp19_;
		gint _tmp19__length1;
		const gchar* _tmp20_;
		_tmp16_ = g_new0 (gchar*, 0 + 1);
		a = _tmp16_;
		a_length1 = 0;
		_a_size_ = a_length1;
		_tmp18_ = baz (&a, (gint*) (&a_length1), &_tmp17_);
		_a_size_ = a_length1;
		_tmp19_ = _tmp18_;
		_tmp19__length1 = _tmp17_;
		_tmp20_ = _tmp19_[0];
		_vala_assert (g_strcmp0 (_tmp20_, "manam") == 0, "baz (ref a)[0] == \"manam\"");
		_tmp19_ = (_vala_array_free (_tmp19_, _tmp19__length1, (GDestroyNotify) g_free), NULL);
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
	}
	{
		gchar** a = NULL;
		gint a_length1 = 0;
		gint _a_size_ = 0;
		gchar** _tmp21_ = NULL;
		gint _tmp22_ = 0;
		gint _tmp23_ = 0;
		gchar** _tmp24_;
		gchar** _tmp25_;
		gint _tmp25__length1;
		const gchar* _tmp26_;
		_tmp24_ = bam (&_tmp21_, &_tmp22_, &_tmp23_);
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
		a = _tmp21_;
		a_length1 = _tmp22_;
		_a_size_ = a_length1;
		_tmp25_ = _tmp24_;
		_tmp25__length1 = _tmp23_;
		_tmp26_ = _tmp25_[0];
		_vala_assert (g_strcmp0 (_tmp26_, "manam") == 0, "bam (out a)[0] == \"manam\"");
		_tmp25_ = (_vala_array_free (_tmp25_, _tmp25__length1, (GDestroyNotify) g_free), NULL);
		a = (_vala_array_free (a, a_length1, (GDestroyNotify) g_free), NULL);
	}
}

int
main (int argc,
      char ** argv)
{
	_vala_main ();
	return 0;
}

static void
_vala_array_destroy (gpointer array,
                     gssize array_length,
                     GDestroyNotify destroy_func)
{
	if ((array != NULL) && (destroy_func != NULL)) {
		gssize i;
		for (i = 0; i < array_length; i = i + 1) {
			if (((gpointer*) array)[i] != NULL) {
				destroy_func (((gpointer*) array)[i]);
			}
		}
	}
}

static void
_vala_array_free (gpointer array,
                  gssize array_length,
                  GDestroyNotify destroy_func)
{
	_vala_array_destroy (array, array_length, destroy_func);
	g_free (array);
}

