1*0Sstevel@tonic-gate /* av.h 2*0Sstevel@tonic-gate * 3*0Sstevel@tonic-gate * Copyright (C) 1991, 1992, 1993, 1995, 1996, 1997, 1998, 1999, 4*0Sstevel@tonic-gate * 2000, 2001, 2002, by Larry Wall and others 5*0Sstevel@tonic-gate * 6*0Sstevel@tonic-gate * You may distribute under the terms of either the GNU General Public 7*0Sstevel@tonic-gate * License or the Artistic License, as specified in the README file. 8*0Sstevel@tonic-gate * 9*0Sstevel@tonic-gate */ 10*0Sstevel@tonic-gate 11*0Sstevel@tonic-gate struct xpvav { 12*0Sstevel@tonic-gate char* xav_array; /* pointer to first array element */ 13*0Sstevel@tonic-gate SSize_t xav_fill; /* Index of last element present */ 14*0Sstevel@tonic-gate SSize_t xav_max; /* max index for which array has space */ 15*0Sstevel@tonic-gate IV xof_off; /* ptr is incremented by offset */ 16*0Sstevel@tonic-gate NV xnv_nv; /* numeric value, if any */ 17*0Sstevel@tonic-gate MAGIC* xmg_magic; /* magic for scalar array */ 18*0Sstevel@tonic-gate HV* xmg_stash; /* class package */ 19*0Sstevel@tonic-gate 20*0Sstevel@tonic-gate SV** xav_alloc; /* pointer to beginning of C array of SVs */ 21*0Sstevel@tonic-gate SV* xav_arylen; 22*0Sstevel@tonic-gate U8 xav_flags; 23*0Sstevel@tonic-gate }; 24*0Sstevel@tonic-gate 25*0Sstevel@tonic-gate 26*0Sstevel@tonic-gate /* AVf_REAL is set for all AVs whose xav_array contents are refcounted. 27*0Sstevel@tonic-gate * Some things like "@_" and the scratchpad list do not set this, to 28*0Sstevel@tonic-gate * indicate that they are cheating (for efficiency) by not refcounting 29*0Sstevel@tonic-gate * the AV's contents. 30*0Sstevel@tonic-gate * 31*0Sstevel@tonic-gate * AVf_REIFY is only meaningful on such "fake" AVs (i.e. where AVf_REAL 32*0Sstevel@tonic-gate * is not set). It indicates that the fake AV is capable of becoming 33*0Sstevel@tonic-gate * real if the array needs to be modified in some way. Functions that 34*0Sstevel@tonic-gate * modify fake AVs check both flags to call av_reify() as appropriate. 35*0Sstevel@tonic-gate * 36*0Sstevel@tonic-gate * Note that the Perl stack and @DB::args have neither flag set. (Thus, 37*0Sstevel@tonic-gate * items that go on the stack are never refcounted.) 38*0Sstevel@tonic-gate * 39*0Sstevel@tonic-gate * These internal details are subject to change any time. AV 40*0Sstevel@tonic-gate * manipulations external to perl should not care about any of this. 41*0Sstevel@tonic-gate * GSAR 1999-09-10 42*0Sstevel@tonic-gate */ 43*0Sstevel@tonic-gate #define AVf_REAL 1 /* free old entries */ 44*0Sstevel@tonic-gate #define AVf_REIFY 2 /* can become real */ 45*0Sstevel@tonic-gate 46*0Sstevel@tonic-gate /* XXX this is not used anywhere */ 47*0Sstevel@tonic-gate #define AVf_REUSED 4 /* got undeffed--don't turn old memory into SVs now */ 48*0Sstevel@tonic-gate 49*0Sstevel@tonic-gate /* 50*0Sstevel@tonic-gate =head1 Handy Values 51*0Sstevel@tonic-gate 52*0Sstevel@tonic-gate =for apidoc AmU||Nullav 53*0Sstevel@tonic-gate Null AV pointer. 54*0Sstevel@tonic-gate 55*0Sstevel@tonic-gate =head1 Array Manipulation Functions 56*0Sstevel@tonic-gate 57*0Sstevel@tonic-gate =for apidoc Am|int|AvFILL|AV* av 58*0Sstevel@tonic-gate Same as C<av_len()>. Deprecated, use C<av_len()> instead. 59*0Sstevel@tonic-gate 60*0Sstevel@tonic-gate =cut 61*0Sstevel@tonic-gate */ 62*0Sstevel@tonic-gate 63*0Sstevel@tonic-gate #define Nullav Null(AV*) 64*0Sstevel@tonic-gate 65*0Sstevel@tonic-gate #define AvARRAY(av) ((SV**)((XPVAV*) SvANY(av))->xav_array) 66*0Sstevel@tonic-gate #define AvALLOC(av) ((XPVAV*) SvANY(av))->xav_alloc 67*0Sstevel@tonic-gate #define AvMAX(av) ((XPVAV*) SvANY(av))->xav_max 68*0Sstevel@tonic-gate #define AvFILLp(av) ((XPVAV*) SvANY(av))->xav_fill 69*0Sstevel@tonic-gate #define AvARYLEN(av) ((XPVAV*) SvANY(av))->xav_arylen 70*0Sstevel@tonic-gate #define AvFLAGS(av) ((XPVAV*) SvANY(av))->xav_flags 71*0Sstevel@tonic-gate 72*0Sstevel@tonic-gate #define AvREAL(av) (AvFLAGS(av) & AVf_REAL) 73*0Sstevel@tonic-gate #define AvREAL_on(av) (AvFLAGS(av) |= AVf_REAL) 74*0Sstevel@tonic-gate #define AvREAL_off(av) (AvFLAGS(av) &= ~AVf_REAL) 75*0Sstevel@tonic-gate #define AvREIFY(av) (AvFLAGS(av) & AVf_REIFY) 76*0Sstevel@tonic-gate #define AvREIFY_on(av) (AvFLAGS(av) |= AVf_REIFY) 77*0Sstevel@tonic-gate #define AvREIFY_off(av) (AvFLAGS(av) &= ~AVf_REIFY) 78*0Sstevel@tonic-gate #define AvREUSED(av) (AvFLAGS(av) & AVf_REUSED) 79*0Sstevel@tonic-gate #define AvREUSED_on(av) (AvFLAGS(av) |= AVf_REUSED) 80*0Sstevel@tonic-gate #define AvREUSED_off(av) (AvFLAGS(av) &= ~AVf_REUSED) 81*0Sstevel@tonic-gate 82*0Sstevel@tonic-gate #define AvREALISH(av) (AvFLAGS(av) & (AVf_REAL|AVf_REIFY)) 83*0Sstevel@tonic-gate 84*0Sstevel@tonic-gate #define AvFILL(av) ((SvRMAGICAL((SV *) (av))) \ 85*0Sstevel@tonic-gate ? mg_size((SV *) av) : AvFILLp(av)) 86*0Sstevel@tonic-gate 87*0Sstevel@tonic-gate #define NEGATIVE_INDICES_VAR "NEGATIVE_INDICES" 88