/* Interface to Perl from OCaml.
* Copyright (C) 2003 Merjis Ltd.
- * $Id: perl_c.c,v 1.14 2004-02-03 12:38:57 rich Exp $
+ * $Id: perl_c.c,v 1.17 2004-11-25 22:16:17 rich Exp $
*/
#include <stdio.h>
perl4caml_sv_undef (value unit)
{
CAMLparam1 (unit);
- CAMLreturn (Val_sv (newSV (0)));
+ /*CAMLreturn (Val_sv (newSV (0)));*/
+ CAMLreturn (Val_sv (&PL_sv_undef));
+}
+
+CAMLprim value
+perl4caml_sv_is_undef (value svv)
+{
+ CAMLparam1 (svv);
+ SV *sv = Sv_val (svv);
+ CAMLreturn (!SvPOK (sv) && !SvIOK (sv) && SvTYPE (sv) == SVt_NULL
+ ? Val_true : Val_false);
}
CAMLprim value
CAMLlocal1 (rsvv);
SV *sv = Sv_val (svv);
- if (SvTYPE (sv) != SVt_RV)
+ if (!SvROK (sv))
invalid_argument ("deref: SV is not a reference");
switch (SvTYPE (SvRV (sv))) {
case SVt_IV:
CAMLlocal1 (ravv);
SV *sv = Sv_val (svv);
- if (SvTYPE (sv) != SVt_RV)
+ if (!SvROK (sv))
invalid_argument ("deref_array: SV is not a reference");
switch (SvTYPE (SvRV (sv))) {
case SVt_PVAV:
CAMLlocal1 (rhvv);
SV *sv = Sv_val (svv);
- if (SvTYPE (sv) != SVt_RV)
- invalid_argument ("deref_array: SV is not a reference");
+ if (!SvROK (sv))
+ invalid_argument ("deref_hash: SV is not a reference");
switch (SvTYPE (SvRV (sv))) {
case SVt_PVHV:
break;
default:
- invalid_argument ("deref_array: SV is not a reference to a hash");
+ invalid_argument ("deref_hash: SV is not a reference to a hash");
}
rhvv = Val_hv ((HV *) SvRV (sv));
CAMLreturn (rhvv);