aboutsummaryrefslogtreecommitdiff
path: root/src/string.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/string.zig')
-rw-r--r--src/string.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/string.zig b/src/string.zig
new file mode 100644
index 0000000..8217a77
--- /dev/null
+++ b/src/string.zig
@@ -0,0 +1,41 @@
+const std = @import("std");
+
+pub fn isNameChar(char: u8) bool {
+ return switch(char) {
+ '0'...'9', 'A'...'Z', 'a'...'z', '_' => true,
+ else => false
+ };
+}
+
+pub fn read_name(buffer: []const u8) struct { []const u8, []const u8 } {
+ for (buffer, 0..) |char, index| {
+ if (!isNameChar(char)) {
+ return .{ buffer[0..index], buffer[index..] };
+ }
+ }
+
+ return .{ buffer[0..buffer.len], buffer[buffer.len..] };
+}
+
+pub fn read_first_from_literal(buffer: []const u8) !struct { u8, []const u8 } {
+ if (buffer[0] != '\\') {
+ return .{ buffer[0], buffer[1..] } ;
+ }
+
+ if (buffer.len > 1 and buffer[1] != 'x') {
+ return switch(buffer[1]) {
+ 't' => return .{ '\t', buffer[2..] },
+ 'n' => return .{ '\n', buffer[2..] },
+ 'r' => return .{ '\r', buffer[2..] },
+ '\'' => return .{ '\'', buffer[2..] },
+ '\\' => return .{ '\\', buffer[2..] },
+ else => return error.InvalidEscapeSequence,
+ };
+ }
+
+ if (buffer.len > 4 and buffer[1] == 'x') {
+ return .{ try std.fmt.parseInt(u8, buffer[2..4], 16), buffer[4..] };
+ }
+
+ return error.InvalidEscapeSequnce;
+}