nsCarbonBreaker.cpp (1403B)
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* This Source Code Form is subject to the terms of the Mozilla Public 3 * License, v. 2.0. If a copy of the MPL was not distributed with this 4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 5 6 #include <CoreFoundation/CoreFoundation.h> 7 #include <stdint.h> 8 #include "nsDebug.h" 9 #include "nscore.h" 10 11 void NS_GetComplexLineBreaks(const char16_t* aText, uint32_t aLength, 12 uint8_t* aBreakBefore) { 13 NS_ASSERTION(aText, "aText shouldn't be null"); 14 15 memset(aBreakBefore, 0, aLength * sizeof(uint8_t)); 16 17 CFStringRef str = ::CFStringCreateWithCharactersNoCopy( 18 kCFAllocatorDefault, reinterpret_cast<const UniChar*>(aText), aLength, 19 kCFAllocatorNull); 20 if (!str) { 21 return; 22 } 23 24 CFStringTokenizerRef st = ::CFStringTokenizerCreate( 25 kCFAllocatorDefault, str, ::CFRangeMake(0, aLength), 26 kCFStringTokenizerUnitLineBreak, nullptr); 27 if (!st) { 28 ::CFRelease(str); 29 return; 30 } 31 32 CFStringTokenizerTokenType tt = ::CFStringTokenizerAdvanceToNextToken(st); 33 while (tt != kCFStringTokenizerTokenNone) { 34 CFRange r = ::CFStringTokenizerGetCurrentTokenRange(st); 35 if (r.location != 0) { // Ignore leading edge 36 aBreakBefore[r.location] = true; 37 } 38 tt = CFStringTokenizerAdvanceToNextToken(st); 39 } 40 41 ::CFRelease(st); 42 ::CFRelease(str); 43 }