Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(987)

Side by Side Diff: frog/leg/scanner/byte_strings.dart

Issue 9873021: Move frog/leg to lib/compiler/implementation. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « frog/leg/scanner/byte_array_scanner.dart ('k') | frog/leg/scanner/class_element_parser.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 /**
6 * An abstract string representation.
7 */
8 class ByteString implements SourceString {
9 final List<int> bytes;
10 final int offset;
11 final int length;
12 int _hashCode;
13
14 ByteString(List<int> this.bytes, int this.offset, int this.length);
15
16 abstract String get charset();
17
18 String slowToString() => new String.fromCharCodes(
19 new Utf8Decoder(bytes, offset, length).decodeRest());
20
21 String toString() => "ByteString(${slowToString()})";
22
23 bool operator ==(other) {
24 throw "should be overridden in subclass";
25 }
26
27 Iterator<int> iterator() => new Utf8Decoder(bytes, offset, length);
28
29 int hashCode() {
30 if (_hashCode === null) {
31 _hashCode = computeHashCode();
32 }
33 return _hashCode;
34 }
35
36 int computeHashCode() {
37 int code = 1;
38 int end = offset + length;
39 for (int i = offset; i < end; i++) {
40 code += 19 * code + bytes[i];
41 }
42 return code;
43 }
44
45 printOn(StringBuffer sb) {
46 sb.add(slowToString());
47 }
48
49 bool isEmpty() => length == 0;
50 }
51
52 /**
53 * A string that consists purely of 7bit ASCII characters.
54 */
55 class AsciiString extends ByteString {
56 final String charset = "ASCII";
57
58 AsciiString(List<int> bytes, int offset, int length)
59 : super(bytes, offset, length);
60
61 static AsciiString of(List<int> bytes, int offset, int length) {
62 AsciiString string = new AsciiString(bytes, offset, length);
63 return string;
64 }
65
66 Iterator<int> iterator() => new AsciiStringIterator(bytes);
67
68 SourceString copyWithoutQuotes(int initial, int terminal) {
69 return new AsciiString(bytes, offset + initial,
70 length - initial - terminal);
71 }
72
73
74 static AsciiString fromString(String string) {
75 List<int> bytes = string.charCodes();
76 return AsciiString.of(bytes, 0, bytes.length);
77 }
78 }
79
80
81 class AsciiStringIterator implements Iterator<int> {
82 final List<int> bytes;
83 int offset;
84 final int end;
85 AsciiStringIterator(List<int> bytes)
86 : this.bytes = bytes, offset = 0, end = bytes.length;
87 AsciiStringIterator.range(List<int> bytes, int from, int length)
88 : this.bytes = bytes, offset = from, end = from + length;
89 bool hasNext() => offset < end;
90 int next() => bytes[offset++];
91 }
92
93
94 /**
95 * A string that consists of characters that can be encoded as UTF-8.
96 */
97 class Utf8String extends ByteString {
98 final String charset = "UTF8";
99
100 Utf8String(List<int> bytes, int offset, int length)
101 : super(bytes, offset, length);
102
103 static Utf8String of(List<int> bytes, int offset, int length) {
104 return new Utf8String(bytes, offset, length);
105 }
106
107 static Utf8String fromString(String string) {
108 throw "not implemented yet";
109 }
110
111 Iterator<int> iterator() => new Utf8Decoder(bytes, 0, length);
112
113 SourceString copyWithoutQuotes(int initial, int terminal) {
114 assert((){
115 // Only allow dropping ASCII characters, to guarantee that
116 // the resulting Utf8String is still valid.
117 for (int i = 0; i < initial; i++) {
118 if (bytes[offset + i] >= 0x80) return false;
119 }
120 for (int i = 0; i < terminal; i++) {
121 if (bytes[offset + length - terminal + i] >= 0x80) return false;
122 }
123 return true;
124 });
125 // TODO(lrn): Check that first and last bytes use the same type of quotes.
126 return new Utf8String(bytes, offset + initial,
127 length - initial - terminal);
128 }
129 }
130
131 /**
132 * A ByteString-valued token.
133 */
134 class ByteStringToken extends Token {
135 final ByteString value;
136
137 ByteStringToken(PrecedenceInfo info, ByteString this.value, int charOffset)
138 : super(info, charOffset);
139
140 String toString() => value.toString();
141 }
OLDNEW
« no previous file with comments | « frog/leg/scanner/byte_array_scanner.dart ('k') | frog/leg/scanner/class_element_parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698