3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
4 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * '...for the Entwives desired order, and plenty, and peace (by which they
13 * meant that things should remain where they had set them).' --Treebeard
15 * [p.476 of _The Lord of the Rings_, III/iv: "Treebeard"]
19 =head1 Array Manipulation Functions
27 Perl_av_reify(pTHX_ AV *av)
31 PERL_ARGS_ASSERT_AV_REIFY;
32 assert(SvTYPE(av) == SVt_PVAV);
37 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
38 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "av_reify called on tied array");
41 while (key > AvFILLp(av) + 1)
42 AvARRAY(av)[--key] = NULL;
44 SV * const sv = AvARRAY(av)[--key];
45 if (sv != &PL_sv_undef)
46 SvREFCNT_inc_simple_void(sv);
48 key = AvARRAY(av) - AvALLOC(av);
50 AvALLOC(av)[--key] = NULL;
58 Pre-extend an array. The C<key> is the index to which the array should be
65 Perl_av_extend(pTHX_ AV *av, SSize_t key)
69 PERL_ARGS_ASSERT_AV_EXTEND;
70 assert(SvTYPE(av) == SVt_PVAV);
72 mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied);
74 SV *arg1 = sv_newmortal();
75 sv_setiv(arg1, (IV)(key + 1));
76 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(EXTEND), G_DISCARD, 1,
80 av_extend_guts(av,key,&AvMAX(av),&AvALLOC(av),&AvARRAY(av));
83 /* The guts of av_extend. *Not* for general use! */
85 Perl_av_extend_guts(pTHX_ AV *av, SSize_t key, SSize_t *maxp, SV ***allocp,
88 PERL_ARGS_ASSERT_AV_EXTEND_GUTS;
90 if (key < -1) /* -1 is legal */
92 "panic: av_extend_guts() negative count (%"IVdf")", (IV)key);
99 if (av && *allocp != *arrayp) {
100 ary = *allocp + AvFILLp(av) + 1;
101 tmp = *arrayp - *allocp;
102 Move(*arrayp, *allocp, AvFILLp(av)+1, SV*);
109 if (key > *maxp - 10) {
110 newmax = key + *maxp;
117 #ifdef Perl_safesysmalloc_size
118 /* Whilst it would be quite possible to move this logic around
119 (as I did in the SV code), so as to set AvMAX(av) early,
120 based on calling Perl_safesysmalloc_size() immediately after
121 allocation, I'm not convinced that it is a great idea here.
122 In an array we have to loop round setting everything to
123 NULL, which means writing to memory, potentially lots
124 of it, whereas for the SV buffer case we don't touch the
125 "bonus" memory. So there there is no cost in telling the
126 world about it, whereas here we have to do work before we can
127 tell the world about it, and that work involves writing to
128 memory that might never be read. So, I feel, better to keep
129 the current lazy system of only writing to it if our caller
130 has a need for more space. NWC */
131 newmax = Perl_safesysmalloc_size((void*)*allocp) /
132 sizeof(const SV *) - 1;
137 /* overflow-safe version of newmax = key + *maxp/5 */
139 newmax = (key > SSize_t_MAX - newmax)
140 ? SSize_t_MAX : key + newmax;
143 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
144 static const char oom_array_extend[] =
145 "Out of memory during array extend";
147 /* it should really be newmax+1 here, but if newmax
148 * happens to equal SSize_t_MAX, then newmax+1 is
149 * undefined. This means technically we croak one
150 * index lower than we should in theory; in practice
151 * its unlikely the system has SSize_t_MAX/sizeof(SV*)
153 MEM_WRAP_CHECK_1(newmax, SV*, oom_array_extend);
155 #ifdef STRESS_REALLOC
157 SV ** const old_alloc = *allocp;
158 Newx(*allocp, newmax+1, SV*);
159 Copy(old_alloc, *allocp, *maxp + 1, SV*);
163 Renew(*allocp,newmax+1, SV*);
165 #ifdef Perl_safesysmalloc_size
168 ary = *allocp + *maxp + 1;
169 tmp = newmax - *maxp;
170 if (av == PL_curstack) { /* Oops, grew stack (via av_store()?) */
171 PL_stack_sp = *allocp + (PL_stack_sp - PL_stack_base);
172 PL_stack_base = *allocp;
173 PL_stack_max = PL_stack_base + newmax;
177 newmax = key < 3 ? 3 : key;
179 #ifdef PERL_MALLOC_WRAP /* Duplicated in pp_hot.c */
180 static const char oom_array_extend[] =
181 "Out of memory during array extend";
183 /* see comment above about newmax+1*/
184 MEM_WRAP_CHECK_1(newmax, SV*, oom_array_extend);
186 Newx(*allocp, newmax+1, SV*);
189 *allocp[0] = NULL; /* For the stacks */
191 if (av && AvREAL(av)) {
205 Returns the SV at the specified index in the array. The C<key> is the
206 index. If lval is true, you are guaranteed to get a real SV back (in case
207 it wasn't real before), which you can then modify. Check that the return
208 value is non-null before dereferencing it to a C<SV*>.
210 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
211 more information on how to use this function on tied arrays.
213 The rough perl equivalent is C<$myarray[$idx]>.
219 S_adjust_index(pTHX_ AV *av, const MAGIC *mg, SSize_t *keyp)
221 bool adjust_index = 1;
223 /* Handle negative array indices 20020222 MJD */
224 SV * const ref = SvTIED_obj(MUTABLE_SV(av), mg);
226 if (SvROK(ref) && SvOBJECT(SvRV(ref))) {
227 SV * const * const negative_indices_glob =
228 hv_fetchs(SvSTASH(SvRV(ref)), NEGATIVE_INDICES_VAR, 0);
230 if (negative_indices_glob && isGV(*negative_indices_glob)
231 && SvTRUE(GvSV(*negative_indices_glob)))
237 *keyp += AvFILL(av) + 1;
245 Perl_av_fetch(pTHX_ AV *av, SSize_t key, I32 lval)
250 PERL_ARGS_ASSERT_AV_FETCH;
251 assert(SvTYPE(av) == SVt_PVAV);
253 if (UNLIKELY(SvRMAGICAL(av))) {
254 const MAGIC * const tied_magic
255 = mg_find((const SV *)av, PERL_MAGIC_tied);
256 if (tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata)) {
259 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
264 sv_upgrade(sv, SVt_PVLV);
265 mg_copy(MUTABLE_SV(av), sv, 0, key);
266 if (!tied_magic) /* for regdata, force leavesub to make copies */
269 LvTARG(sv) = sv; /* fake (SV**) */
270 return &(LvTARG(sv));
275 size = AvFILLp(av) + 1;
276 key += neg * size; /* handle negative index without using branch */
278 /* the cast from SSize_t to Size_t allows both (key < 0) and (key >= size)
279 * to be tested as a single condition */
280 if ((Size_t)key >= (Size_t)size) {
286 if (!AvARRAY(av)[key]) {
288 return lval ? av_store(av,key,newSV(0)) : NULL;
291 if (UNLIKELY(AvREIFY(av) && SvIS_FREED(AvARRAY(av)[key]))) {
292 /* eg. @_ could have freed elts */
293 AvARRAY(av)[key] = NULL; /* 1/2 reify */
296 return &AvARRAY(av)[key];
302 Stores an SV in an array. The array index is specified as C<key>. The
303 return value will be C<NULL> if the operation failed or if the value did not
304 need to be actually stored within the array (as in the case of tied
305 arrays). Otherwise, it can be dereferenced
306 to get the C<SV*> that was stored
309 Note that the caller is responsible for suitably incrementing the reference
310 count of C<val> before the call, and decrementing it if the function
313 Approximate Perl equivalent: C<$myarray[$key] = $val;>.
315 See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for
316 more information on how to use this function on tied arrays.
322 Perl_av_store(pTHX_ AV *av, SSize_t key, SV *val)
326 PERL_ARGS_ASSERT_AV_STORE;
327 assert(SvTYPE(av) == SVt_PVAV);
329 /* S_regclass relies on being able to pass in a NULL sv
330 (unicode_alternate may be NULL).
333 if (SvRMAGICAL(av)) {
334 const MAGIC * const tied_magic = mg_find((const SV *)av, PERL_MAGIC_tied);
337 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
341 mg_copy(MUTABLE_SV(av), val, 0, key);
349 key += AvFILL(av) + 1;
354 if (SvREADONLY(av) && key >= AvFILL(av))
355 Perl_croak_no_modify();
357 if (!AvREAL(av) && AvREIFY(av))
362 if (AvFILLp(av) < key) {
364 if (av == PL_curstack && key > PL_stack_sp - PL_stack_base)
365 PL_stack_sp = PL_stack_base + key; /* XPUSH in disguise */
367 ary[++AvFILLp(av)] = NULL;
368 } while (AvFILLp(av) < key);
373 SvREFCNT_dec(ary[key]);
375 if (SvSMAGICAL(av)) {
376 const MAGIC *mg = SvMAGIC(av);
378 for (; mg; mg = mg->mg_moremagic) {
379 if (!isUPPER(mg->mg_type)) continue;
381 sv_magic(val, MUTABLE_SV(av), toLOWER(mg->mg_type), 0, key);
383 if (PL_delaymagic && mg->mg_type == PERL_MAGIC_isa) {
384 PL_delaymagic |= DM_ARRAY_ISA;
389 mg_set(MUTABLE_SV(av));
397 Creates a new AV and populates it with a list of SVs. The SVs are copied
398 into the array, so they may be freed after the call to C<av_make>. The new AV
399 will have a reference count of 1.
401 Perl equivalent: C<my @new_array = ($scalar1, $scalar2, $scalar3...);>
407 Perl_av_make(pTHX_ SSize_t size, SV **strp)
409 AV * const av = MUTABLE_AV(newSV_type(SVt_PVAV));
410 /* sv_upgrade does AvREAL_only() */
411 PERL_ARGS_ASSERT_AV_MAKE;
412 assert(SvTYPE(av) == SVt_PVAV);
414 if (size) { /* "defined" was returning undef for size==0 anyway. */
420 AvMAX(av) = size - 1;
424 for (i = 0; i < size; i++) {
427 /* Don't let sv_setsv swipe, since our source array might
428 have multiple references to the same temp scalar (e.g.
429 from a list slice) */
431 SvGETMAGIC(*strp); /* before newSV, in case it dies */
434 sv_setsv_flags(ary[i], *strp,
435 SV_DO_COW_SVSETSV|SV_NOSTEAL);
438 SvREFCNT_inc_simple_void_NN(av);
447 Frees the all the elements of an array, leaving it empty.
448 The XS equivalent of C<@array = ()>. See also L</av_undef>.
450 Note that it is possible that the actions of a destructor called directly
451 or indirectly by freeing an element of the array could cause the reference
452 count of the array itself to be reduced (e.g. by deleting an entry in the
453 symbol table). So it is a possibility that the AV could have been freed
454 (or even reallocated) on return from the call unless you hold a reference
461 Perl_av_clear(pTHX_ AV *av)
466 PERL_ARGS_ASSERT_AV_CLEAR;
467 assert(SvTYPE(av) == SVt_PVAV);
470 if (SvREFCNT(av) == 0) {
471 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEBUGGING), "Attempt to clear deleted array");
476 Perl_croak_no_modify();
478 /* Give any tie a chance to cleanup first */
479 if (SvRMAGICAL(av)) {
480 const MAGIC* const mg = SvMAGIC(av);
481 if (PL_delaymagic && mg && mg->mg_type == PERL_MAGIC_isa)
482 PL_delaymagic |= DM_ARRAY_ISA;
484 mg_clear(MUTABLE_SV(av));
490 if ((real = !!AvREAL(av))) {
491 SV** const ary = AvARRAY(av);
492 SSize_t index = AvFILLp(av) + 1;
494 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
496 SV * const sv = ary[--index];
497 /* undef the slot before freeing the value, because a
498 * destructor might try to modify this array */
503 extra = AvARRAY(av) - AvALLOC(av);
506 AvARRAY(av) = AvALLOC(av);
515 Undefines the array. The XS equivalent of C<undef(@array)>.
517 As well as freeing all the elements of the array (like C<av_clear()>), this
518 also frees the memory used by the av to store its list of scalars.
520 See L</av_clear> for a note about the array possibly being invalid on
527 Perl_av_undef(pTHX_ AV *av)
531 PERL_ARGS_ASSERT_AV_UNDEF;
532 assert(SvTYPE(av) == SVt_PVAV);
534 /* Give any tie a chance to cleanup first */
535 if (SvTIED_mg((const SV *)av, PERL_MAGIC_tied))
538 if ((real = !!AvREAL(av))) {
539 SSize_t key = AvFILLp(av) + 1;
541 SAVEFREESV(SvREFCNT_inc_simple_NN(av));
543 SvREFCNT_dec(AvARRAY(av)[--key]);
546 Safefree(AvALLOC(av));
549 AvMAX(av) = AvFILLp(av) = -1;
551 if(SvRMAGICAL(av)) mg_clear(MUTABLE_SV(av));
557 =for apidoc av_create_and_push
559 Push an SV onto the end of the array, creating the array if necessary.
560 A small internal helper function to remove a commonly duplicated idiom.
566 Perl_av_create_and_push(pTHX_ AV **const avp, SV *const val)
568 PERL_ARGS_ASSERT_AV_CREATE_AND_PUSH;
578 Pushes an SV (transferring control of one reference count) onto the end of the
579 array. The array will grow automatically to accommodate the addition.
581 Perl equivalent: C<push @myarray, $elem;>.
587 Perl_av_push(pTHX_ AV *av, SV *val)
591 PERL_ARGS_ASSERT_AV_PUSH;
592 assert(SvTYPE(av) == SVt_PVAV);
595 Perl_croak_no_modify();
597 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
598 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(PUSH), G_DISCARD, 1,
602 av_store(av,AvFILLp(av)+1,val);
608 Removes one SV from the end of the array, reducing its size by one and
609 returning the SV (transferring control of one reference count) to the
610 caller. Returns C<&PL_sv_undef> if the array is empty.
612 Perl equivalent: C<pop(@myarray);>
618 Perl_av_pop(pTHX_ AV *av)
623 PERL_ARGS_ASSERT_AV_POP;
624 assert(SvTYPE(av) == SVt_PVAV);
627 Perl_croak_no_modify();
628 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
629 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(POP), 0, 0);
631 retval = newSVsv(retval);
636 retval = AvARRAY(av)[AvFILLp(av)];
637 AvARRAY(av)[AvFILLp(av)--] = NULL;
639 mg_set(MUTABLE_SV(av));
640 return retval ? retval : &PL_sv_undef;
645 =for apidoc av_create_and_unshift_one
647 Unshifts an SV onto the beginning of the array, creating the array if
649 A small internal helper function to remove a commonly duplicated idiom.
655 Perl_av_create_and_unshift_one(pTHX_ AV **const avp, SV *const val)
657 PERL_ARGS_ASSERT_AV_CREATE_AND_UNSHIFT_ONE;
662 return av_store(*avp, 0, val);
666 =for apidoc av_unshift
668 Unshift the given number of C<undef> values onto the beginning of the
669 array. The array will grow automatically to accommodate the addition. You
670 must then use C<av_store> to assign values to these new elements.
672 Perl equivalent: S<C<unshift @myarray, ( (undef) x $n );>>
678 Perl_av_unshift(pTHX_ AV *av, SSize_t num)
683 PERL_ARGS_ASSERT_AV_UNSHIFT;
684 assert(SvTYPE(av) == SVt_PVAV);
687 Perl_croak_no_modify();
689 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
690 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(UNSHIFT),
691 G_DISCARD | G_UNDEF_FILL, num);
697 if (!AvREAL(av) && AvREIFY(av))
699 i = AvARRAY(av) - AvALLOC(av);
707 AvARRAY(av) = AvARRAY(av) - i;
711 const SSize_t i = AvFILLp(av);
712 /* Create extra elements */
713 const SSize_t slide = i > 0 ? i : 0;
715 av_extend(av, i + num);
718 Move(ary, ary + num, i + 1, SV*);
722 /* Make extra elements into a buffer */
724 AvFILLp(av) -= slide;
725 AvARRAY(av) = AvARRAY(av) + slide;
732 Removes one SV from the start of the array, reducing its size by one and
733 returning the SV (transferring control of one reference count) to the
734 caller. Returns C<&PL_sv_undef> if the array is empty.
736 Perl equivalent: C<shift(@myarray);>
742 Perl_av_shift(pTHX_ AV *av)
747 PERL_ARGS_ASSERT_AV_SHIFT;
748 assert(SvTYPE(av) == SVt_PVAV);
751 Perl_croak_no_modify();
752 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
753 retval = Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(SHIFT), 0, 0);
755 retval = newSVsv(retval);
760 retval = *AvARRAY(av);
763 AvARRAY(av) = AvARRAY(av) + 1;
767 mg_set(MUTABLE_SV(av));
768 return retval ? retval : &PL_sv_undef;
772 =for apidoc av_top_index
774 Returns the highest index in the array. The number of elements in the
775 array is S<C<av_top_index(av) + 1>>. Returns -1 if the array is empty.
777 The Perl equivalent for this is C<$#myarray>.
779 (A slightly shorter form is C<av_tindex>.)
783 Same as L</av_top_index>. Note that, unlike what the name implies, it returns
784 the highest index in the array, so to get the size of the array you need to use
785 S<C<av_len(av) + 1>>. This is unlike L</sv_len>, which returns what you would
792 Perl_av_len(pTHX_ AV *av)
794 PERL_ARGS_ASSERT_AV_LEN;
796 return av_top_index(av);
802 Set the highest index in the array to the given number, equivalent to
803 Perl's S<C<$#array = $fill;>>.
805 The number of elements in the array will be S<C<fill + 1>> after
806 C<av_fill()> returns. If the array was previously shorter, then the
807 additional elements appended are set to NULL. If the array
808 was longer, then the excess elements are freed. S<C<av_fill(av, -1)>> is
809 the same as C<av_clear(av)>.
814 Perl_av_fill(pTHX_ AV *av, SSize_t fill)
818 PERL_ARGS_ASSERT_AV_FILL;
819 assert(SvTYPE(av) == SVt_PVAV);
823 if ((mg = SvTIED_mg((const SV *)av, PERL_MAGIC_tied))) {
824 SV *arg1 = sv_newmortal();
825 sv_setiv(arg1, (IV)(fill + 1));
826 Perl_magic_methcall(aTHX_ MUTABLE_SV(av), mg, SV_CONST(STORESIZE), G_DISCARD,
830 if (fill <= AvMAX(av)) {
831 SSize_t key = AvFILLp(av);
832 SV** const ary = AvARRAY(av);
836 SvREFCNT_dec(ary[key]);
847 mg_set(MUTABLE_SV(av));
850 (void)av_store(av,fill,NULL);
854 =for apidoc av_delete
856 Deletes the element indexed by C<key> from the array, makes the element mortal,
857 and returns it. If C<flags> equals C<G_DISCARD>, the element is freed and null
858 is returned. Perl equivalent: S<C<my $elem = delete($myarray[$idx]);>> for the
859 non-C<G_DISCARD> version and a void-context S<C<delete($myarray[$idx]);>> for the
860 C<G_DISCARD> version.
865 Perl_av_delete(pTHX_ AV *av, SSize_t key, I32 flags)
869 PERL_ARGS_ASSERT_AV_DELETE;
870 assert(SvTYPE(av) == SVt_PVAV);
873 Perl_croak_no_modify();
875 if (SvRMAGICAL(av)) {
876 const MAGIC * const tied_magic
877 = mg_find((const SV *)av, PERL_MAGIC_tied);
878 if ((tied_magic || mg_find((const SV *)av, PERL_MAGIC_regdata))) {
881 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
884 svp = av_fetch(av, key, TRUE);
888 if (mg_find(sv, PERL_MAGIC_tiedelem)) {
889 sv_unmagic(sv, PERL_MAGIC_tiedelem); /* No longer an element */
898 key += AvFILL(av) + 1;
903 if (key > AvFILLp(av))
906 if (!AvREAL(av) && AvREIFY(av))
908 sv = AvARRAY(av)[key];
909 AvARRAY(av)[key] = NULL;
910 if (key == AvFILLp(av)) {
913 } while (--key >= 0 && !AvARRAY(av)[key]);
916 mg_set(MUTABLE_SV(av));
919 if (flags & G_DISCARD) {
930 =for apidoc av_exists
932 Returns true if the element indexed by C<key> has been initialized.
934 This relies on the fact that uninitialized array elements are set to
937 Perl equivalent: C<exists($myarray[$key])>.
942 Perl_av_exists(pTHX_ AV *av, SSize_t key)
944 PERL_ARGS_ASSERT_AV_EXISTS;
945 assert(SvTYPE(av) == SVt_PVAV);
947 if (SvRMAGICAL(av)) {
948 const MAGIC * const tied_magic
949 = mg_find((const SV *)av, PERL_MAGIC_tied);
950 const MAGIC * const regdata_magic
951 = mg_find((const SV *)av, PERL_MAGIC_regdata);
952 if (tied_magic || regdata_magic) {
954 /* Handle negative array indices 20020222 MJD */
956 if (!S_adjust_index(aTHX_ av, tied_magic, &key))
960 if(key >= 0 && regdata_magic) {
961 if (key <= AvFILL(av))
967 SV * const sv = sv_newmortal();
968 mg_copy(MUTABLE_SV(av), sv, 0, key);
969 mg = mg_find(sv, PERL_MAGIC_tiedelem);
971 magic_existspack(sv, mg);
973 I32 retbool = SvTRUE_nomg_NN(sv);
974 return cBOOL(retbool);
982 key += AvFILL(av) + 1;
987 if (key <= AvFILLp(av) && AvARRAY(av)[key])
996 S_get_aux_mg(pTHX_ AV *av) {
999 PERL_ARGS_ASSERT_GET_AUX_MG;
1000 assert(SvTYPE(av) == SVt_PVAV);
1002 mg = mg_find((const SV *)av, PERL_MAGIC_arylen_p);
1005 mg = sv_magicext(MUTABLE_SV(av), 0, PERL_MAGIC_arylen_p,
1006 &PL_vtbl_arylen_p, 0, 0);
1008 /* sv_magicext won't set this for us because we pass in a NULL obj */
1009 mg->mg_flags |= MGf_REFCOUNTED;
1015 Perl_av_arylen_p(pTHX_ AV *av) {
1016 MAGIC *const mg = get_aux_mg(av);
1018 PERL_ARGS_ASSERT_AV_ARYLEN_P;
1019 assert(SvTYPE(av) == SVt_PVAV);
1021 return &(mg->mg_obj);
1025 Perl_av_iter_p(pTHX_ AV *av) {
1026 MAGIC *const mg = get_aux_mg(av);
1028 PERL_ARGS_ASSERT_AV_ITER_P;
1029 assert(SvTYPE(av) == SVt_PVAV);
1031 #if IVSIZE == I32SIZE
1032 return (IV *)&(mg->mg_len);
1036 mg->mg_len = IVSIZE;
1038 mg->mg_ptr = (char *) temp;
1040 return (IV *)mg->mg_ptr;
1045 * ex: set ts=8 sts=4 sw=4 et: