Add a test for [perl #17753].
[p5sagit/p5-mst-13.2.git] / mg.h
1 /*    mg.h
2  *
3  *    Copyright (c) 1991-2002, 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     int         (CPERLscope(*svt_copy)) (pTHX_ SV *sv, MAGIC* mg,
20                                         SV *nsv, const char *name, int namlen);
21     int         (CPERLscope(*svt_dup))  (pTHX_ MAGIC *mg, CLONE_PARAMS *param);
22 };
23 #endif
24
25 struct magic {
26     MAGIC*      mg_moremagic;
27     MGVTBL*     mg_virtual;     /* pointer to magic functions */
28     U16         mg_private;
29     char        mg_type;
30     U8          mg_flags;
31     SV*         mg_obj;
32     char*       mg_ptr;
33     I32         mg_len;
34 };
35
36 #define MGf_TAINTEDDIR 1        /* PERL_MAGIC_envelem only */
37 #define MGf_MINMATCH   1        /* PERL_MAGIC_regex_global only */
38 #define MGf_REFCOUNTED 2
39 #define MGf_GSKIP      4
40 #define MGf_COPY       8
41 #define MGf_DUP        16
42
43 #define MgTAINTEDDIR(mg)        (mg->mg_flags & MGf_TAINTEDDIR)
44 #define MgTAINTEDDIR_on(mg)     (mg->mg_flags |= MGf_TAINTEDDIR)
45 #define MgTAINTEDDIR_off(mg)    (mg->mg_flags &= ~MGf_TAINTEDDIR)
46
47 #define MgPV(mg,lp)             ((((int)(lp = (mg)->mg_len)) == HEf_SVKEY) ?   \
48                                  SvPV((SV*)((mg)->mg_ptr),lp) :         \
49                                  (mg)->mg_ptr)
50
51 #define SvTIED_mg(sv,how) \
52     (SvRMAGICAL(sv) ? mg_find((sv),(how)) : Null(MAGIC*))
53 #define SvTIED_obj(sv,mg) \
54     ((mg)->mg_obj ? (mg)->mg_obj : sv_2mortal(newRV(sv)))