zig-std 0.1.1

Bindings to Zig `std`, with optional Rust `std` features
Documentation
const export_fn = @import("util.zig").export_fn;
const ReprCSlice = @import("util.zig").ReprCSlice;
const std_crypto = @import("std").crypto;

const pwhash = @import("crypto/pwhash.zig");

comptime {
	_ = pwhash;

	export_fn(secure_zero_u8, "zig_std_rs__crypto__secure_zero_u8");
	export_fn(secure_zero_u16, "zig_std_rs__crypto__secure_zero_u16");
	export_fn(secure_zero_u32, "zig_std_rs__crypto__secure_zero_u32");
	export_fn(secure_zero_u64, "zig_std_rs__crypto__secure_zero_u64");
	export_fn(secure_zero_u128, "zig_std_rs__crypto__secure_zero_u128");
}

fn secure_zero(comptime T: type) *const fn(ptr: ReprCSlice(T)) callconv(.c) void {
	return struct {
		fn impl(ptr: ReprCSlice(T)) callconv(.c) void {
			std_crypto.secureZero(T, ptr.to_slice().?);
		}
	}.impl;
}

pub const secure_zero_u8 = secure_zero(u8);
pub const secure_zero_u16 = secure_zero(u16);
pub const secure_zero_u32 = secure_zero(u32);
pub const secure_zero_u64 = secure_zero(u64);
pub const secure_zero_u128 = secure_zero(u128);

test "smoke tests" {
	var slice_u8 = [_]u8 { 247 };
	_ = secure_zero_u8(ReprCSlice(u8).from_slice(&slice_u8));
	var slice_u16 = [_]u16 { 247 };
	_ = secure_zero_u16(ReprCSlice(u16).from_slice(&slice_u16));
	var slice_u32 = [_]u32 { 247 };
	_ = secure_zero_u32(ReprCSlice(u32).from_slice(&slice_u32));
	var slice_u64 = [_]u64 { 247 };
	_ = secure_zero_u64(ReprCSlice(u64).from_slice(&slice_u64));
	var slice_u128 = [_]u128 { 247 };
	_ = secure_zero_u128(ReprCSlice(u128).from_slice(&slice_u128));
}