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