chiark / gitweb /
Initial checkin.
[catacomb-perl] / pgproc.c
1 /* -*-c-*-
2  *
3  * $Id: pgproc.c,v 1.1 2004/04/02 18:04:01 mdw Exp $
4  *
5  * Prime generation procedures
6  *
7  * (c) 2001 Straylight/Edgeware
8  */
9
10 /*----- Licensing notice --------------------------------------------------* 
11  *
12  * This file is part of the Perl interface to Catacomb.
13  *
14  * Catacomb/Perl is free software; you can redistribute it and/or modify
15  * it under the terms of the GNU General Public License as published by
16  * the Free Software Foundation; either version 2 of the License, or
17  * (at your option) any later version.
18  * 
19  * Catacomb/Perl is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  * 
24  * You should have received a copy of the GNU General Public License
25  * along with Catacomb/Perl; if not, write to the Free Software Foundation,
26  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27  */
28
29 /*----- Revision history --------------------------------------------------* 
30  *
31  * $Log: pgproc.c,v $
32  * Revision 1.1  2004/04/02 18:04:01  mdw
33  * Initial checkin.
34  *
35  */
36
37 /*----- Header files ------------------------------------------------------*/
38
39 #include "catacomb-perl.h"
40
41 /*----- Main code ---------------------------------------------------------*/
42
43 static int perlevent(int rq, pgen_event *e, void *p)
44 {
45   char *meth = 0;
46   int n;
47   SV *sv = p;
48   int rc;
49   dSP;
50
51   switch (rq) {
52     case PGEN_BEGIN:    meth = "pgen_begin"; break;
53     case PGEN_TRY:      meth = "pgen_try"; break;
54     case PGEN_FAIL:     meth = "pgen_fail"; break;
55     case PGEN_PASS:     meth = "pgen_pass"; break;
56     case PGEN_DONE:     meth = "pgen_done"; break;
57     case PGEN_ABORT:    meth = "pgen_abort"; break;
58     default:
59       abort();
60   }
61
62   ENTER;
63   SAVETMPS;
64   PUSHMARK(SP);
65   XPUSHs(sv);
66   XPUSHs(sv_setref_pv(sv_newmortal(), "Catacomb::MP::Prime::Gen::Event",
67                       (void *)e));
68   PUTBACK;
69   n = perl_call_method(meth, G_SCALAR);
70   assert(n == 1);
71   SPAGAIN;
72   rc = POPi;
73   PUTBACK;
74   FREETMPS;
75   LEAVE;
76   return (rc);
77 }
78
79 void pgproc_get(SV *sv, pgen_proc **p, void **ctx)
80 {
81   if (!SvOK(sv)) {
82     *p = 0;
83     *ctx = 0;
84   } else if (sv_derived_from(sv, "Catacomb::MP::Prime::Gen::MagicProc")) {
85     MP_Prime_Gen_MagicProc *mg =
86       (MP_Prime_Gen_MagicProc *)SvIV((SV *)SvRV(sv));
87     *p = mg->p;
88     *ctx = mg->ctx;
89   } else {
90     *p = perlevent;
91     *ctx = sv;
92   }
93 }
94
95 /*----- That's all, folks -------------------------------------------------*/