Skip to content

Commit 1b8e7c2

Browse files
committed
bech32: use utf8 it and last index
1 parent 6ef9a1f commit 1b8e7c2

File tree

1 file changed

+21
-5
lines changed

1 file changed

+21
-5
lines changed

src/bech32/bech32.zig

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ pub const Variant = enum {
153153
fn splitAndDecode(allocator: std.mem.Allocator, s: []const u8) Error!struct { std.ArrayList(u8), std.ArrayList(u5) } {
154154
// Split at separator and check for two pieces
155155

156-
const raw_hrp, const raw_data = if (std.mem.indexOfScalar(u8, s, SEP)) |sep| .{
156+
const raw_hrp, const raw_data = if (std.mem.lastIndexOfScalar(u8, s, SEP)) |sep| .{
157157
s[0..sep], s[sep + 1 ..],
158158
} else return Error.MissingSeparator;
159159

@@ -177,20 +177,27 @@ fn splitAndDecode(allocator: std.mem.Allocator, s: []const u8) Error!struct { st
177177
var data = std.ArrayList(u5).init(allocator);
178178
errdefer data.deinit();
179179

180+
var it = std.unicode.Utf8View.initUnchecked(raw_data).iterator();
180181
// Check data payload
181-
for (raw_data) |c| {
182+
while (it.nextCodepoint()) |c| {
182183
// Only check if c is in the ASCII range, all invalid ASCII
183184
// characters have the value -1 in CHARSET_REV (which covers
184185
// the whole ASCII range) and will be filtered out later.
185-
if (!std.ascii.isAscii(c)) return error.InvalidChar;
186+
if (c >= 128) return error.InvalidChar;
186187

187-
if (std.ascii.isLower(c)) {
188+
if (switch (c) {
189+
'a'...'z' => true,
190+
else => false,
191+
}) {
188192
switch (case) {
189193
.upper => return Error.MixedCase,
190194
.none => case = .lower,
191195
.lower => {},
192196
}
193-
} else if (std.ascii.isUpper(c)) {
197+
} else if (switch (c) {
198+
'A'...'Z' => true,
199+
else => false,
200+
}) {
194201
switch (case) {
195202
.lower => return Error.MixedCase,
196203
.none => case = .upper,
@@ -531,6 +538,15 @@ test "roundtrip_without_checksum" {
531538
try std.testing.expectEqualSlices(u5, data.items, decoded_data.items);
532539
}
533540

541+
test "decode ln" {
542+
const str = "lnbc10n1pnw2hkzdqqpp5ve584t0cv27hwmy0cx9ca8uwyqyfw9y9dm3r8vus9fv36r2l9yjssp59g4z52329g4z52329g4z52329g4z52329g4z52329g4z52329g4qcqzysc39n3w6zq50y3775yc66mmvt2fe5aa9mzzdnvq5palgyw6j9uu04qnm0g4ftm5ehtm5aulwtuy0hfrtqcdaxcl2r7wz2x4503levlacqswkkem";
543+
544+
const h, const d, const v = try decode(std.testing.allocator, str);
545+
_ = v; // autofix
546+
defer h.deinit();
547+
defer d.deinit();
548+
}
549+
534550
test "test_hrp_case_decode" {
535551
const hrp, const data, const variant = try decode(std.testing.allocator, "hrp1qqqq40atq3");
536552
defer hrp.deinit();

0 commit comments

Comments
 (0)