tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 }