Added wrappers around other methods of WWW::Mechanize::Links.
[perl4caml.git] / perl_c.c
index 06b69b6..1a6b1ef 100644 (file)
--- a/perl_c.c
+++ b/perl_c.c
@@ -1,6 +1,6 @@
 /* Interface to Perl from OCaml.
  * Copyright (C) 2003 Merjis Ltd.
- * $Id: perl_c.c,v 1.21 2005-01-29 12:22:49 rich Exp $
+ * $Id: perl_c.c,v 1.23 2005-04-14 13:05:12 rich Exp $
  */
 
 #include <stdio.h>
@@ -129,8 +129,8 @@ perl4caml_string_of_sv (value svv)
   STRLEN len;
   CAMLlocal1 (strv);
   str = SvPV (sv, len);
-  /* XXX This won't work if the string contains NUL. */
-  strv = caml_copy_string (str);
+  strv = caml_alloc_string (len);
+  memcpy (String_val (strv), str, len);
   CAMLreturn (strv);
 }
 
@@ -180,25 +180,31 @@ perl4caml_sv_no (value unit)
   CAMLreturn (Val_sv (&PL_sv_no));
 }
 
+static int
+sv_type (SV *sv)
+{
+  switch (SvTYPE (sv))
+    {
+    case SVt_IV: return 1;
+    case SVt_NV: return 2;
+    case SVt_PV: return 3;
+    case SVt_RV: return 4;
+    case SVt_PVAV: return 5;
+    case SVt_PVHV: return 6;
+    case SVt_PVCV: return 7;
+    case SVt_PVGV: return 8;
+    case SVt_PVMG: return 9;
+    default: return 0;
+    }
+}
+
 CAMLprim value
 perl4caml_sv_type (value svv)
 {
   CAMLparam1 (svv);
   SV *sv = Sv_val (svv);
 
-  switch (SvTYPE (sv))
-    {
-    case SVt_IV: CAMLreturn (Val_int (1));
-    case SVt_NV: CAMLreturn (Val_int (2));
-    case SVt_PV: CAMLreturn (Val_int (3));
-    case SVt_RV: CAMLreturn (Val_int (4));
-    case SVt_PVAV: CAMLreturn (Val_int (5));
-    case SVt_PVHV: CAMLreturn (Val_int (6));
-    case SVt_PVCV: CAMLreturn (Val_int (7));
-    case SVt_PVGV: CAMLreturn (Val_int (8));
-    case SVt_PVMG: CAMLreturn (Val_int (9));
-    default: CAMLreturn (Val_int (0));
-    }
+  CAMLreturn (Val_int (sv_type (sv)));
 }
 
 CAMLprim value
@@ -256,6 +262,18 @@ perl4caml_hashref (value hvv)
 }
 
 CAMLprim value
+perl4caml_reftype (value svv)
+{
+  CAMLparam1 (svv);
+  SV *sv = Sv_val (svv);
+
+  if (!SvROK (sv))
+    caml_invalid_argument ("reftype: SV is not a reference");
+
+  CAMLreturn (Val_int (sv_type (SvRV (sv))));
+}
+
+CAMLprim value
 perl4caml_deref (value svv)
 {
   CAMLparam1 (svv);