source: trunk/processor/string.m4 @ 1471

Last change on this file since 1471 was 1471, checked in by moo, 9 months ago

relocate: rename marcos to relocate

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