1 /* $RCSfile: hash.c,v $$Revision: 4.1 $$Date: 92/08/07 18:21:48 $
3 * Copyright (c) 1993, Larry Wall
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.
19 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
20 MGVTBL* vtbl = mg->mg_virtual;
26 if (!(SvFLAGS(sv) & (SVs_GMG|SVs_SMG)) || vtbl->svt_clear)
37 U32 savemagic = SvMAGICAL(sv);
40 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
42 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
43 MGVTBL* vtbl = mg->mg_virtual;
44 if (vtbl && vtbl->svt_get)
45 (*vtbl->svt_get)(sv, mg);
48 SvFLAGS(sv) |= savemagic;
49 assert(SvGMAGICAL(sv));
50 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
61 U32 savemagic = SvMAGICAL(sv);
65 for (mg = SvMAGIC(sv); mg; mg = nextmg) {
66 MGVTBL* vtbl = mg->mg_virtual;
67 nextmg = mg->mg_moremagic; /* it may delete itself */
68 if (vtbl && vtbl->svt_set)
69 (*vtbl->svt_set)(sv, mg);
73 SvFLAGS(sv) |= savemagic;
75 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
88 U32 savemagic = SvMAGICAL(sv);
91 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
93 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
94 MGVTBL* vtbl = mg->mg_virtual;
95 if (vtbl && vtbl->svt_len)
96 return (*vtbl->svt_len)(sv, mg);
101 SvFLAGS(sv) |= savemagic;
103 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
113 U32 savemagic = SvMAGICAL(sv);
116 SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
118 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
119 MGVTBL* vtbl = mg->mg_virtual;
120 if (vtbl && vtbl->svt_clear)
121 (*vtbl->svt_clear)(sv, mg);
124 SvFLAGS(sv) |= savemagic;
126 SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
137 mg_find(SV *sv, char type)
138 #endif /* STANDARD_C */
141 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
142 if (mg->mg_type == type)
149 mg_copy(sv, nsv, key, klen)
157 for (mg = SvMAGIC(sv); mg; mg = mg->mg_moremagic) {
158 if (isUPPER(mg->mg_type)) {
159 sv_magic(nsv, mg->mg_obj, tolower(mg->mg_type), key, klen);
172 for (mg = SvMAGIC(sv); mg; mg = moremagic) {
173 MGVTBL* vtbl = mg->mg_virtual;
174 moremagic = mg->mg_moremagic;
175 if (vtbl && vtbl->svt_free)
176 (*vtbl->svt_free)(sv, mg);
177 if (mg->mg_ptr && mg->mg_type != 'g')
178 Safefree(mg->mg_ptr);
179 if (mg->mg_obj != sv)
180 SvREFCNT_dec(mg->mg_obj);
187 #if !defined(NSIG) || defined(M_UNIX) || defined(M_XENIX)
200 switch (*mg->mg_ptr) {
201 case '1': case '2': case '3': case '4':
202 case '5': case '6': case '7': case '8': case '9': case '&':
204 paren = atoi(mg->mg_ptr);
206 if (curpm->op_pmregexp &&
207 paren <= curpm->op_pmregexp->nparens &&
208 (s = curpm->op_pmregexp->startp[paren]) ) {
209 i = curpm->op_pmregexp->endp[paren] - s;
221 paren = curpm->op_pmregexp->lastparen;
227 if (curpm->op_pmregexp &&
228 (s = curpm->op_pmregexp->subbeg) ) {
229 i = curpm->op_pmregexp->startp[0] - s;
241 if (curpm->op_pmregexp &&
242 (s = curpm->op_pmregexp->endp[0]) ) {
243 return (STRLEN) (curpm->op_pmregexp->subend - s);
250 return (STRLEN)ofslen;
252 return (STRLEN)orslen;
255 if (!SvPOK(sv) && SvNIOK(sv))
271 switch (*mg->mg_ptr) {
272 case '\004': /* ^D */
273 sv_setiv(sv,(I32)(debug & 32767));
275 case '\006': /* ^F */
276 sv_setiv(sv,(I32)maxsysfd);
280 sv_setpv(sv, inplace);
282 sv_setsv(sv,&sv_undef);
284 case '\020': /* ^P */
285 sv_setiv(sv,(I32)perldb);
287 case '\024': /* ^T */
288 sv_setiv(sv,(I32)basetime);
290 case '\027': /* ^W */
291 sv_setiv(sv,(I32)dowarn);
293 case '1': case '2': case '3': case '4':
294 case '5': case '6': case '7': case '8': case '9': case '&':
296 paren = atoi(GvENAME(mg->mg_obj));
298 if (curpm->op_pmregexp &&
299 paren <= curpm->op_pmregexp->nparens &&
300 (s = curpm->op_pmregexp->startp[paren]) ) {
301 i = curpm->op_pmregexp->endp[paren] - s;
305 sv_setsv(sv,&sv_undef);
308 sv_setsv(sv,&sv_undef);
313 paren = curpm->op_pmregexp->lastparen;
319 if (curpm->op_pmregexp &&
320 (s = curpm->op_pmregexp->subbeg) ) {
321 i = curpm->op_pmregexp->startp[0] - s;
333 if (curpm->op_pmregexp &&
334 (s = curpm->op_pmregexp->endp[0]) ) {
335 sv_setpvn(sv,s, curpm->op_pmregexp->subend - s);
343 if (last_in_gv && GvIO(last_in_gv)) {
344 sv_setiv(sv,(I32)IoLINES(GvIO(last_in_gv)));
349 sv_setiv(sv,(I32)statusvalue);
352 s = IoTOP_NAME(GvIO(defoutgv));
356 sv_setpv(sv,GvENAME(defoutgv));
361 s = IoFMT_NAME(GvIO(defoutgv));
363 s = GvENAME(defoutgv);
368 sv_setiv(sv,(I32)IoPAGE_LEN(GvIO(defoutgv)));
371 sv_setiv(sv,(I32)IoLINES_LEFT(GvIO(defoutgv)));
374 sv_setiv(sv,(I32)IoPAGE(GvIO(defoutgv)));
382 sv_setiv(sv,(I32)arybase);
386 GvIO(defoutgv) = newIO();
387 sv_setiv(sv, (IoFLAGS(GvIO(defoutgv)) & IOf_FLUSH) != 0 );
390 sv_setpvn(sv,ofs,ofslen);
393 sv_setpvn(sv,ors,orslen);
399 sv_setnv(sv,(double)errno);
400 sv_setpv(sv, errno ? Strerror(errno) : "");
401 SvNOK_on(sv); /* what a wonderful hack! */
404 sv_setiv(sv,(I32)uid);
407 sv_setiv(sv,(I32)euid);
411 (void)sprintf(s,"%d",(int)gid);
415 (void)sprintf(s,"%d",(int)egid);
423 GROUPSTYPE gary[NGROUPS];
425 i = getgroups(NGROUPS,gary);
427 (void)sprintf(s," %ld", (long)gary[i]);
442 magic_getuvar(sv, mg)
446 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
448 if (uf && uf->uf_val)
449 (*uf->uf_val)(uf->uf_index, sv);
461 my_setenv(mg->mg_ptr,s);
462 /* And you'll never guess what the dog had */
463 /* in its mouth... */
465 if (s && strEQ(mg->mg_ptr,"PATH")) {
466 char *strend = SvEND(sv);
469 s = cpytill(tokenbuf,s,strend,':',&i);
472 || (stat(tokenbuf,&statbuf) && (statbuf.st_mode & 2)) )
488 i = whichsig(mg->mg_ptr); /* ...no, a brick */
489 if (!i && (dowarn || strEQ(mg->mg_ptr,"ALARM")))
490 warn("No such signal: SIG%s", mg->mg_ptr);
491 if (strEQ(s,"IGNORE"))
493 (void)signal(i,SIG_IGN);
497 else if (strEQ(s,"DEFAULT") || !*s)
498 (void)signal(i,SIG_DFL);
500 (void)signal(i,sighandler);
501 if (!strchr(s,':') && !strchr(s,'\'')) {
502 sprintf(tokenbuf, "main::%s",s);
503 sv_setpv(sv,tokenbuf);
524 HV* stash = SvSTASH(SvRV(rv));
525 GV* gv = gv_fetchmethod(stash, "fetch");
529 if (!gv || !GvCV(gv)) {
530 croak("No fetch method for magical variable in package \"%s\"",
533 Zero(&myop, 1, BINOP);
534 myop.op_last = (OP *) &myop;
535 myop.op_next = Nullop;
536 myop.op_flags = OPf_STACKED;
548 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
549 else if (mg->mg_len >= 0)
550 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
553 if (op = pp_entersubr())
570 HV* stash = SvSTASH(SvRV(rv));
571 GV* gv = gv_fetchmethod(stash, "store");
575 if (!gv || !GvCV(gv)) {
576 croak("No store method for magical variable in package \"%s\"",
579 Zero(&myop, 1, BINOP);
580 myop.op_last = (OP *) &myop;
581 myop.op_next = Nullop;
582 myop.op_flags = OPf_STACKED;
594 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
595 else if (mg->mg_len >= 0)
596 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
600 if (op = pp_entersubr())
612 magic_clearpack(sv,mg)
617 HV* stash = SvSTASH(SvRV(rv));
618 GV* gv = gv_fetchmethod(stash, "delete");
622 if (!gv || !GvCV(gv)) {
623 croak("No delete method for magical variable in package \"%s\"",
626 Zero(&myop, 1, BINOP);
627 myop.op_last = (OP *) &myop;
628 myop.op_next = Nullop;
629 myop.op_flags = OPf_STACKED;
641 PUSHs(sv_mortalcopy(newSVpv(mg->mg_ptr, mg->mg_len)));
643 PUSHs(sv_mortalcopy(newSViv(mg->mg_len)));
646 if (op = pp_entersubr())
658 magic_nextpack(sv,mg,key)
664 HV* stash = SvSTASH(SvRV(rv));
665 GV* gv = gv_fetchmethod(stash, SvOK(key) ? "nextkey" : "firstkey");
669 if (!gv || !GvCV(gv)) {
670 croak("No fetch method for magical variable in package \"%s\"",
673 Zero(&myop, 1, BINOP);
674 myop.op_last = (OP *) &myop;
675 myop.op_next = Nullop;
676 myop.op_flags = OPf_STACKED;
691 if (op = pp_entersubr())
703 magic_setdbline(sv,mg)
714 svp = av_fetch(GvAV(gv),atoi(mg->mg_ptr), FALSE);
715 if (svp && SvIOKp(*svp) && (o = (OP*)SvSTASH(*svp)))
718 warn("Can't break at that line\n");
723 magic_getarylen(sv,mg)
727 sv_setiv(sv, AvFILL((AV*)mg->mg_obj) + arybase);
732 magic_setarylen(sv,mg)
736 av_fill((AV*)mg->mg_obj, (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) - arybase);
745 gv_efullname(sv,((GV*)sv));/* a gv value, be nice */
760 if (*s == '*' && s[1])
762 gv = gv_fetchpv(s,TRUE);
767 GvGP(sv) = gp_ref(GvGP(gv));
778 magic_setsubstr(sv,mg)
783 char *tmps = SvPV(sv,len);
784 sv_insert(LvTARG(sv),LvTARGOFF(sv),LvTARGLEN(sv), tmps, len);
789 magic_gettaint(sv,mg)
798 magic_settaint(sv,mg)
812 do_vecset(sv); /* XXX slurp this routine */
817 magic_setmglob(sv,mg)
841 struct ufuncs *uf = (struct ufuncs *)mg->mg_ptr;
843 if (uf && uf->uf_set)
844 (*uf->uf_set)(uf->uf_index, sv);
856 switch (*mg->mg_ptr) {
857 case '\004': /* ^D */
858 debug = (SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) | 0x80000000;
861 case '\006': /* ^F */
862 maxsysfd = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
868 inplace = savestr(SvPV(sv,na));
872 case '\020': /* ^P */
873 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
882 case '\024': /* ^T */
883 basetime = (time_t)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
885 case '\027': /* ^W */
886 dowarn = (bool)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
890 save_sptr((SV**)&last_in_gv);
892 IoLINES(GvIO(last_in_gv)) = (long)SvIV(sv);
895 Safefree(IoTOP_NAME(GvIO(defoutgv)));
896 IoTOP_NAME(GvIO(defoutgv)) = s = savestr(SvPV(sv,na));
897 IoTOP_GV(GvIO(defoutgv)) = gv_fetchpv(s,TRUE);
900 Safefree(IoFMT_NAME(GvIO(defoutgv)));
901 IoFMT_NAME(GvIO(defoutgv)) = s = savestr(SvPV(sv,na));
902 IoFMT_GV(GvIO(defoutgv)) = gv_fetchpv(s,TRUE);
905 IoPAGE_LEN(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
908 IoLINES_LEFT(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
909 if (IoLINES_LEFT(GvIO(defoutgv)) < 0L)
910 IoLINES_LEFT(GvIO(defoutgv)) = 0L;
913 IoPAGE(GvIO(defoutgv)) = (long)(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
917 GvIO(defoutgv) = newIO();
918 IoFLAGS(GvIO(defoutgv)) &= ~IOf_FLUSH;
919 if ((SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv)) != 0) {
920 IoFLAGS(GvIO(defoutgv)) |= IOf_FLUSH;
924 i = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
925 multiline = (i != 0);
929 nrs = rs = SvPV(sv,rslen);
931 if (rspara = !rslen) {
935 nrschar = rschar = rs[rslen - 1];
938 nrschar = rschar = 0777; /* fake a non-existent char */
945 ors = savestr(SvPV(sv,orslen));
950 ofs = savestr(SvPV(sv, ofslen));
955 ofmt = savestr(SvPV(sv,na));
958 arybase = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
961 statusvalue = U_S(SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv));
964 errno = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv); /* will anyone ever use this? */
967 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
969 delaymagic |= DM_RUID;
970 break; /* don't do magic till later */
973 (void)setruid((UIDTYPE)uid);
976 (void)setreuid((UIDTYPE)uid, (UIDTYPE)-1);
978 if (uid == euid) /* special case $< = $> */
981 croak("setruid() not implemented");
984 uid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
985 tainting |= (euid != uid || egid != gid);
988 euid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
990 delaymagic |= DM_EUID;
991 break; /* don't do magic till later */
994 (void)seteuid((UIDTYPE)euid);
997 (void)setreuid((UIDTYPE)-1, (UIDTYPE)euid);
999 if (euid == uid) /* special case $> = $< */
1002 croak("seteuid() not implemented");
1005 euid = (I32)geteuid();
1006 tainting |= (euid != uid || egid != gid);
1009 gid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1011 delaymagic |= DM_RGID;
1012 break; /* don't do magic till later */
1015 (void)setrgid((GIDTYPE)gid);
1018 (void)setregid((GIDTYPE)gid, (GIDTYPE)-1);
1020 if (gid == egid) /* special case $( = $) */
1023 croak("setrgid() not implemented");
1026 gid = (I32)getgid();
1027 tainting |= (euid != uid || egid != gid);
1030 egid = SvIOK(sv) ? SvIVX(sv) : sv_2iv(sv);
1032 delaymagic |= DM_EGID;
1033 break; /* don't do magic till later */
1036 (void)setegid((GIDTYPE)egid);
1039 (void)setregid((GIDTYPE)-1, (GIDTYPE)egid);
1041 if (egid == gid) /* special case $) = $( */
1044 croak("setegid() not implemented");
1047 egid = (I32)getegid();
1048 tainting |= (euid != uid || egid != gid);
1051 chopset = SvPV(sv,na);
1057 /* See if all the arguments are contiguous in memory */
1058 for (i = 1; i < origargc; i++) {
1059 if (origargv[i] == s + 1)
1060 s += strlen(++s); /* this one is ok too */
1062 if (origenviron[0] == s + 1) { /* can grab env area too? */
1063 my_setenv("NoNeSuCh", Nullch);
1064 /* force copy of environment */
1065 for (i = 0; origenviron[i]; i++)
1066 if (origenviron[i] == s + 1)
1069 origalen = s - origargv[0];
1073 if (i >= origalen) {
1077 Copy(s, origargv[0], i, char);
1080 Copy(s, origargv[0], i, char);
1083 while (++i < origalen)
1086 for (i = 1; i < origargc; i++)
1087 origargv[i] = Nullch;
1098 register char **sigv;
1100 for (sigv = sig_name+1; *sigv; sigv++)
1101 if (strEQ(sig,*sigv))
1102 return sigv - sig_name;
1104 if (strEQ(sig,"CHLD"))
1108 if (strEQ(sig,"CLD"))
1126 I32 gimme = G_SCALAR;
1128 #ifdef OS2 /* or anybody else who requires SIG_ACK */
1129 signal(sig, SIG_ACK);
1133 SvPVx(*hv_fetch(GvHVn(siggv),sig_name[sig],strlen(sig_name[sig]),
1136 if (!cv && *sig_name[sig] == 'C' && instr(sig_name[sig],"LD")) {
1137 if (sig_name[sig][1] == 'H')
1138 gv = gv_fetchpv(SvPVx(*hv_fetch(GvHVn(siggv),"CLD",3,TRUE), na),
1141 gv = gv_fetchpv(SvPVx(*hv_fetch(GvHVn(siggv),"CHLD",4,TRUE), na),
1143 cv = GvCV(gv); /* gag */
1147 warn("SIG%s handler \"%s\" not defined.\n",
1148 sig_name[sig], GvENAME(gv) );
1153 SWITCHSTACK(stack, signalstack);
1155 sv = sv_newmortal();
1156 sv_setpv(sv,sig_name[sig]);
1164 PUSHBLOCK(cx, CXt_SUB, sp);
1166 cx->blk_sub.savearray = GvAV(defgv);
1167 cx->blk_sub.argarray = av_fake(items, sp);
1168 SAVEFREESV(cx->blk_sub.argarray);
1169 GvAV(defgv) = cx->blk_sub.argarray;
1171 if (CvDEPTH(cv) >= 2) {
1172 if (CvDEPTH(cv) == 100 && dowarn)
1173 warn("Deep recursion on subroutine \"%s\"",GvENAME(gv));
1177 run(); /* Does the LEAVE for us. */
1179 SWITCHSTACK(signalstack, oldstack);