The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/* -*- mode: c; coding: utf-8; tab-width: 4; -*- */

#include "xs.h"

/* T_PACKED (CvConnectedComp) for INPUT: */
CvConnectedComp XS_unpack_CvConnectedComp(SV* arg)
{
	const int verbose = 0;
	if (SvROK(arg) && SvTYPE(SvRV(arg)) == SVt_PVAV) {
		CvConnectedComp comp = { 0, { 0, 0, 0, 0 }, { 0, 0, 0, 0 }, 0 };
		int n = av_len((AV*)SvRV(arg)) + 1; int i = 0;
		if (i < n) {
			SV* sv = (SV*)(*av_fetch((AV*)SvRV(arg), i, 0));
			if (SvTYPE(sv) == SVt_IV || SvTYPE(sv) == SVt_NV ||
				SvTYPE(sv) == SVt_PVNV || SvTYPE(sv) == SVt_PVIV) {
				comp.area = SvNV(sv);
				i++;
			} else {
				fprintf(stderr, "SvTYPE(area) = %d@%d\n", SvTYPE(sv), i);
			}
			if (verbose)
				fprintf(stderr, "comp.area = %g\n", comp.area);
		}
		if (i < n) {
			SV* sv = (SV*)(*av_fetch((AV*)SvRV(arg), i, 0));
			comp.value = XS_unpack_CvScalar(sv);
			if (verbose)
				fprintf(stderr, "comp.value = (%g, %g, %g, %g)\n",
						comp.value.val[0], comp.value.val[1],
						comp.value.val[2], comp.value.val[3]);
			i++;
		}
		if (i < n) {
			SV* sv = (SV*)(*av_fetch((AV*)SvRV(arg), i, 0));
			comp.rect = XS_unpack_CvRect(sv);
			if (verbose)
				fprintf(stderr, "comp.rect = (%d, %d, %d, %d)\n",
						comp.rect.x, comp.rect.y,
						comp.rect.width, comp.rect.height);
			i++;
		}
		if (i < n) {
			SV* sv = (SV*)(*av_fetch((AV*)SvRV(arg), i, 0));
			if (SvTYPE(sv) == SVt_IV || SvTYPE(sv) == SVt_PVIV) {
				comp.contour = (CvSeq*)SvIV(sv);
				i++;
			} else {
				fprintf(stderr, "type of contour = %d@%d\n", SvTYPE(sv), i);
			}
			if (verbose)
				fprintf(stderr, "comp.contour = %u\n", comp.contour);
		}
		return comp;
	}
	croak("not a CvConnectedComp");
}