Skip to content

Instantly share code, notes, and snippets.

@ssteinbach
Created June 11, 2023 23:01
Show Gist options
  • Save ssteinbach/bbcca6d0f85df8c7dde67a7febc62ff3 to your computer and use it in GitHub Desktop.
Save ssteinbach/bbcca6d0f85df8c7dde67a7febc62ff3 to your computer and use it in GitHub Desktop.
Explorations with 0 terminated buffers & strings in zig
const std = @import("std");
fn print_string_contents(buffer: anytype) void {
std.debug.print("string print: '{s}'\n", .{ buffer });
std.debug.print("char print:\n", .{});
for (buffer) |b, ind| {
std.debug.print(" {d}: {d} {s}", .{ ind, b, buffer[ind..ind+1] });
}
std.debug.print("\nbuffer.len: {d}", .{ buffer.len});
// std.debug.print("\nbuffer[buffer.len]: {d}", .{ buffer[buffer.len]});
std.debug.print("\ndone.\n", .{});
}
fn test_buffer_type(comptime T: type) void {
const alphabet = "abcdefghijklmnopqrstuvwxyz";
{
var buffer:T = .{};
std.debug.print("\nfilled by setting array items exhaustively\n", .{});
for (buffer) |*b, ind| {
b.* = alphabet[ind];
}
print_string_contents(buffer);
}
{
var buffer:T = .{};
std.debug.print("\nfilled by memset\n", .{});
std.mem.set(u8, &buffer, 97);
print_string_contents(buffer);
}
{
var buffer:T = .{};
std.mem.set(u8, &buffer, 0);
std.debug.print("\nfilled by copy\n", .{});
const word = "hello";
std.mem.copy(u8, &buffer, word);
print_string_contents(buffer);
}
{
var buffer:T = .{};
std.mem.set(u8, &buffer, 1);
std.debug.print("\nmemset to 1 filled by copy\n", .{});
{
const word = "no term";
std.mem.copy(u8, &buffer, word);
print_string_contents(buffer);
}
{
std.mem.set(u8, &buffer, 1);
const word:[:0]const u8 = "zero_term";
std.mem.copy(u8, &buffer, word);
print_string_contents(buffer);
}
{
std.mem.set(u8, &buffer, "a"[0]);
print_string_contents(buffer);
const word:[:0]const u8 = "letters";
std.mem.copy(u8, &buffer, word);
print_string_contents(buffer);
}
}
}
test "0 terminated stack allocated array" {
const bufsize:usize = 16;
std.debug.print("\n----------------------------------------\n", .{});
std.debug.print("[bufsize:0]u8\n", .{});
std.debug.print("----------------------------------------\n", .{});
test_buffer_type([bufsize:0]u8);
// prints:
// ----------------------------------------
// [bufsize:0]u8
// ----------------------------------------
//
// filled by setting array items exhaustively
// string print: 'abcdefghijklmnop'
// char print:
// 0: 97 a 1: 98 b 2: 99 c 3: 100 d 4: 101 e 5: 102 f 6: 103 g 7: 104 h 8: 105 i 9: 106 j 10: 107 k 11: 108 l 12: 109 m 13: 110 n 14: 111 o 15: 112 p
// buffer.len: 16
// done.
//
// filled by memset
// string print: 'aaaaaaaaaaaaaaaa'
// char print:
// 0: 97 a 1: 97 a 2: 97 a 3: 97 a 4: 97 a 5: 97 a 6: 97 a 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
//
// filled by copy
// string print: 'hello'
// char print:
// 0: 104 h 1: 101 e 2: 108 l 3: 108 l 4: 111 o 5: 0 6: 0 7: 0 8: 0 9: 0 10: 0 11: 0 12: 0 13: 0 14: 0 15: 0
// buffer.len: 16
// done.
//
// memset to 1 filled by copy
// string print: 'no term'
// char print:
// 0: 110 n 1: 111 o 2: 32 3: 116 t 4: 101 e 5: 114 r 6: 109 m 7: 1 8: 1 9: 1 10: 1 11: 1 12: 1 13: 1 14: 1 15: 1
// buffer.len: 16
// done.
// string print: 'zero_term'
// char print:
// 0: 122 z 1: 101 e 2: 114 r 3: 111 o 4: 95 _ 5: 116 t 6: 101 e 7: 114 r 8: 109 m 9: 1 10: 1 11: 1 12: 1 13: 1 14: 1 15: 1
// buffer.len: 16
// done.
// string print: 'aaaaaaaaaaaaaaaa'
// char print:
// 0: 97 a 1: 97 a 2: 97 a 3: 97 a 4: 97 a 5: 97 a 6: 97 a 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
// string print: 'lettersaaaaaaaaa'
// char print:
// 0: 108 l 1: 101 e 2: 116 t 3: 116 t 4: 101 e 5: 114 r 6: 115 s 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
std.debug.print("\n----------------------------------------\n", .{});
std.debug.print("[bufsize]u8\n", .{});
std.debug.print("----------------------------------------\n", .{});
test_buffer_type([bufsize]u8);
// prints:
// ----------------------------------------
// [bufsize]u8
// ----------------------------------------
//
// filled by setting array items exhaustively
// string print: 'abcdefghijklmnop'
// char print:
// 0: 97 a 1: 98 b 2: 99 c 3: 100 d 4: 101 e 5: 102 f 6: 103 g 7: 104 h 8: 105 i 9: 106 j 10: 107 k 11: 108 l 12: 109 m 13: 110 n 14: 111 o 15: 112 p
// buffer.len: 16
// done.
//
// filled by memset
// string print: 'aaaaaaaaaaaaaaaa'
// char print:
// 0: 97 a 1: 97 a 2: 97 a 3: 97 a 4: 97 a 5: 97 a 6: 97 a 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
//
// filled by copy
// string print: 'hello'
// char print:
// 0: 104 h 1: 101 e 2: 108 l 3: 108 l 4: 111 o 5: 0 6: 0 7: 0 8: 0 9: 0 10: 0 11: 0 12: 0 13: 0 14: 0 15: 0
// buffer.len: 16
// done.
//
// memset to 1 filled by copy
// string print: 'no term'
// char print:
// 0: 110 n 1: 111 o 2: 32 3: 116 t 4: 101 e 5: 114 r 6: 109 m 7: 1 8: 1 9: 1 10: 1 11: 1 12: 1 13: 1 14: 1 15: 1
// buffer.len: 16
// done.
// string print: 'zero_term'
// char print:
// 0: 122 z 1: 101 e 2: 114 r 3: 111 o 4: 95 _ 5: 116 t 6: 101 e 7: 114 r 8: 109 m 9: 1 10: 1 11: 1 12: 1 13: 1 14: 1 15: 1
// buffer.len: 16
// done.
// string print: 'aaaaaaaaaaaaaaaa'
// char print:
// 0: 97 a 1: 97 a 2: 97 a 3: 97 a 4: 97 a 5: 97 a 6: 97 a 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
// string print: 'lettersaaaaaaaaa'
// char print:
// 0: 108 l 1: 101 e 2: 116 t 3: 116 t 4: 101 e 5: 114 r 6: 115 s 7: 97 a 8: 97 a 9: 97 a 10: 97 a 11: 97 a 12: 97 a 13: 97 a 14: 97 a 15: 97 a
// buffer.len: 16
// done.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment