Trivial dump.c feature
[p5sagit/p5-mst-13.2.git] / hv.c
CommitLineData
a0d0e21e 1/* hv.c
79072805 2 *
3818b22b 3 * Copyright (c) 1991-2000, Larry Wall
79072805 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 *
a0d0e21e 8 */
9
10/*
11 * "I sit beside the fire and think of all that I have seen." --Bilbo
79072805 12 */
13
14#include "EXTERN.h"
864dbfa3 15#define PERL_IN_HV_C
79072805 16#include "perl.h"
17
1c846c1f 18
76e3520e 19STATIC HE*
cea2e8a9 20S_new_he(pTHX)
4633a7c4 21{
22 HE* he;
333f433b 23 LOCK_SV_MUTEX;
24 if (!PL_he_root)
25 more_he();
26 he = PL_he_root;
27 PL_he_root = HeNEXT(he);
28 UNLOCK_SV_MUTEX;
29 return he;
4633a7c4 30}
31
76e3520e 32STATIC void
cea2e8a9 33S_del_he(pTHX_ HE *p)
4633a7c4 34{
333f433b 35 LOCK_SV_MUTEX;
3280af22 36 HeNEXT(p) = (HE*)PL_he_root;
37 PL_he_root = p;
333f433b 38 UNLOCK_SV_MUTEX;
4633a7c4 39}
40
333f433b 41STATIC void
cea2e8a9 42S_more_he(pTHX)
4633a7c4 43{
44 register HE* he;
45 register HE* heend;
612f20c3 46 XPV *ptr;
47 New(54, ptr, 1008/sizeof(XPV), XPV);
48 ptr->xpv_pv = (char*)PL_he_arenaroot;
49 PL_he_arenaroot = ptr;
50
51 he = (HE*)ptr;
4633a7c4 52 heend = &he[1008 / sizeof(HE) - 1];
612f20c3 53 PL_he_root = ++he;
4633a7c4 54 while (he < heend) {
fde52b5c 55 HeNEXT(he) = (HE*)(he + 1);
4633a7c4 56 he++;
57 }
fde52b5c 58 HeNEXT(he) = 0;
4633a7c4 59}
60
d33b2eba 61#ifdef PURIFY
62
63#define new_HE() (HE*)safemalloc(sizeof(HE))
64#define del_HE(p) safefree((char*)p)
65
66#else
67
68#define new_HE() new_he()
69#define del_HE(p) del_he(p)
70
71#endif
72
76e3520e 73STATIC HEK *
cea2e8a9 74S_save_hek(pTHX_ const char *str, I32 len, U32 hash)
bbce6d69 75{
76 char *k;
77 register HEK *hek;
da58a35d 78 bool is_utf8 = FALSE;
79
80 if (len < 0) {
81 len = -len;
82 is_utf8 = TRUE;
83 }
1c846c1f 84
ff68c719 85 New(54, k, HEK_BASESIZE + len + 1, char);
bbce6d69 86 hek = (HEK*)k;
ff68c719 87 Copy(str, HEK_KEY(hek), len, char);
ff68c719 88 HEK_LEN(hek) = len;
89 HEK_HASH(hek) = hash;
da58a35d 90 HEK_UTF8(hek) = (char)is_utf8;
bbce6d69 91 return hek;
92}
93
94void
864dbfa3 95Perl_unshare_hek(pTHX_ HEK *hek)
bbce6d69 96{
ff68c719 97 unsharepvn(HEK_KEY(hek),HEK_LEN(hek),HEK_HASH(hek));
bbce6d69 98}
99
d18c6117 100#if defined(USE_ITHREADS)
101HE *
102Perl_he_dup(pTHX_ HE *e, bool shared)
103{
104 HE *ret;
105
106 if (!e)
107 return Nullhe;
7766f137 108 /* look for it in the table first */
109 ret = (HE*)ptr_table_fetch(PL_ptr_table, e);
110 if (ret)
111 return ret;
112
113 /* create anew and remember what it is */
d33b2eba 114 ret = new_HE();
7766f137 115 ptr_table_store(PL_ptr_table, e, ret);
116
117 HeNEXT(ret) = he_dup(HeNEXT(e),shared);
d18c6117 118 if (HeKLEN(e) == HEf_SVKEY)
119 HeKEY_sv(ret) = SvREFCNT_inc(sv_dup(HeKEY_sv(e)));
120 else if (shared)
da58a35d 121 HeKEY_hek(ret) = share_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
d18c6117 122 else
da58a35d 123 HeKEY_hek(ret) = save_hek(HeKEY(e), HeKLEN_UTF8(e), HeHASH(e));
d18c6117 124 HeVAL(ret) = SvREFCNT_inc(sv_dup(HeVAL(e)));
125 return ret;
126}
127#endif /* USE_ITHREADS */
128
fde52b5c 129/* (klen == HEf_SVKEY) is special for MAGICAL hv entries, meaning key slot
130 * contains an SV* */
131
954c1994 132/*
133=for apidoc hv_fetch
134
135Returns the SV which corresponds to the specified key in the hash. The
136C<klen> is the length of the key. If C<lval> is set then the fetch will be
137part of a store. Check that the return value is non-null before
1c846c1f 138dereferencing it to a C<SV*>.
954c1994 139
96f1132b 140See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994 141information on how to use this function on tied hashes.
142
143=cut
144*/
145
79072805 146SV**
da58a35d 147Perl_hv_fetch(pTHX_ HV *hv, const char *key, I32 klen, I32 lval)
79072805 148{
149 register XPVHV* xhv;
fde52b5c 150 register U32 hash;
79072805 151 register HE *entry;
79072805 152 SV *sv;
da58a35d 153 bool is_utf8 = FALSE;
79072805 154
155 if (!hv)
156 return 0;
463ee0b2 157
da58a35d 158 if (klen < 0) {
159 klen = -klen;
160 is_utf8 = TRUE;
161 }
162
8990e307 163 if (SvRMAGICAL(hv)) {
463ee0b2 164 if (mg_find((SV*)hv,'P')) {
11343788 165 dTHR;
8990e307 166 sv = sv_newmortal();
463ee0b2 167 mg_copy((SV*)hv, sv, key, klen);
3280af22 168 PL_hv_fetch_sv = sv;
169 return &PL_hv_fetch_sv;
463ee0b2 170 }
902173a3 171#ifdef ENV_IS_CASELESS
172 else if (mg_find((SV*)hv,'E')) {
e7152ba2 173 U32 i;
174 for (i = 0; i < klen; ++i)
175 if (isLOWER(key[i])) {
79cb57f6 176 char *nkey = strupr(SvPVX(sv_2mortal(newSVpvn(key,klen))));
e7152ba2 177 SV **ret = hv_fetch(hv, nkey, klen, 0);
178 if (!ret && lval)
179 ret = hv_store(hv, key, klen, NEWSV(61,0), 0);
180 return ret;
181 }
902173a3 182 }
183#endif
463ee0b2 184 }
185
79072805 186 xhv = (XPVHV*)SvANY(hv);
187 if (!xhv->xhv_array) {
1c846c1f 188 if (lval
a0d0e21e 189#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
190 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
191#endif
192 )
d18c6117 193 Newz(503, xhv->xhv_array,
194 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
79072805 195 else
196 return 0;
197 }
198
fde52b5c 199 PERL_HASH(hash, key, klen);
79072805 200
a0d0e21e 201 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 202 for (; entry; entry = HeNEXT(entry)) {
203 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 204 continue;
fde52b5c 205 if (HeKLEN(entry) != klen)
79072805 206 continue;
1c846c1f 207 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 208 continue;
da58a35d 209 if (HeKUTF8(entry) != (char)is_utf8)
210 continue;
fde52b5c 211 return &HeVAL(entry);
79072805 212 }
a0d0e21e 213#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
214 if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
a6c40364 215 unsigned long len;
216 char *env = PerlEnv_ENVgetenv_len(key,&len);
217 if (env) {
218 sv = newSVpvn(env,len);
219 SvTAINTED_on(sv);
220 return hv_store(hv,key,klen,sv,hash);
221 }
a0d0e21e 222 }
223#endif
79072805 224 if (lval) { /* gonna assign to this, so it better be there */
225 sv = NEWSV(61,0);
da58a35d 226 return hv_store(hv,key,is_utf8?-klen:klen,sv,hash);
79072805 227 }
228 return 0;
229}
230
fde52b5c 231/* returns a HE * structure with the all fields set */
232/* note that hent_val will be a mortal sv for MAGICAL hashes */
954c1994 233/*
234=for apidoc hv_fetch_ent
235
236Returns the hash entry which corresponds to the specified key in the hash.
237C<hash> must be a valid precomputed hash number for the given C<key>, or 0
238if you want the function to compute it. IF C<lval> is set then the fetch
239will be part of a store. Make sure the return value is non-null before
240accessing it. The return value when C<tb> is a tied hash is a pointer to a
241static location, so be sure to make a copy of the structure if you need to
1c846c1f 242store it somewhere.
954c1994 243
96f1132b 244See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994 245information on how to use this function on tied hashes.
246
247=cut
248*/
249
fde52b5c 250HE *
864dbfa3 251Perl_hv_fetch_ent(pTHX_ HV *hv, SV *keysv, I32 lval, register U32 hash)
fde52b5c 252{
253 register XPVHV* xhv;
254 register char *key;
255 STRLEN klen;
256 register HE *entry;
257 SV *sv;
da58a35d 258 bool is_utf8;
fde52b5c 259
260 if (!hv)
261 return 0;
262
902173a3 263 if (SvRMAGICAL(hv)) {
264 if (mg_find((SV*)hv,'P')) {
6ff68fdd 265 dTHR;
902173a3 266 sv = sv_newmortal();
267 keysv = sv_2mortal(newSVsv(keysv));
268 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
3280af22 269 if (!HeKEY_hek(&PL_hv_fetch_ent_mh)) {
902173a3 270 char *k;
271 New(54, k, HEK_BASESIZE + sizeof(SV*), char);
3280af22 272 HeKEY_hek(&PL_hv_fetch_ent_mh) = (HEK*)k;
902173a3 273 }
3280af22 274 HeSVKEY_set(&PL_hv_fetch_ent_mh, keysv);
275 HeVAL(&PL_hv_fetch_ent_mh) = sv;
276 return &PL_hv_fetch_ent_mh;
1cf368ac 277 }
902173a3 278#ifdef ENV_IS_CASELESS
279 else if (mg_find((SV*)hv,'E')) {
e7152ba2 280 U32 i;
902173a3 281 key = SvPV(keysv, klen);
e7152ba2 282 for (i = 0; i < klen; ++i)
283 if (isLOWER(key[i])) {
79cb57f6 284 SV *nkeysv = sv_2mortal(newSVpvn(key,klen));
e7152ba2 285 (void)strupr(SvPVX(nkeysv));
286 entry = hv_fetch_ent(hv, nkeysv, 0, 0);
287 if (!entry && lval)
288 entry = hv_store_ent(hv, keysv, NEWSV(61,0), hash);
289 return entry;
290 }
902173a3 291 }
292#endif
fde52b5c 293 }
294
effa1e2d 295 xhv = (XPVHV*)SvANY(hv);
fde52b5c 296 if (!xhv->xhv_array) {
1c846c1f 297 if (lval
fde52b5c 298#ifdef DYNAMIC_ENV_FETCH /* if it's an %ENV lookup, we may get it on the fly */
299 || (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME))
300#endif
301 )
d18c6117 302 Newz(503, xhv->xhv_array,
303 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
fde52b5c 304 else
305 return 0;
306 }
307
effa1e2d 308 key = SvPV(keysv, klen);
da58a35d 309 is_utf8 = (SvUTF8(keysv)!=0);
1c846c1f 310
effa1e2d 311 if (!hash)
312 PERL_HASH(hash, key, klen);
313
fde52b5c 314 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
315 for (; entry; entry = HeNEXT(entry)) {
316 if (HeHASH(entry) != hash) /* strings can't be equal */
317 continue;
318 if (HeKLEN(entry) != klen)
319 continue;
1c846c1f 320 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 321 continue;
da58a35d 322 if (HeKUTF8(entry) != (char)is_utf8)
323 continue;
fde52b5c 324 return entry;
325 }
326#ifdef DYNAMIC_ENV_FETCH /* %ENV lookup? If so, try to fetch the value now */
327 if (HvNAME(hv) && strEQ(HvNAME(hv),ENV_HV_NAME)) {
a6c40364 328 unsigned long len;
329 char *env = PerlEnv_ENVgetenv_len(key,&len);
330 if (env) {
331 sv = newSVpvn(env,len);
332 SvTAINTED_on(sv);
333 return hv_store_ent(hv,keysv,sv,hash);
334 }
fde52b5c 335 }
336#endif
337 if (lval) { /* gonna assign to this, so it better be there */
338 sv = NEWSV(61,0);
e7152ba2 339 return hv_store_ent(hv,keysv,sv,hash);
fde52b5c 340 }
341 return 0;
342}
343
864dbfa3 344STATIC void
cea2e8a9 345S_hv_magic_check(pTHX_ HV *hv, bool *needs_copy, bool *needs_store)
d0066dc7 346{
347 MAGIC *mg = SvMAGIC(hv);
348 *needs_copy = FALSE;
349 *needs_store = TRUE;
350 while (mg) {
351 if (isUPPER(mg->mg_type)) {
352 *needs_copy = TRUE;
353 switch (mg->mg_type) {
354 case 'P':
d0066dc7 355 case 'S':
356 *needs_store = FALSE;
d0066dc7 357 }
358 }
359 mg = mg->mg_moremagic;
360 }
361}
362
954c1994 363/*
364=for apidoc hv_store
365
366Stores an SV in a hash. The hash key is specified as C<key> and C<klen> is
367the length of the key. The C<hash> parameter is the precomputed hash
368value; if it is zero then Perl will compute it. The return value will be
369NULL if the operation failed or if the value did not need to be actually
370stored within the hash (as in the case of tied hashes). Otherwise it can
371be dereferenced to get the original C<SV*>. Note that the caller is
372responsible for suitably incrementing the reference count of C<val> before
1c846c1f 373the call, and decrementing it if the function returned NULL.
954c1994 374
96f1132b 375See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994 376information on how to use this function on tied hashes.
377
378=cut
379*/
380
79072805 381SV**
da58a35d 382Perl_hv_store(pTHX_ HV *hv, const char *key, I32 klen, SV *val, register U32 hash)
79072805 383{
384 register XPVHV* xhv;
79072805 385 register I32 i;
386 register HE *entry;
387 register HE **oentry;
da58a35d 388 bool is_utf8 = FALSE;
79072805 389
390 if (!hv)
391 return 0;
392
da58a35d 393 if (klen < 0) {
394 klen = -klen;
395 is_utf8 = TRUE;
396 }
397
79072805 398 xhv = (XPVHV*)SvANY(hv);
463ee0b2 399 if (SvMAGICAL(hv)) {
d0066dc7 400 bool needs_copy;
401 bool needs_store;
402 hv_magic_check (hv, &needs_copy, &needs_store);
403 if (needs_copy) {
404 mg_copy((SV*)hv, val, key, klen);
405 if (!xhv->xhv_array && !needs_store)
406 return 0;
902173a3 407#ifdef ENV_IS_CASELESS
408 else if (mg_find((SV*)hv,'E')) {
79cb57f6 409 SV *sv = sv_2mortal(newSVpvn(key,klen));
902173a3 410 key = strupr(SvPVX(sv));
411 hash = 0;
412 }
413#endif
d0066dc7 414 }
463ee0b2 415 }
fde52b5c 416 if (!hash)
417 PERL_HASH(hash, key, klen);
418
419 if (!xhv->xhv_array)
d18c6117 420 Newz(505, xhv->xhv_array,
421 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
fde52b5c 422
423 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
424 i = 1;
425
426 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
427 if (HeHASH(entry) != hash) /* strings can't be equal */
428 continue;
429 if (HeKLEN(entry) != klen)
430 continue;
1c846c1f 431 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 432 continue;
da58a35d 433 if (HeKUTF8(entry) != (char)is_utf8)
434 continue;
fde52b5c 435 SvREFCNT_dec(HeVAL(entry));
436 HeVAL(entry) = val;
437 return &HeVAL(entry);
438 }
439
d33b2eba 440 entry = new_HE();
fde52b5c 441 if (HvSHAREKEYS(hv))
da58a35d 442 HeKEY_hek(entry) = share_hek(key, is_utf8?-klen:klen, hash);
fde52b5c 443 else /* gotta do the real thing */
da58a35d 444 HeKEY_hek(entry) = save_hek(key, is_utf8?-klen:klen, hash);
fde52b5c 445 HeVAL(entry) = val;
fde52b5c 446 HeNEXT(entry) = *oentry;
447 *oentry = entry;
448
449 xhv->xhv_keys++;
450 if (i) { /* initial entry? */
451 ++xhv->xhv_fill;
452 if (xhv->xhv_keys > xhv->xhv_max)
453 hsplit(hv);
79072805 454 }
455
fde52b5c 456 return &HeVAL(entry);
457}
458
954c1994 459/*
460=for apidoc hv_store_ent
461
462Stores C<val> in a hash. The hash key is specified as C<key>. The C<hash>
463parameter is the precomputed hash value; if it is zero then Perl will
464compute it. The return value is the new hash entry so created. It will be
465NULL if the operation failed or if the value did not need to be actually
466stored within the hash (as in the case of tied hashes). Otherwise the
467contents of the return value can be accessed using the C<He???> macros
468described here. Note that the caller is responsible for suitably
469incrementing the reference count of C<val> before the call, and
1c846c1f 470decrementing it if the function returned NULL.
954c1994 471
96f1132b 472See L<perlguts/"Understanding the Magic of Tied Hashes and Arrays"> for more
954c1994 473information on how to use this function on tied hashes.
474
475=cut
476*/
477
fde52b5c 478HE *
864dbfa3 479Perl_hv_store_ent(pTHX_ HV *hv, SV *keysv, SV *val, register U32 hash)
fde52b5c 480{
481 register XPVHV* xhv;
482 register char *key;
483 STRLEN klen;
484 register I32 i;
485 register HE *entry;
486 register HE **oentry;
da58a35d 487 bool is_utf8;
fde52b5c 488
489 if (!hv)
490 return 0;
491
492 xhv = (XPVHV*)SvANY(hv);
493 if (SvMAGICAL(hv)) {
aeea060c 494 dTHR;
d0066dc7 495 bool needs_copy;
496 bool needs_store;
497 hv_magic_check (hv, &needs_copy, &needs_store);
498 if (needs_copy) {
3280af22 499 bool save_taint = PL_tainted;
500 if (PL_tainting)
501 PL_tainted = SvTAINTED(keysv);
d0066dc7 502 keysv = sv_2mortal(newSVsv(keysv));
503 mg_copy((SV*)hv, val, (char*)keysv, HEf_SVKEY);
504 TAINT_IF(save_taint);
505 if (!xhv->xhv_array && !needs_store)
506 return Nullhe;
902173a3 507#ifdef ENV_IS_CASELESS
508 else if (mg_find((SV*)hv,'E')) {
509 key = SvPV(keysv, klen);
79cb57f6 510 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3 511 (void)strupr(SvPVX(keysv));
512 hash = 0;
513 }
514#endif
515 }
fde52b5c 516 }
517
518 key = SvPV(keysv, klen);
da58a35d 519 is_utf8 = (SvUTF8(keysv) != 0);
902173a3 520
fde52b5c 521 if (!hash)
522 PERL_HASH(hash, key, klen);
523
79072805 524 if (!xhv->xhv_array)
d18c6117 525 Newz(505, xhv->xhv_array,
526 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
79072805 527
a0d0e21e 528 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
79072805 529 i = 1;
530
fde52b5c 531 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
532 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 533 continue;
fde52b5c 534 if (HeKLEN(entry) != klen)
79072805 535 continue;
1c846c1f 536 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 537 continue;
da58a35d 538 if (HeKUTF8(entry) != (char)is_utf8)
539 continue;
fde52b5c 540 SvREFCNT_dec(HeVAL(entry));
541 HeVAL(entry) = val;
542 return entry;
79072805 543 }
79072805 544
d33b2eba 545 entry = new_HE();
fde52b5c 546 if (HvSHAREKEYS(hv))
da58a35d 547 HeKEY_hek(entry) = share_hek(key, is_utf8?-klen:klen, hash);
fde52b5c 548 else /* gotta do the real thing */
da58a35d 549 HeKEY_hek(entry) = save_hek(key, is_utf8?-klen:klen, hash);
fde52b5c 550 HeVAL(entry) = val;
fde52b5c 551 HeNEXT(entry) = *oentry;
79072805 552 *oentry = entry;
553
463ee0b2 554 xhv->xhv_keys++;
79072805 555 if (i) { /* initial entry? */
463ee0b2 556 ++xhv->xhv_fill;
557 if (xhv->xhv_keys > xhv->xhv_max)
79072805 558 hsplit(hv);
559 }
79072805 560
fde52b5c 561 return entry;
79072805 562}
563
954c1994 564/*
565=for apidoc hv_delete
566
567Deletes a key/value pair in the hash. The value SV is removed from the
1c846c1f 568hash and returned to the caller. The C<klen> is the length of the key.
954c1994 569The C<flags> value will normally be zero; if set to G_DISCARD then NULL
570will be returned.
571
572=cut
573*/
574
79072805 575SV *
da58a35d 576Perl_hv_delete(pTHX_ HV *hv, const char *key, I32 klen, I32 flags)
79072805 577{
578 register XPVHV* xhv;
79072805 579 register I32 i;
fde52b5c 580 register U32 hash;
79072805 581 register HE *entry;
582 register HE **oentry;
67a38de0 583 SV **svp;
79072805 584 SV *sv;
da58a35d 585 bool is_utf8 = FALSE;
79072805 586
587 if (!hv)
588 return Nullsv;
da58a35d 589 if (klen < 0) {
590 klen = -klen;
591 is_utf8 = TRUE;
592 }
8990e307 593 if (SvRMAGICAL(hv)) {
0a0bb7c7 594 bool needs_copy;
595 bool needs_store;
596 hv_magic_check (hv, &needs_copy, &needs_store);
597
67a38de0 598 if (needs_copy && (svp = hv_fetch(hv, key, klen, TRUE))) {
599 sv = *svp;
0a0bb7c7 600 mg_clear(sv);
601 if (!needs_store) {
602 if (mg_find(sv, 'p')) {
603 sv_unmagic(sv, 'p'); /* No longer an element */
604 return sv;
605 }
606 return Nullsv; /* element cannot be deleted */
607 }
902173a3 608#ifdef ENV_IS_CASELESS
2fd1c6b8 609 else if (mg_find((SV*)hv,'E')) {
79cb57f6 610 sv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8 611 key = strupr(SvPVX(sv));
612 }
902173a3 613#endif
2fd1c6b8 614 }
463ee0b2 615 }
79072805 616 xhv = (XPVHV*)SvANY(hv);
617 if (!xhv->xhv_array)
618 return Nullsv;
fde52b5c 619
620 PERL_HASH(hash, key, klen);
79072805 621
a0d0e21e 622 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
79072805 623 entry = *oentry;
624 i = 1;
fde52b5c 625 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
626 if (HeHASH(entry) != hash) /* strings can't be equal */
79072805 627 continue;
fde52b5c 628 if (HeKLEN(entry) != klen)
79072805 629 continue;
1c846c1f 630 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
79072805 631 continue;
da58a35d 632 if (HeKUTF8(entry) != (char)is_utf8)
633 continue;
fde52b5c 634 *oentry = HeNEXT(entry);
79072805 635 if (i && !*oentry)
636 xhv->xhv_fill--;
748a9306 637 if (flags & G_DISCARD)
638 sv = Nullsv;
94f7643d 639 else {
79d01fbf 640 sv = sv_2mortal(HeVAL(entry));
94f7643d 641 HeVAL(entry) = &PL_sv_undef;
642 }
a0d0e21e 643 if (entry == xhv->xhv_eiter)
72940dca 644 HvLAZYDEL_on(hv);
a0d0e21e 645 else
68dc0745 646 hv_free_ent(hv, entry);
fde52b5c 647 --xhv->xhv_keys;
648 return sv;
649 }
650 return Nullsv;
651}
652
954c1994 653/*
654=for apidoc hv_delete_ent
655
656Deletes a key/value pair in the hash. The value SV is removed from the
657hash and returned to the caller. The C<flags> value will normally be zero;
658if set to G_DISCARD then NULL will be returned. C<hash> can be a valid
659precomputed hash value, or 0 to ask for it to be computed.
660
661=cut
662*/
663
fde52b5c 664SV *
864dbfa3 665Perl_hv_delete_ent(pTHX_ HV *hv, SV *keysv, I32 flags, U32 hash)
fde52b5c 666{
667 register XPVHV* xhv;
668 register I32 i;
669 register char *key;
670 STRLEN klen;
671 register HE *entry;
672 register HE **oentry;
673 SV *sv;
da58a35d 674 bool is_utf8;
1c846c1f 675
fde52b5c 676 if (!hv)
677 return Nullsv;
678 if (SvRMAGICAL(hv)) {
0a0bb7c7 679 bool needs_copy;
680 bool needs_store;
681 hv_magic_check (hv, &needs_copy, &needs_store);
682
67a38de0 683 if (needs_copy && (entry = hv_fetch_ent(hv, keysv, TRUE, hash))) {
0a0bb7c7 684 sv = HeVAL(entry);
685 mg_clear(sv);
686 if (!needs_store) {
687 if (mg_find(sv, 'p')) {
688 sv_unmagic(sv, 'p'); /* No longer an element */
689 return sv;
690 }
691 return Nullsv; /* element cannot be deleted */
692 }
902173a3 693#ifdef ENV_IS_CASELESS
2fd1c6b8 694 else if (mg_find((SV*)hv,'E')) {
695 key = SvPV(keysv, klen);
79cb57f6 696 keysv = sv_2mortal(newSVpvn(key,klen));
2fd1c6b8 697 (void)strupr(SvPVX(keysv));
1c846c1f 698 hash = 0;
2fd1c6b8 699 }
902173a3 700#endif
2fd1c6b8 701 }
fde52b5c 702 }
703 xhv = (XPVHV*)SvANY(hv);
704 if (!xhv->xhv_array)
705 return Nullsv;
706
707 key = SvPV(keysv, klen);
da58a35d 708 is_utf8 = (SvUTF8(keysv) != 0);
1c846c1f 709
fde52b5c 710 if (!hash)
711 PERL_HASH(hash, key, klen);
712
713 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
714 entry = *oentry;
715 i = 1;
716 for (; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
717 if (HeHASH(entry) != hash) /* strings can't be equal */
718 continue;
719 if (HeKLEN(entry) != klen)
720 continue;
1c846c1f 721 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 722 continue;
da58a35d 723 if (HeKUTF8(entry) != (char)is_utf8)
724 continue;
fde52b5c 725 *oentry = HeNEXT(entry);
726 if (i && !*oentry)
727 xhv->xhv_fill--;
728 if (flags & G_DISCARD)
729 sv = Nullsv;
94f7643d 730 else {
79d01fbf 731 sv = sv_2mortal(HeVAL(entry));
94f7643d 732 HeVAL(entry) = &PL_sv_undef;
733 }
fde52b5c 734 if (entry == xhv->xhv_eiter)
72940dca 735 HvLAZYDEL_on(hv);
fde52b5c 736 else
68dc0745 737 hv_free_ent(hv, entry);
463ee0b2 738 --xhv->xhv_keys;
79072805 739 return sv;
740 }
79072805 741 return Nullsv;
79072805 742}
743
954c1994 744/*
745=for apidoc hv_exists
746
747Returns a boolean indicating whether the specified hash key exists. The
748C<klen> is the length of the key.
749
750=cut
751*/
752
a0d0e21e 753bool
da58a35d 754Perl_hv_exists(pTHX_ HV *hv, const char *key, I32 klen)
a0d0e21e 755{
756 register XPVHV* xhv;
fde52b5c 757 register U32 hash;
a0d0e21e 758 register HE *entry;
759 SV *sv;
da58a35d 760 bool is_utf8 = FALSE;
a0d0e21e 761
762 if (!hv)
763 return 0;
764
da58a35d 765 if (klen < 0) {
766 klen = -klen;
767 is_utf8 = TRUE;
768 }
769
a0d0e21e 770 if (SvRMAGICAL(hv)) {
771 if (mg_find((SV*)hv,'P')) {
11343788 772 dTHR;
a0d0e21e 773 sv = sv_newmortal();
1c846c1f 774 mg_copy((SV*)hv, sv, key, klen);
a0d0e21e 775 magic_existspack(sv, mg_find(sv, 'p'));
776 return SvTRUE(sv);
777 }
902173a3 778#ifdef ENV_IS_CASELESS
779 else if (mg_find((SV*)hv,'E')) {
79cb57f6 780 sv = sv_2mortal(newSVpvn(key,klen));
902173a3 781 key = strupr(SvPVX(sv));
782 }
783#endif
a0d0e21e 784 }
785
786 xhv = (XPVHV*)SvANY(hv);
f675dbe5 787#ifndef DYNAMIC_ENV_FETCH
a0d0e21e 788 if (!xhv->xhv_array)
1c846c1f 789 return 0;
f675dbe5 790#endif
a0d0e21e 791
fde52b5c 792 PERL_HASH(hash, key, klen);
a0d0e21e 793
f675dbe5 794#ifdef DYNAMIC_ENV_FETCH
795 if (!xhv->xhv_array) entry = Null(HE*);
796 else
797#endif
a0d0e21e 798 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
fde52b5c 799 for (; entry; entry = HeNEXT(entry)) {
800 if (HeHASH(entry) != hash) /* strings can't be equal */
a0d0e21e 801 continue;
fde52b5c 802 if (HeKLEN(entry) != klen)
a0d0e21e 803 continue;
1c846c1f 804 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
fde52b5c 805 continue;
da58a35d 806 if (HeKUTF8(entry) != (char)is_utf8)
807 continue;
fde52b5c 808 return TRUE;
809 }
f675dbe5 810#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
a6c40364 811 if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME)) {
812 unsigned long len;
813 char *env = PerlEnv_ENVgetenv_len(key,&len);
814 if (env) {
815 sv = newSVpvn(env,len);
816 SvTAINTED_on(sv);
817 (void)hv_store(hv,key,klen,sv,hash);
818 return TRUE;
819 }
f675dbe5 820 }
821#endif
fde52b5c 822 return FALSE;
823}
824
825
954c1994 826/*
827=for apidoc hv_exists_ent
828
829Returns a boolean indicating whether the specified hash key exists. C<hash>
830can be a valid precomputed hash value, or 0 to ask for it to be
831computed.
832
833=cut
834*/
835
fde52b5c 836bool
864dbfa3 837Perl_hv_exists_ent(pTHX_ HV *hv, SV *keysv, U32 hash)
fde52b5c 838{
839 register XPVHV* xhv;
840 register char *key;
841 STRLEN klen;
842 register HE *entry;
843 SV *sv;
844
845 if (!hv)
846 return 0;
847
848 if (SvRMAGICAL(hv)) {
849 if (mg_find((SV*)hv,'P')) {
e858de61 850 dTHR; /* just for SvTRUE */
fde52b5c 851 sv = sv_newmortal();
effa1e2d 852 keysv = sv_2mortal(newSVsv(keysv));
1c846c1f 853 mg_copy((SV*)hv, sv, (char*)keysv, HEf_SVKEY);
fde52b5c 854 magic_existspack(sv, mg_find(sv, 'p'));
855 return SvTRUE(sv);
856 }
902173a3 857#ifdef ENV_IS_CASELESS
858 else if (mg_find((SV*)hv,'E')) {
859 key = SvPV(keysv, klen);
79cb57f6 860 keysv = sv_2mortal(newSVpvn(key,klen));
902173a3 861 (void)strupr(SvPVX(keysv));
1c846c1f 862 hash = 0;
902173a3 863 }
864#endif
fde52b5c 865 }
866
867 xhv = (XPVHV*)SvANY(hv);
f675dbe5 868#ifndef DYNAMIC_ENV_FETCH
fde52b5c 869 if (!xhv->xhv_array)
1c846c1f 870 return 0;
f675dbe5 871#endif
fde52b5c 872
873 key = SvPV(keysv, klen);
874 if (!hash)
875 PERL_HASH(hash, key, klen);
876
f675dbe5 877#ifdef DYNAMIC_ENV_FETCH
878 if (!xhv->xhv_array) entry = Null(HE*);
879 else
880#endif
fde52b5c 881 entry = ((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
882 for (; entry; entry = HeNEXT(entry)) {
883 if (HeHASH(entry) != hash) /* strings can't be equal */
884 continue;
885 if (HeKLEN(entry) != klen)
886 continue;
1c846c1f 887 if (HeKEY(entry) != key && memNE(HeKEY(entry),key,klen)) /* is this it? */
a0d0e21e 888 continue;
889 return TRUE;
890 }
f675dbe5 891#ifdef DYNAMIC_ENV_FETCH /* is it out there? */
a6c40364 892 if (HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME)) {
893 unsigned long len;
894 char *env = PerlEnv_ENVgetenv_len(key,&len);
895 if (env) {
896 sv = newSVpvn(env,len);
897 SvTAINTED_on(sv);
898 (void)hv_store_ent(hv,keysv,sv,hash);
899 return TRUE;
900 }
f675dbe5 901 }
902#endif
a0d0e21e 903 return FALSE;
904}
905
76e3520e 906STATIC void
cea2e8a9 907S_hsplit(pTHX_ HV *hv)
79072805 908{
909 register XPVHV* xhv = (XPVHV*)SvANY(hv);
a0d0e21e 910 I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
79072805 911 register I32 newsize = oldsize * 2;
912 register I32 i;
72311751 913 register char *a = xhv->xhv_array;
914 register HE **aep;
915 register HE **bep;
79072805 916 register HE *entry;
917 register HE **oentry;
918
3280af22 919 PL_nomemok = TRUE;
8d6dde3e 920#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 921 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 922 if (!a) {
4a33f861 923 PL_nomemok = FALSE;
422a93e5 924 return;
925 }
4633a7c4 926#else
4633a7c4 927#define MALLOC_OVERHEAD 16
d18c6117 928 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 929 if (!a) {
3280af22 930 PL_nomemok = FALSE;
422a93e5 931 return;
932 }
72311751 933 Copy(xhv->xhv_array, a, oldsize * sizeof(HE*), char);
fba3b22e 934 if (oldsize >= 64) {
d18c6117 935 offer_nice_chunk(xhv->xhv_array, PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
4633a7c4 936 }
937 else
938 Safefree(xhv->xhv_array);
939#endif
940
3280af22 941 PL_nomemok = FALSE;
72311751 942 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
79072805 943 xhv->xhv_max = --newsize;
72311751 944 xhv->xhv_array = a;
945 aep = (HE**)a;
79072805 946
72311751 947 for (i=0; i<oldsize; i++,aep++) {
948 if (!*aep) /* non-existent */
79072805 949 continue;
72311751 950 bep = aep+oldsize;
951 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
fde52b5c 952 if ((HeHASH(entry) & newsize) != i) {
953 *oentry = HeNEXT(entry);
72311751 954 HeNEXT(entry) = *bep;
955 if (!*bep)
79072805 956 xhv->xhv_fill++;
72311751 957 *bep = entry;
79072805 958 continue;
959 }
960 else
fde52b5c 961 oentry = &HeNEXT(entry);
79072805 962 }
72311751 963 if (!*aep) /* everything moved */
79072805 964 xhv->xhv_fill--;
965 }
966}
967
72940dca 968void
864dbfa3 969Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
72940dca 970{
971 register XPVHV* xhv = (XPVHV*)SvANY(hv);
972 I32 oldsize = (I32) xhv->xhv_max + 1; /* sic(k) */
973 register I32 newsize;
974 register I32 i;
975 register I32 j;
72311751 976 register char *a;
977 register HE **aep;
72940dca 978 register HE *entry;
979 register HE **oentry;
980
981 newsize = (I32) newmax; /* possible truncation here */
982 if (newsize != newmax || newmax <= oldsize)
983 return;
984 while ((newsize & (1 + ~newsize)) != newsize) {
985 newsize &= ~(newsize & (1 + ~newsize)); /* get proper power of 2 */
986 }
987 if (newsize < newmax)
988 newsize *= 2;
989 if (newsize < newmax)
990 return; /* overflow detection */
991
72311751 992 a = xhv->xhv_array;
72940dca 993 if (a) {
3280af22 994 PL_nomemok = TRUE;
8d6dde3e 995#if defined(STRANGE_MALLOC) || defined(MYMALLOC)
d18c6117 996 Renew(a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 997 if (!a) {
4a33f861 998 PL_nomemok = FALSE;
422a93e5 999 return;
1000 }
72940dca 1001#else
d18c6117 1002 New(2, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
422a93e5 1003 if (!a) {
3280af22 1004 PL_nomemok = FALSE;
422a93e5 1005 return;
1006 }
72311751 1007 Copy(xhv->xhv_array, a, oldsize * sizeof(HE*), char);
fba3b22e 1008 if (oldsize >= 64) {
d18c6117 1009 offer_nice_chunk(xhv->xhv_array, PERL_HV_ARRAY_ALLOC_BYTES(oldsize));
72940dca 1010 }
1011 else
1012 Safefree(xhv->xhv_array);
1013#endif
3280af22 1014 PL_nomemok = FALSE;
72311751 1015 Zero(&a[oldsize * sizeof(HE*)], (newsize-oldsize) * sizeof(HE*), char); /* zero 2nd half*/
72940dca 1016 }
1017 else {
d18c6117 1018 Newz(0, a, PERL_HV_ARRAY_ALLOC_BYTES(newsize), char);
72940dca 1019 }
1020 xhv->xhv_max = --newsize;
72311751 1021 xhv->xhv_array = a;
72940dca 1022 if (!xhv->xhv_fill) /* skip rest if no entries */
1023 return;
1024
72311751 1025 aep = (HE**)a;
1026 for (i=0; i<oldsize; i++,aep++) {
1027 if (!*aep) /* non-existent */
72940dca 1028 continue;
72311751 1029 for (oentry = aep, entry = *aep; entry; entry = *oentry) {
72940dca 1030 if ((j = (HeHASH(entry) & newsize)) != i) {
1031 j -= i;
1032 *oentry = HeNEXT(entry);
72311751 1033 if (!(HeNEXT(entry) = aep[j]))
72940dca 1034 xhv->xhv_fill++;
72311751 1035 aep[j] = entry;
72940dca 1036 continue;
1037 }
1038 else
1039 oentry = &HeNEXT(entry);
1040 }
72311751 1041 if (!*aep) /* everything moved */
72940dca 1042 xhv->xhv_fill--;
1043 }
1044}
1045
954c1994 1046/*
1047=for apidoc newHV
1048
1049Creates a new HV. The reference count is set to 1.
1050
1051=cut
1052*/
1053
79072805 1054HV *
864dbfa3 1055Perl_newHV(pTHX)
79072805 1056{
1057 register HV *hv;
1058 register XPVHV* xhv;
1059
a0d0e21e 1060 hv = (HV*)NEWSV(502,0);
1061 sv_upgrade((SV *)hv, SVt_PVHV);
79072805 1062 xhv = (XPVHV*)SvANY(hv);
1063 SvPOK_off(hv);
1064 SvNOK_off(hv);
1c846c1f 1065#ifndef NODEFAULT_SHAREKEYS
fde52b5c 1066 HvSHAREKEYS_on(hv); /* key-sharing on by default */
1c846c1f 1067#endif
463ee0b2 1068 xhv->xhv_max = 7; /* start with 8 buckets */
79072805 1069 xhv->xhv_fill = 0;
1070 xhv->xhv_pmroot = 0;
79072805 1071 (void)hv_iterinit(hv); /* so each() will start off right */
1072 return hv;
1073}
1074
b3ac6de7 1075HV *
864dbfa3 1076Perl_newHVhv(pTHX_ HV *ohv)
b3ac6de7 1077{
1078 register HV *hv;
b3ac6de7 1079 STRLEN hv_max = ohv ? HvMAX(ohv) : 0;
1080 STRLEN hv_fill = ohv ? HvFILL(ohv) : 0;
1081
1082 hv = newHV();
1083 while (hv_max && hv_max + 1 >= hv_fill * 2)
1084 hv_max = hv_max / 2; /* Is always 2^n-1 */
4a76a316 1085 HvMAX(hv) = hv_max;
b3ac6de7 1086 if (!hv_fill)
1087 return hv;
1088
1089#if 0
33c27489 1090 if (! SvTIED_mg((SV*)ohv, 'P')) {
b3ac6de7 1091 /* Quick way ???*/
1c846c1f 1092 }
1093 else
b3ac6de7 1094#endif
1095 {
1096 HE *entry;
1097 I32 hv_riter = HvRITER(ohv); /* current root of iterator */
1098 HE *hv_eiter = HvEITER(ohv); /* current entry of iterator */
1099
1100 /* Slow way */
4a76a316 1101 hv_iterinit(ohv);
155aba94 1102 while ((entry = hv_iternext(ohv))) {
da58a35d 1103 hv_store(hv, HeKEY(entry), HeKLEN_UTF8(entry),
b3ac6de7 1104 SvREFCNT_inc(HeVAL(entry)), HeHASH(entry));
1105 }
1106 HvRITER(ohv) = hv_riter;
1107 HvEITER(ohv) = hv_eiter;
1108 }
1c846c1f 1109
b3ac6de7 1110 return hv;
1111}
1112
79072805 1113void
864dbfa3 1114Perl_hv_free_ent(pTHX_ HV *hv, register HE *entry)
79072805 1115{
16bdeea2 1116 SV *val;
1117
68dc0745 1118 if (!entry)
79072805 1119 return;
16bdeea2 1120 val = HeVAL(entry);
257c9e5b 1121 if (val && isGV(val) && GvCVu(val) && HvNAME(hv))
3280af22 1122 PL_sub_generation++; /* may be deletion of method from stash */
16bdeea2 1123 SvREFCNT_dec(val);
68dc0745 1124 if (HeKLEN(entry) == HEf_SVKEY) {
1125 SvREFCNT_dec(HeKEY_sv(entry));
1126 Safefree(HeKEY_hek(entry));
44a8e56a 1127 }
1128 else if (HvSHAREKEYS(hv))
68dc0745 1129 unshare_hek(HeKEY_hek(entry));
fde52b5c 1130 else
68dc0745 1131 Safefree(HeKEY_hek(entry));
d33b2eba 1132 del_HE(entry);
79072805 1133}
1134
1135void
864dbfa3 1136Perl_hv_delayfree_ent(pTHX_ HV *hv, register HE *entry)
79072805 1137{
68dc0745 1138 if (!entry)
79072805 1139 return;
68dc0745 1140 if (isGV(HeVAL(entry)) && GvCVu(HeVAL(entry)) && HvNAME(hv))
3280af22 1141 PL_sub_generation++; /* may be deletion of method from stash */
68dc0745 1142 sv_2mortal(HeVAL(entry)); /* free between statements */
1143 if (HeKLEN(entry) == HEf_SVKEY) {
1144 sv_2mortal(HeKEY_sv(entry));
1145 Safefree(HeKEY_hek(entry));
44a8e56a 1146 }
1147 else if (HvSHAREKEYS(hv))
68dc0745 1148 unshare_hek(HeKEY_hek(entry));
fde52b5c 1149 else
68dc0745 1150 Safefree(HeKEY_hek(entry));
d33b2eba 1151 del_HE(entry);
79072805 1152}
1153
954c1994 1154/*
1155=for apidoc hv_clear
1156
1157Clears a hash, making it empty.
1158
1159=cut
1160*/
1161
79072805 1162void
864dbfa3 1163Perl_hv_clear(pTHX_ HV *hv)
79072805 1164{
1165 register XPVHV* xhv;
1166 if (!hv)
1167 return;
1168 xhv = (XPVHV*)SvANY(hv);
463ee0b2 1169 hfreeentries(hv);
79072805 1170 xhv->xhv_fill = 0;
a0d0e21e 1171 xhv->xhv_keys = 0;
79072805 1172 if (xhv->xhv_array)
463ee0b2 1173 (void)memzero(xhv->xhv_array, (xhv->xhv_max + 1) * sizeof(HE*));
a0d0e21e 1174
1175 if (SvRMAGICAL(hv))
1c846c1f 1176 mg_clear((SV*)hv);
79072805 1177}
1178
76e3520e 1179STATIC void
cea2e8a9 1180S_hfreeentries(pTHX_ HV *hv)
79072805 1181{
a0d0e21e 1182 register HE **array;
68dc0745 1183 register HE *entry;
1184 register HE *oentry = Null(HE*);
a0d0e21e 1185 I32 riter;
1186 I32 max;
79072805 1187
1188 if (!hv)
1189 return;
a0d0e21e 1190 if (!HvARRAY(hv))
79072805 1191 return;
a0d0e21e 1192
1193 riter = 0;
1194 max = HvMAX(hv);
1195 array = HvARRAY(hv);
68dc0745 1196 entry = array[0];
a0d0e21e 1197 for (;;) {
68dc0745 1198 if (entry) {
1199 oentry = entry;
1200 entry = HeNEXT(entry);
1201 hv_free_ent(hv, oentry);
a0d0e21e 1202 }
68dc0745 1203 if (!entry) {
a0d0e21e 1204 if (++riter > max)
1205 break;
68dc0745 1206 entry = array[riter];
1c846c1f 1207 }
79072805 1208 }
a0d0e21e 1209 (void)hv_iterinit(hv);
79072805 1210}
1211
954c1994 1212/*
1213=for apidoc hv_undef
1214
1215Undefines the hash.
1216
1217=cut
1218*/
1219
79072805 1220void
864dbfa3 1221Perl_hv_undef(pTHX_ HV *hv)
79072805 1222{
1223 register XPVHV* xhv;
1224 if (!hv)
1225 return;
1226 xhv = (XPVHV*)SvANY(hv);
463ee0b2 1227 hfreeentries(hv);
79072805 1228 Safefree(xhv->xhv_array);
85e6fe83 1229 if (HvNAME(hv)) {
1230 Safefree(HvNAME(hv));
1231 HvNAME(hv) = 0;
1232 }
79072805 1233 xhv->xhv_array = 0;
aa689395 1234 xhv->xhv_max = 7; /* it's a normal hash */
79072805 1235 xhv->xhv_fill = 0;
a0d0e21e 1236 xhv->xhv_keys = 0;
1237
1238 if (SvRMAGICAL(hv))
1c846c1f 1239 mg_clear((SV*)hv);
79072805 1240}
1241
954c1994 1242/*
1243=for apidoc hv_iterinit
1244
1245Prepares a starting point to traverse a hash table. Returns the number of
1246keys in the hash (i.e. the same as C<HvKEYS(tb)>). The return value is
1c846c1f 1247currently only meaningful for hashes without tie magic.
954c1994 1248
1249NOTE: Before version 5.004_65, C<hv_iterinit> used to return the number of
1250hash buckets that happen to be in use. If you still need that esoteric
1251value, you can get it through the macro C<HvFILL(tb)>.
1252
1253=cut
1254*/
1255
79072805 1256I32
864dbfa3 1257Perl_hv_iterinit(pTHX_ HV *hv)
79072805 1258{
aa689395 1259 register XPVHV* xhv;
1260 HE *entry;
1261
1262 if (!hv)
cea2e8a9 1263 Perl_croak(aTHX_ "Bad hash");
aa689395 1264 xhv = (XPVHV*)SvANY(hv);
1265 entry = xhv->xhv_eiter;
72940dca 1266 if (entry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1267 HvLAZYDEL_off(hv);
68dc0745 1268 hv_free_ent(hv, entry);
72940dca 1269 }
79072805 1270 xhv->xhv_riter = -1;
1271 xhv->xhv_eiter = Null(HE*);
c6601927 1272 return xhv->xhv_keys; /* used to be xhv->xhv_fill before 5.004_65 */
79072805 1273}
1274
954c1994 1275/*
1276=for apidoc hv_iternext
1277
1278Returns entries from a hash iterator. See C<hv_iterinit>.
1279
1280=cut
1281*/
1282
79072805 1283HE *
864dbfa3 1284Perl_hv_iternext(pTHX_ HV *hv)
79072805 1285{
1286 register XPVHV* xhv;
1287 register HE *entry;
a0d0e21e 1288 HE *oldentry;
463ee0b2 1289 MAGIC* mg;
79072805 1290
1291 if (!hv)
cea2e8a9 1292 Perl_croak(aTHX_ "Bad hash");
79072805 1293 xhv = (XPVHV*)SvANY(hv);
a0d0e21e 1294 oldentry = entry = xhv->xhv_eiter;
463ee0b2 1295
155aba94 1296 if ((mg = SvTIED_mg((SV*)hv, 'P'))) {
8990e307 1297 SV *key = sv_newmortal();
cd1469e6 1298 if (entry) {
fde52b5c 1299 sv_setsv(key, HeSVKEY_force(entry));
cd1469e6 1300 SvREFCNT_dec(HeSVKEY(entry)); /* get rid of previous key */
1301 }
a0d0e21e 1302 else {
ff68c719 1303 char *k;
bbce6d69 1304 HEK *hek;
ff68c719 1305
d33b2eba 1306 xhv->xhv_eiter = entry = new_HE(); /* one HE per MAGICAL hash */
4633a7c4 1307 Zero(entry, 1, HE);
ff68c719 1308 Newz(54, k, HEK_BASESIZE + sizeof(SV*), char);
1309 hek = (HEK*)k;
1310 HeKEY_hek(entry) = hek;
fde52b5c 1311 HeKLEN(entry) = HEf_SVKEY;
a0d0e21e 1312 }
1313 magic_nextpack((SV*) hv,mg,key);
463ee0b2 1314 if (SvOK(key)) {
cd1469e6 1315 /* force key to stay around until next time */
bbce6d69 1316 HeSVKEY_set(entry, SvREFCNT_inc(key));
1317 return entry; /* beware, hent_val is not set */
463ee0b2 1318 }
fde52b5c 1319 if (HeVAL(entry))
1320 SvREFCNT_dec(HeVAL(entry));
ff68c719 1321 Safefree(HeKEY_hek(entry));
d33b2eba 1322 del_HE(entry);
463ee0b2 1323 xhv->xhv_eiter = Null(HE*);
1324 return Null(HE*);
79072805 1325 }
f675dbe5 1326#ifdef DYNAMIC_ENV_FETCH /* set up %ENV for iteration */
1327 if (!entry && HvNAME(hv) && strEQ(HvNAME(hv), ENV_HV_NAME))
1328 prime_env_iter();
1329#endif
463ee0b2 1330
79072805 1331 if (!xhv->xhv_array)
d18c6117 1332 Newz(506, xhv->xhv_array,
1333 PERL_HV_ARRAY_ALLOC_BYTES(xhv->xhv_max + 1), char);
fde52b5c 1334 if (entry)
1335 entry = HeNEXT(entry);
1336 while (!entry) {
1337 ++xhv->xhv_riter;
1338 if (xhv->xhv_riter > xhv->xhv_max) {
1339 xhv->xhv_riter = -1;
1340 break;
79072805 1341 }
fde52b5c 1342 entry = ((HE**)xhv->xhv_array)[xhv->xhv_riter];
1343 }
79072805 1344
72940dca 1345 if (oldentry && HvLAZYDEL(hv)) { /* was deleted earlier? */
1346 HvLAZYDEL_off(hv);
68dc0745 1347 hv_free_ent(hv, oldentry);
72940dca 1348 }
a0d0e21e 1349
79072805 1350 xhv->xhv_eiter = entry;
1351 return entry;
1352}
1353
954c1994 1354/*
1355=for apidoc hv_iterkey
1356
1357Returns the key from the current position of the hash iterator. See
1358C<hv_iterinit>.
1359
1360=cut
1361*/
1362
79072805 1363char *
864dbfa3 1364Perl_hv_iterkey(pTHX_ register HE *entry, I32 *retlen)
79072805 1365{
fde52b5c 1366 if (HeKLEN(entry) == HEf_SVKEY) {
fb73857a 1367 STRLEN len;
1368 char *p = SvPV(HeKEY_sv(entry), len);
1369 *retlen = len;
1370 return p;
fde52b5c 1371 }
1372 else {
1373 *retlen = HeKLEN(entry);
1374 return HeKEY(entry);
1375 }
1376}
1377
1378/* unlike hv_iterval(), this always returns a mortal copy of the key */
954c1994 1379/*
1380=for apidoc hv_iterkeysv
1381
1382Returns the key as an C<SV*> from the current position of the hash
1383iterator. The return value will always be a mortal copy of the key. Also
1384see C<hv_iterinit>.
1385
1386=cut
1387*/
1388
fde52b5c 1389SV *
864dbfa3 1390Perl_hv_iterkeysv(pTHX_ register HE *entry)
fde52b5c 1391{
1392 if (HeKLEN(entry) == HEf_SVKEY)
bbce6d69 1393 return sv_mortalcopy(HeKEY_sv(entry));
1c846c1f 1394 else {
da58a35d 1395 SV *sv = newSVpvn_share((HeKLEN(entry) ? HeKEY(entry) : ""),
1396 HeKLEN(entry), HeHASH(entry));
1397 if (HeKUTF8(entry))
1398 SvUTF8_on(sv);
1399 return sv_2mortal(sv);
1c846c1f 1400 }
79072805 1401}
1402
954c1994 1403/*
1404=for apidoc hv_iterval
1405
1406Returns the value from the current position of the hash iterator. See
1407C<hv_iterkey>.
1408
1409=cut
1410*/
1411
79072805 1412SV *
864dbfa3 1413Perl_hv_iterval(pTHX_ HV *hv, register HE *entry)
79072805 1414{
8990e307 1415 if (SvRMAGICAL(hv)) {
463ee0b2 1416 if (mg_find((SV*)hv,'P')) {
8990e307 1417 SV* sv = sv_newmortal();
bbce6d69 1418 if (HeKLEN(entry) == HEf_SVKEY)
1419 mg_copy((SV*)hv, sv, (char*)HeKEY_sv(entry), HEf_SVKEY);
1420 else mg_copy((SV*)hv, sv, HeKEY(entry), HeKLEN(entry));
463ee0b2 1421 return sv;
1422 }
79072805 1423 }
fde52b5c 1424 return HeVAL(entry);
79072805 1425}
1426
954c1994 1427/*
1428=for apidoc hv_iternextsv
1429
1430Performs an C<hv_iternext>, C<hv_iterkey>, and C<hv_iterval> in one
1431operation.
1432
1433=cut
1434*/
1435
a0d0e21e 1436SV *
864dbfa3 1437Perl_hv_iternextsv(pTHX_ HV *hv, char **key, I32 *retlen)
a0d0e21e 1438{
1439 HE *he;
1440 if ( (he = hv_iternext(hv)) == NULL)
1441 return NULL;
1442 *key = hv_iterkey(he, retlen);
1443 return hv_iterval(hv, he);
1444}
1445
954c1994 1446/*
1447=for apidoc hv_magic
1448
1449Adds magic to a hash. See C<sv_magic>.
1450
1451=cut
1452*/
1453
79072805 1454void
864dbfa3 1455Perl_hv_magic(pTHX_ HV *hv, GV *gv, int how)
79072805 1456{
a0d0e21e 1457 sv_magic((SV*)hv, (SV*)gv, how, Nullch, 0);
79072805 1458}
fde52b5c 1459
bbce6d69 1460char*
864dbfa3 1461Perl_sharepvn(pTHX_ const char *sv, I32 len, U32 hash)
bbce6d69 1462{
ff68c719 1463 return HEK_KEY(share_hek(sv, len, hash));
bbce6d69 1464}
1465
1466/* possibly free a shared string if no one has access to it
fde52b5c 1467 * len and hash must both be valid for str.
1468 */
bbce6d69 1469void
864dbfa3 1470Perl_unsharepvn(pTHX_ const char *str, I32 len, U32 hash)
fde52b5c 1471{
1472 register XPVHV* xhv;
1473 register HE *entry;
1474 register HE **oentry;
1475 register I32 i = 1;
1476 I32 found = 0;
1c846c1f 1477
fde52b5c 1478 /* what follows is the moral equivalent of:
6b88bc9c 1479 if ((Svp = hv_fetch(PL_strtab, tmpsv, FALSE, hash))) {
bbce6d69 1480 if (--*Svp == Nullsv)
6b88bc9c 1481 hv_delete(PL_strtab, str, len, G_DISCARD, hash);
bbce6d69 1482 } */
3280af22 1483 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 1484 /* assert(xhv_array != 0) */
5f08fbcd 1485 LOCK_STRTAB_MUTEX;
fde52b5c 1486 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
bbce6d69 1487 for (entry = *oentry; entry; i=0, oentry = &HeNEXT(entry), entry = *oentry) {
fde52b5c 1488 if (HeHASH(entry) != hash) /* strings can't be equal */
1489 continue;
1490 if (HeKLEN(entry) != len)
1491 continue;
1c846c1f 1492 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
fde52b5c 1493 continue;
1494 found = 1;
bbce6d69 1495 if (--HeVAL(entry) == Nullsv) {
1496 *oentry = HeNEXT(entry);
1497 if (i && !*oentry)
1498 xhv->xhv_fill--;
ff68c719 1499 Safefree(HeKEY_hek(entry));
d33b2eba 1500 del_HE(entry);
bbce6d69 1501 --xhv->xhv_keys;
fde52b5c 1502 }
bbce6d69 1503 break;
fde52b5c 1504 }
333f433b 1505 UNLOCK_STRTAB_MUTEX;
1c846c1f 1506
0453d815 1507 {
1508 dTHR;
1509 if (!found && ckWARN_d(WARN_INTERNAL))
1c846c1f 1510 Perl_warner(aTHX_ WARN_INTERNAL, "Attempt to free non-existent shared string '%s'",str);
0453d815 1511 }
fde52b5c 1512}
1513
bbce6d69 1514/* get a (constant) string ptr from the global string table
1515 * string will get added if it is not already there.
fde52b5c 1516 * len and hash must both be valid for str.
1517 */
bbce6d69 1518HEK *
864dbfa3 1519Perl_share_hek(pTHX_ const char *str, I32 len, register U32 hash)
fde52b5c 1520{
1521 register XPVHV* xhv;
1522 register HE *entry;
1523 register HE **oentry;
1524 register I32 i = 1;
1525 I32 found = 0;
da58a35d 1526 bool is_utf8 = FALSE;
1527
1528 if (len < 0) {
1529 len = -len;
1530 is_utf8 = TRUE;
1531 }
bbce6d69 1532
fde52b5c 1533 /* what follows is the moral equivalent of:
1c846c1f 1534
6b88bc9c 1535 if (!(Svp = hv_fetch(PL_strtab, str, len, FALSE)))
1536 hv_store(PL_strtab, str, len, Nullsv, hash);
bbce6d69 1537 */
3280af22 1538 xhv = (XPVHV*)SvANY(PL_strtab);
fde52b5c 1539 /* assert(xhv_array != 0) */
5f08fbcd 1540 LOCK_STRTAB_MUTEX;
fde52b5c 1541 oentry = &((HE**)xhv->xhv_array)[hash & (I32) xhv->xhv_max];
bbce6d69 1542 for (entry = *oentry; entry; i=0, entry = HeNEXT(entry)) {
fde52b5c 1543 if (HeHASH(entry) != hash) /* strings can't be equal */
1544 continue;
1545 if (HeKLEN(entry) != len)
1546 continue;
1c846c1f 1547 if (HeKEY(entry) != str && memNE(HeKEY(entry),str,len)) /* is this it? */
fde52b5c 1548 continue;
da58a35d 1549 if (HeKUTF8(entry) != (char)is_utf8)
1550 continue;
fde52b5c 1551 found = 1;
fde52b5c 1552 break;
1553 }
bbce6d69 1554 if (!found) {
d33b2eba 1555 entry = new_HE();
da58a35d 1556 HeKEY_hek(entry) = save_hek(str, is_utf8?-len:len, hash);
bbce6d69 1557 HeVAL(entry) = Nullsv;
1558 HeNEXT(entry) = *oentry;
1559 *oentry = entry;
1560 xhv->xhv_keys++;
1561 if (i) { /* initial entry? */
1562 ++xhv->xhv_fill;
1563 if (xhv->xhv_keys > xhv->xhv_max)
3280af22 1564 hsplit(PL_strtab);
bbce6d69 1565 }
1566 }
1567
1568 ++HeVAL(entry); /* use value slot as REFCNT */
5f08fbcd 1569 UNLOCK_STRTAB_MUTEX;
ff68c719 1570 return HeKEY_hek(entry);
fde52b5c 1571}
1572
bbce6d69 1573
61c8b479 1574