Remove, eliminate, and destroy multiple, redundant occurences of the
[p5sagit/p5-mst-13.2.git] / mg.c
1 /*    mg.c
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 /*
11  * "Sam sat on the ground and put his head in his hands.  'I wish I had never
12  * come here, and I don't want to see no more magic,' he said, and fell silent."
13  */
14
15 /*
16 =head1 Magical Functions
17 */
18
19 #include "EXTERN.h"
20 #define PERL_IN_MG_C
21 #include "perl.h"
22
23 #if defined(HAS_GETGROUPS) || defined(HAS_SETGROUPS)
24 #  ifndef NGROUPS
25 #    define NGROUPS 32
26 #  endif
27 #  ifdef I_GRP
28 #    include <grp.h>
29 #  endif
30 #endif
31
32 /* if you only have signal() and it resets on each signal, FAKE_PERSISTENT_SIGNAL_HANDLERS fixes */
33 #if !defined(HAS_SIGACTION) && defined(VMS)
34 #  define  FAKE_PERSISTENT_SIGNAL_HANDLERS
35 #endif
36 /* if we're doing kill() with sys$sigprc on VMS, FAKE_DEFAULT_SIGNAL_HANDLERS */
37 #if defined(KILL_BY_SIGPRC)
38 #  define  FAKE_DEFAULT_SIGNAL_HANDLERS
39 #endif
40
41 static void restore_magic(pTHX_ void *p);
42 static void unwind_handler_stack(pTHX_ void *p);
43
44 /*
45  * Use the "DESTRUCTOR" scope cleanup to reinstate magic.
46  */
47
48 struct magic_state {
49     SV* mgs_sv;
50     U32 mgs_flags;
51     I32 mgs_ss_ix;
52 };
53 /* MGS is typedef'ed to struct magic_state in perl.h */
54
55 STATIC void
56 S_save_magic(pTHX_ I32 mgs_ix, SV *sv)
57 {
58     MGS* mgs;
59     assert(SvMAGICAL(sv));
60
61     SAVEDESTRUCTOR_X(restore_magic, INT2PTR(void*, (IV)mgs_ix));
62
63     mgs = SSPTR(mgs_ix, MGS*);
64     mgs->mgs_sv = sv;
65     mgs->mgs_flags = SvMAGICAL(sv) | SvREADONLY(sv);
66     mgs->mgs_ss_ix = PL_savestack_ix;   /* points after the saved destructor */
67
68     SvMAGICAL_off(sv);
69     SvREADONLY_off(sv);
70     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_NOK|SVp_POK)) >> PRIVSHIFT;
71 }
72
73 /*
74 =for apidoc mg_magical
75
76 Turns on the magical status of an SV.  See C<sv_magic>.
77
78 =cut
79 */
80
81 void
82 Perl_mg_magical(pTHX_ SV *sv)
83 {
84     MAGIC* mg;
85     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
86         MGVTBL* vtbl = mg->mg_virtual;
87         if (vtbl) {
88             if (vtbl->svt_get && !(mg->mg_flags & MGf_GSKIP))
89                 SvGMAGICAL_on(sv);
90             if (vtbl->svt_set)
91                 SvSMAGICAL_on(sv);
92             if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
93                 SvRMAGICAL_on(sv);
94         }
95     }
96 }
97
98 /*
99 =for apidoc mg_get
100
101 Do magic after a value is retrieved from the SV.  See C<sv_magic>.
102
103 =cut
104 */
105
106 int
107 Perl_mg_get(pTHX_ SV *sv)
108 {
109     int new = 0;
110     MAGIC *newmg, *head, *cur, *mg;
111     I32 mgs_ix = SSNEW(sizeof(MGS));
112
113     save_magic(mgs_ix, sv);
114
115     /* We must call svt_get(sv, mg) for each valid entry in the linked
116        list of magic. svt_get() may delete the current entry, add new
117        magic to the head of the list, or upgrade the SV. AMS 20010810 */
118
119     newmg = cur = head = mg = SvMAGIC(sv);
120     while (mg) {
121         MGVTBL *vtbl = mg->mg_virtual;
122
123         if (!(mg->mg_flags & MGf_GSKIP) && vtbl && vtbl->svt_get) {
124             CALL_FPTR(vtbl->svt_get)(aTHX_ sv, mg);
125             /* Don't restore the flags for this entry if it was deleted. */
126             if (mg->mg_flags & MGf_GSKIP)
127                 (SSPTR(mgs_ix, MGS *))->mgs_flags = 0;
128         }
129
130         mg = mg->mg_moremagic;
131
132         if (new) {
133             /* Have we finished with the new entries we saw? Start again
134                where we left off (unless there are more new entries). */
135             if (mg == head) {
136                 new  = 0;
137                 mg   = cur;
138                 head = newmg;
139             }
140         }
141
142         /* Were any new entries added? */
143         if (!new && (newmg = SvMAGIC(sv)) != head) {
144             new = 1;
145             cur = mg;
146             mg  = newmg;
147         }
148     }
149
150     restore_magic(aTHX_ INT2PTR(void *, (IV)mgs_ix));
151     return 0;
152 }
153
154 /*
155 =for apidoc mg_set
156
157 Do magic after a value is assigned to the SV.  See C<sv_magic>.
158
159 =cut
160 */
161
162 int
163 Perl_mg_set(pTHX_ SV *sv)
164 {
165     I32 mgs_ix;
166     MAGIC* mg;
167     MAGIC* nextmg;
168
169     mgs_ix = SSNEW(sizeof(MGS));
170     save_magic(mgs_ix, sv);
171
172     for (mg = SvMAGIC(sv); mg; mg = nextmg) {
173         MGVTBL* vtbl = mg->mg_virtual;
174         nextmg = mg->mg_moremagic;      /* it may delete itself */
175         if (mg->mg_flags & MGf_GSKIP) {
176             mg->mg_flags &= ~MGf_GSKIP; /* setting requires another read */
177             (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
178         }
179         if (vtbl && vtbl->svt_set)
180             CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
181     }
182
183     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
184     return 0;
185 }
186
187 /*
188 =for apidoc mg_length
189
190 Report on the SV's length.  See C<sv_magic>.
191
192 =cut
193 */
194
195 U32
196 Perl_mg_length(pTHX_ SV *sv)
197 {
198     MAGIC* mg;
199     STRLEN len;
200
201     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
202         MGVTBL* vtbl = mg->mg_virtual;
203         if (vtbl && vtbl->svt_len) {
204             I32 mgs_ix;
205
206             mgs_ix = SSNEW(sizeof(MGS));
207             save_magic(mgs_ix, sv);
208             /* omit MGf_GSKIP -- not changed here */
209             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
210             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
211             return len;
212         }
213     }
214
215     if (DO_UTF8(sv))
216     {
217         U8 *s = (U8*)SvPV(sv, len);
218         len = Perl_utf8_length(aTHX_ s, s + len);
219     }
220     else
221         (void)SvPV(sv, len);
222     return len;
223 }
224
225 I32
226 Perl_mg_size(pTHX_ SV *sv)
227 {
228     MAGIC* mg;
229     I32 len;
230
231     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
232         MGVTBL* vtbl = mg->mg_virtual;
233         if (vtbl && vtbl->svt_len) {
234             I32 mgs_ix;
235
236             mgs_ix = SSNEW(sizeof(MGS));
237             save_magic(mgs_ix, sv);
238             /* omit MGf_GSKIP -- not changed here */
239             len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
240             restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
241             return len;
242         }
243     }
244
245     switch(SvTYPE(sv)) {
246         case SVt_PVAV:
247             len = AvFILLp((AV *) sv); /* Fallback to non-tied array */
248             return len;
249         case SVt_PVHV:
250             /* FIXME */
251         default:
252             Perl_croak(aTHX_ "Size magic not implemented");
253             break;
254     }
255     return 0;
256 }
257
258 /*
259 =for apidoc mg_clear
260
261 Clear something magical that the SV represents.  See C<sv_magic>.
262
263 =cut
264 */
265
266 int
267 Perl_mg_clear(pTHX_ SV *sv)
268 {
269     I32 mgs_ix;
270     MAGIC* mg;
271
272     mgs_ix = SSNEW(sizeof(MGS));
273     save_magic(mgs_ix, sv);
274
275     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
276         MGVTBL* vtbl = mg->mg_virtual;
277         /* omit GSKIP -- never set here */
278
279         if (vtbl && vtbl->svt_clear)
280             CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
281     }
282
283     restore_magic(aTHX_ INT2PTR(void*, (IV)mgs_ix));
284     return 0;
285 }
286
287 /*
288 =for apidoc mg_find
289
290 Finds the magic pointer for type matching the SV.  See C<sv_magic>.
291
292 =cut
293 */
294
295 MAGIC*
296 Perl_mg_find(pTHX_ SV *sv, int type)
297 {
298     MAGIC* mg;
299     if (!sv)
300         return 0;
301     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
302         if (mg->mg_type == type)
303             return mg;
304     }
305     return 0;
306 }
307
308 /*
309 =for apidoc mg_copy
310
311 Copies the magic from one SV to another.  See C<sv_magic>.
312
313 =cut
314 */
315
316 int
317 Perl_mg_copy(pTHX_ SV *sv, SV *nsv, const char *key, I32 klen)
318 {
319     int count = 0;
320     MAGIC* mg;
321     for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
322         MGVTBL* vtbl = mg->mg_virtual;
323         if ((mg->mg_flags & MGf_COPY) && vtbl->svt_copy){
324             count += CALL_FPTR(vtbl->svt_copy)(aTHX_ sv, mg, nsv, key, klen);
325         }
326         else if (isUPPER(mg->mg_type)) {
327             sv_magic(nsv,
328                      mg->mg_type == PERL_MAGIC_tied ? SvTIED_obj(sv, mg) :
329                      (mg->mg_type == PERL_MAGIC_regdata && mg->mg_obj)
330                                                         ? sv : mg->mg_obj,
331                      toLOWER(mg->mg_type), key, klen);
332             count++;
333         }
334     }
335     return count;
336 }
337
338 /*
339 =for apidoc mg_free
340
341 Free any magic storage used by the SV.  See C<sv_magic>.
342
343 =cut
344 */
345
346 int
347 Perl_mg_free(pTHX_ SV *sv)
348 {
349     MAGIC* mg;
350     MAGIC* moremagic;
351     for (mg = SvMAGIC(sv); mg; mg = moremagic) {
352         MGVTBL* vtbl = mg->mg_virtual;
353         moremagic = mg->mg_moremagic;
354         if (vtbl && vtbl->svt_free)
355             CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
356         if (mg->mg_ptr && mg->mg_type != PERL_MAGIC_regex_global) {
357             if (mg->mg_len > 0)
358                 Safefree(mg->mg_ptr);
359             else if (mg->mg_len == HEf_SVKEY)
360                 SvREFCNT_dec((SV*)mg->mg_ptr);
361         }
362         if (mg->mg_flags & MGf_REFCOUNTED)
363             SvREFCNT_dec(mg->mg_obj);
364         Safefree(mg);
365     }
366     SvMAGIC(sv) = 0;
367     return 0;
368 }
369
370
371 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
372 #include <signal.h>
373 #endif
374
375 U32
376 Perl_magic_regdata_cnt(pTHX_ SV *sv, MAGIC *mg)
377 {
378     register REGEXP *rx;
379
380     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
381         if (mg->mg_obj)         /* @+ */
382             return rx->nparens;
383         else                    /* @- */
384             return rx->lastparen;
385     }
386
387     return (U32)-1;
388 }
389
390 int
391 Perl_magic_regdatum_get(pTHX_ SV *sv, MAGIC *mg)
392 {
393     register I32 paren;
394     register I32 s;
395     register I32 i;
396     register REGEXP *rx;
397     I32 t;
398
399     if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
400         paren = mg->mg_len;
401         if (paren < 0)
402             return 0;
403         if (paren <= rx->nparens &&
404             (s = rx->startp[paren]) != -1 &&
405             (t = rx->endp[paren]) != -1)
406             {
407                 if (mg->mg_obj)         /* @+ */
408                     i = t;
409                 else                    /* @- */
410                     i = s;
411
412                 if (i > 0 && PL_reg_match_utf8) {
413                     char *b = rx->subbeg;
414                     if (b)
415                         i = Perl_utf8_length(aTHX_ (U8*)b, (U8*)(b+i));
416                 }
417
418                 sv_setiv(sv, i);
419             }
420     }
421     return 0;
422 }
423
424 int
425 Perl_magic_regdatum_set(pTHX_ SV *sv, MAGIC *mg)
426 {
427     Perl_croak(aTHX_ PL_no_modify);
428     /* NOT REACHED */
429     return 0;
430 }
431
432 U32
433 Perl_magic_len(pTHX_ SV *sv, MAGIC *mg)
434 {
435     register I32 paren;
436     register I32 i;
437     register REGEXP *rx;
438     I32 s1, t1;
439
440     switch (*mg->mg_ptr) {
441     case '1': case '2': case '3': case '4':
442     case '5': case '6': case '7': case '8': case '9': case '&':
443         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
444
445             paren = atoi(mg->mg_ptr); /* $& is in [0] */
446           getparen:
447             if (paren <= rx->nparens &&
448                 (s1 = rx->startp[paren]) != -1 &&
449                 (t1 = rx->endp[paren]) != -1)
450             {
451                 i = t1 - s1;
452               getlen:
453                 if (i > 0 && PL_reg_match_utf8) {
454                     char *s    = rx->subbeg + s1;
455                     char *send = rx->subbeg + t1;
456
457                     if (is_utf8_string((U8*)s, i))
458                         i = Perl_utf8_length(aTHX_ (U8*)s, (U8*)send);
459                 }
460                 if (i < 0)
461                     Perl_croak(aTHX_ "panic: magic_len: %"IVdf, (IV)i);
462                 return i;
463             }
464             else {
465                 if (ckWARN(WARN_UNINITIALIZED))
466                     report_uninit();
467             }
468         }
469         else {
470             if (ckWARN(WARN_UNINITIALIZED))
471                 report_uninit();
472         }
473         return 0;
474     case '+':
475         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
476             paren = rx->lastparen;
477             if (paren)
478                 goto getparen;
479         }
480         return 0;
481     case '\016': /* ^N */
482         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
483             paren = rx->lastcloseparen;
484             if (paren)
485                 goto getparen;
486         }
487         return 0;
488     case '`':
489         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
490             if (rx->startp[0] != -1) {
491                 i = rx->startp[0];
492                 if (i > 0) {
493                     s1 = 0;
494                     t1 = i;
495                     goto getlen;
496                 }
497             }
498         }
499         return 0;
500     case '\'':
501         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
502             if (rx->endp[0] != -1) {
503                 i = rx->sublen - rx->endp[0];
504                 if (i > 0) {
505                     s1 = rx->endp[0];
506                     t1 = rx->sublen;
507                     goto getlen;
508                 }
509             }
510         }
511         return 0;
512     }
513     magic_get(sv,mg);
514     if (!SvPOK(sv) && SvNIOK(sv)) {
515         STRLEN n_a;
516         sv_2pv(sv, &n_a);
517     }
518     if (SvPOK(sv))
519         return SvCUR(sv);
520     return 0;
521 }
522
523 int
524 Perl_magic_get(pTHX_ SV *sv, MAGIC *mg)
525 {
526     register I32 paren;
527     register char *s;
528     register I32 i;
529     register REGEXP *rx;
530
531     switch (*mg->mg_ptr) {
532     case '\001':                /* ^A */
533         sv_setsv(sv, PL_bodytarget);
534         break;
535     case '\003':                /* ^C */
536         sv_setiv(sv, (IV)PL_minus_c);
537         break;
538
539     case '\004':                /* ^D */
540         sv_setiv(sv, (IV)(PL_debug & DEBUG_MASK));
541 #if defined(YYDEBUG) && defined(DEBUGGING)
542         PL_yydebug = DEBUG_p_TEST;
543 #endif
544         break;
545     case '\005':  /* ^E */
546          if (*(mg->mg_ptr+1) == '\0') {
547 #ifdef MACOS_TRADITIONAL
548              {
549                   char msg[256];
550
551                   sv_setnv(sv,(double)gMacPerl_OSErr);
552                   sv_setpv(sv, gMacPerl_OSErr ? GetSysErrText(gMacPerl_OSErr, msg) : "");
553              }
554 #else
555 #ifdef VMS
556              {
557 #                 include <descrip.h>
558 #                 include <starlet.h>
559                   char msg[255];
560                   $DESCRIPTOR(msgdsc,msg);
561                   sv_setnv(sv,(NV) vaxc$errno);
562                   if (sys$getmsg(vaxc$errno,&msgdsc.dsc$w_length,&msgdsc,0,0) & 1)
563                        sv_setpvn(sv,msgdsc.dsc$a_pointer,msgdsc.dsc$w_length);
564                   else
565                        sv_setpv(sv,"");
566              }
567 #else
568 #ifdef OS2
569              if (!(_emx_env & 0x200)) { /* Under DOS */
570                   sv_setnv(sv, (NV)errno);
571                   sv_setpv(sv, errno ? Strerror(errno) : "");
572              } else {
573                   if (errno != errno_isOS2) {
574                        int tmp = _syserrno();
575                        if (tmp) /* 2nd call to _syserrno() makes it 0 */
576                             Perl_rc = tmp;
577                   }
578                   sv_setnv(sv, (NV)Perl_rc);
579                   sv_setpv(sv, os2error(Perl_rc));
580              }
581 #else
582 #ifdef WIN32
583              {
584                   DWORD dwErr = GetLastError();
585                   sv_setnv(sv, (NV)dwErr);
586                   if (dwErr)
587                   {
588                        PerlProc_GetOSError(sv, dwErr);
589                   }
590                   else
591                        sv_setpv(sv, "");
592                   SetLastError(dwErr);
593              }
594 #else
595              sv_setnv(sv, (NV)errno);
596              sv_setpv(sv, errno ? Strerror(errno) : "");
597 #endif
598 #endif
599 #endif
600 #endif
601              SvNOK_on(sv);      /* what a wonderful hack! */
602          }
603          else if (strEQ(mg->mg_ptr+1, "NCODING"))
604               sv_setsv(sv, PL_encoding);
605          break;
606     case '\006':                /* ^F */
607         sv_setiv(sv, (IV)PL_maxsysfd);
608         break;
609     case '\010':                /* ^H */
610         sv_setiv(sv, (IV)PL_hints);
611         break;
612     case '\011':                /* ^I */ /* NOT \t in EBCDIC */
613         if (PL_inplace)
614             sv_setpv(sv, PL_inplace);
615         else
616             sv_setsv(sv, &PL_sv_undef);
617         break;
618     case '\017':                /* ^O & ^OPEN */
619         if (*(mg->mg_ptr+1) == '\0')
620             sv_setpv(sv, PL_osname);
621         else if (strEQ(mg->mg_ptr, "\017PEN")) {
622             if (!PL_compiling.cop_io)
623                 sv_setsv(sv, &PL_sv_undef);
624             else {
625                 sv_setsv(sv, PL_compiling.cop_io);
626             }
627         }
628         break;
629     case '\020':                /* ^P */
630         sv_setiv(sv, (IV)PL_perldb);
631         break;
632     case '\023':                /* ^S */
633         {
634             if (PL_lex_state != LEX_NOTPARSING)
635                 (void)SvOK_off(sv);
636             else if (PL_in_eval)
637                 sv_setiv(sv, PL_in_eval & ~(EVAL_INREQUIRE));
638             else
639                 sv_setiv(sv, 0);
640         }
641         break;
642     case '\024':                /* ^T */
643         if (*(mg->mg_ptr+1) == '\0') {
644 #ifdef BIG_TIME
645             sv_setnv(sv, PL_basetime);
646 #else
647             sv_setiv(sv, (IV)PL_basetime);
648 #endif
649         }
650         else if (strEQ(mg->mg_ptr, "\024AINT"))
651             sv_setiv(sv, PL_tainting);
652         break;
653     case '\027':                /* ^W  & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
654         if (*(mg->mg_ptr+1) == '\0')
655             sv_setiv(sv, (IV)((PL_dowarn & G_WARN_ON) ? TRUE : FALSE));
656         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
657             if (PL_compiling.cop_warnings == pWARN_NONE ||
658                 PL_compiling.cop_warnings == pWARN_STD)
659             {
660                 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;
661             }
662             else if (PL_compiling.cop_warnings == pWARN_ALL) {
663                 sv_setpvn(sv, WARN_ALLstring, WARNsize) ;
664             }
665             else {
666                 sv_setsv(sv, PL_compiling.cop_warnings);
667             }
668             SvPOK_only(sv);
669         }
670         else if (strEQ(mg->mg_ptr+1, "IDE_SYSTEM_CALLS"))
671             sv_setiv(sv, (IV)PL_widesyscalls);
672         break;
673     case '1': case '2': case '3': case '4':
674     case '5': case '6': case '7': case '8': case '9': case '&':
675         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
676             I32 s1, t1;
677
678             /*
679              * Pre-threads, this was paren = atoi(GvENAME((GV*)mg->mg_obj));
680              * XXX Does the new way break anything?
681              */
682             paren = atoi(mg->mg_ptr); /* $& is in [0] */
683           getparen:
684             if (paren <= rx->nparens &&
685                 (s1 = rx->startp[paren]) != -1 &&
686                 (t1 = rx->endp[paren]) != -1)
687             {
688                 i = t1 - s1;
689                 s = rx->subbeg + s1;
690                 if (!rx->subbeg)
691                     break;
692
693               getrx:
694                 if (i >= 0) {
695                     bool was_tainted = FALSE;
696                     if (PL_tainting) {
697                         was_tainted = PL_tainted;
698                         PL_tainted = FALSE;
699                     }
700                     sv_setpvn(sv, s, i);
701                    if (PL_reg_match_utf8 && is_utf8_string((U8*)s, i))
702                         SvUTF8_on(sv);
703                     else
704                         SvUTF8_off(sv);
705                     if (PL_tainting)
706                         PL_tainted = (was_tainted || RX_MATCH_TAINTED(rx));
707                     break;
708                 }
709             }
710         }
711         sv_setsv(sv,&PL_sv_undef);
712         break;
713     case '+':
714         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
715             paren = rx->lastparen;
716             if (paren)
717                 goto getparen;
718         }
719         sv_setsv(sv,&PL_sv_undef);
720         break;
721     case '\016':                /* ^N */
722         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
723             paren = rx->lastcloseparen;
724             if (paren)
725                 goto getparen;
726         }
727         sv_setsv(sv,&PL_sv_undef);
728         break;
729     case '`':
730         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
731             if ((s = rx->subbeg) && rx->startp[0] != -1) {
732                 i = rx->startp[0];
733                 goto getrx;
734             }
735         }
736         sv_setsv(sv,&PL_sv_undef);
737         break;
738     case '\'':
739         if (PL_curpm && (rx = PM_GETRE(PL_curpm))) {
740             if (rx->subbeg && rx->endp[0] != -1) {
741                 s = rx->subbeg + rx->endp[0];
742                 i = rx->sublen - rx->endp[0];
743                 goto getrx;
744             }
745         }
746         sv_setsv(sv,&PL_sv_undef);
747         break;
748     case '.':
749 #ifndef lint
750         if (GvIO(PL_last_in_gv)) {
751             sv_setiv(sv, (IV)IoLINES(GvIOp(PL_last_in_gv)));
752         }
753 #endif
754         break;
755     case '?':
756         {
757             sv_setiv(sv, (IV)STATUS_CURRENT);
758 #ifdef COMPLEX_STATUS
759             LvTARGOFF(sv) = PL_statusvalue;
760             LvTARGLEN(sv) = PL_statusvalue_vms;
761 #endif
762         }
763         break;
764     case '^':
765         s = IoTOP_NAME(GvIOp(PL_defoutgv));
766         if (s)
767             sv_setpv(sv,s);
768         else {
769             sv_setpv(sv,GvENAME(PL_defoutgv));
770             sv_catpv(sv,"_TOP");
771         }
772         break;
773     case '~':
774         s = IoFMT_NAME(GvIOp(PL_defoutgv));
775         if (!s)
776             s = GvENAME(PL_defoutgv);
777         sv_setpv(sv,s);
778         break;
779 #ifndef lint
780     case '=':
781         sv_setiv(sv, (IV)IoPAGE_LEN(GvIOp(PL_defoutgv)));
782         break;
783     case '-':
784         sv_setiv(sv, (IV)IoLINES_LEFT(GvIOp(PL_defoutgv)));
785         break;
786     case '%':
787         sv_setiv(sv, (IV)IoPAGE(GvIOp(PL_defoutgv)));
788         break;
789 #endif
790     case ':':
791         break;
792     case '/':
793         break;
794     case '[':
795         WITH_THR(sv_setiv(sv, (IV)PL_curcop->cop_arybase));
796         break;
797     case '|':
798         sv_setiv(sv, (IV)(IoFLAGS(GvIOp(PL_defoutgv)) & IOf_FLUSH) != 0 );
799         break;
800     case ',':
801         break;
802     case '\\':
803         if (PL_ors_sv)
804             sv_setpv(sv,SvPVX(PL_ors_sv));
805         break;
806     case '#':
807         sv_setpv(sv,PL_ofmt);
808         break;
809     case '!':
810 #ifdef VMS
811         sv_setnv(sv, (NV)((errno == EVMSERR) ? vaxc$errno : errno));
812         sv_setpv(sv, errno ? Strerror(errno) : "");
813 #else
814         {
815         int saveerrno = errno;
816         sv_setnv(sv, (NV)errno);
817 #ifdef OS2
818         if (errno == errno_isOS2 || errno == errno_isOS2_set)
819             sv_setpv(sv, os2error(Perl_rc));
820         else
821 #endif
822         sv_setpv(sv, errno ? Strerror(errno) : "");
823         errno = saveerrno;
824         }
825 #endif
826         SvNOK_on(sv);   /* what a wonderful hack! */
827         break;
828     case '<':
829         sv_setiv(sv, (IV)PL_uid);
830         break;
831     case '>':
832         sv_setiv(sv, (IV)PL_euid);
833         break;
834     case '(':
835         sv_setiv(sv, (IV)PL_gid);
836 #ifdef HAS_GETGROUPS
837         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_gid);
838 #endif
839         goto add_groups;
840     case ')':
841         sv_setiv(sv, (IV)PL_egid);
842 #ifdef HAS_GETGROUPS
843         Perl_sv_setpvf(aTHX_ sv, "%"Gid_t_f, PL_egid);
844 #endif
845       add_groups:
846 #ifdef HAS_GETGROUPS
847         {
848             Groups_t gary[NGROUPS];
849             i = getgroups(NGROUPS,gary);
850             while (--i >= 0)
851                 Perl_sv_catpvf(aTHX_ sv, " %"Gid_t_f, gary[i]);
852         }
853 #endif
854         (void)SvIOK_on(sv);     /* what a wonderful hack! */
855         break;
856     case '*':
857         break;
858 #ifndef MACOS_TRADITIONAL
859     case '0':
860         break;
861 #endif
862 #ifdef USE_5005THREADS
863     case '@':
864         sv_setsv(sv, thr->errsv);
865         break;
866 #endif /* USE_5005THREADS */
867     }
868     return 0;
869 }
870
871 int
872 Perl_magic_getuvar(pTHX_ SV *sv, MAGIC *mg)
873 {
874     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
875
876     if (uf && uf->uf_val)
877         (*uf->uf_val)(aTHX_ uf->uf_index, sv);
878     return 0;
879 }
880
881 int
882 Perl_magic_setenv(pTHX_ SV *sv, MAGIC *mg)
883 {
884     register char *s;
885     char *ptr;
886     STRLEN len, klen;
887
888     s = SvPV(sv,len);
889     ptr = MgPV(mg,klen);
890     my_setenv(ptr, s);
891
892 #ifdef DYNAMIC_ENV_FETCH
893      /* We just undefd an environment var.  Is a replacement */
894      /* waiting in the wings? */
895     if (!len) {
896         SV **valp;
897         if ((valp = hv_fetch(GvHVn(PL_envgv), ptr, klen, FALSE)))
898             s = SvPV(*valp, len);
899     }
900 #endif
901
902 #if !defined(OS2) && !defined(AMIGAOS) && !defined(WIN32) && !defined(MSDOS)
903                             /* And you'll never guess what the dog had */
904                             /*   in its mouth... */
905     if (PL_tainting) {
906         MgTAINTEDDIR_off(mg);
907 #ifdef VMS
908         if (s && klen == 8 && strEQ(ptr, "DCL$PATH")) {
909             char pathbuf[256], eltbuf[256], *cp, *elt = s;
910             struct stat sbuf;
911             int i = 0, j = 0;
912
913             do {          /* DCL$PATH may be a search list */
914                 while (1) {   /* as may dev portion of any element */
915                     if ( ((cp = strchr(elt,'[')) || (cp = strchr(elt,'<'))) ) {
916                         if ( *(cp+1) == '.' || *(cp+1) == '-' ||
917                              cando_by_name(S_IWUSR,0,elt) ) {
918                             MgTAINTEDDIR_on(mg);
919                             return 0;
920                         }
921                     }
922                     if ((cp = strchr(elt, ':')) != Nullch)
923                         *cp = '\0';
924                     if (my_trnlnm(elt, eltbuf, j++))
925                         elt = eltbuf;
926                     else
927                         break;
928                 }
929                 j = 0;
930             } while (my_trnlnm(s, pathbuf, i++) && (elt = pathbuf));
931         }
932 #endif /* VMS */
933         if (s && klen == 4 && strEQ(ptr,"PATH")) {
934             char *strend = s + len;
935
936             while (s < strend) {
937                 char tmpbuf[256];
938                 struct stat st;
939                 I32 i;
940                 s = delimcpy(tmpbuf, tmpbuf + sizeof tmpbuf,
941                              s, strend, ':', &i);
942                 s++;
943                 if (i >= sizeof tmpbuf   /* too long -- assume the worst */
944                       || *tmpbuf != '/'
945                       || (PerlLIO_stat(tmpbuf, &st) == 0 && (st.st_mode & 2)) ) {
946                     MgTAINTEDDIR_on(mg);
947                     return 0;
948                 }
949             }
950         }
951     }
952 #endif /* neither OS2 nor AMIGAOS nor WIN32 nor MSDOS */
953
954     return 0;
955 }
956
957 int
958 Perl_magic_clearenv(pTHX_ SV *sv, MAGIC *mg)
959 {
960     STRLEN n_a;
961     my_setenv(MgPV(mg,n_a),Nullch);
962     return 0;
963 }
964
965 int
966 Perl_magic_set_all_env(pTHX_ SV *sv, MAGIC *mg)
967 {
968 #if defined(VMS)
969     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
970 #else
971     if (PL_localizing) {
972         HE* entry;
973         STRLEN n_a;
974         magic_clear_all_env(sv,mg);
975         hv_iterinit((HV*)sv);
976         while ((entry = hv_iternext((HV*)sv))) {
977             I32 keylen;
978             my_setenv(hv_iterkey(entry, &keylen),
979                       SvPV(hv_iterval((HV*)sv, entry), n_a));
980         }
981     }
982 #endif
983     return 0;
984 }
985
986 int
987 Perl_magic_clear_all_env(pTHX_ SV *sv, MAGIC *mg)
988 {
989 #if defined(VMS) || defined(EPOC)
990     Perl_die(aTHX_ "Can't make list assignment to %%ENV on this system");
991 #else
992 #   if defined(PERL_IMPLICIT_SYS) || defined(WIN32)
993     PerlEnv_clearenv();
994 #   else
995 #       ifdef USE_ENVIRON_ARRAY
996 #           ifndef PERL_USE_SAFE_PUTENV
997     I32 i;
998
999     if (environ == PL_origenviron)
1000         environ = (char**)safesysmalloc(sizeof(char*));
1001     else
1002         for (i = 0; environ[i]; i++)
1003             safesysfree(environ[i]);
1004 #           endif /* PERL_USE_SAFE_PUTENV */
1005
1006     environ[0] = Nullch;
1007
1008 #       endif /* USE_ENVIRON_ARRAY */
1009 #   endif /* PERL_IMPLICIT_SYS || WIN32 */
1010 #endif /* VMS || EPC */
1011     return 0;
1012 }
1013
1014 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS)||defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1015 static int sig_handlers_initted = 0;
1016 #endif
1017 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1018 static int sig_ignoring[SIG_SIZE];      /* which signals we are ignoring */
1019 #endif
1020 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1021 static int sig_defaulting[SIG_SIZE];
1022 #endif
1023
1024 #ifndef PERL_MICRO
1025 int
1026 Perl_magic_getsig(pTHX_ SV *sv, MAGIC *mg)
1027 {
1028     I32 i;
1029     STRLEN n_a;
1030     /* Are we fetching a signal entry? */
1031     i = whichsig(MgPV(mg,n_a));
1032     if (i) {
1033         if(PL_psig_ptr[i])
1034             sv_setsv(sv,PL_psig_ptr[i]);
1035         else {
1036             Sighandler_t sigstate;
1037             sigstate = rsignal_state(i);
1038 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1039             if (sig_handlers_initted && sig_ignoring[i]) sigstate = SIG_IGN;
1040 #endif
1041 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1042             if (sig_handlers_initted && sig_defaulting[i]) sigstate = SIG_DFL;
1043 #endif
1044             /* cache state so we don't fetch it again */
1045             if(sigstate == SIG_IGN)
1046                 sv_setpv(sv,"IGNORE");
1047             else
1048                 sv_setsv(sv,&PL_sv_undef);
1049             PL_psig_ptr[i] = SvREFCNT_inc(sv);
1050             SvTEMP_off(sv);
1051         }
1052     }
1053     return 0;
1054 }
1055 int
1056 Perl_magic_clearsig(pTHX_ SV *sv, MAGIC *mg)
1057 {
1058     I32 i;
1059     STRLEN n_a;
1060     /* Are we clearing a signal entry? */
1061     i = whichsig(MgPV(mg,n_a));
1062     if (i) {
1063         if(PL_psig_ptr[i]) {
1064             SvREFCNT_dec(PL_psig_ptr[i]);
1065             PL_psig_ptr[i]=0;
1066         }
1067         if(PL_psig_name[i]) {
1068             SvREFCNT_dec(PL_psig_name[i]);
1069             PL_psig_name[i]=0;
1070         }
1071     }
1072     return 0;
1073 }
1074
1075 void
1076 Perl_raise_signal(pTHX_ int sig)
1077 {
1078     /* Set a flag to say this signal is pending */
1079     PL_psig_pend[sig]++;
1080     /* And one to say _a_ signal is pending */
1081     PL_sig_pending = 1;
1082 }
1083
1084 Signal_t
1085 Perl_csighandler(int sig)
1086 {
1087 #ifdef PERL_GET_SIG_CONTEXT
1088     dTHXa(PERL_GET_SIG_CONTEXT);
1089 #else
1090     dTHX;
1091 #endif
1092 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1093     (void) rsignal(sig, &Perl_csighandler);
1094     if (sig_ignoring[sig]) return;
1095 #endif
1096 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1097     if (sig_defaulting[sig])
1098 #ifdef KILL_BY_SIGPRC
1099             exit((Perl_sig_to_vmscondition(sig)&STS$M_COND_ID)|STS$K_SEVERE|STS$M_INHIB_MSG);
1100 #else
1101             exit(1);
1102 #endif
1103 #endif
1104
1105 #ifdef PERL_OLD_SIGNALS
1106     /* Call the perl level handler now with risk we may be in malloc() etc. */
1107     (*PL_sighandlerp)(sig);
1108 #else
1109     Perl_raise_signal(aTHX_ sig);
1110 #endif
1111 }
1112
1113 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1114 void
1115 Perl_csighandler_init(void)
1116 {
1117     int sig;
1118     if (sig_handlers_initted) return;
1119
1120     for (sig = 1; sig < SIG_SIZE; sig++) {
1121 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1122         dTHX;
1123         sig_defaulting[sig] = 1;
1124         (void) rsignal(sig, &Perl_csighandler);
1125 #endif
1126 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1127         sig_ignoring[sig] = 0;
1128 #endif
1129     }
1130     sig_handlers_initted = 1;
1131 }
1132 #endif
1133
1134 void
1135 Perl_despatch_signals(pTHX)
1136 {
1137     int sig;
1138     PL_sig_pending = 0;
1139     for (sig = 1; sig < SIG_SIZE; sig++) {
1140         if (PL_psig_pend[sig]) {
1141             PL_psig_pend[sig] = 0;
1142             (*PL_sighandlerp)(sig);
1143         }
1144     }
1145 }
1146
1147 int
1148 Perl_magic_setsig(pTHX_ SV *sv, MAGIC *mg)
1149 {
1150     register char *s;
1151     I32 i;
1152     SV** svp = 0;
1153     STRLEN len;
1154
1155     s = MgPV(mg,len);
1156     if (*s == '_') {
1157         if (strEQ(s,"__DIE__"))
1158             svp = &PL_diehook;
1159         else if (strEQ(s,"__WARN__"))
1160             svp = &PL_warnhook;
1161         else
1162             Perl_croak(aTHX_ "No such hook: %s", s);
1163         i = 0;
1164         if (*svp) {
1165             SvREFCNT_dec(*svp);
1166             *svp = 0;
1167         }
1168     }
1169     else {
1170         i = whichsig(s);        /* ...no, a brick */
1171         if (!i) {
1172             if (ckWARN(WARN_SIGNAL))
1173                 Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "No such signal: SIG%s", s);
1174             return 0;
1175         }
1176 #if defined(FAKE_PERSISTENT_SIGNAL_HANDLERS) || defined(FAKE_DEFAULT_SIGNAL_HANDLERS)
1177         if (!sig_handlers_initted) Perl_csighandler_init();
1178 #endif
1179 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1180         sig_ignoring[i] = 0;
1181 #endif
1182 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1183           sig_defaulting[i] = 0;
1184 #endif
1185         SvREFCNT_dec(PL_psig_name[i]);
1186         SvREFCNT_dec(PL_psig_ptr[i]);
1187         PL_psig_ptr[i] = SvREFCNT_inc(sv);
1188         SvTEMP_off(sv); /* Make sure it doesn't go away on us */
1189         PL_psig_name[i] = newSVpvn(s, len);
1190         SvREADONLY_on(PL_psig_name[i]);
1191     }
1192     if (SvTYPE(sv) == SVt_PVGV || SvROK(sv)) {
1193         if (i)
1194             (void)rsignal(i, &Perl_csighandler);
1195         else
1196             *svp = SvREFCNT_inc(sv);
1197         return 0;
1198     }
1199     s = SvPV_force(sv,len);
1200     if (strEQ(s,"IGNORE")) {
1201         if (i) {
1202 #ifdef FAKE_PERSISTENT_SIGNAL_HANDLERS
1203             sig_ignoring[i] = 1;
1204             (void)rsignal(i, &Perl_csighandler);
1205 #else
1206             (void)rsignal(i, SIG_IGN);
1207 #endif
1208         } else
1209             *svp = 0;
1210     }
1211     else if (strEQ(s,"DEFAULT") || !*s) {
1212         if (i)
1213 #ifdef FAKE_DEFAULT_SIGNAL_HANDLERS
1214           {
1215             sig_defaulting[i] = 1;
1216             (void)rsignal(i, &Perl_csighandler);
1217           }
1218 #else
1219             (void)rsignal(i, SIG_DFL);
1220 #endif
1221         else
1222             *svp = 0;
1223     }
1224     else {
1225         /*
1226          * We should warn if HINT_STRICT_REFS, but without
1227          * access to a known hint bit in a known OP, we can't
1228          * tell whether HINT_STRICT_REFS is in force or not.
1229          */
1230         if (!strchr(s,':') && !strchr(s,'\''))
1231             sv_insert(sv, 0, 0, "main::", 6);
1232         if (i)
1233             (void)rsignal(i, &Perl_csighandler);
1234         else
1235             *svp = SvREFCNT_inc(sv);
1236     }
1237     return 0;
1238 }
1239 #endif /* !PERL_MICRO */
1240
1241 int
1242 Perl_magic_setisa(pTHX_ SV *sv, MAGIC *mg)
1243 {
1244     PL_sub_generation++;
1245     return 0;
1246 }
1247
1248 int
1249 Perl_magic_setamagic(pTHX_ SV *sv, MAGIC *mg)
1250 {
1251     /* HV_badAMAGIC_on(Sv_STASH(sv)); */
1252     PL_amagic_generation++;
1253
1254     return 0;
1255 }
1256
1257 int
1258 Perl_magic_getnkeys(pTHX_ SV *sv, MAGIC *mg)
1259 {
1260     HV *hv = (HV*)LvTARG(sv);
1261     I32 i = 0;
1262
1263     if (hv) {
1264          (void) hv_iterinit(hv);
1265          if (! SvTIED_mg((SV*)hv, PERL_MAGIC_tied))
1266              i = HvKEYS(hv);
1267          else {
1268              while (hv_iternext(hv))
1269                  i++;
1270          }
1271     }
1272
1273     sv_setiv(sv, (IV)i);
1274     return 0;
1275 }
1276
1277 int
1278 Perl_magic_setnkeys(pTHX_ SV *sv, MAGIC *mg)
1279 {
1280     if (LvTARG(sv)) {
1281         hv_ksplit((HV*)LvTARG(sv), SvIV(sv));
1282     }
1283     return 0;
1284 }
1285
1286 /* caller is responsible for stack switching/cleanup */
1287 STATIC int
1288 S_magic_methcall(pTHX_ SV *sv, MAGIC *mg, char *meth, I32 flags, int n, SV *val)
1289 {
1290     dSP;
1291
1292     PUSHMARK(SP);
1293     EXTEND(SP, n);
1294     PUSHs(SvTIED_obj(sv, mg));
1295     if (n > 1) {
1296         if (mg->mg_ptr) {
1297             if (mg->mg_len >= 0)
1298                 PUSHs(sv_2mortal(newSVpvn(mg->mg_ptr, mg->mg_len)));
1299             else if (mg->mg_len == HEf_SVKEY)
1300                 PUSHs((SV*)mg->mg_ptr);
1301         }
1302         else if (mg->mg_type == PERL_MAGIC_tiedelem) {
1303             PUSHs(sv_2mortal(newSViv(mg->mg_len)));
1304         }
1305     }
1306     if (n > 2) {
1307         PUSHs(val);
1308     }
1309     PUTBACK;
1310
1311     return call_method(meth, flags);
1312 }
1313
1314 STATIC int
1315 S_magic_methpack(pTHX_ SV *sv, MAGIC *mg, char *meth)
1316 {
1317     dSP;
1318
1319     ENTER;
1320     SAVETMPS;
1321     PUSHSTACKi(PERLSI_MAGIC);
1322
1323     if (magic_methcall(sv, mg, meth, G_SCALAR, 2, NULL)) {
1324         sv_setsv(sv, *PL_stack_sp--);
1325     }
1326
1327     POPSTACK;
1328     FREETMPS;
1329     LEAVE;
1330     return 0;
1331 }
1332
1333 int
1334 Perl_magic_getpack(pTHX_ SV *sv, MAGIC *mg)
1335 {
1336     magic_methpack(sv,mg,"FETCH");
1337     if (mg->mg_ptr)
1338         mg->mg_flags |= MGf_GSKIP;
1339     return 0;
1340 }
1341
1342 int
1343 Perl_magic_setpack(pTHX_ SV *sv, MAGIC *mg)
1344 {
1345     dSP;
1346     ENTER;
1347     PUSHSTACKi(PERLSI_MAGIC);
1348     magic_methcall(sv, mg, "STORE", G_SCALAR|G_DISCARD, 3, sv);
1349     POPSTACK;
1350     LEAVE;
1351     return 0;
1352 }
1353
1354 int
1355 Perl_magic_clearpack(pTHX_ SV *sv, MAGIC *mg)
1356 {
1357     return magic_methpack(sv,mg,"DELETE");
1358 }
1359
1360
1361 U32
1362 Perl_magic_sizepack(pTHX_ SV *sv, MAGIC *mg)
1363 {
1364     dSP;
1365     U32 retval = 0;
1366
1367     ENTER;
1368     SAVETMPS;
1369     PUSHSTACKi(PERLSI_MAGIC);
1370     if (magic_methcall(sv, mg, "FETCHSIZE", G_SCALAR, 2, NULL)) {
1371         sv = *PL_stack_sp--;
1372         retval = (U32) SvIV(sv)-1;
1373     }
1374     POPSTACK;
1375     FREETMPS;
1376     LEAVE;
1377     return retval;
1378 }
1379
1380 int
1381 Perl_magic_wipepack(pTHX_ SV *sv, MAGIC *mg)
1382 {
1383     dSP;
1384
1385     ENTER;
1386     PUSHSTACKi(PERLSI_MAGIC);
1387     PUSHMARK(SP);
1388     XPUSHs(SvTIED_obj(sv, mg));
1389     PUTBACK;
1390     call_method("CLEAR", G_SCALAR|G_DISCARD);
1391     POPSTACK;
1392     LEAVE;
1393     return 0;
1394 }
1395
1396 int
1397 Perl_magic_nextpack(pTHX_ SV *sv, MAGIC *mg, SV *key)
1398 {
1399     dSP;
1400     const char *meth = SvOK(key) ? "NEXTKEY" : "FIRSTKEY";
1401
1402     ENTER;
1403     SAVETMPS;
1404     PUSHSTACKi(PERLSI_MAGIC);
1405     PUSHMARK(SP);
1406     EXTEND(SP, 2);
1407     PUSHs(SvTIED_obj(sv, mg));
1408     if (SvOK(key))
1409         PUSHs(key);
1410     PUTBACK;
1411
1412     if (call_method(meth, G_SCALAR))
1413         sv_setsv(key, *PL_stack_sp--);
1414
1415     POPSTACK;
1416     FREETMPS;
1417     LEAVE;
1418     return 0;
1419 }
1420
1421 int
1422 Perl_magic_existspack(pTHX_ SV *sv, MAGIC *mg)
1423 {
1424     return magic_methpack(sv,mg,"EXISTS");
1425 }
1426
1427 int
1428 Perl_magic_setdbline(pTHX_ SV *sv, MAGIC *mg)
1429 {
1430     OP *o;
1431     I32 i;
1432     GV* gv;
1433     SV** svp;
1434     STRLEN n_a;
1435
1436     gv = PL_DBline;
1437     i = SvTRUE(sv);
1438     svp = av_fetch(GvAV(gv),
1439                      atoi(MgPV(mg,n_a)), FALSE);
1440     if (svp && SvIOKp(*svp) && (o = INT2PTR(OP*,SvIVX(*svp))))
1441         o->op_private = i;
1442     return 0;
1443 }
1444
1445 int
1446 Perl_magic_getarylen(pTHX_ SV *sv, MAGIC *mg)
1447 {
1448     sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + PL_curcop->cop_arybase);
1449     return 0;
1450 }
1451
1452 int
1453 Perl_magic_setarylen(pTHX_ SV *sv, MAGIC *mg)
1454 {
1455     av_fill((AV*)mg->mg_obj, SvIV(sv) - PL_curcop->cop_arybase);
1456     return 0;
1457 }
1458
1459 int
1460 Perl_magic_getpos(pTHX_ SV *sv, MAGIC *mg)
1461 {
1462     SV* lsv = LvTARG(sv);
1463
1464     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv)) {
1465         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1466         if (mg && mg->mg_len >= 0) {
1467             I32 i = mg->mg_len;
1468             if (DO_UTF8(lsv))
1469                 sv_pos_b2u(lsv, &i);
1470             sv_setiv(sv, i + PL_curcop->cop_arybase);
1471             return 0;
1472         }
1473     }
1474     (void)SvOK_off(sv);
1475     return 0;
1476 }
1477
1478 int
1479 Perl_magic_setpos(pTHX_ SV *sv, MAGIC *mg)
1480 {
1481     SV* lsv = LvTARG(sv);
1482     SSize_t pos;
1483     STRLEN len;
1484     STRLEN ulen = 0;
1485
1486     mg = 0;
1487
1488     if (SvTYPE(lsv) >= SVt_PVMG && SvMAGIC(lsv))
1489         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1490     if (!mg) {
1491         if (!SvOK(sv))
1492             return 0;
1493         sv_magic(lsv, (SV*)0, PERL_MAGIC_regex_global, Nullch, 0);
1494         mg = mg_find(lsv, PERL_MAGIC_regex_global);
1495     }
1496     else if (!SvOK(sv)) {
1497         mg->mg_len = -1;
1498         return 0;
1499     }
1500     len = SvPOK(lsv) ? SvCUR(lsv) : sv_len(lsv);
1501
1502     pos = SvIV(sv) - PL_curcop->cop_arybase;
1503
1504     if (DO_UTF8(lsv)) {
1505         ulen = sv_len_utf8(lsv);
1506         if (ulen)
1507             len = ulen;
1508     }
1509
1510     if (pos < 0) {
1511         pos += len;
1512         if (pos < 0)
1513             pos = 0;
1514     }
1515     else if (pos > len)
1516         pos = len;
1517
1518     if (ulen) {
1519         I32 p = pos;
1520         sv_pos_u2b(lsv, &p, 0);
1521         pos = p;
1522     }
1523
1524     mg->mg_len = pos;
1525     mg->mg_flags &= ~MGf_MINMATCH;
1526
1527     return 0;
1528 }
1529
1530 int
1531 Perl_magic_getglob(pTHX_ SV *sv, MAGIC *mg)
1532 {
1533     if (SvFAKE(sv)) {                   /* FAKE globs can get coerced */
1534         SvFAKE_off(sv);
1535         gv_efullname3(sv,((GV*)sv), "*");
1536         SvFAKE_on(sv);
1537     }
1538     else
1539         gv_efullname3(sv,((GV*)sv), "*");       /* a gv value, be nice */
1540     return 0;
1541 }
1542
1543 int
1544 Perl_magic_setglob(pTHX_ SV *sv, MAGIC *mg)
1545 {
1546     register char *s;
1547     GV* gv;
1548     STRLEN n_a;
1549
1550     if (!SvOK(sv))
1551         return 0;
1552     s = SvPV(sv, n_a);
1553     if (*s == '*' && s[1])
1554         s++;
1555     gv = gv_fetchpv(s,TRUE, SVt_PVGV);
1556     if (sv == (SV*)gv)
1557         return 0;
1558     if (GvGP(sv))
1559         gp_free((GV*)sv);
1560     GvGP(sv) = gp_ref(GvGP(gv));
1561     return 0;
1562 }
1563
1564 int
1565 Perl_magic_getsubstr(pTHX_ SV *sv, MAGIC *mg)
1566 {
1567     STRLEN len;
1568     SV *lsv = LvTARG(sv);
1569     char *tmps = SvPV(lsv,len);
1570     I32 offs = LvTARGOFF(sv);
1571     I32 rem = LvTARGLEN(sv);
1572
1573     if (SvUTF8(lsv))
1574         sv_pos_u2b(lsv, &offs, &rem);
1575     if (offs > len)
1576         offs = len;
1577     if (rem + offs > len)
1578         rem = len - offs;
1579     sv_setpvn(sv, tmps + offs, (STRLEN)rem);
1580     if (SvUTF8(lsv))
1581         SvUTF8_on(sv);
1582     return 0;
1583 }
1584
1585 int
1586 Perl_magic_setsubstr(pTHX_ SV *sv, MAGIC *mg)
1587 {
1588     STRLEN len;
1589     char *tmps = SvPV(sv, len);
1590     SV *lsv = LvTARG(sv);
1591     I32 lvoff = LvTARGOFF(sv);
1592     I32 lvlen = LvTARGLEN(sv);
1593
1594     if (DO_UTF8(sv)) {
1595         sv_utf8_upgrade(lsv);
1596         sv_pos_u2b(lsv, &lvoff, &lvlen);
1597         sv_insert(lsv, lvoff, lvlen, tmps, len);
1598         SvUTF8_on(lsv);
1599     }
1600     else if (lsv && SvUTF8(lsv)) {
1601         sv_pos_u2b(lsv, &lvoff, &lvlen);
1602         tmps = (char*)bytes_to_utf8((U8*)tmps, &len);
1603         sv_insert(lsv, lvoff, lvlen, tmps, len);
1604         Safefree(tmps);
1605     }
1606     else
1607         sv_insert(lsv, lvoff, lvlen, tmps, len);
1608
1609     return 0;
1610 }
1611
1612 int
1613 Perl_magic_gettaint(pTHX_ SV *sv, MAGIC *mg)
1614 {
1615     TAINT_IF((mg->mg_len & 1) ||
1616              ((mg->mg_len & 2) && mg->mg_obj == sv));   /* kludge */
1617     return 0;
1618 }
1619
1620 int
1621 Perl_magic_settaint(pTHX_ SV *sv, MAGIC *mg)
1622 {
1623     if (PL_localizing) {
1624         if (PL_localizing == 1)
1625             mg->mg_len <<= 1;
1626         else
1627             mg->mg_len >>= 1;
1628     }
1629     else if (PL_tainted)
1630         mg->mg_len |= 1;
1631     else
1632         mg->mg_len &= ~1;
1633     return 0;
1634 }
1635
1636 int
1637 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
1638 {
1639     SV *lsv = LvTARG(sv);
1640
1641     if (!lsv) {
1642         (void)SvOK_off(sv);
1643         return 0;
1644     }
1645
1646     sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
1647     return 0;
1648 }
1649
1650 int
1651 Perl_magic_setvec(pTHX_ SV *sv, MAGIC *mg)
1652 {
1653     do_vecset(sv);      /* XXX slurp this routine */
1654     return 0;
1655 }
1656
1657 int
1658 Perl_magic_getdefelem(pTHX_ SV *sv, MAGIC *mg)
1659 {
1660     SV *targ = Nullsv;
1661     if (LvTARGLEN(sv)) {
1662         if (mg->mg_obj) {
1663             SV *ahv = LvTARG(sv);
1664             if (SvTYPE(ahv) == SVt_PVHV) {
1665                 HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, FALSE, 0);
1666                 if (he)
1667                     targ = HeVAL(he);
1668             }
1669             else {
1670                 SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, FALSE, 0);
1671                 if (svp)
1672                     targ = *svp;
1673             }
1674         }
1675         else {
1676             AV* av = (AV*)LvTARG(sv);
1677             if ((I32)LvTARGOFF(sv) <= AvFILL(av))
1678                 targ = AvARRAY(av)[LvTARGOFF(sv)];
1679         }
1680         if (targ && targ != &PL_sv_undef) {
1681             /* somebody else defined it for us */
1682             SvREFCNT_dec(LvTARG(sv));
1683             LvTARG(sv) = SvREFCNT_inc(targ);
1684             LvTARGLEN(sv) = 0;
1685             SvREFCNT_dec(mg->mg_obj);
1686             mg->mg_obj = Nullsv;
1687             mg->mg_flags &= ~MGf_REFCOUNTED;
1688         }
1689     }
1690     else
1691         targ = LvTARG(sv);
1692     sv_setsv(sv, targ ? targ : &PL_sv_undef);
1693     return 0;
1694 }
1695
1696 int
1697 Perl_magic_setdefelem(pTHX_ SV *sv, MAGIC *mg)
1698 {
1699     if (LvTARGLEN(sv))
1700         vivify_defelem(sv);
1701     if (LvTARG(sv)) {
1702         sv_setsv(LvTARG(sv), sv);
1703         SvSETMAGIC(LvTARG(sv));
1704     }
1705     return 0;
1706 }
1707
1708 void
1709 Perl_vivify_defelem(pTHX_ SV *sv)
1710 {
1711     MAGIC *mg;
1712     SV *value = Nullsv;
1713
1714     if (!LvTARGLEN(sv) || !(mg = mg_find(sv, PERL_MAGIC_defelem)))
1715         return;
1716     if (mg->mg_obj) {
1717         SV *ahv = LvTARG(sv);
1718         STRLEN n_a;
1719         if (SvTYPE(ahv) == SVt_PVHV) {
1720             HE *he = hv_fetch_ent((HV*)ahv, mg->mg_obj, TRUE, 0);
1721             if (he)
1722                 value = HeVAL(he);
1723         }
1724         else {
1725             SV **svp = avhv_fetch_ent((AV*)ahv, mg->mg_obj, TRUE, 0);
1726             if (svp)
1727                 value = *svp;
1728         }
1729         if (!value || value == &PL_sv_undef)
1730             Perl_croak(aTHX_ PL_no_helem, SvPV(mg->mg_obj, n_a));
1731     }
1732     else {
1733         AV* av = (AV*)LvTARG(sv);
1734         if ((I32)LvTARGLEN(sv) < 0 && (I32)LvTARGOFF(sv) > AvFILL(av))
1735             LvTARG(sv) = Nullsv;        /* array can't be extended */
1736         else {
1737             SV** svp = av_fetch(av, LvTARGOFF(sv), TRUE);
1738             if (!svp || (value = *svp) == &PL_sv_undef)
1739                 Perl_croak(aTHX_ PL_no_aelem, (I32)LvTARGOFF(sv));
1740         }
1741     }
1742     (void)SvREFCNT_inc(value);
1743     SvREFCNT_dec(LvTARG(sv));
1744     LvTARG(sv) = value;
1745     LvTARGLEN(sv) = 0;
1746     SvREFCNT_dec(mg->mg_obj);
1747     mg->mg_obj = Nullsv;
1748     mg->mg_flags &= ~MGf_REFCOUNTED;
1749 }
1750
1751 int
1752 Perl_magic_killbackrefs(pTHX_ SV *sv, MAGIC *mg)
1753 {
1754     AV *av = (AV*)mg->mg_obj;
1755     SV **svp = AvARRAY(av);
1756     I32 i = AvFILLp(av);
1757     while (i >= 0) {
1758         if (svp[i] && svp[i] != &PL_sv_undef) {
1759             if (!SvWEAKREF(svp[i]))
1760                 Perl_croak(aTHX_ "panic: magic_killbackrefs");
1761             /* XXX Should we check that it hasn't changed? */
1762             SvRV(svp[i]) = 0;
1763             (void)SvOK_off(svp[i]);
1764             SvWEAKREF_off(svp[i]);
1765             svp[i] = &PL_sv_undef;
1766         }
1767         i--;
1768     }
1769     return 0;
1770 }
1771
1772 int
1773 Perl_magic_setmglob(pTHX_ SV *sv, MAGIC *mg)
1774 {
1775     mg->mg_len = -1;
1776     SvSCREAM_off(sv);
1777     return 0;
1778 }
1779
1780 int
1781 Perl_magic_setbm(pTHX_ SV *sv, MAGIC *mg)
1782 {
1783     sv_unmagic(sv, PERL_MAGIC_bm);
1784     SvVALID_off(sv);
1785     return 0;
1786 }
1787
1788 int
1789 Perl_magic_setfm(pTHX_ SV *sv, MAGIC *mg)
1790 {
1791     sv_unmagic(sv, PERL_MAGIC_fm);
1792     SvCOMPILED_off(sv);
1793     return 0;
1794 }
1795
1796 int
1797 Perl_magic_setuvar(pTHX_ SV *sv, MAGIC *mg)
1798 {
1799     struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
1800
1801     if (uf && uf->uf_set)
1802         (*uf->uf_set)(aTHX_ uf->uf_index, sv);
1803     return 0;
1804 }
1805
1806 int
1807 Perl_magic_freeregexp(pTHX_ SV *sv, MAGIC *mg)
1808 {
1809     regexp *re = (regexp *)mg->mg_obj;
1810     ReREFCNT_dec(re);
1811     return 0;
1812 }
1813
1814 #ifdef USE_LOCALE_COLLATE
1815 int
1816 Perl_magic_setcollxfrm(pTHX_ SV *sv, MAGIC *mg)
1817 {
1818     /*
1819      * RenE<eacute> Descartes said "I think not."
1820      * and vanished with a faint plop.
1821      */
1822     if (mg->mg_ptr) {
1823         Safefree(mg->mg_ptr);
1824         mg->mg_ptr = NULL;
1825         mg->mg_len = -1;
1826     }
1827     return 0;
1828 }
1829 #endif /* USE_LOCALE_COLLATE */
1830
1831 int
1832 Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
1833 {
1834     register char *s;
1835     I32 i;
1836     STRLEN len;
1837     switch (*mg->mg_ptr) {
1838     case '\001':        /* ^A */
1839         sv_setsv(PL_bodytarget, sv);
1840         break;
1841     case '\003':        /* ^C */
1842         PL_minus_c = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1843         break;
1844
1845     case '\004':        /* ^D */
1846         PL_debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | DEBUG_TOP_FLAG;
1847         DEBUG_x(dump_all());
1848         break;
1849     case '\005':  /* ^E */
1850          if (*(mg->mg_ptr+1) == '\0') {
1851 #ifdef MACOS_TRADITIONAL
1852               gMacPerl_OSErr = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1853 #else
1854 #  ifdef VMS
1855               set_vaxc_errno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1856 #  else
1857 #    ifdef WIN32
1858               SetLastError( SvIV(sv) );
1859 #    else
1860 #      ifdef OS2
1861               os2_setsyserrno(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1862 #      else
1863               /* will anyone ever use this? */
1864               SETERRNO(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv), 4);
1865 #      endif
1866 #    endif
1867 #  endif
1868 #endif
1869          }
1870          else if (strEQ(mg->mg_ptr+1, "NCODING")) {
1871              if (PL_encoding)
1872                  sv_setsv(PL_encoding, sv);
1873              else
1874                  PL_encoding = newSVsv(sv);
1875          }
1876     case '\006':        /* ^F */
1877         PL_maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1878         break;
1879     case '\010':        /* ^H */
1880         PL_hints = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1881         break;
1882     case '\011':        /* ^I */ /* NOT \t in EBCDIC */
1883         if (PL_inplace)
1884             Safefree(PL_inplace);
1885         if (SvOK(sv))
1886             PL_inplace = savepv(SvPV(sv,len));
1887         else
1888             PL_inplace = Nullch;
1889         break;
1890     case '\017':        /* ^O */
1891         if (*(mg->mg_ptr+1) == '\0') {
1892             if (PL_osname)
1893                 Safefree(PL_osname);
1894             if (SvOK(sv))
1895                 PL_osname = savepv(SvPV(sv,len));
1896             else
1897                 PL_osname = Nullch;
1898         }
1899         else if (strEQ(mg->mg_ptr, "\017PEN")) {
1900             if (!PL_compiling.cop_io)
1901                 PL_compiling.cop_io = newSVsv(sv);
1902             else
1903                 sv_setsv(PL_compiling.cop_io,sv);
1904         }
1905         break;
1906     case '\020':        /* ^P */
1907         PL_perldb = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1908         if (PL_perldb && !PL_DBsingle)
1909             init_debugger();
1910         break;
1911     case '\024':        /* ^T */
1912 #ifdef BIG_TIME
1913         PL_basetime = (Time_t)(SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv));
1914 #else
1915         PL_basetime = (Time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1916 #endif
1917         break;
1918     case '\027':        /* ^W & $^WARNING_BITS & ^WIDE_SYSTEM_CALLS */
1919         if (*(mg->mg_ptr+1) == '\0') {
1920             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1921                 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1922                 PL_dowarn = (PL_dowarn & ~G_WARN_ON)
1923                                 | (i ? G_WARN_ON : G_WARN_OFF) ;
1924             }
1925         }
1926         else if (strEQ(mg->mg_ptr+1, "ARNING_BITS")) {
1927             if ( ! (PL_dowarn & G_WARN_ALL_MASK)) {
1928                 if (!SvPOK(sv) && PL_localizing) {
1929                     sv_setpvn(sv, WARN_NONEstring, WARNsize);
1930                     PL_compiling.cop_warnings = pWARN_NONE;
1931                     break;
1932                 }
1933                 {
1934                     STRLEN len, i;
1935                     int accumulate = 0 ;
1936                     int any_fatals = 0 ;
1937                     char * ptr = (char*)SvPV(sv, len) ;
1938                     for (i = 0 ; i < len ; ++i) {
1939                         accumulate |= ptr[i] ;
1940                         any_fatals |= (ptr[i] & 0xAA) ;
1941                     }
1942                     if (!accumulate)
1943                         PL_compiling.cop_warnings = pWARN_NONE;
1944                     else if (isWARN_on(sv, WARN_ALL) && !any_fatals) {
1945                         PL_compiling.cop_warnings = pWARN_ALL;
1946                         PL_dowarn |= G_WARN_ONCE ;
1947                     }
1948                     else {
1949                         if (specialWARN(PL_compiling.cop_warnings))
1950                             PL_compiling.cop_warnings = newSVsv(sv) ;
1951                         else
1952                             sv_setsv(PL_compiling.cop_warnings, sv);
1953                         if (isWARN_on(PL_compiling.cop_warnings, WARN_ONCE))
1954                             PL_dowarn |= G_WARN_ONCE ;
1955                     }
1956
1957                 }
1958             }
1959         }
1960         else if (strEQ(mg->mg_ptr+1, "IDE_SYSTEM_CALLS"))
1961             PL_widesyscalls = SvTRUE(sv);
1962         break;
1963     case '.':
1964         if (PL_localizing) {
1965             if (PL_localizing == 1)
1966                 SAVESPTR(PL_last_in_gv);
1967         }
1968         else if (SvOK(sv) && GvIO(PL_last_in_gv))
1969             IoLINES(GvIOp(PL_last_in_gv)) = SvIV(sv);
1970         break;
1971     case '^':
1972         Safefree(IoTOP_NAME(GvIOp(PL_defoutgv)));
1973         IoTOP_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
1974         IoTOP_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1975         break;
1976     case '~':
1977         Safefree(IoFMT_NAME(GvIOp(PL_defoutgv)));
1978         IoFMT_NAME(GvIOp(PL_defoutgv)) = s = savepv(SvPV(sv,len));
1979         IoFMT_GV(GvIOp(PL_defoutgv)) = gv_fetchpv(s,TRUE, SVt_PVIO);
1980         break;
1981     case '=':
1982         IoPAGE_LEN(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1983         break;
1984     case '-':
1985         IoLINES_LEFT(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1986         if (IoLINES_LEFT(GvIOp(PL_defoutgv)) < 0L)
1987             IoLINES_LEFT(GvIOp(PL_defoutgv)) = 0L;
1988         break;
1989     case '%':
1990         IoPAGE(GvIOp(PL_defoutgv)) = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
1991         break;
1992     case '|':
1993         {
1994             IO *io = GvIOp(PL_defoutgv);
1995             if(!io)
1996               break;
1997             if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) == 0)
1998                 IoFLAGS(io) &= ~IOf_FLUSH;
1999             else {
2000                 if (!(IoFLAGS(io) & IOf_FLUSH)) {
2001                     PerlIO *ofp = IoOFP(io);
2002                     if (ofp)
2003                         (void)PerlIO_flush(ofp);
2004                     IoFLAGS(io) |= IOf_FLUSH;
2005                 }
2006             }
2007         }
2008         break;
2009     case '*':
2010         i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2011         PL_multiline = (i != 0);
2012         break;
2013     case '/':
2014         SvREFCNT_dec(PL_rs);
2015         PL_rs = newSVsv(sv);
2016         break;
2017     case '\\':
2018         if (PL_ors_sv)
2019             SvREFCNT_dec(PL_ors_sv);
2020         if (SvOK(sv) || SvGMAGICAL(sv)) {
2021             PL_ors_sv = newSVsv(sv);
2022         }
2023         else {
2024             PL_ors_sv = Nullsv;
2025         }
2026         break;
2027     case ',':
2028         if (PL_ofs_sv)
2029             SvREFCNT_dec(PL_ofs_sv);
2030         if (SvOK(sv) || SvGMAGICAL(sv)) {
2031             PL_ofs_sv = newSVsv(sv);
2032         }
2033         else {
2034             PL_ofs_sv = Nullsv;
2035         }
2036         break;
2037     case '#':
2038         if (PL_ofmt)
2039             Safefree(PL_ofmt);
2040         PL_ofmt = savepv(SvPV(sv,len));
2041         break;
2042     case '[':
2043         PL_compiling.cop_arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2044         break;
2045     case '?':
2046 #ifdef COMPLEX_STATUS
2047         if (PL_localizing == 2) {
2048             PL_statusvalue = LvTARGOFF(sv);
2049             PL_statusvalue_vms = LvTARGLEN(sv);
2050         }
2051         else
2052 #endif
2053 #ifdef VMSISH_STATUS
2054         if (VMSISH_STATUS)
2055             STATUS_NATIVE_SET((U32)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)));
2056         else
2057 #endif
2058             STATUS_POSIX_SET(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
2059         break;
2060     case '!':
2061         SETERRNO(SvIOK(sv) ? SvIVX(sv) : SvOK(sv) ? sv_2iv(sv) : 0,
2062                  (SvIV(sv) == EVMSERR) ? 4 : vaxc$errno);
2063         break;
2064     case '<':
2065         PL_uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2066         if (PL_delaymagic) {
2067             PL_delaymagic |= DM_RUID;
2068             break;                              /* don't do magic till later */
2069         }
2070 #ifdef HAS_SETRUID
2071         (void)setruid((Uid_t)PL_uid);
2072 #else
2073 #ifdef HAS_SETREUID
2074         (void)setreuid((Uid_t)PL_uid, (Uid_t)-1);
2075 #else
2076 #ifdef HAS_SETRESUID
2077       (void)setresuid((Uid_t)PL_uid, (Uid_t)-1, (Uid_t)-1);
2078 #else
2079         if (PL_uid == PL_euid)          /* special case $< = $> */
2080             (void)PerlProc_setuid(PL_uid);
2081         else {
2082             PL_uid = PerlProc_getuid();
2083             Perl_croak(aTHX_ "setruid() not implemented");
2084         }
2085 #endif
2086 #endif
2087 #endif
2088         PL_uid = PerlProc_getuid();
2089         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2090         break;
2091     case '>':
2092         PL_euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2093         if (PL_delaymagic) {
2094             PL_delaymagic |= DM_EUID;
2095             break;                              /* don't do magic till later */
2096         }
2097 #ifdef HAS_SETEUID
2098         (void)seteuid((Uid_t)PL_euid);
2099 #else
2100 #ifdef HAS_SETREUID
2101         (void)setreuid((Uid_t)-1, (Uid_t)PL_euid);
2102 #else
2103 #ifdef HAS_SETRESUID
2104         (void)setresuid((Uid_t)-1, (Uid_t)PL_euid, (Uid_t)-1);
2105 #else
2106         if (PL_euid == PL_uid)          /* special case $> = $< */
2107             PerlProc_setuid(PL_euid);
2108         else {
2109             PL_euid = PerlProc_geteuid();
2110             Perl_croak(aTHX_ "seteuid() not implemented");
2111         }
2112 #endif
2113 #endif
2114 #endif
2115         PL_euid = PerlProc_geteuid();
2116         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2117         break;
2118     case '(':
2119         PL_gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2120         if (PL_delaymagic) {
2121             PL_delaymagic |= DM_RGID;
2122             break;                              /* don't do magic till later */
2123         }
2124 #ifdef HAS_SETRGID
2125         (void)setrgid((Gid_t)PL_gid);
2126 #else
2127 #ifdef HAS_SETREGID
2128         (void)setregid((Gid_t)PL_gid, (Gid_t)-1);
2129 #else
2130 #ifdef HAS_SETRESGID
2131       (void)setresgid((Gid_t)PL_gid, (Gid_t)-1, (Gid_t) 1);
2132 #else
2133         if (PL_gid == PL_egid)                  /* special case $( = $) */
2134             (void)PerlProc_setgid(PL_gid);
2135         else {
2136             PL_gid = PerlProc_getgid();
2137             Perl_croak(aTHX_ "setrgid() not implemented");
2138         }
2139 #endif
2140 #endif
2141 #endif
2142         PL_gid = PerlProc_getgid();
2143         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2144         break;
2145     case ')':
2146 #ifdef HAS_SETGROUPS
2147         {
2148             char *p = SvPV(sv, len);
2149             Groups_t gary[NGROUPS];
2150
2151             while (isSPACE(*p))
2152                 ++p;
2153             PL_egid = Atol(p);
2154             for (i = 0; i < NGROUPS; ++i) {
2155                 while (*p && !isSPACE(*p))
2156                     ++p;
2157                 while (isSPACE(*p))
2158                     ++p;
2159                 if (!*p)
2160                     break;
2161                 gary[i] = Atol(p);
2162             }
2163             if (i)
2164                 (void)setgroups(i, gary);
2165         }
2166 #else  /* HAS_SETGROUPS */
2167         PL_egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
2168 #endif /* HAS_SETGROUPS */
2169         if (PL_delaymagic) {
2170             PL_delaymagic |= DM_EGID;
2171             break;                              /* don't do magic till later */
2172         }
2173 #ifdef HAS_SETEGID
2174         (void)setegid((Gid_t)PL_egid);
2175 #else
2176 #ifdef HAS_SETREGID
2177         (void)setregid((Gid_t)-1, (Gid_t)PL_egid);
2178 #else
2179 #ifdef HAS_SETRESGID
2180         (void)setresgid((Gid_t)-1, (Gid_t)PL_egid, (Gid_t)-1);
2181 #else
2182         if (PL_egid == PL_gid)                  /* special case $) = $( */
2183             (void)PerlProc_setgid(PL_egid);
2184         else {
2185             PL_egid = PerlProc_getegid();
2186             Perl_croak(aTHX_ "setegid() not implemented");
2187         }
2188 #endif
2189 #endif
2190 #endif
2191         PL_egid = PerlProc_getegid();
2192         PL_tainting |= (PL_uid && (PL_euid != PL_uid || PL_egid != PL_gid));
2193         break;
2194     case ':':
2195         PL_chopset = SvPV_force(sv,len);
2196         break;
2197 #ifndef MACOS_TRADITIONAL
2198     case '0':
2199 #ifdef HAS_SETPROCTITLE
2200         /* The BSDs don't show the argv[] in ps(1) output, they
2201          * show a string from the process struct and provide
2202          * the setproctitle() routine to manipulate that. */
2203         {
2204             s = SvPV(sv, len);
2205 #   if __FreeBSD_version > 410001
2206             /* The leading "-" removes the "perl: " prefix,
2207              * but not the "(perl) suffix from the ps(1)
2208              * output, because that's what ps(1) shows if the
2209              * argv[] is modified. */
2210             setproctitle("-%s", s);
2211 #   else        /* old FreeBSDs, NetBSD, OpenBSD, anyBSD */
2212             /* This doesn't really work if you assume that
2213              * $0 = 'foobar'; will wipe out 'perl' from the $0
2214              * because in ps(1) output the result will be like
2215              * sprintf("perl: %s (perl)", s)
2216              * I guess this is a security feature:
2217              * one (a user process) cannot get rid of the original name.
2218              * --jhi */
2219             setproctitle("%s", s);
2220 #   endif
2221         }
2222 #endif
2223         if (!PL_origalen) {
2224             s = PL_origargv[0];
2225             s += strlen(s);
2226             /* See if all the arguments are contiguous in memory */
2227             for (i = 1; i < PL_origargc; i++) {
2228                 if (PL_origargv[i] == s + 1
2229 #ifdef OS2
2230                     || PL_origargv[i] == s + 2
2231 #endif
2232                    )
2233                 {
2234                     ++s;
2235                     s += strlen(s);     /* this one is ok too */
2236                 }
2237                 else
2238                     break;
2239             }
2240             /* can grab env area too? */
2241             if (PL_origenviron && (PL_origenviron[0] == s + 1)) {
2242                 my_setenv("NoNe  SuCh", Nullch);
2243                                             /* force copy of environment */
2244                 for (i = 0; PL_origenviron[i]; i++)
2245                     if (PL_origenviron[i] == s + 1) {
2246                         ++s;
2247                         s += strlen(s);
2248                     }
2249                     else
2250                         break;
2251             }
2252             PL_origalen = s - PL_origargv[0];
2253         }
2254         s = SvPV_force(sv,len);
2255         i = len;
2256         if (i >= PL_origalen) {
2257             i = PL_origalen;
2258             /* don't allow system to limit $0 seen by script */
2259             /* SvCUR_set(sv, i); *SvEND(sv) = '\0'; */
2260             Copy(s, PL_origargv[0], i, char);
2261             s = PL_origargv[0]+i;
2262             *s = '\0';
2263         }
2264         else {
2265             Copy(s, PL_origargv[0], i, char);
2266             s = PL_origargv[0]+i;
2267             *s++ = '\0';
2268             while (++i < PL_origalen)
2269                 *s++ = ' ';
2270             s = PL_origargv[0]+i;
2271             for (i = 1; i < PL_origargc; i++)
2272                 PL_origargv[i] = Nullch;
2273         }
2274         break;
2275 #endif
2276 #ifdef USE_5005THREADS
2277     case '@':
2278         sv_setsv(thr->errsv, sv);
2279         break;
2280 #endif /* USE_5005THREADS */
2281     }
2282     return 0;
2283 }
2284
2285 #ifdef USE_5005THREADS
2286 int
2287 Perl_magic_mutexfree(pTHX_ SV *sv, MAGIC *mg)
2288 {
2289     DEBUG_S(PerlIO_printf(Perl_debug_log,
2290                           "0x%"UVxf": magic_mutexfree 0x%"UVxf"\n",
2291                           PTR2UV(thr), PTR2UV(sv)));
2292     if (MgOWNER(mg))
2293         Perl_croak(aTHX_ "panic: magic_mutexfree");
2294     MUTEX_DESTROY(MgMUTEXP(mg));
2295     COND_DESTROY(MgCONDP(mg));
2296     return 0;
2297 }
2298 #endif /* USE_5005THREADS */
2299
2300 I32
2301 Perl_whichsig(pTHX_ char *sig)
2302 {
2303     register char **sigv;
2304
2305     for (sigv = PL_sig_name+1; *sigv; sigv++)
2306         if (strEQ(sig,*sigv))
2307             return PL_sig_num[sigv - PL_sig_name];
2308 #ifdef SIGCLD
2309     if (strEQ(sig,"CHLD"))
2310         return SIGCLD;
2311 #endif
2312 #ifdef SIGCHLD
2313     if (strEQ(sig,"CLD"))
2314         return SIGCHLD;
2315 #endif
2316     return 0;
2317 }
2318
2319 #if !defined(PERL_IMPLICIT_CONTEXT)
2320 static SV* sig_sv;
2321 #endif
2322
2323 Signal_t
2324 Perl_sighandler(int sig)
2325 {
2326 #ifdef PERL_GET_SIG_CONTEXT
2327     dTHXa(PERL_GET_SIG_CONTEXT);
2328 #else
2329     dTHX;
2330 #endif
2331     dSP;
2332     GV *gv = Nullgv;
2333     HV *st;
2334     SV *sv = Nullsv, *tSv = PL_Sv;
2335     CV *cv = Nullcv;
2336     OP *myop = PL_op;
2337     U32 flags = 0;
2338     XPV *tXpv = PL_Xpv;
2339
2340     if (PL_savestack_ix + 15 <= PL_savestack_max)
2341         flags |= 1;
2342     if (PL_markstack_ptr < PL_markstack_max - 2)
2343         flags |= 4;
2344     if (PL_retstack_ix < PL_retstack_max - 2)
2345         flags |= 8;
2346     if (PL_scopestack_ix < PL_scopestack_max - 3)
2347         flags |= 16;
2348
2349     if (!PL_psig_ptr[sig]) {
2350                 PerlIO_printf(Perl_error_log, "Signal SIG%s received, but no signal handler set.\n",
2351                                  PL_sig_name[sig]);
2352                 exit(sig);
2353         }
2354
2355     /* Max number of items pushed there is 3*n or 4. We cannot fix
2356        infinity, so we fix 4 (in fact 5): */
2357     if (flags & 1) {
2358         PL_savestack_ix += 5;           /* Protect save in progress. */
2359         SAVEDESTRUCTOR_X(unwind_handler_stack, (void*)&flags);
2360     }
2361     if (flags & 4)
2362         PL_markstack_ptr++;             /* Protect mark. */
2363     if (flags & 8) {
2364         PL_retstack_ix++;
2365         PL_retstack[PL_retstack_ix] = NULL;
2366     }
2367     if (flags & 16)
2368         PL_scopestack_ix += 1;
2369     /* sv_2cv is too complicated, try a simpler variant first: */
2370     if (!SvROK(PL_psig_ptr[sig]) || !(cv = (CV*)SvRV(PL_psig_ptr[sig]))
2371         || SvTYPE(cv) != SVt_PVCV)
2372         cv = sv_2cv(PL_psig_ptr[sig],&st,&gv,TRUE);
2373
2374     if (!cv || !CvROOT(cv)) {
2375         if (ckWARN(WARN_SIGNAL))
2376             Perl_warner(aTHX_ packWARN(WARN_SIGNAL), "SIG%s handler \"%s\" not defined.\n",
2377                 PL_sig_name[sig], (gv ? GvENAME(gv)
2378                                 : ((cv && CvGV(cv))
2379                                    ? GvENAME(CvGV(cv))
2380                                    : "__ANON__")));
2381         goto cleanup;
2382     }
2383
2384     if(PL_psig_name[sig]) {
2385         sv = SvREFCNT_inc(PL_psig_name[sig]);
2386         flags |= 64;
2387 #if !defined(PERL_IMPLICIT_CONTEXT)
2388         sig_sv = sv;
2389 #endif
2390     } else {
2391         sv = sv_newmortal();
2392         sv_setpv(sv,PL_sig_name[sig]);
2393     }
2394
2395     PUSHSTACKi(PERLSI_SIGNAL);
2396     PUSHMARK(SP);
2397     PUSHs(sv);
2398     PUTBACK;
2399
2400     call_sv((SV*)cv, G_DISCARD|G_EVAL);
2401
2402     POPSTACK;
2403     if (SvTRUE(ERRSV)) {
2404 #ifndef PERL_MICRO
2405 #ifdef HAS_SIGPROCMASK
2406         /* Handler "died", for example to get out of a restart-able read().
2407          * Before we re-do that on its behalf re-enable the signal which was
2408          * blocked by the system when we entered.
2409          */
2410         sigset_t set;
2411         sigemptyset(&set);
2412         sigaddset(&set,sig);
2413         sigprocmask(SIG_UNBLOCK, &set, NULL);
2414 #else
2415         /* Not clear if this will work */
2416         (void)rsignal(sig, SIG_IGN);
2417         (void)rsignal(sig, &Perl_csighandler);
2418 #endif
2419 #endif /* !PERL_MICRO */
2420         Perl_die(aTHX_ Nullformat);
2421     }
2422 cleanup:
2423     if (flags & 1)
2424         PL_savestack_ix -= 8; /* Unprotect save in progress. */
2425     if (flags & 4)
2426         PL_markstack_ptr--;
2427     if (flags & 8)
2428         PL_retstack_ix--;
2429     if (flags & 16)
2430         PL_scopestack_ix -= 1;
2431     if (flags & 64)
2432         SvREFCNT_dec(sv);
2433     PL_op = myop;                       /* Apparently not needed... */
2434
2435     PL_Sv = tSv;                        /* Restore global temporaries. */
2436     PL_Xpv = tXpv;
2437     return;
2438 }
2439
2440
2441 static void
2442 restore_magic(pTHX_ void *p)
2443 {
2444     MGS* mgs = SSPTR(PTR2IV(p), MGS*);
2445     SV* sv = mgs->mgs_sv;
2446
2447     if (!sv)
2448         return;
2449
2450     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
2451     {
2452         if (mgs->mgs_flags)
2453             SvFLAGS(sv) |= mgs->mgs_flags;
2454         else
2455             mg_magical(sv);
2456         if (SvGMAGICAL(sv))
2457             SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
2458     }
2459
2460     mgs->mgs_sv = NULL;  /* mark the MGS structure as restored */
2461
2462     /* If we're still on top of the stack, pop us off.  (That condition
2463      * will be satisfied if restore_magic was called explicitly, but *not*
2464      * if it's being called via leave_scope.)
2465      * The reason for doing this is that otherwise, things like sv_2cv()
2466      * may leave alloc gunk on the savestack, and some code
2467      * (e.g. sighandler) doesn't expect that...
2468      */
2469     if (PL_savestack_ix == mgs->mgs_ss_ix)
2470     {
2471         I32 popval = SSPOPINT;
2472         assert(popval == SAVEt_DESTRUCTOR_X);
2473         PL_savestack_ix -= 2;
2474         popval = SSPOPINT;
2475         assert(popval == SAVEt_ALLOC);
2476         popval = SSPOPINT;
2477         PL_savestack_ix -= popval;
2478     }
2479
2480 }
2481
2482 static void
2483 unwind_handler_stack(pTHX_ void *p)
2484 {
2485     U32 flags = *(U32*)p;
2486
2487     if (flags & 1)
2488         PL_savestack_ix -= 5; /* Unprotect save in progress. */
2489     /* cxstack_ix-- Not needed, die already unwound it. */
2490 #if !defined(PERL_IMPLICIT_CONTEXT)
2491     if (flags & 64)
2492         SvREFCNT_dec(sig_sv);
2493 #endif
2494 }
2495
2496