aboutsummaryrefslogtreecommitdiff
path: root/std/cstr.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-09-25 23:35:41 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-09-25 23:35:41 -0400
commited36dbbd9c9dc21b2eebae1b31586fea1c6b51c3 (patch)
tree317ff9db438e8f1a2cd42b42b077071b07492256 /std/cstr.zig
parent6128bc728d1e1024a178c16c2149f5b1a167a013 (diff)
downloadzig-ed36dbbd9c9dc21b2eebae1b31586fea1c6b51c3.tar.gz
zig-ed36dbbd9c9dc21b2eebae1b31586fea1c6b51c3.zip
mv std/ lib/
that's all this commit does. further commits will fix cli flags and such. see #2221
Diffstat (limited to 'std/cstr.zig')
-rw-r--r--std/cstr.zig94
1 files changed, 0 insertions, 94 deletions
diff --git a/std/cstr.zig b/std/cstr.zig
deleted file mode 100644
index dd28e50449..0000000000
--- a/std/cstr.zig
+++ /dev/null
@@ -1,94 +0,0 @@
-const std = @import("std.zig");
-const builtin = @import("builtin");
-const debug = std.debug;
-const mem = std.mem;
-const testing = std.testing;
-
-pub const line_sep = switch (builtin.os) {
- builtin.Os.windows => "\r\n",
- else => "\n",
-};
-
-pub fn cmp(a: [*]const u8, b: [*]const u8) i8 {
- var index: usize = 0;
- while (a[index] == b[index] and a[index] != 0) : (index += 1) {}
- if (a[index] > b[index]) {
- return 1;
- } else if (a[index] < b[index]) {
- return -1;
- } else {
- return 0;
- }
-}
-
-test "cstr fns" {
- comptime testCStrFnsImpl();
- testCStrFnsImpl();
-}
-
-fn testCStrFnsImpl() void {
- testing.expect(cmp(c"aoeu", c"aoez") == -1);
- testing.expect(mem.len(u8, c"123456789") == 9);
-}
-
-/// Returns a mutable slice with 1 more byte of length which is a null byte.
-/// Caller owns the returned memory.
-pub fn addNullByte(allocator: *mem.Allocator, slice: []const u8) ![]u8 {
- const result = try allocator.alloc(u8, slice.len + 1);
- mem.copy(u8, result, slice);
- result[slice.len] = 0;
- return result;
-}
-
-pub const NullTerminated2DArray = struct {
- allocator: *mem.Allocator,
- byte_count: usize,
- ptr: ?[*]?[*]u8,
-
- /// Takes N lists of strings, concatenates the lists together, and adds a null terminator
- /// Caller must deinit result
- pub fn fromSlices(allocator: *mem.Allocator, slices: []const []const []const u8) !NullTerminated2DArray {
- var new_len: usize = 1; // 1 for the list null
- var byte_count: usize = 0;
- for (slices) |slice| {
- new_len += slice.len;
- for (slice) |inner| {
- byte_count += inner.len;
- }
- byte_count += slice.len; // for the null terminators of inner
- }
-
- const index_size = @sizeOf(usize) * new_len; // size of the ptrs
- byte_count += index_size;
-
- const buf = try allocator.alignedAlloc(u8, @alignOf(?*u8), byte_count);
- errdefer allocator.free(buf);
-
- var write_index = index_size;
- const index_buf = @bytesToSlice(?[*]u8, buf);
-
- var i: usize = 0;
- for (slices) |slice| {
- for (slice) |inner| {
- index_buf[i] = buf.ptr + write_index;
- i += 1;
- mem.copy(u8, buf[write_index..], inner);
- write_index += inner.len;
- buf[write_index] = 0;
- write_index += 1;
- }
- }
- index_buf[i] = null;
-
- return NullTerminated2DArray{
- .allocator = allocator,
- .byte_count = byte_count,
- .ptr = @ptrCast(?[*]?[*]u8, buf.ptr),
- };
- }
-
- pub fn deinit(self: *NullTerminated2DArray) void {
- const buf = @ptrCast([*]u8, self.ptr);
- self.allocator.free(buf[0..self.byte_count]);
- }
-};