#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#include "const-c.inc"

#define sv_defined(sv) (sv && (SvIOK(sv) || SvNOK(sv) || SvPOK(sv) || SvROK(sv)))

MODULE = PerlX::Maybe::XS		PACKAGE = PerlX::Maybe::XS		

INCLUDE: const-xs.inc

void
maybe (x, y, ...)
	SV *x
	SV *y
PROTOTYPE: $$@
PPCODE:
{
	int i;
	
	if (sv_defined(x) && sv_defined(y))
	{
		// return ($x, $y, @rest);
		for (i = 0; i <= items; i++)
		{
			PUSHs(ST(i));
		}
		XSRETURN(items);
	}
	else
	{
		// return @rest
		for (i = 2; i <= items; i++)
		{
			PUSHs(ST(i));
		}
		XSRETURN(items - 2);
	}
}

void
provided (chk, x, y, ...)
	SV *chk
	SV *x
	SV *y
PROTOTYPE: $$$@
PPCODE:
{
	int i;
	
	if (SvTRUE(chk))
	{
		// return ($x, $y, @rest);
		for (i = 1; i <= items; i++)
		{
			PUSHs(ST(i));
		}
		XSRETURN(items - 1);
	}
	else
	{
		// return @rest
		for (i = 3; i <= items; i++)
		{
			PUSHs(ST(i));
		}
		XSRETURN(items - 3);
	}
}