source: trunk/processor/hashtable.m4 @ 1

Last change on this file since 1 was 1, checked in by moo, 8 years ago

initial import to online

File size: 3.3 KB
Line 
1dnl DEF_HASH_TABLE_FUNC(1:name, 2:datatype [, 3:dataname])
2define(`DEF_HASH_TABLE_FUNC', `
3    DEF_STRUCT_P_FUNC(`HashTable', `$1', `
4        pushdefFUNC_NAME(`$2', `$3')
5        dnl {{{ dasm
6        IFDASM(`
7            Bucket *b;
8            zval *zv;
9            int bufsize = 2;
10            char *buf = emalloc(bufsize);
11            int keysize;
12
13            DONE(nTableSize)
14            DONE(nTableMask)
15            DONE(nNumOfElements)
16            DONE(nNextFreeElement)
17            DONE(pInternalPointer)
18            DONE(pListHead)
19            DONE(pListTail)
20            DONE(arBuckets)
21            DONE(pDestructor)
22            DONE(persistent)
23            DONE(nApplyCount)
24            DONE(bApplyProtection)
25#if ZEND_DEBUG
26            DONE(inconsistent)
27#endif
28#ifdef IS_UNICODE
29            DONE(unicode)
30#endif
31
32            DISABLECHECK(`
33            for (b = src->pListHead; b != NULL; b = b->pListNext) {
34                ALLOC_INIT_ZVAL(zv);
35                array_init(zv);
36                FUNC_NAME (zv, (($2*)b->pData) TSRMLS_CC);
37                keysize = BUCKET_KEY_SIZE(b) + 2;
38                if (keysize > bufsize) {
39                    do {
40                        bufsize *= 2;
41                    } while (keysize > bufsize);
42                    buf = erealloc(buf, bufsize);
43                }
44                memcpy(buf, BUCKET_KEY(b), keysize);
45                buf[keysize - 2] = buf[keysize - 1] = ""[0];
46                keysize = b->nKeyLength;
47#ifdef IS_UNICODE
48                if (BUCKET_KEY_TYPE(b) == IS_UNICODE) {
49                    if (buf[0] == ""[0] && buf[1] == ""[0]) {
50                        keysize ++;
51                    }
52                } else
53#endif
54                {
55                    if (buf[0] == ""[0]) {
56                        keysize ++;
57                    }
58                }
59                add_u_assoc_zval_ex(dst, BUCKET_KEY_TYPE(b), buf, keysize, zv);
60            }
61            ')
62
63            efree(buf);
64            return; /* no check size */
65        ', `
66        dnl }}}
67        Bucket *b, *pnew = NULL, *prev = NULL;
68        zend_bool first = 1;
69        dnl only used for copy
70        IFCOPY(`uint n;')
71        IFCALCCOPY(`int bucketsize;')
72
73        DISPATCH(uint, nTableSize)
74        DISPATCH(uint, nTableMask)
75        DISPATCH(uint, nNumOfElements)
76        DISPATCH(ulong, nNextFreeElement)
77        IFCOPY(`dst->pInternalPointer = NULL;   /* Used for element traversal */') DONE(pInternalPointer)
78        IFCOPY(`dst->pListHead = NULL;') DONE(pListHead)
79        CALLOC(dst->arBuckets, Bucket*, src->nTableSize)
80        DONE(arBuckets)
81        DISABLECHECK(`
82
83        for (b = src->pListHead; b != NULL; b = b->pListNext) {
84            IFCALCCOPY(`bucketsize = BUCKET_SIZE(b);')
85            ALLOC(pnew, char, bucketsize, , Bucket)
86            IFCOPY(`memcpy(pnew, b, bucketsize);')
87            IFCOPY(`
88                n = b->h & src->nTableMask;
89                /* pnew into hash node chain */
90                pnew->pLast = NULL;
91                if (dst->arBuckets[n]) {
92                    pnew->pNext = dst->arBuckets[n];
93                    pnew->pNext->pLast = pnew;
94                }
95                else {
96                    pnew->pNext = NULL;
97                }
98                dst->arBuckets[n] = pnew;
99            ')
100            if (sizeof(void *) == sizeof($2)) {
101                IFCOPY(`pnew->pData = &pnew->pDataPtr;')
102                dnl no alloc
103                STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `$3', ` ')
104            }
105            else {
106                STRUCT_P_EX(`$2', pnew->pData, (($2*)b->pData), `$3')
107                IFCOPY(`pnew->pDataPtr = NULL;')
108            }
109
110            if (first) {
111                IFCOPY(`dst->pListHead = pnew;')
112                first = 0;
113            }
114
115            IFCOPY(`
116                /* flat link */
117                pnew->pListLast = prev;
118                pnew->pListNext = NULL;
119                if (prev) {
120                    prev->pListNext = pnew;
121                }
122            ')
123            prev = pnew;
124        }
125        ')
126        IFCOPY(`dst->pListTail = pnew;') DONE(pListTail)
127        IFCOPY(`dst->pDestructor = src->pDestructor;') DONE(pDestructor)
128        DISPATCH(zend_bool, persistent)
129#ifdef IS_UNICODE
130        DISPATCH(zend_bool, unicode)
131#endif
132        DISPATCH(unsigned char, nApplyCount)
133        DISPATCH(zend_bool, bApplyProtection)
134#if ZEND_DEBUG
135        DISPATCH(int, inconsistent)
136#endif
137        ')dnl IFDASM
138        popdef(`FUNC_NAME')
139    ')
140')
Note: See TracBrowser for help on using the repository browser.