RE: [PHP-I18N] Ideas for a portable string api
[email protected] (Andi Gutmans)
| Newsgroups | php.i18n |
|---|---|
| Message-ID | <[email protected]> |
I think this is a good approach (although debugging will not be easy,
but that's already a given for PHP :)
+1 from me.
Andi
At 01:12 AM 2/16/2006, Dmitry Stogov wrote:
>Hi,
>
>After reviewing Marcus ideas, some experiments and speaking with Andrei.
>I propose the following solutions:
>
>1) We will not use any kind of unicode literals in C code (no L"foo" no
>"f\0o\0o\0\0"),
>Because L"" is not portable and "f\0.." looks to ugly.
>
>2) We will change "zval" structure to make "zval.value.str.len" and
>"zval.value.ustr.len" of the same type.
>This will allow optimize Z_UNISTR() and Z_UNILEN() macros. They will
>
>#define Z_UNISTR(z) ((void*)(Z_STRVAL(z)))
>#define Z_UNILEN(z) ((void*)(Z_STRLEN(z)))
>
>Instead of
>
>#define Z_UNISTR(z) Z_TYPE(z)==IS_UNICODE?(char*)Z_USTRVAL(z):Z_STRVAL(z)
>#define Z_UNILEN(z) Z_TYPE(z)==IS_UNICODE?(int)Z_USTRLEN(z):Z_STRLEN(z)
>
>3) I don't like to break source compatibility with modification of "zval"
>layout as Marcus suggested.
>We will pass string/unicode values near in the same way as do today.
>As three values - zend_uchar type, void* str, int len.
>But we will create a set of the following macros to do it with less
>overhead.
>
>#define S_TYPE(x) _type_##x
>#define S_UNIVAL(x) _val_##x
>#define S_UNILEN(x) _len_##x
>#define S_STRVAL(x) ((char*)S_UNIVAL(x))
>#define S_USTRVAL(x) ((UChar*)S_UNIVAL(x))
>#define S_STRLEN(x) S_UNILEN(x)
>#define S_USTRLEN(x) S_UNILEN(x)
>
>#define S_ARG(x) zend_uchar S_TYPE(x), void *S_UNIVAL(x), int
>S_UNILEN(x)
>
>#define S_PASS(x) S_TYPE(x), S_UNIVAL(x), S_UNILEN(x)
>
>#define Z_STR_PASS(x) Z_TYPE(x), Z_UNIVAL(x), Z_UNILEN(x)
>#define Z_STR_PASS_P(x) Z_TYPE_P(x), Z_UNIVAL_P(x), Z_UNILEN_P(x)
>#define Z_STR_PASS_PP(x) Z_TYPE_PP(x), Z_UNIVAL_PP(x), Z_UNILEN_PP(x)
>
>Then most zend_u_... Functions must be rewriten with these macros
>
>Foe example:
>
>ZEND_API int zend_u_lookup_class(S_ARG(name), zend_class_entry ***ce
>TSRMLS_DC)
>{
> return zend_u_lookup_class_ex(S_PASS(name), 1, ce TSRMLS_CC);
>}
>
>Instead of
>
>ZEND_API int zend_u_lookup_class(zend_uchar type, void *name, int
>name_length, zend_class_entry ***ce TSRMLS_DC)
>{
> return zend_u_lookup_class_ex(type, name, name_length, 1, ce
>TSRMLS_CC);
>}
>
>Any objections, additions?
>
>Thanks. Dmitry.
>
>--
>PHP Unicode & I18N Mailing List (http://www.php.net/)
>To unsubscribe, visit: http://www.php.net/unsub.php