this repo has no description
1const std = @import("std");
2
3/// Returns a url percent-encoded slice that the caller must free.
4/// Encoded characters: " < > ` # ? ^ { }
5/// Not a complete urlencode implementation; this ignores unicode code points.
6/// See https://url.spec.whatwg.org/#percent-encoded-bytes.
7pub fn encode(allocator: std.mem.Allocator, url: []const u8) ![]const u8 {
8 var new_length = url.len;
9
10 new_length += 2 * std.mem.count(u8, url, "\""); // " -> %22.
11 new_length += 2 * std.mem.count(u8, url, "<"); // < -> %3C.
12 new_length += 2 * std.mem.count(u8, url, ">"); // > -> %3E.
13 new_length += 2 * std.mem.count(u8, url, "`"); // ` -> %60.
14 new_length += 2 * std.mem.count(u8, url, "#"); // ` -> %23.
15 new_length += 2 * std.mem.count(u8, url, "?"); // ` -> %3F.
16 new_length += 2 * std.mem.count(u8, url, "^"); // ` -> %5E.
17 new_length += 2 * std.mem.count(u8, url, "{"); // ` -> %7B.
18 new_length += 2 * std.mem.count(u8, url, "}"); // ` -> %7D.
19
20 const encoded = try allocator.alloc(u8, new_length);
21
22 var encoded_idx: usize = 0;
23
24 for (0..url.len) |i| {
25 const c = url[i];
26
27 if (c == '\"') {
28 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%22");
29 encoded_idx += 3;
30 continue;
31 }
32 if (c == '<') {
33 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3C");
34 encoded_idx += 3;
35 continue;
36 }
37 if (c == '>') {
38 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3E");
39 encoded_idx += 3;
40 continue;
41 }
42 if (c == '`') {
43 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%60");
44 encoded_idx += 3;
45 continue;
46 }
47 if (c == '#') {
48 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%23");
49 encoded_idx += 3;
50 continue;
51 }
52 if (c == '?') {
53 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%3F");
54 encoded_idx += 3;
55 continue;
56 }
57 if (c == '^') {
58 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%5E");
59 encoded_idx += 3;
60 continue;
61 }
62 if (c == '{') {
63 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%7B");
64 encoded_idx += 3;
65 continue;
66 }
67 if (c == '}') {
68 @memcpy(encoded[encoded_idx .. encoded_idx + 3], "%7D");
69 encoded_idx += 3;
70 continue;
71 }
72
73 encoded[encoded_idx] = c;
74 encoded_idx += 1;
75 }
76
77 return encoded;
78}