Check if the string contains more Unicode code points than a certain number. This is more efficient than counting all code points in the entire string and comparing that number with a threshold. This function may not need to scan the string at all if the length is known (not -1 for NUL-termination) and falls within a certain range, and never needs to count more than 'number+1' code points. Logically equivalent to (u_countChar32(s, length)>number). A Unicode code point may occupy either one or two UChar code units.
Definition at line 1045 of file ustring.c. References FALSE, NULL, TRUE, U16_IS_LEAD, and U16_IS_TRAIL. { if(number<0) { return TRUE; } if(s==NULL || length<-1) { return FALSE; } if(length==-1) { /* s is NUL-terminated */ UChar c; /* count code points until they exceed */ for(;;) { if((c=*s++)==0) { return FALSE; } if(number==0) { return TRUE; } if(U16_IS_LEAD(c) && U16_IS_TRAIL(*s)) { ++s; } --number; } } else { /* length>=0 known */ const UChar *limit; int32_t maxSupplementary; /* s contains at least (length+1)/2 code points: <=2 UChars per cp */ if(((length+1)/2)>number) { return TRUE; } /* check if s does not even contain enough UChars */ maxSupplementary=length-number; if(maxSupplementary<=0) { return FALSE; } /* there are maxSupplementary=length-number more UChars than asked-for code points */ /* * count code points until they exceed and also check that there are * no more than maxSupplementary supplementary code points (UChar pairs) */ limit=s+length; for(;;) { if(s==limit) { return FALSE; } if(number==0) { return TRUE; } if(U16_IS_LEAD(*s++) && s!=limit && U16_IS_TRAIL(*s)) { ++s; if(--maxSupplementary<=0) { /* too many pairs - too few code points */ return FALSE; } } --number; } } }
|