@@ -1135,4 +1135,63 @@ U_CFUNC PHP_FUNCTION(grapheme_levenshtein)
11351135 efree (ustring1);
11361136}
11371137
1138+ U_CFUNC PHP_FUNCTION (grapheme_strrev)
1139+ {
1140+ zend_string *string;
1141+ UText *ut = nullptr ;
1142+ UErrorCode ustatus = U_ZERO_ERROR;
1143+ UBreakIterator *bi;
1144+ char *pstr, *end, *p;
1145+ zend_string *ret;
1146+ int32_t pos = 0 , current = 0 , end_len = 0 ;
1147+ unsigned char u_break_iterator_buffer[U_BRK_SAFECLONE_BUFFERSIZE];
1148+
1149+ ZEND_PARSE_PARAMETERS_START (1 , 1 )
1150+ Z_PARAM_STR (string)
1151+ ZEND_PARSE_PARAMETERS_END ();
1152+
1153+ if (ZSTR_LEN (string) == 0 ) {
1154+ RETURN_EMPTY_STRING ();
1155+ }
1156+
1157+ pstr = ZSTR_VAL (string);
1158+ ut = utext_openUTF8 (ut, pstr, ZSTR_LEN (string), &ustatus);
1159+
1160+ if (U_FAILURE (ustatus)) {
1161+ intl_error_set_code (nullptr , ustatus);
1162+ intl_error_set_custom_msg (nullptr , " Error opening UTF-8 text" );
1163+
1164+ RETVAL_FALSE;
1165+ goto close;
1166+ }
1167+
1168+ bi = nullptr ;
1169+ ustatus = U_ZERO_ERROR;
1170+
1171+ bi = grapheme_get_break_iterator ((void *)u_break_iterator_buffer, &ustatus );
1172+ ret = zend_string_alloc (ZSTR_LEN (string), 0 );
1173+ p = ZSTR_VAL (ret);
1174+
1175+ ubrk_setUText (bi, ut, &ustatus);
1176+ pos = ubrk_last (bi);
1177+ if (pos == UBRK_DONE) {
1178+ goto ubrk_end;
1179+ }
1180+
1181+ current = ZSTR_LEN (string);
1182+ for (end = pstr; pos != UBRK_DONE; ) {
1183+ pos = ubrk_previous (bi);
1184+ end_len = current - pos;
1185+ for (int32_t j = 0 ; j < end_len; j++) {
1186+ *p++ = *(pstr + pos + j);
1187+ }
1188+ current = pos;
1189+ }
1190+ ubrk_end:
1191+ RETVAL_NEW_STR (ret);
1192+ ubrk_close (bi);
1193+ close:
1194+ utext_close (ut);
1195+ }
1196+
11381197/* }}} */
0 commit comments