443728493204c8484deb2a7fa3e69603adfad77f
[perl.git] / ext / Safe / Safe.xs
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 MODULE = Safe   PACKAGE = Safe
6
7 void
8 safe_call_sv(package, mask, codesv)
9         char *  package
10         SV *    mask
11         SV *    codesv
12     CODE:
13         int i;
14         char *str;
15         STRLEN len;
16
17         ENTER;
18         SAVETMPS;
19         save_hptr(&defstash);
20         save_aptr(&endav);
21         SAVEPPTR(op_mask);
22         Newz(666, op_mask, maxo, char);
23         SAVEFREEPV(op_mask);
24         str = SvPV(mask, len);
25         if (maxo != len)
26             croak("Bad mask length");
27         for (i = 0; i < maxo; i++)
28             op_mask[i] = str[i];
29         defstash = gv_stashpv(package, TRUE);
30         endav = (AV*)sv_2mortal((SV*)newAV()); /* Ignore END blocks for now */
31         GvHV(gv_fetchpv("main::", TRUE, SVt_PVHV)) = defstash;
32         PUSHMARK(sp);
33         i = perl_call_sv(codesv, G_SCALAR|G_EVAL|G_KEEPERR);
34         SPAGAIN;
35         ST(0) = i ? newSVsv(POPs) : &sv_undef;
36         PUTBACK;
37         FREETMPS;
38         LEAVE;
39         sv_2mortal(ST(0));
40
41 void
42 op_mask()
43     CODE:
44         ST(0) = sv_newmortal();
45         if (op_mask)
46             sv_setpvn(ST(0), op_mask, maxo);
47
48 void
49 mask_to_ops(mask)
50         SV *    mask
51     PPCODE:
52         STRLEN len;
53         char *maskstr = SvPV(mask, len);
54         int i;
55         if (maxo != len)
56             croak("Bad mask length");
57         for (i = 0; i < maxo; i++)
58             if (maskstr[i])
59                 XPUSHs(sv_2mortal(newSVpv(op_name[i], 0)));
60
61 void
62 ops_to_mask(...)
63     CODE:
64         int i, j;
65         char *mask, *op;
66         Newz(666, mask, maxo, char);
67         for (i = 0; i < items; i++)
68         {
69             op = SvPV(ST(i), na);
70             for (j = 0; j < maxo && strNE(op, op_name[j]); j++) /* nothing */ ;
71             if (j < maxo)
72                 mask[j] = 1;
73             else
74             {
75                 Safefree(mask);
76                 croak("bad op name \"%s\" in mask", op);
77             }
78         }
79         ST(0) = sv_newmortal();
80         sv_usepvn(ST(0), mask, maxo);
81
82 void
83 opname(...)
84     PPCODE:
85         int i, opcode;
86         for (i = 0; i < items; i++)
87         {
88             opcode = SvIV(ST(i));
89             if (opcode < 0 || opcode >= maxo)
90                 croak("opcode out of range");
91             XPUSHs(sv_2mortal(newSVpv(op_name[opcode], 0)));
92         }
93
94 void
95 opcode(...)
96     PPCODE:
97         int i, j;
98         char *op;
99         for (i = 0; i < items; i++)
100         {
101             op = SvPV(ST(i), na);
102             for (j = 0; j < maxo && strNE(op, op_name[j]); j++) /* nothing */ ;
103             if (j == maxo)
104                 croak("bad op name \"%s\"", op);
105             XPUSHs(sv_2mortal(newSViv(j)));
106         }
107
108 int
109 MAXO()
110     CODE:
111         RETVAL = maxo;
112     OUTPUT:
113         RETVAL