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