source: trunk/processor/string.m4 @ 1

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

initial import to online

File size: 2.6 KB
Line 
1
2dnl {{{ PROC_STRING_N_EX(1:dst, 2:src, 3:size, 4:name, 5:type=char)
3define(`PROC_STRING_N_EX', `
4    pushdef(`STRTYPE', `ifelse(`$5',,`char',`$5')')
5    pushdef(`ISTYPE', ifelse(STRTYPE,`char',IS_STRING,IS_UNICODE))
6    if ($2 == NULL) {
7        IFNOTMEMCPY(`IFCOPY(`
8            $1 = NULL;
9        ')')
10        IFDASM(`
11            add_assoc_null_ex(dst, ZEND_STRS("$4"));
12        ')
13    }
14    else {
15        IFDPRINT(`INDENT()
16            ifelse(STRTYPE, `UChar', `
17#ifdef IS_UNICODE
18            do {
19                zval zv;
20                zval reszv;
21                int usecopy;
22
23                INIT_ZVAL(zv);
24                ZVAL_UNICODEL(&zv, (UChar *) ($2), $3 - 1, 1);
25                zend_make_printable_zval(&zv, &reszv, &usecopy);
26                fprintf(stderr, "string:%s:\t\"%s\" len=%d\n", "$1", reszv.value.str.val, $3 - 1);
27                if (usecopy) {
28                    zval_dtor(&reszv);
29                }
30                zval_dtor(&zv);
31            } while (0);
32#endif
33            ', `
34            fprintf(stderr, "string:%s:\t\"%s\" len=%d\n", "$1", $2, $3 - 1);
35            ')
36        ')
37        IFCALC(`xc_calc_string_n(processor, ISTYPE, (void *) $2, `$3' IFASSERT(`, __LINE__'));')
38        IFSTORE(`$1 = (typeof($1)) xc_store_string_n(processor, ISTYPE, (char *) $2, `$3' IFASSERT(`, __LINE__'));')
39        IFRESTORE(`
40            ALLOC(`$1', `typeof($1[0])', `sizeof(STRTYPE) * ($3)')
41            memcpy($1, $2, sizeof(STRTYPE) * ($3));
42        ')
43        FIXPOINTER_EX(`typeof($1[0])', `$1')
44        IFDASM(`
45                ifelse(STRTYPE,UChar, `
46                    add_assoc_unicodel_ex(dst, ZEND_STRS("$4"), $2, $3-1, 1);
47                    ', ` dnl else
48                    add_assoc_stringl_ex(dst, ZEND_STRS("$4"), $2, $3-1, 1);')
49                ')
50    }
51    popdef(`STRTYPE')
52    popdef(`ISTYPE')
53')
54dnl }}}
55dnl PROC_STRING_N(1:name, 2:size, 3:type)
56define(`PROC_STRING_N', `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `src->$2', `$1', `char')')
57
58define(`PROC_STRING_L', `DBG(`$0($*)') PROC_STRING_N(`$1', `$2 + 1')')
59define(`PROC_STRING',   `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `strlen(src->$1) + 1', `$1', `char')')
60
61dnl {{{ PROC_USTRING_N(1:type, 2:name, 3:size, 4:size_type)
62define(`PROC_USTRING_N', `
63    DBG(`$0($*)')
64#ifdef IS_UNICODE
65    pushdef(`NSIZE', ifelse(
66            `$4', `strlen', `strlen(src->$2) + 1',
67            `$4', `len',    `src->$3 + 1',
68            `',   `',       `src->$3',
69            ))
70    DONE(`$2')
71    ifelse(`$1', `1', `PROC_STRING_N_EX(`dst->$2', `src->$2', NSIZE, `$2', `UChar')
72    ', `
73        if (ifelse(`$1', `', `UG(unicode)', `src->$1')) {
74            PROC_STRING_N_EX(`dst->$2', `src->$2', NSIZE, `$2', `UChar')
75        }
76        else {
77            PROC_STRING_N_EX(`dst->$2', `src->$2', NSIZE, `$2', `char')
78        }
79    ')
80#else
81    DONE(`$2')
82    PROC_STRING_N_EX(`dst->$2', `src->$2', NSIZE, `$2', `char')
83#endif
84    popdef(`NSIZE')
85')
86// }}}
87define(`PROC_USTRING_L', `DBG(`$0($*)') PROC_USTRING_N(`$1', `$2', `$3', `len')')
88define(`PROC_USTRING', `DBG(`$0($*)') PROC_USTRING_N(`$1', `$2', , `strlen')')
Note: See TracBrowser for help on using the repository browser.