X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=array.c;h=aff66caf87daa6467746cf0a7067e37e392888ff;hb=39c3038ca76b338006c640ae6da52b407dd9e654;hp=6875d28af55e6ea7eea0cbe6a81c7083cb443140;hpb=a687059cbaf2c6fdccb5e0fae2aee80ec15625a8;p=p5sagit%2Fp5-mst-13.2.git diff --git a/array.c b/array.c index 6875d28..aff66ca 100644 --- a/array.c +++ b/array.c @@ -1,4 +1,4 @@ -/* $Header: array.c,v 3.0 89/10/18 15:08:33 lwall Locked $ +/* $Header: array.c,v 3.0.1.3 90/10/15 14:56:17 lwall Locked $ * * Copyright (c) 1989, Larry Wall * @@ -6,6 +6,15 @@ * as specified in the README file that comes with the perl 3.0 kit. * * $Log: array.c,v $ + * Revision 3.0.1.3 90/10/15 14:56:17 lwall + * patch29: non-existent array values no longer cause core dumps + * + * Revision 3.0.1.2 90/08/13 21:52:20 lwall + * patch28: defined(@array) and defined(%array) didn't work right + * + * Revision 3.0.1.1 89/11/17 15:02:52 lwall + * patch5: nested foreach on same array didn't work + * * Revision 3.0 89/10/18 15:08:33 lwall * 3.0 baseline * @@ -32,12 +41,15 @@ int lval; return str; } else - return Nullstr; + return &str_undef; } - if (lval && !ar->ary_array[key]) { - str = Str_new(6,0); - (void)astore(ar,key,str); - return str; + if (!ar->ary_array[key]) { + if (lval) { + str = Str_new(6,0); + (void)astore(ar,key,str); + return str; + } + return &str_undef; } return ar->ary_array[key]; } @@ -67,10 +79,16 @@ STR *val; } } else { - newmax = key + ar->ary_max / 5; - resize: - Renew(ar->ary_alloc,newmax+1, STR*); - Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*); + if (ar->ary_alloc) { + newmax = key + ar->ary_max / 5; + resize: + Renew(ar->ary_alloc,newmax+1, STR*); + Zero(&ar->ary_alloc[ar->ary_max+1], newmax - ar->ary_max, STR*); + } + else { + newmax = key < 4 ? 4 : key; + Newz(2,ar->ary_alloc, newmax+1, STR*); + } ar->ary_array = ar->ary_alloc; ar->ary_max = newmax; } @@ -97,13 +115,10 @@ STAB *stab; register ARRAY *ar; New(1,ar,1,ARRAY); - Newz(2,ar->ary_alloc,5,STR*); - ar->ary_array = ar->ary_alloc; ar->ary_magic = Str_new(7,0); + ar->ary_alloc = ar->ary_array = 0; str_magic(ar->ary_magic, stab, '#', Nullch, 0); - ar->ary_fill = -1; - ar->ary_index = -1; - ar->ary_max = 4; + ar->ary_max = ar->ary_fill = -1; ar->ary_flags = ARF_REAL; return ar; } @@ -123,7 +138,6 @@ STR **strp; ar->ary_magic = Str_new(8,0); str_magic(ar->ary_magic, stab, '#', Nullch, 0); ar->ary_fill = size - 1; - ar->ary_index = -1; ar->ary_max = size - 1; ar->ary_flags = 0; return ar; @@ -135,7 +149,7 @@ register ARRAY *ar; { register int key; - if (!ar || !(ar->ary_flags & ARF_REAL)) + if (!ar || !(ar->ary_flags & ARF_REAL) || ar->ary_max < 0) return; if (key = ar->ary_array - ar->ary_alloc) { ar->ary_max += key;