| // Copyright 2013 The Flutter Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "flutter/fml/platform/darwin/string_range_sanitization.h" |
| |
| namespace fml { |
| |
| NSRange RangeForCharacterAtIndex(NSString* text, NSUInteger index) { |
| if (text == nil || index >= text.length) { |
| return NSMakeRange(NSNotFound, 0); |
| } |
| if (index < text.length) |
| return [text rangeOfComposedCharacterSequenceAtIndex:index]; |
| return NSMakeRange(index, 0); |
| } |
| |
| NSRange RangeForCharactersInRange(NSString* text, NSRange range) { |
| if (text == nil || range.location + range.length > text.length) { |
| return NSMakeRange(NSNotFound, 0); |
| } |
| NSRange sanitizedRange = [text rangeOfComposedCharacterSequencesForRange:range]; |
| // We don't want to override the length, we just want to make sure we don't |
| // select into the middle of a multi-byte character. Taking the |
| // `sanitizedRange`'s length will end up altering the actual selection. |
| return NSMakeRange(sanitizedRange.location, range.length); |
| } |
| |
| } // namespace fml |