e433393947780a1484625b9062a785f96a08ef8d
[perl.git] / do / kv
1 int
2 do_kv(TARG,hash,kv,gimme,arglast)
3 STR *TARG;
4 HASH *hash;
5 int kv;
6 int gimme;
7 int *arglast;
8 {
9     register ARRAY *ary = stack;
10     STR **st = ary->ary_array;
11     register int sp = arglast[0];
12     int i;
13     register HENT *entry;
14     char *tmps;
15     STR *tmpstr;
16     int dokeys = (kv == O_KEYS || kv == O_HASH);
17     int dovalues = (kv == O_VALUES || kv == O_HASH);
18
19     if (gimme != G_ARRAY) {
20         i = 0;
21         (void)hiterinit(hash);
22         /*SUPPRESS 560*/
23         while (entry = hiternext(hash)) {
24             i++;
25         }
26         str_numset(TARG,(double)i);
27         STABSET(TARG);
28         st[++sp] = TARG;
29         return sp;
30     }
31     (void)hiterinit(hash);
32     /*SUPPRESS 560*/
33     while (entry = hiternext(hash)) {
34         if (dokeys) {
35             tmps = hiterkey(entry,&i);
36             if (!i)
37                 tmps = "";
38             (void)astore(ary,++sp,str_2mortal(str_make(tmps,i)));
39         }
40         if (dovalues) {
41             tmpstr = Str_new(45,0);
42 #ifdef DEBUGGING
43             if (debug & 8192) {
44                 sprintf(buf,"%d%%%d=%d\n",entry->hent_hash,
45                     hash->tbl_max+1,entry->hent_hash & hash->tbl_max);
46                 str_set(tmpstr,buf);
47             }
48             else
49 #endif
50             str_sset(tmpstr,hiterval(hash,entry));
51             (void)astore(ary,++sp,str_2mortal(tmpstr));
52         }
53     }
54     return sp;
55 }
56