source: trunk/processor/struct.m4 @ 1

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

initial import to online

File size: 4.8 KB
Line 
1define(`pushdefFUNC_NAME', `
2    pushdef(`FUNC_NAME', `xc_`'KIND`'_`'ifelse(`$2', `', `$1', `$2')')
3')
4dnl {{{ DECL_STRUCT_P_FUNC(1:type, 2:name, 3:comma=;)
5define(`DECL_STRUCT_P_FUNC', `patsubst(
6    pushdefFUNC_NAME(`$1', `$2')
7    define(`DEFINED_'ifelse(`$2', `', `$1', `$2'), `')
8    ifdef(`EXPORT_'ifelse(`$2', `', `$1', `$2'), `void', `static void inline')
9    FUNC_NAME`'(
10        IFDPRINT( `const $1 * const src, int indent')
11        IFCALC(   `processor_t *processor, const $1 * const src')
12        IFSTORE(  `processor_t *processor, $1 *dst, const $1 * const src')
13        IFRESTORE(`processor_t *processor, $1 *dst, const $1 * const src')
14        IFDASM(   `zval *dst, const $1 * const src')
15        IFASM(    `$1 *dst, const $1 * const src')
16        TSRMLS_DC
17    )ifelse(`$3', `', `;')
18    popdef(`FUNC_NAME')dnl
19, `[
20     ]+', ` ')')
21dnl }}}
22dnl {{{ DEF_STRUCT_P_FUNC(1:type, 2:name, 3:body)
23define(`DEF_STRUCT_P_FUNC', `
24    pushdefFUNC_NAME(`$1', `$2')
25/* {`{'{ FUNC_NAME */
26    ifdef(`EXPORT_'ifelse(`$2', `', `$1', `$2'), `
27        /* export: DECL_STRUCT_P_FUNC(`$1', `$2') :export */
28    ')
29DECL_STRUCT_P_FUNC(`$1', `$2', 1)
30    {
31        IFASSERT(`
32            /* {{{ init assert */
33            ifdef(`SIZEOF_$1', , `m4_errprint(`missing SIZEOF_$1, safe to ignore')define(`SIZEOF_$1', 0)')
34            ifdef(`COUNTOF_$1', , `m4_errprint(`missing COUNTOF_$1, safe to ignore')define(`COUNTOF_$1', 0)')
35            int assert_size = SIZEOF_$1, assert_count = COUNTOF_$1;
36            int done_size = 0, done_count = 0;
37            ifdef(`ELEMENTSOF_$1', `
38                define(`ELEMENTS', defn(`ELEMENTSOF_$1'))
39            ')
40            /* }}} */
41            IFRESTORE(`assert(xc_is_shm(src));')
42            IFCALCSTORE(`assert(!xc_is_shm(src));')
43        ')
44
45        ifdef(`USEMEMCPY', `IFCOPY(`
46            memcpy(dst, src, sizeof($1));
47        ')')
48
49        IFDPRINT(`
50            fprintf(stderr, "%s", " {\n");
51            indent ++;
52        ')
53        $3`'
54        IFDPRINT(`
55            indent --;
56            INDENT()fprintf(stderr, "}\n");
57        ')
58        ifdef(`SKIPASSERT_ONCE', `undefine(`SKIPASSERT_ONCE')', `IFASSERT(`
59                /* {{{ check assert */
60                if (done_count != assert_count) {
61                    fprintf(stderr
62                        , "count assertion failed at %s `#'%d FUNC_NAME`' : unexpected %d - expected %d = %d != 0\n"
63                        , __FILE__, __LINE__
64                        , done_count, assert_count, done_count - assert_count
65                        );
66                    abort();
67                }
68                if (done_size != assert_size) {
69                    fprintf(stderr
70                        , "size assertion failed at %s `#'%d FUNC_NAME`' : %d - %d = %d != 0\n"
71                        , __FILE__, __LINE__
72                        , done_size, assert_size, done_size - assert_size
73                        );
74                    abort();
75                }
76                ifdef(`ELEMENTSOF_$1', `
77                    ifelse(ELEMENTS, , , `
78                        m4_errprint(`====' KIND `$1 =================')
79                        m4_errprint(`expected:' ELEMENTSOF_$1)
80                        m4_errprint(`missing :' ELEMENTS)
81                        define(`EXIT_PENDING', 1)
82                    ')
83                ')
84                undefine(`ELEMENTS')
85                /* }}} */
86        ')')
87    }
88/* }`}'} */
89    popdef(`FUNC_NAME')
90')
91dnl }}}
92dnl {{{ STRUCT_P_EX(1:type, 2:dst, 3:src, 4:name=type, 5:&)
93define(`STRUCT_P_EX', `
94    DBG(`$0($*)')
95    pushdefFUNC_NAME(`$1', `$4')
96    ifdef(`DEFINED_'ifelse(`$4', `', `$1', `$4'), `', `m4_errprint(`Unknown struct "'ifelse(`$4', `', `$1', `$4')`"')')
97    assert(sizeof($1) == sizeof(($5 $3)[0]));
98    ifelse(`$5', `', `ALLOC(`$2', `$1')')
99    IFDASM(`do {
100        zval *zv;
101        ALLOC_INIT_ZVAL(zv);
102        array_init(zv);
103    ')
104    FUNC_NAME`'(
105        IFDPRINT( `           $5 $3, indent')
106        IFCALC(   `processor, $5 $3')
107        IFSTORE(  `processor, $5 $2, $5 $3')
108        IFRESTORE(`processor, $5 $2, $5 $3')
109        IFDASM(   `zv, $5 $3')
110        IFASM(    `$5 $2, $5 $3')
111        TSRMLS_CC
112    );
113    IFDASM(`
114        add_assoc_zval_ex(dst, ZEND_STRS("patsubst(`$2', `dst->')"), zv);
115    } while (0);
116    ')
117    popdef(`FUNC_NAME')
118    ifelse(`$5', , `FIXPOINTER_EX(`$1', `$2')')
119')
120dnl }}}
121dnl {{{ STRUCT_P(1:type, 2:elm, 3:name=type)
122define(`STRUCT_P', `
123    DBG(`$0($*)')
124    if (src->$2) {
125        STRUCT_P_EX(`$1', `dst->$2', `src->$2', `$3')
126        IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2");')
127    }
128    else {
129        COPYNULL_EX(dst->$2)
130        IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2:\tNULL\n");')
131    }
132    DONE(`$2')
133')
134dnl }}}
135dnl {{{ STRUCT(1:type, 2:elm, 3:name=type)
136define(`STRUCT', `
137    DBG(`$0($*)')
138    assert(sizeof($1) == sizeof(src->$2));
139    IFDPRINT(`INDENT()`'fprintf(stderr, "$1:$2");')
140    STRUCT_P_EX(`$1', `dst->$2', `src->$2', `$3', `&')
141    DONE(`$2')
142')
143dnl }}}
144dnl {{{ STRUCT_ARRAY(1:count, 2:type, 3:elm, 4:name=type)
145define(`STRUCT_ARRAY', `
146    if (src->$3) {
147        pushdefFUNC_NAME(`$2', `$4')
148        IFDASM(`
149            zval *arr;
150            ALLOC_INIT_ZVAL(arr);
151            array_init(arr);
152            for (i = 0; i < src->$1; i ++) {
153                zval *zv;
154
155                ALLOC_INIT_ZVAL(zv);
156                array_init(zv);
157                FUNC_NAME (zv, &(src->$3[i]) TSRMLS_CC);
158                add_next_index_zval(arr, zv);
159            }
160            add_assoc_zval_ex(dst, ZEND_STRS("$3"), arr);
161        ', `
162            ALLOC(`dst->$3', `$2', `src->$1')
163            ifdef(`AFTER_ALLOC', AFTER_ALLOC)
164            for (i = 0; i < src->$1; i ++) {
165                DISABLECHECK(`
166                    ifdef(`BEFORE_LOOP', `BEFORE_LOOP')
167                    STRUCT(`$2', `$3[i]', `$4')
168                ')
169            }
170        ')dnl IFDASM
171        DONE(`$3')
172        popdef(`FUNC_NAME')
173    }
174    else {
175        COPYNULL(`$3')
176        ifdef(`AFTER_ALLOC', AFTER_ALLOC)
177    }
178')
179dnl }}}
Note: See TracBrowser for help on using the repository browser.