KWQTextUtilities.cpp [plain text]
#import "KWQTextUtilities.h"
#import <qstring.h>
#import <CoreServices/CoreServices.h>
void KWQFindWordBoundary(QChar *chars, int len, int position, int *start, int *end)
{
TextBreakLocatorRef breakLocator;
OSStatus status = UCCreateTextBreakLocator(NULL, 0, kUCTextBreakWordMask, &breakLocator);
if (status == noErr) {
UniCharArrayOffset startOffset, endOffset;
status = UCFindTextBreak(breakLocator, kUCTextBreakWordMask, 0, (const UniChar *)chars, len, position, &endOffset);
if (status == noErr) {
status = UCFindTextBreak(breakLocator, kUCTextBreakWordMask, kUCTextBreakGoBackwardsMask, (const UniChar *)chars, len, position, &startOffset);
}
UCDisposeTextBreakLocator(&breakLocator);
if (status == noErr) {
*start = startOffset;
*end = endOffset;
return;
}
}
if (chars[position].isSpace()) {
int pos = position;
while (chars[pos].isSpace() && pos >= 0)
pos--;
*start = pos+1;
pos = position;
while (chars[pos].isSpace() && pos < (int)len)
pos++;
*end = pos;
} else if (chars[position].isPunct()) {
int pos = position;
while (chars[pos].isPunct() && pos >= 0)
pos--;
*start = pos+1;
pos = position;
while (chars[pos].isPunct() && pos < (int)len)
pos++;
*end = pos;
} else {
int pos = position;
while (!chars[pos].isSpace() && !chars[pos].isPunct() && pos >= 0)
pos--;
*start = pos+1;
pos = position;
while (!chars[pos].isSpace() && !chars[pos].isPunct() && pos < (int)len)
pos++;
*end = pos;
}
}