| Index: mojo/public/dart/third_party/utf/lib/src/util.dart
|
| diff --git a/mojo/public/dart/third_party/utf/lib/src/util.dart b/mojo/public/dart/third_party/utf/lib/src/util.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..17427d5c4a839212768538858aae16b8d38f1a84
|
| --- /dev/null
|
| +++ b/mojo/public/dart/third_party/utf/lib/src/util.dart
|
| @@ -0,0 +1,78 @@
|
| +// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +library utf.util;
|
| +
|
| +import 'constants.dart';
|
| +import 'list_range.dart';
|
| +import 'utf_16_code_unit_decoder.dart';
|
| +
|
| +/**
|
| + * Decodes the utf16 codeunits to codepoints.
|
| + */
|
| +List<int> utf16CodeUnitsToCodepoints(
|
| + List<int> utf16CodeUnits, [int offset = 0, int length,
|
| + int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
|
| + ListRangeIterator source =
|
| + (new ListRange(utf16CodeUnits, offset, length)).iterator;
|
| + Utf16CodeUnitDecoder decoder = new Utf16CodeUnitDecoder
|
| + .fromListRangeIterator(source, replacementCodepoint);
|
| + List<int> codepoints = new List<int>(source.remaining);
|
| + int i = 0;
|
| + while (decoder.moveNext()) {
|
| + codepoints[i++] = decoder.current;
|
| + }
|
| + if (i == codepoints.length) {
|
| + return codepoints;
|
| + } else {
|
| + List<int> codepointTrunc = new List<int>(i);
|
| + codepointTrunc.setRange(0, i, codepoints);
|
| + return codepointTrunc;
|
| + }
|
| +}
|
| +
|
| +/**
|
| + * Encode code points as UTF16 code units.
|
| + */
|
| +List<int> codepointsToUtf16CodeUnits(
|
| + List<int> codepoints,
|
| + [int offset = 0,
|
| + int length,
|
| + int replacementCodepoint = UNICODE_REPLACEMENT_CHARACTER_CODEPOINT]) {
|
| +
|
| + ListRange listRange = new ListRange(codepoints, offset, length);
|
| + int encodedLength = 0;
|
| + for (int value in listRange) {
|
| + if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
|
| + (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
|
| + encodedLength++;
|
| + } else if (value > UNICODE_PLANE_ONE_MAX &&
|
| + value <= UNICODE_VALID_RANGE_MAX) {
|
| + encodedLength += 2;
|
| + } else {
|
| + encodedLength++;
|
| + }
|
| + }
|
| +
|
| + List<int> codeUnitsBuffer = new List<int>(encodedLength);
|
| + int j = 0;
|
| + for (int value in listRange) {
|
| + if ((value >= 0 && value < UNICODE_UTF16_RESERVED_LO) ||
|
| + (value > UNICODE_UTF16_RESERVED_HI && value <= UNICODE_PLANE_ONE_MAX)) {
|
| + codeUnitsBuffer[j++] = value;
|
| + } else if (value > UNICODE_PLANE_ONE_MAX &&
|
| + value <= UNICODE_VALID_RANGE_MAX) {
|
| + int base = value - UNICODE_UTF16_OFFSET;
|
| + codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_0_BASE +
|
| + ((base & UNICODE_UTF16_HI_MASK) >> 10);
|
| + codeUnitsBuffer[j++] = UNICODE_UTF16_SURROGATE_UNIT_1_BASE +
|
| + (base & UNICODE_UTF16_LO_MASK);
|
| + } else if (replacementCodepoint != null) {
|
| + codeUnitsBuffer[j++] = replacementCodepoint;
|
| + } else {
|
| + throw new ArgumentError("Invalid encoding");
|
| + }
|
| + }
|
| + return codeUnitsBuffer;
|
| +}
|
|
|