andrei Tue Jul 11 17:48:14 2006 UTC Modified files: /php-src/ext/unicode unicode_iterators.c Log: Implement getRuleStatus() and getRuleStatusArray() as well as related constants. http://cvs.php.net/viewvc.cgi/php-src/ext/unicode/unicode_iterators.c?r1=1.40&r2=1.41&diff_format=u Index: php-src/ext/unicode/unicode_iterators.c diff -u php-src/ext/unicode/unicode_iterators.c:1.40 php-src/ext/unicode/unicode_iterators.c:1.41 --- php-src/ext/unicode/unicode_iterators.c:1.40 Tue Jul 11 16:20:21 2006 +++ php-src/ext/unicode/unicode_iterators.c Tue Jul 11 17:48:14 2006 @@ -14,7 +14,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: unicode_iterators.c,v 1.40 2006/07/11 16:20:21 andrei Exp $ */ +/* $Id: unicode_iterators.c,v 1.41 2006/07/11 17:48:14 andrei Exp $ */ /* * TODO @@ -99,7 +99,6 @@ UBRK_SENTENCE, }; -PHPAPI zend_class_entry* text_iterator_aggregate_ce; PHPAPI zend_class_entry* text_iterator_ce; PHPAPI zend_class_entry* rev_text_iterator_ce; @@ -1123,7 +1122,7 @@ } /* - * ReverseTextIterator will behave the same as the normal one. + * ReverseTextIterator will behave in the same way as the normal one. */ flags = intern->flags | ITER_REVERSE; iter_ops[intern->type]->following(intern, offset, flags TSRMLS_CC); @@ -1141,7 +1140,7 @@ } /* - * ReverseTextIterator will behave the same as the normal one. + * ReverseTextIterator will behave in the same way as the normal one. */ RETURN_BOOL(iter_ops[intern->type]->isBoundary(intern, offset, intern->flags TSRMLS_CC)); } @@ -1154,10 +1153,6 @@ return; } - if (!return_value_used) { - return; - } - array_init(return_value); count = ubrk_countAvailable(); for (i = 0; i < count; i++) { @@ -1165,6 +1160,56 @@ } } +PHP_METHOD(TextIterator, getRuleStatus) +{ + zval *object = getThis(); + text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + return; + } + + if (intern->type >= ITER_CHARACTER && intern->type < ITER_TYPE_LAST) { + RETURN_LONG(ubrk_getRuleStatus(intern->u.brk.iter)); + } else { + RETURN_LONG(0); + } +} + +PHP_METHOD(TextIterator, getRuleStatusArray) +{ + int32_t status_vec[32], *vec_ptr = status_vec; + int32_t vec_size, i; + zval *object = getThis(); + text_iter_obj *intern = (text_iter_obj*) zend_object_store_get_object(object TSRMLS_CC); + UErrorCode status = U_ZERO_ERROR; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "") == FAILURE) { + return; + } + + array_init(return_value); + if (intern->type < ITER_CHARACTER) { + add_next_index_long(return_value, 0); + } else { + vec_size = sizeof(status_vec) / sizeof(status_vec[0]); + vec_size = ubrk_getRuleStatusVec(intern->u.brk.iter, vec_ptr, vec_size, &status); + if (status == U_BUFFER_OVERFLOW_ERROR) { + vec_ptr = safe_emalloc(vec_size, sizeof(int32_t), 0); + status = U_ZERO_ERROR; + vec_size = ubrk_getRuleStatusVec(intern->u.brk.iter, vec_ptr, vec_size, &status); + } + + for (i = 0; i < vec_size; i++) { + add_next_index_long(return_value, vec_ptr[i]); + } + + if (vec_ptr != status_vec) { + efree(vec_ptr); + } + } +} + static zend_function_entry text_iterator_funcs[] = { PHP_ME(TextIterator, __construct, NULL, ZEND_ACC_PUBLIC) @@ -1183,6 +1228,9 @@ PHP_ME(TextIterator, preceding, NULL, ZEND_ACC_PUBLIC) PHP_ME(TextIterator, isBoundary, NULL, ZEND_ACC_PUBLIC) + PHP_ME(TextIterator, getRuleStatus, NULL, ZEND_ACC_PUBLIC) + PHP_ME(TextIterator, getRuleStatusArray, NULL, ZEND_ACC_PUBLIC) + PHP_ME(TextIterator, getAvailableLocales, NULL, ZEND_ACC_PUBLIC | ZEND_ACC_STATIC) PHP_MALIAS(TextIterator, first, rewind, NULL, ZEND_ACC_PUBLIC) @@ -1207,14 +1255,35 @@ rev_text_iterator_ce->ce_flags |= ZEND_ACC_FINAL_CLASS; zend_class_implements(rev_text_iterator_ce TSRMLS_CC, 1, zend_ce_iterator); - zend_declare_class_constant_long(text_iterator_ce, "CODE_POINT", sizeof("CODE_POINT")-1, ITER_CODE_POINT TSRMLS_CC); - zend_declare_class_constant_long(text_iterator_ce, "COMB_SEQUENCE", sizeof("COMB_SEQUENCE")-1, ITER_COMB_SEQUENCE TSRMLS_CC); - zend_declare_class_constant_long(text_iterator_ce, "CHARACTER", sizeof("CHARACTER")-1, ITER_CHARACTER TSRMLS_CC); - zend_declare_class_constant_long(text_iterator_ce, "WORD", sizeof("WORD")-1, ITER_WORD TSRMLS_CC); - zend_declare_class_constant_long(text_iterator_ce, "LINE", sizeof("LINE")-1, ITER_LINE TSRMLS_CC); - zend_declare_class_constant_long(text_iterator_ce, "SENTENCE", sizeof("SENTENCE")-1, ITER_SENTENCE TSRMLS_CC); - - zend_declare_class_constant_long(text_iterator_ce, "DONE", sizeof("DONE")-1, UBRK_DONE TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "CODE_POINT", sizeof("CODE_POINT")-1, ITER_CODE_POINT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "COMB_SEQUENCE", sizeof("COMB_SEQUENCE")-1, ITER_COMB_SEQUENCE TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "CHARACTER", sizeof("CHARACTER")-1, ITER_CHARACTER TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD", sizeof("WORD")-1, ITER_WORD TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "LINE", sizeof("LINE")-1, ITER_LINE TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "SENTENCE", sizeof("SENTENCE")-1, ITER_SENTENCE TSRMLS_CC); + + zend_declare_class_constant_long(text_iterator_ce, "DONE", sizeof("DONE")-1, UBRK_DONE TSRMLS_CC); + + zend_declare_class_constant_long(text_iterator_ce, "WORD_NONE", sizeof("WORD_NONE")-1, UBRK_WORD_NONE TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_NONE_LIMIT", sizeof("WORD_NONE_LIMIT")-1, UBRK_WORD_NONE_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_NUMBER", sizeof("WORD_NUMBER")-1, UBRK_WORD_NUMBER TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_NUMBER_LIMIT", sizeof("WORD_NUMBER_LIMIT")-1, UBRK_WORD_NUMBER_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_LETTER", sizeof("WORD_LETTER")-1, UBRK_WORD_LETTER TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_LETTER_LIMIT", sizeof("WORD_LETTER_LIMIT")-1, UBRK_WORD_LETTER_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_KANA", sizeof("WORD_KANA")-1, UBRK_WORD_KANA TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_KANA_LIMIT", sizeof("WORD_KANA_LIMIT")-1, UBRK_WORD_KANA_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_IDEO", sizeof("WORD_IDEO")-1, UBRK_WORD_IDEO TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "WORD_IDEO_LIMIT", sizeof("WORD_IDEO_LIMIT")-1, UBRK_WORD_IDEO_LIMIT TSRMLS_CC); + + zend_declare_class_constant_long(text_iterator_ce, "LINE_SOFT", sizeof("LINE_SOFT")-1, UBRK_LINE_SOFT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "LINE_SOFT_LIMIT", sizeof("LINE_SOFT_LIMIT")-1, UBRK_LINE_SOFT_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "LINE_HARD", sizeof("LINE_HARD")-1, UBRK_LINE_HARD TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "LINE_HARD_LIMIT", sizeof("LINE_HARD_LIMIT")-1, UBRK_LINE_HARD_LIMIT TSRMLS_CC); + + zend_declare_class_constant_long(text_iterator_ce, "SENTENCE_TERM", sizeof("SENTENCE_TERM")-1, UBRK_SENTENCE_TERM TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "SENTENCE_TERM_LIMIT", sizeof("SENTENCE_TERM_LIMIT")-1, UBRK_SENTENCE_TERM_LIMIT TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "SENTENCE_SEP", sizeof("SENTENCE_SEP")-1, UBRK_SENTENCE_SEP TSRMLS_CC); + zend_declare_class_constant_long(text_iterator_ce, "SENTENCE_SEP_LIMIT", sizeof("SENTENCE_SEP_LIMIT")-1, UBRK_SENTENCE_SEP_LIMIT TSRMLS_CC); } /*
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php