Much wider support for Catacomb in all its glory.
[catacomb-perl] / keystuff.c
index b8c9519..beb9a74 100644 (file)
 
 /*----- Main code ---------------------------------------------------------*/
 
-void warn_keyreporter(const char *file, int line, const char *err, void *p)
+void keyreport(const char *file, int line, const char *err, void *p)
 {
-  warn("%s:%i: keyfile error: %s", file, line, err);
+  SV *sv = p;
+  dSP;
+
+  if (!SvOK(sv))
+    warn("%s:%i: keyfile error: %s", file, line, err);
+  else {
+    ENTER; SAVETMPS;
+
+    PUSHMARK(SP);
+    XPUSHs(sv);
+    XPUSHs(sv_2mortal(newSVpv(file, 0)));
+    XPUSHs(sv_2mortal(newSViv(line)));
+    XPUSHs(sv_2mortal(newSVpv(err, 0)));
+    PUTBACK;
+
+    call_method("report", G_DISCARD | G_EVAL | G_KEEPERR);
+    if (SvTRUE(ERRSV)) {
+      STRLEN len;
+      warn("reporter raised error (ignoring): %s", SvPV(ERRSV, len));
+    }
+
+    FREETMPS; LEAVE;
+  }
 }
 
 SV *keyerr(int rc)
@@ -49,4 +71,15 @@ SV *keyerr(int rc)
   return (&PL_sv_undef);
 }
 
+void keyfile_dec(Key_File *kf)
+{
+  kf->ref--;
+  if (!kf->ref) {
+    key_discard(&kf->kf);
+    DESTROY(kf);
+  }
+}
+
+
+
 /*----- That's all, folks -------------------------------------------------*/