1818
1919// some utils to parser strings.
2020const std = @import ("std" );
21- const testing = std .testing ;
2221
2322pub const Reader = struct {
24- s : [] const u8 ,
25- i : usize = 0 ,
23+ pos : usize = 0 ,
24+ data : [] const u8 ,
2625
2726 pub fn until (self : * Reader , c : u8 ) []const u8 {
28- const ln = self .s .len ;
29- const start = self .i ;
30- while (self .i < ln ) {
31- if (c == self .s [self .i ]) return self .s [start .. self .i ];
32- self .i += 1 ;
33- }
27+ const pos = self .pos ;
28+ const data = self .data ;
3429
35- return self .s [start .. self .i ];
30+ const index = std .mem .indexOfScalarPos (u8 , data , pos , c ) orelse data .len ;
31+ self .pos = index ;
32+ return data [pos .. index ];
3633 }
3734
3835 pub fn tail (self : * Reader ) []const u8 {
39- if (self .i > self .s .len ) return "" ;
40- defer self .i = self .s .len ;
41- return self .s [self .i .. ];
36+ const pos = self .pos ;
37+ const data = self .data ;
38+ if (pos > data .len ) {
39+ return "" ;
40+ }
41+ self .pos = data .len ;
42+ return data [pos .. ];
4243 }
4344
4445 pub fn skip (self : * Reader ) bool {
45- if (self .i >= self .s .len ) return false ;
46- self .i += 1 ;
46+ const pos = self .pos ;
47+ if (pos >= self .data .len ) {
48+ return false ;
49+ }
50+ self .pos = pos + 1 ;
4751 return true ;
4852 }
4953};
@@ -69,61 +73,38 @@ fn AsUintReturn(comptime string: anytype) type {
6973 });
7074}
7175
72- test "Reader.skip" {
73- var r = Reader { .s = "foo" };
74- try testing .expect (r .skip ());
75- try testing .expect (r .skip ());
76- try testing .expect (r .skip ());
77- try testing .expect (! r .skip ());
78- try testing .expect (! r .skip ());
76+ const testing = std .testing ;
77+ test "parser.Reader: skip" {
78+ var r = Reader { .data = "foo" };
79+ try testing .expectEqual (true , r .skip ());
80+ try testing .expectEqual (true , r .skip ());
81+ try testing .expectEqual (true , r .skip ());
82+ try testing .expectEqual (false , r .skip ());
83+ try testing .expectEqual (false , r .skip ());
7984}
8085
81- test "Reader. tail" {
82- var r = Reader { .s = "foo" };
86+ test "parser.Reader: tail" {
87+ var r = Reader { .data = "foo" };
8388 try testing .expectEqualStrings ("foo" , r .tail ());
8489 try testing .expectEqualStrings ("" , r .tail ());
90+ try testing .expectEqualStrings ("" , r .tail ());
8591}
8692
87- test "Reader. until" {
88- var r = Reader { .s = "foo.bar.baz" };
93+ test "parser.Reader: until" {
94+ var r = Reader { .data = "foo.bar.baz" };
8995 try testing .expectEqualStrings ("foo" , r .until ('.' ));
9096 _ = r .skip ();
9197 try testing .expectEqualStrings ("bar" , r .until ('.' ));
9298 _ = r .skip ();
9399 try testing .expectEqualStrings ("baz" , r .until ('.' ));
94100
95- r = Reader { .s = "foo" };
101+ r = Reader { .data = "foo" };
96102 try testing .expectEqualStrings ("foo" , r .until ('.' ));
103+ try testing .expectEqualStrings ("" , r .tail ());
97104
98- r = Reader { .s = "" };
105+ r = Reader { .data = "" };
99106 try testing .expectEqualStrings ("" , r .until ('.' ));
100- }
101-
102- pub fn trim (s : []const u8 ) []const u8 {
103- const ln = s .len ;
104- if (ln == 0 ) {
105- return "" ;
106- }
107- var start : usize = 0 ;
108- while (start < ln ) {
109- if (! std .ascii .isWhitespace (s [start ])) break ;
110- start += 1 ;
111- }
112-
113- var end : usize = ln ;
114- while (end > 0 ) {
115- if (! std .ascii .isWhitespace (s [end - 1 ])) break ;
116- end -= 1 ;
117- }
118-
119- return s [start .. end ];
120- }
121-
122- test "trim" {
123- try testing .expectEqualStrings ("" , trim ("" ));
124- try testing .expectEqualStrings ("foo" , trim ("foo" ));
125- try testing .expectEqualStrings ("foo" , trim (" \n \t foo" ));
126- try testing .expectEqualStrings ("foo" , trim ("foo \n \t " ));
107+ try testing .expectEqualStrings ("" , r .tail ());
127108}
128109
129110test "parser: asUint" {
0 commit comments