$VERSION "a5" doesn't quite work.
[p5sagit/p5-mst-13.2.git] / mg.h
1 /*    mg.h
2  *
3  *    Copyright (c) 1991-2001, Larry Wall
4  *
5  *    You may distribute under the terms of either the GNU General Public
6  *    License or the Artistic License, as specified in the README file.
7  *
8  */
9
10 #ifdef STRUCT_MGVTBL_DEFINITION
11 STRUCT_MGVTBL_DEFINITION;
12 #else
13 struct mgvtbl {
14     int         (CPERLscope(*svt_get))  (pTHX_ SV *sv, MAGIC* mg);
15     int         (CPERLscope(*svt_set))  (pTHX_ SV *sv, MAGIC* mg);
16     U32         (CPERLscope(*svt_len))  (pTHX_ SV *sv, MAGIC* mg);
17     int         (CPERLscope(*svt_clear))(pTHX_ SV *sv, MAGIC* mg);
18     int         (CPERLscope(*svt_free)) (pTHX_ SV *sv, MAGIC* mg);
19 };
20 #endif
21
22 struct magic {
23     MAGIC*      mg_moremagic;
24     MGVTBL*     mg_virtual;     /* pointer to magic functions */
25     U16         mg_private;
26     char        mg_type;
27     U8          mg_flags;
28     SV*         mg_obj;
29     char*       mg_ptr;
30     I32         mg_len;
31 };
32
33 #define MGf_TAINTEDDIR 1
34 #define MGf_REFCOUNTED 2
35 #define MGf_GSKIP      4
36
37 #define MGf_MINMATCH   1
38
39 #define MgTAINTEDDIR(mg)        (mg->mg_flags & MGf_TAINTEDDIR)
40 #define MgTAINTEDDIR_on(mg)     (mg->mg_flags |= MGf_TAINTEDDIR)
41 #define MgTAINTEDDIR_off(mg)    (mg->mg_flags &= ~MGf_TAINTEDDIR)
42
43 #define MgPV(mg,lp)             ((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ?   \
44                                  SvPV((SV*)((mg)->mg_ptr),lp) :         \
45                                  (mg)->mg_ptr)
46
47 #define SvTIED_mg(sv,how) \
48     (SvRMAGICAL(sv) ? mg_find((sv),(how)) : Null(MAGIC*))
49 #define SvTIED_obj(sv,mg) \
50     ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv)))