diff options
author | Larry Wall <lwall@netlabs.com> | 1991-11-05 06:28:06 +0000 |
---|---|---|
committer | Larry Wall <lwall@netlabs.com> | 1991-11-05 06:28:06 +0000 |
commit | f0fcb5529109ae3ced6c7fbb8cbd77162fa9bfdb (patch) | |
tree | 1f4224435eb95a0b48c30422d7d2f8bf73343aec /stab.c | |
parent | 45d8adaa83210dbf286f70ae01d99f534e6c8052 (diff) | |
download | perl-f0fcb5529109ae3ced6c7fbb8cbd77162fa9bfdb.tar.gz |
perl 4.0 patch 16: patch #11, continued
See patch #11.
Diffstat (limited to 'stab.c')
-rw-r--r-- | stab.c | 46 |
1 files changed, 35 insertions, 11 deletions
@@ -1,4 +1,4 @@ -/* $RCSfile: stab.c,v $$Revision: 4.0.1.2 $$Date: 91/06/07 11:55:53 $ +/* $RCSfile: stab.c,v $$Revision: 4.0.1.3 $$Date: 91/11/05 18:35:33 $ * * Copyright (c) 1991, Larry Wall * @@ -6,6 +6,13 @@ * License or the Artistic License, as specified in the README file. * * $Log: stab.c,v $ + * Revision 4.0.1.3 91/11/05 18:35:33 lwall + * patch11: length($x) was sometimes wrong for numeric $x + * patch11: perl now issues warning if $SIG{'ALARM'} is referenced + * patch11: *foo = undef coredumped + * patch11: solitary subroutine references no longer trigger typo warnings + * patch11: local(*FILEHANDLE) had a memory leak + * * Revision 4.0.1.2 91/06/07 11:55:53 lwall * patch4: new copyright notice * patch4: added $^P variable to control calling of perldb routines @@ -247,7 +254,7 @@ STR *str; char *s; if (str->str_rare) - return stab_val(stab)->str_cur; + return str_len(stab_val(stab)); switch (*stab->str_magic->str_ptr) { case '1': case '2': case '3': case '4': @@ -303,7 +310,7 @@ STR *str; case '\\': return (STRLEN)orslen; default: - return stab_str(str)->str_cur; + return str_len(stab_str(str)); } } @@ -311,7 +318,7 @@ stabset(mstr,str) register STR *mstr; STR *str; { - STAB *stab = mstr->str_u.str_stab; + STAB *stab; register char *s; int i; @@ -338,6 +345,8 @@ STR *str; case 'S': s = str_get(str); i = whichsig(mstr->str_ptr); /* ...no, a brick */ + if (!i && (dowarn || strEQ(mstr->str_ptr,"ALARM"))) + warn("No such signal: SIG%s", mstr->str_ptr); if (strEQ(s,"IGNORE")) #ifndef lint (void)signal(i,SIG_IGN); @@ -356,6 +365,7 @@ STR *str; break; #ifdef SOME_DBM case 'D': + stab = mstr->str_u.str_stab; hdbmstore(stab_hash(stab),mstr->str_ptr,mstr->str_cur,str); break; #endif @@ -363,6 +373,7 @@ STR *str; { CMD *cmd; + stab = mstr->str_u.str_stab; i = str_true(str); str = afetch(stab_xarray(stab),atoi(mstr->str_ptr), FALSE); cmd = str->str_magic->str_u.str_cmd; @@ -371,16 +382,19 @@ STR *str; } break; case '#': + stab = mstr->str_u.str_stab; afill(stab_array(stab), (int)str_gnum(str) - arybase); break; case 'X': /* merely a copy of a * string */ break; case '*': - s = str_get(str); + s = str->str_pok ? str_get(str) : ""; if (strNE(s,"StB") || str->str_cur != sizeof(STBP)) { + stab = mstr->str_u.str_stab; if (!*s) { STBP *stbp; + /*SUPPRESS 701*/ (void)savenostab(stab); /* schedule a free of this stab */ if (stab->str_len) Safefree(stab->str_ptr); @@ -402,7 +416,7 @@ STR *str; if (!stab_io(stab)) stab_io(stab) = stio_new(); } - str_sset(str,stab); + str_sset(str, (STR*) stab); } break; case 's': { @@ -422,6 +436,9 @@ STR *str; break; case 0: + /*SUPPRESS 560*/ + if (!(stab = mstr->str_u.str_stab)) + break; switch (*stab->str_magic->str_ptr) { case '\004': /* ^D */ #ifdef DEBUGGING @@ -711,6 +728,7 @@ int sig; sig_name[sig], stab_name(stab) ); return; } + /*SUPPRESS 701*/ saveaptr(&stack); str = Str_new(15, sizeof(CSV)); str->str_state = SS_SCSV; @@ -791,7 +809,7 @@ int add; char *prevquote = Nullch; bool global = FALSE; - if (isascii(*name) && isupper(*name)) { + if (isUPPER(*name)) { if (*name > 'I') { if (*name == 'S' && ( strEQ(name, "SIG") || @@ -822,9 +840,9 @@ int add; sawquote = Nullch; name++; } - else if (!isalpha(*name) || global) + else if (!isALPHA(*name) || global) stash = defstash; - else if (curcmd == &compiling) + else if ((CMD*)curcmd == &compiling) stash = curstash; else stash = curcmd->c_stash; @@ -833,6 +851,7 @@ int add; char *s, *d; *sawquote = '\0'; + /*SUPPRESS 560*/ if (s = prevquote) { strncpy(tmpbuf,name,s-name+1); d = tmpbuf+(s-name+1); @@ -869,12 +888,14 @@ int add; strcpy(stab_magic(stab),"StB"); stab_val(stab) = Str_new(72,0); stab_line(stab) = curcmd->c_line; - str_magic(stab,stab,'*',name,len); + str_magic((STR*)stab, stab, '*', name, len); stab_stash(stab) = stash; - if (isdigit(*name) && *name != '0') { + if (isDIGIT(*name) && *name != '0') { stab_flags(stab) = SF_VMAGIC; str_magic(stab_val(stab), stab, 0, Nullch, 0); } + if (add & 2) + stab->str_pok |= SP_MULTI; return stab; } } @@ -945,11 +966,14 @@ register STAB *stab; stab_xhash(stab) = Null(HASH*); str_free(stab_val(stab)); stab_val(stab) = Nullstr; + /*SUPPRESS 560*/ if (stio = stab_io(stab)) { do_close(stab,FALSE); Safefree(stio->top_name); Safefree(stio->fmt_name); + Safefree(stio); } + /*SUPPRESS 560*/ if (sub = stab_sub(stab)) { afree(sub->tosave); cmd_free(sub->cmd); |