source: branches/1.3/processor/string.m4 @ 622

Last change on this file since 622 was 622, checked in by moo, 5 years ago

merged r504:513 from trunk

  • Property svn:eol-style set to native
File size: 3.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(`PTRTYPE', ifelse(
6            STRTYPE, `char',      `char',
7            STRTYPE, `zstr_char', `char',
8            `',      `',          `UChar'))
9    pushdef(`ISTYPE', ifelse(STRTYPE,`zstr_uchar',IS_UNICODE,IS_STRING))
10    pushdef(`UNI_STRLEN', ifelse(
11            STRTYPE, `zstr_uchar', `xc_zstrlen_uchar',
12            STRTYPE, `zstr_char',  `xc_zstrlen_char',
13            `',      `',           `strlen'))
14    pushdef(`SRCSTR', ifelse(STRTYPE,`char',`ZSTR($2)',`$2'))
15    pushdef(`SRCPTR', ifelse(
16            STRTYPE, `zstr_uchar', `ZSTR_U($2)',
17            STRTYPE, `zstr_char',  `ZSTR_S($2)',
18            `',      `',           `$2'))
19    pushdef(`DSTPTR', ifelse(
20            STRTYPE, `zstr_uchar', `ZSTR_U($1)',
21            STRTYPE, `zstr_char',  `ZSTR_S($1)',
22            `',      `',           `$1'))
23    if (SRCPTR == NULL) {
24        IFNOTMEMCPY(`IFCOPY(`
25            DSTPTR = NULL;
26        ')')
27        IFDASM(`
28            add_assoc_null_ex(dst, ZEND_STRS("$4"));
29        ')
30    }
31    else {
32        IFDPRINT(`INDENT()
33            ifelse(STRTYPE, `zstr_uchar', `
34#ifdef IS_UNICODE
35            do {
36                zval zv;
37                zval reszv;
38                int usecopy;
39
40                INIT_ZVAL(zv);
41                ZVAL_UNICODEL(&zv, ZSTR_U($2), $3 - 1, 1);
42                zend_make_printable_zval(&zv, &reszv, &usecopy);
43                fprintf(stderr, "string:%s:\t\"", "$1");
44                xc_dprint_str_len(Z_STRVAL(reszv), Z_STRLEN(reszv));
45                fprintf(stderr, "\" len=%d\n", $3 - 1);
46                if (usecopy) {
47                    zval_dtor(&reszv);
48                }
49                zval_dtor(&zv);
50            } while (0);
51#endif
52            ', `
53            fprintf(stderr, "string:%s:\t\"", "$1");
54            xc_dprint_str_len(SRCPTR, $3 - 1);
55            fprintf(stderr, "\" len=%d\n", $3 - 1);
56            ')
57        ')
58        IFCALC(`xc_calc_string_n(processor, ISTYPE, SRCSTR, $3 IFASSERT(`, __LINE__'));')
59        IFSTORE(`DSTPTR = ifelse(PTRTYPE,`char',`ZSTR_S',`ZSTR_U')(xc_store_string_n(processor, ISTYPE, SRCSTR, $3 IFASSERT(`, __LINE__')));')
60        IFRESTORE(`
61            ALLOC(DSTPTR, `STRTYPE', `($3)')
62            memcpy(DSTPTR, SRCPTR, sizeof(STRTYPE) * ($3));
63        ')
64        FIXPOINTER_EX(`PTRTYPE', DSTPTR)
65        IFDASM(`
66            ifelse(STRTYPE,zstr_uchar, `
67                add_assoc_unicodel_ex(dst, ZEND_STRS("$4"), ZSTR_U($2), $3-1, 1);
68                ', ` dnl else
69                ifelse(STRTYPE,zstr_char, `
70                    add_assoc_stringl_ex(dst, ZEND_STRS("$4"), ZSTR_S($2), $3-1, 1);
71                    ', `
72                    add_assoc_stringl_ex(dst, ZEND_STRS("$4"), $2, $3-1, 1);
73                ')
74            ')
75        ')
76    }
77    popdef(`DSTPTR')
78    popdef(`SRCPTR')
79    popdef(`SRCSTR')
80    popdef(`UNI_STRLEN')
81    popdef(`STRTYPE')
82    popdef(`ISTYPE')
83')
84dnl }}}
85dnl PROC_STRING_N(1:name, 2:size, 3:type)
86define(`PROC_STRING_N', `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `src->$2', `$1', `char')')
87
88define(`PROC_STRING_L', `DBG(`$0($*)') PROC_STRING_N(`$1', `$2 + 1')')
89define(`PROC_STRING',   `DBG(`$0($*)') DONE(`$1')`'PROC_STRING_N_EX(`dst->$1', `src->$1', `strlen(src->$1) + 1', `$1', `char')')
90
91dnl {{{ PROC_ZSTRING_N(1:type, 2:name, 3:size, 4:size_type)
92define(`PROC_ZSTRING_N', `
93    DBG(`$0($*)')
94#ifdef IS_UNICODE
95    pushdef(`NSIZE', ifelse(
96            `$4', `strlen', `UNI_STRLEN (src->$2) + 1',
97            `$4', `len',    `src->$3 + 1',
98            `',   `',       `src->$3',
99            ))
100    DONE(`$2')
101    ifelse(`$1', `1', `PROC_STRING_N_EX(`dst->$2', `src->$2', defn(`NSIZE'), `$2', `zstr_uchar')
102    ', `
103        if (ifelse(`$1', `', `UG(unicode)', `src->$1 == IS_UNICODE')) {
104            PROC_STRING_N_EX(`dst->$2', `src->$2', defn(`NSIZE'), `$2', `zstr_uchar')
105        }
106        else {
107            PROC_STRING_N_EX(`dst->$2', `src->$2', defn(`NSIZE'), `$2', `zstr_char')
108        }
109    ')
110#else
111    DONE(`$2')
112    PROC_STRING_N_EX(`dst->$2', `src->$2', NSIZE, `$2', `zstr_char')
113#endif
114    popdef(`NSIZE')
115')
116dnl }}}
117define(`PROC_ZSTRING_L', `DBG(`$0($*)') PROC_ZSTRING_N(`$1', `$2', `$3', `len')')
118define(`PROC_ZSTRING', `DBG(`$0($*)') PROC_ZSTRING_N(`$1', `$2', , `strlen')')
Note: See TracBrowser for help on using the repository browser.