| // 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 |