Logo Search packages:      
Sourcecode: icu version File versions  Download package

U_STABLE UChar* U_EXPORT2 u_strFindLast ( const UChar *  s,
int32_t  length,
const UChar *  substring,
int32_t  subLength 

Find the last occurrence of a substring in a string. The substring is found at code point boundaries. That means that if the substring begins with a trail surrogate or ends with a lead surrogate, then it is found only if these surrogates stand alone in the text. Otherwise, the substring edge units would be matched against halves of surrogate pairs.

s The string to search.
length The length of s (number of UChars), or -1 if it is NUL-terminated.
substring The substring to find (NUL-terminated).
subLength The length of substring (number of UChars), or -1 if it is NUL-terminated.
A pointer to the last occurrence of substring in s, or s itself if the substring is empty, or NULL if substring is not in s. ICU 2.4
See also:


Definition at line 283 of file ustring.c.

References NULL, U16_IS_SURROGATE, and u_strlen().

    const UChar *start, *limit, *p, *q, *subLimit;
    UChar c, cs;

    if(sub==NULL || subLength<-1) {
        return (UChar *)s;
    if(s==NULL || length<-1) {
        return NULL;

     * This implementation is more lazy than the one for u_strFindFirst():
     * There is no special search code for NUL-terminated strings.
     * It does not seem to be worth it for searching substrings to
     * search forward and find all matches like in u_strrchr() and similar.
     * Therefore, we simply get both string lengths and search backward.
     * markus 2002oct23

    if(subLength<0) {
    if(subLength==0) {
        return (UChar *)s;

    /* get sub[subLength-1] to search for it fast */

    if(subLength==0 && !U16_IS_SURROGATE(cs)) {
        /* the substring consists of a single, non-surrogate BMP code point */
        return length<0 ? u_strrchr(s, cs) : u_memrchr(s, cs, length);

    if(length<0) {

    /* subLength was decremented above */
    if(length<=subLength) {
        return NULL; /* s is shorter than sub */


    /* the substring must start no later than s+subLength */

    while(s!=limit) {
        if(c==cs) {
            /* found last substring UChar, compare rest */
            for(;;) {
                if(q==sub) {
                    if(isMatchAtCPBoundary(start, p, limit+1, start+length)) {
                        return (UChar *)p; /* well-formed match */
                    } else {
                        break; /* no match because surrogate pair is split */
                if(*(--p)!=*(--q)) {
                    break; /* no match */

    /* not found */
    return NULL;

Generated by  Doxygen 1.6.0   Back to index