andrei Thu Dec 7 22:00:55 2006 UTC
Modified files:
/php-src/ext/standard datetime.c
Log:
Unicode support in strptime(). Uses runtime encoding for conversion.
# Blah, those new _ut_ macros might be necessary after all.
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/datetime.c?r1=1.140&r2=1.141&diff_format=u
Index: php-src/ext/standard/datetime.c
diff -u php-src/ext/standard/datetime.c:1.140
php-src/ext/standard/datetime.c:1.141
--- php-src/ext/standard/datetime.c:1.140 Tue Sep 19 10:38:31 2006
+++ php-src/ext/standard/datetime.c Thu Dec 7 22:00:55 2006
@@ -18,7 +18,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: datetime.c,v 1.140 2006/09/19 10:38:31 dmitry Exp $ */
+/* $Id: datetime.c,v 1.141 2006/12/07 22:00:55 andrei Exp $ */
#include "php.h"
#include "zend_operators.h"
@@ -85,25 +85,39 @@
char *strptime(const char *s, const char *format, struct tm *tm);
#endif
-/* {{{ proto string strptime(string timestamp, string format)
+/* {{{ proto string strptime(string timestamp, string format) U
Parse a time/date generated with strftime() */
PHP_FUNCTION(strptime)
{
- char *ts;
+ zstr ts;
int ts_length;
- char *format;
+ zstr format;
int format_length;
struct tm parsed_time;
char *unparsed_part;
+ zend_uchar type;
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss",
- &ts, &ts_length, &format, &format_length) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "TT",
+ &ts, &ts_length, &type, &format, &format_length, &type) ==
FAILURE) {
return;
}
+ if (type == IS_UNICODE) {
+ char *temp;
+ int temp_len;
+
+
zend_unicode_to_string(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &temp,
&temp_len, ts.u, ts_length TSRMLS_CC);
+ ts.s = temp;
+ ts_length = temp_len;
+
+
zend_unicode_to_string(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &temp,
&temp_len, format.u, format_length TSRMLS_CC);
+ format.s = temp;
+ format_length = temp_len;
+ }
+
memset(&parsed_time, 0, sizeof(parsed_time));
- unparsed_part = strptime(ts, format, &parsed_time);
+ unparsed_part = strptime(ts.s, format.s, &parsed_time);
if (unparsed_part == NULL) {
RETURN_FALSE;
}
@@ -117,7 +131,18 @@
add_ascii_assoc_long(return_value, "tm_year", parsed_time.tm_year);
add_ascii_assoc_long(return_value, "tm_wday", parsed_time.tm_wday);
add_ascii_assoc_long(return_value, "tm_yday", parsed_time.tm_yday);
- add_ascii_assoc_string(return_value, "unparsed", unparsed_part, 1);
+ if (type == IS_UNICODE) {
+ UChar *temp;
+ int temp_len;
+
+
zend_string_to_unicode(ZEND_U_CONVERTER(UG(runtime_encoding_conv)), &temp,
&temp_len, unparsed_part, strlen(unparsed_part) TSRMLS_CC);
+ add_ascii_assoc_unicodel(return_value, "unparsed", temp,
temp_len, 0);
+
+ efree(ts.s);
+ efree(format.s);
+ } else {
+ add_ascii_assoc_string(return_value, "unparsed", unparsed_part,
1);
+ }
}
/* }}} */
#endif
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php