Extract Subversion ignore data.
[catacomb-perl] / keystuff.c
index b8c9519..73e850f 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)
@@ -42,11 +64,36 @@ SV *keyerr(int rc)
   SV *sv;
   if (!rc)
     return (&PL_sv_yes);
-  sv = perl_get_sv("Catacomb::Key::error", TRUE);
+  sv = perl_get_sv("Catacomb::keyerror", TRUE);
   sv_setiv(sv, rc);
   sv_setpv(sv, key_strerror(rc));
   SvIOK_on(sv);
   return (&PL_sv_undef);
 }
 
+const char *keydata_type(Key_Data *kd)
+{
+  const char *cls;
+  if (!kd) return (0);
+  switch (kd->e & KF_ENCMASK) {
+    case KENC_BINARY: cls = "Catacomb::Key::Data::Binary"; break;
+    case KENC_ENCRYPT: cls = "Catacomb::Key::Data::Encrypted"; break;
+    case KENC_EC: cls = "Catacomb::Key::Data::EC"; break;
+    case KENC_STRING: cls = "Catacomb::Key::Data::String"; break;
+    case KENC_STRUCT: cls = "Catacomb::Key::Data::Structured"; break;
+    case KENC_MP: cls = "Catacomb::Key::Data::MP"; break;
+    default: abort();
+  }
+  return (cls);
+}
+
+void keyfile_dec(Key_File *kf)
+{
+  kf->ref--;
+  if (!kf->ref) {
+    key_discard(&kf->kf);
+    DESTROY(kf);
+  }
+}
+
 /*----- That's all, folks -------------------------------------------------*/