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