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