RE: [PHP-I18N] Ideas for a portable string api
| From: | Dmitry Stogov | Date: | Fri, 17 Feb 2006 08:03:27 +0000 |
| Subject: | RE: [PHP-I18N] Ideas for a portable string api | ||
| References: | 1 | Groups: | php.i18n |
| Request: | Send a blank email to php-i18n+get-927@lists.php.net to get a copy of this message | ||
We already discussd these solutions with Andrei and Marcus.
I'll start implementation at Monday.
Thanks. Dmitry.
> -----Original Message-----
> From: Andi Gutmans [mailto:andi@zend.com]
> Sent: Friday, February 17, 2006 6:09 AM
> To: Dmitry Stogov; php-i18n@lists.php.net
> Subject: RE: [PHP-I18N] Ideas for a portable string api
>
>
> 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
>
>
>