Browse Source

- Add ^ specifier that returns original string type before conversion.

- Add ZVAL_ENC_STRING[L] macro that allows returning either a binary
  string or an encoded strings as Unicode based on type, instead of
  UG(unicode)
migration/RELEASE_1_0_0
Andrei Zmievski 19 years ago
parent
commit
135c947f8d
  1. 2
      README.PARAMETER_PARSING_API
  2. 18
      Zend/zend_API.c
  3. 44
      Zend/zend_API.h

2
README.PARAMETER_PARSING_API

@ -74,6 +74,8 @@ Type specifiers
pointer is set to NULL as well.
& - alternate format (currently used for 's' only to specify a converter to
use when converting from Unicode strings)
^ - returns original string type before conversion (only for 's' and 'u'
specifiers)
Examples
--------

18
Zend/zend_API.c

@ -316,6 +316,8 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
char c = *spec_walk++;
int return_null = 0;
int alternate_form = 0;
int return_orig_type = 0;
zend_uchar orig_type;
/* scan through modifiers */
while (1) {
@ -327,6 +329,9 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
if (Z_TYPE_PP(arg) == IS_NULL) {
return_null = 1;
}
} else if (*spec_walk == '^') {
return_orig_type = 1;
orig_type = Z_TYPE_PP(arg);
} else {
break;
}
@ -443,6 +448,11 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
conv = va_arg(*va, UConverter *);
}
if (return_orig_type) {
zend_uchar *type = va_arg(*va, zend_uchar *);
*type = orig_type;
}
switch (Z_TYPE_PP(arg)) {
case IS_NULL:
if (return_null) {
@ -497,6 +507,12 @@ static char *zend_parse_arg_impl(int arg_num, zval **arg, va_list *va, char **sp
{
UChar **p = va_arg(*va, UChar **);
int *pl = va_arg(*va, int *);
if (return_orig_type) {
zend_uchar *type = va_arg(*va, zend_uchar *);
*type = orig_type;
}
switch (Z_TYPE_PP(arg)) {
case IS_NULL:
if (return_null) {
@ -882,7 +898,7 @@ static int zend_parse_va_args(int num_args, char *type_spec, va_list *va, int fl
break;
case '/': case '!':
case '&':
case '&': case '^':
/* Pass */
break;

44
Zend/zend_API.h

@ -1796,6 +1796,46 @@ END_EXTERN_C()
ZVAL_EMPTY_STRING(z); \
}
#define ZVAL_ENC_STRINGL(z, t, conv, s, l, flags) \
if (t == IS_UNICODE) { \
char *__s = (char *)(s); \
int __s_len = (l); \
UChar *u_str; \
int u_len; \
if (zend_string_to_unicode(conv, &u_str, &u_len, __s, __s_len TSRMLS_CC) == SUCCESS) { \
ZVAL_UNICODEL(z, u_str, u_len, 0); \
} \
if ((flags) & ZSTR_AUTOFREE) { \
efree(__s); \
} \
} else { \
char *__s=(char *)(s); int __l=l; \
Z_STRLEN_P(z) = __l; \
Z_STRVAL_P(z) = (((flags) & ZSTR_DUPLICATE) ? estrndup(__s, __l) : __s); \
Z_TYPE_P(z) = IS_STRING; \
} \
}
#define ZVAL_ENC_STRING(z, t, conv, s, flags) \
if (t == IS_UNICODE) { \
char *__s = (char *)(s); \
int __s_len = strlen(__s); \
UChar *u_str; \
int u_len; \
if (zend_string_to_unicode(conv, &u_str, &u_len, __s, __s_len TSRMLS_CC) == SUCCESS) { \
ZVAL_UNICODEL(z, u_str, u_len, 0); \
} \
if ((flags) & ZSTR_AUTOFREE) { \
efree(__s); \
} \
} else { \
char *__s=(char *)(s); \
Z_STRLEN_P(z) = strlen(__s); \
Z_STRVAL_P(z) = (((flags) & ZSTR_DUPLICATE) ? estrndup(__s, Z_STRLEN_P(z)) : __s); \
Z_TYPE_P(z) = IS_STRING; \
} \
}
#define ZVAL_FALSE(z) ZVAL_BOOL(z, 0)
#define ZVAL_TRUE(z) ZVAL_BOOL(z, 1)
@ -1827,6 +1867,8 @@ END_EXTERN_C()
#define RETVAL_EMPTY_TEXT() ZVAL_EMPTY_TEXT(return_value)
#define RETVAL_ZSTR(type, s, duplicate) ZVAL_ZSTR(return_value, type, s, duplicate)
#define RETVAL_ZSTRL(type, s, l, duplicate) ZVAL_ZSTRL(return_value, type, s, l, duplicate)
#define RETVAL_ENC_STRINGL(type, conv, s, l, flags) ZVAL_ENC_STRINGL(return_value, t, conv, s, l, flags)
#define RETVAL_ENC_STRING(type, conv, s, flags) ZVAL_ENC_STRING(return_value, t, conv, s, flags)
#define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }
#define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
@ -1856,6 +1898,8 @@ END_EXTERN_C()
#define RETURN_UTF8_STRINGL(t, l, flags) { RETVAL_UTF8_STRINGL(t, l, flags); return; }
#define RETURN_ZSTR(type, s, duplicate) { RETVAL_ZSTR(type, s, duplicate); return; }
#define RETURN_ZSTRL(type, s, l, duplicate) { RETVAL_ZSTRL(type, s, l, duplicate); return; }
#define RETURN_ENC_STRINGL(type, conv, s, l, flags) { RETVAL_ENC_STRINGL(type, conv, s, l, flags); return; }
#define RETURN_ENC_STRING(type, conv, s, flags) { RETVAL_ENC_STRING(type, conv, s, flags); return; }
#define SET_VAR_STRING(n, v) { \
{ \

Loading…
Cancel
Save