Skip to content

Commit 0c1a486

Browse files
Merge pull request #411 from karlseguin/reader_tweak
Minor Reader tweaks
2 parents 1594f14 + 688cb55 commit 0c1a486

File tree

3 files changed

+45
-62
lines changed

3 files changed

+45
-62
lines changed

src/browser/mime.zig

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,7 @@
1919
const std = @import("std");
2020
const testing = std.testing;
2121

22-
const strparser = @import("../str/parser.zig");
23-
const Reader = strparser.Reader;
24-
const trim = strparser.trim;
22+
const Reader = @import("../str/parser.zig").Reader;
2523

2624
const Self = @This();
2725

@@ -70,7 +68,7 @@ pub fn parse(s: []const u8) Self.MimeError!Self {
7068
if (ln > 255) return MimeError.TooBig;
7169

7270
var res = Self{ .mtype = "", .msubtype = "" };
73-
var r = Reader{ .s = s };
71+
var r = Reader{ .data = s };
7472

7573
res.mtype = trim(r.until('/'));
7674
if (res.mtype.len == 0) return MimeError.Invalid;
@@ -87,7 +85,7 @@ pub fn parse(s: []const u8) Self.MimeError!Self {
8785

8886
// parse well known parameters.
8987
// don't check invalid parameter format.
90-
var rp = Reader{ .s = res.params };
88+
var rp = Reader{ .data = res.params };
9189
while (true) {
9290
const name = trim(rp.until('='));
9391
if (!rp.skip()) return res;
@@ -106,6 +104,10 @@ pub fn parse(s: []const u8) Self.MimeError!Self {
106104
return res;
107105
}
108106

107+
fn trim(s: []const u8) []const u8 {
108+
return std.mem.trim(u8, s, &std.ascii.whitespace);
109+
}
110+
109111
test "parse valid" {
110112
for ([_][]const u8{
111113
"text/html",

src/str/parser.zig

Lines changed: 36 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -18,89 +18,70 @@
1818

1919
// some utils to parser strings.
2020
const std = @import("std");
21-
const testing = std.testing;
2221

2322
pub 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
};
5054

51-
test "Reader.skip" {
52-
var r = Reader{ .s = "foo" };
53-
try testing.expect(r.skip());
54-
try testing.expect(r.skip());
55-
try testing.expect(r.skip());
56-
try testing.expect(!r.skip());
57-
try testing.expect(!r.skip());
55+
const testing = std.testing;
56+
test "parser.Reader: skip" {
57+
var r = Reader{ .data = "foo" };
58+
try testing.expectEqual(true, r.skip());
59+
try testing.expectEqual(true, r.skip());
60+
try testing.expectEqual(true, r.skip());
61+
try testing.expectEqual(false, r.skip());
62+
try testing.expectEqual(false, r.skip());
5863
}
5964

60-
test "Reader.tail" {
61-
var r = Reader{ .s = "foo" };
65+
test "parser.Reader: tail" {
66+
var r = Reader{ .data = "foo" };
6267
try testing.expectEqualStrings("foo", r.tail());
6368
try testing.expectEqualStrings("", r.tail());
69+
try testing.expectEqualStrings("", r.tail());
6470
}
6571

66-
test "Reader.until" {
67-
var r = Reader{ .s = "foo.bar.baz" };
72+
test "parser.Reader: until" {
73+
var r = Reader{ .data = "foo.bar.baz" };
6874
try testing.expectEqualStrings("foo", r.until('.'));
6975
_ = r.skip();
7076
try testing.expectEqualStrings("bar", r.until('.'));
7177
_ = r.skip();
7278
try testing.expectEqualStrings("baz", r.until('.'));
7379

74-
r = Reader{ .s = "foo" };
80+
r = Reader{ .data = "foo" };
7581
try testing.expectEqualStrings("foo", r.until('.'));
82+
try testing.expectEqualStrings("", r.tail());
7683

77-
r = Reader{ .s = "" };
84+
r = Reader{ .data = "" };
7885
try testing.expectEqualStrings("", r.until('.'));
79-
}
80-
81-
pub fn trim(s: []const u8) []const u8 {
82-
const ln = s.len;
83-
if (ln == 0) {
84-
return "";
85-
}
86-
var start: usize = 0;
87-
while (start < ln) {
88-
if (!std.ascii.isWhitespace(s[start])) break;
89-
start += 1;
90-
}
91-
92-
var end: usize = ln;
93-
while (end > 0) {
94-
if (!std.ascii.isWhitespace(s[end - 1])) break;
95-
end -= 1;
96-
}
97-
98-
return s[start..end];
99-
}
100-
101-
test "trim" {
102-
try testing.expectEqualStrings("", trim(""));
103-
try testing.expectEqualStrings("foo", trim("foo"));
104-
try testing.expectEqualStrings("foo", trim(" \n\tfoo"));
105-
try testing.expectEqualStrings("foo", trim("foo \n\t"));
86+
try testing.expectEqualStrings("", r.tail());
10687
}

src/url/query.zig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,12 @@ pub fn parseQuery(alloc: std.mem.Allocator, s: []const u8) !Values {
199199
const ln = s.len;
200200
if (ln == 0) return values;
201201

202-
var r = Reader{ .s = s };
202+
var r = Reader{ .data = s };
203203
while (true) {
204204
const param = r.until('&');
205205
if (param.len == 0) break;
206206

207-
var rr = Reader{ .s = param };
207+
var rr = Reader{ .data = param };
208208
const k = rr.until('=');
209209
if (k.len == 0) continue;
210210

0 commit comments

Comments
 (0)