-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTDWhitespaceState.j
67 lines (51 loc) · 1.57 KB
/
TDWhitespaceState.j
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
@import "TDTokenizerState.j"
@implementation TDWhitespaceState : TDTokenizerState
{
CPArray whitespaceChars;
BOOL reportsWhitespaceTokens;
}
- (id)init
{
if (self = [super init])
{
whitespaceChars = [];
for (var i=0, len=255; i <= len; i++) {
[whitespaceChars addObject:NO];
}
[self setWhitespaceChars:YES from:0 to:255];
}
return self;
}
- (void)setWhitespaceChars:(BOOL)yn from:(unsigned)start to:(unsigned)end
{
var len = whitespaceChars.length;
if (start > len || end > len || start < 0 || end < 0)
[CPException raise:@"TDWhitespaceStateNotSupportedException" reason:@"TDWhitespaceState only supports setting word chars for chars in the latin1 set (under 256)"];
for (var i=start ; i <= end; i++) {
[whitespaceChars replaceObjectAtIndex:i withObject:yn];
}
}
- (BOOL)isWhitespaceChar:(unsigned)cin
{
if (cin < 0 || cin > whitespaceChars.length - 1)
return NO;
return !![whitespaceChars objectAtIndex:cin];
}
- (TDToken)nextTokenFromReader:(TDReader)r startingWith:(unsigned)cin tokenizer:(TDTokenizer)t
{
if (reportsWhitespaceTokens)
[self reset];
var c = cin;
while ([self isWhitespaceChar:c]) {
if (reportsWhitespaceTokens)
[self append:c];
c = [r read];
}
if (-1 != c)
[r unread];
if (reportsWhitespaceTokens)
return [TDToken tokenWithTokenType:TDTokenTypeWhitespace stringValue:[self bufferedString] floatValue:0.0];
else
return [t nextToken];
}
@end