-
-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
zig build system supports building a library
See #329 Supporting work: * move std.cstr.Buffer0 to std.buffer.Buffer * add build.zig to example/shared_library/ and add an automated test for it * add std.list.List.resizeDown * improve std.os.makePath - no longer recursive - takes into account . and .. * add std.os.path.isAbsolute * add std.os.path.resolve * reimplement std.os.path.dirname - no longer requires an allocator - handles edge cases correctly
- Loading branch information
Showing
17 changed files
with
641 additions
and
245 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
const Builder = @import("std").build.Builder; | ||
|
||
pub fn build(b: &Builder) { | ||
const lib = b.addSharedLibrary("mathtest", "mathtest.zig", b.version(1, 0, 0)); | ||
|
||
const exe = b.addCExecutable("test"); | ||
exe.addCompileFlags([][]const u8 { | ||
"-std=c99", | ||
}); | ||
exe.addSourceFile("test.c"); | ||
exe.linkLibrary(lib); | ||
|
||
b.default_step.dependOn(&exe.step); | ||
|
||
const run_cmd = b.addCommand(b.out_dir, b.env_map, "./test", [][]const u8{}); | ||
run_cmd.step.dependOn(&exe.step); | ||
|
||
const test_step = b.step("test", "Test the program"); | ||
test_step.dependOn(&run_cmd.step); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,3 @@ | ||
export fn add(a: i32, b: i32) -> i32 { | ||
a + b | ||
} | ||
|
||
export fn hang() -> unreachable { | ||
while (true) { } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,7 @@ | ||
#include "mathtest.h" | ||
#include <stdio.h> | ||
#include <assert.h> | ||
|
||
int main(int argc, char **argv) { | ||
printf("%d\n", add(42, 1137)); | ||
assert(add(42, 1337) == 1379); | ||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
const debug = @import("debug.zig"); | ||
const mem = @import("mem.zig"); | ||
const Allocator = mem.Allocator; | ||
const assert = debug.assert; | ||
const List = @import("list.zig").List; | ||
|
||
/// A buffer that allocates memory and maintains a null byte at the end. | ||
pub const Buffer = struct { | ||
list: List(u8), | ||
|
||
/// Must deinitialize with deinit. | ||
pub fn init(allocator: &Allocator, m: []const u8) -> %Buffer { | ||
var self = %return initSize(allocator, m.len); | ||
mem.copy(u8, self.list.items, m); | ||
return self; | ||
} | ||
|
||
/// Must deinitialize with deinit. | ||
pub fn initSize(allocator: &Allocator, size: usize) -> %Buffer { | ||
var self = initNull(allocator); | ||
%return self.resize(size); | ||
return self; | ||
} | ||
|
||
/// Must deinitialize with deinit. | ||
/// None of the other operations are valid until you do one of these: | ||
/// * ::replaceContents | ||
/// * ::replaceContentsBuffer | ||
/// * ::resize | ||
pub fn initNull(allocator: &Allocator) -> Buffer { | ||
Buffer { | ||
.list = List(u8).init(allocator), | ||
} | ||
} | ||
|
||
/// Must deinitialize with deinit. | ||
pub fn initFromBuffer(buffer: &const Buffer) -> %Buffer { | ||
return Buffer.init(buffer.list.allocator, buffer.toSliceConst()); | ||
} | ||
|
||
pub fn deinit(self: &Buffer) { | ||
self.list.deinit(); | ||
} | ||
|
||
pub fn toSlice(self: &Buffer) -> []u8 { | ||
return self.list.toSlice()[0...self.len()]; | ||
} | ||
|
||
pub fn toSliceConst(self: &const Buffer) -> []const u8 { | ||
return self.list.toSliceConst()[0...self.len()]; | ||
} | ||
|
||
pub fn resize(self: &Buffer, new_len: usize) -> %void { | ||
%return self.list.resize(new_len + 1); | ||
self.list.items[self.len()] = 0; | ||
} | ||
|
||
pub fn isNull(self: &const Buffer) -> bool { | ||
return self.list.len == 0; | ||
} | ||
|
||
pub fn len(self: &const Buffer) -> usize { | ||
return self.list.len - 1; | ||
} | ||
|
||
pub fn append(self: &Buffer, m: []const u8) -> %void { | ||
const old_len = self.len(); | ||
%return self.resize(old_len + m.len); | ||
mem.copy(u8, self.list.toSlice()[old_len...], m); | ||
} | ||
|
||
pub fn appendByte(self: &Buffer, byte: u8) -> %void { | ||
%return self.resize(self.len() + 1); | ||
self.list.items[self.len() - 1] = byte; | ||
} | ||
|
||
pub fn eql(self: &const Buffer, m: []const u8) -> bool { | ||
mem.eql(u8, self.toSliceConst(), m) | ||
} | ||
|
||
pub fn startsWith(self: &const Buffer, m: []const u8) -> bool { | ||
if (self.len() < m.len) return false; | ||
return mem.eql(u8, self.list.items[0...m.len], m); | ||
} | ||
|
||
pub fn endsWith(self: &const Buffer, m: []const u8) -> bool { | ||
const l = self.len(); | ||
if (l < m.len) return false; | ||
const start = l - m.len; | ||
return mem.eql(u8, self.list.items[start...], m); | ||
} | ||
|
||
pub fn replaceContents(self: &const Buffer, m: []const u8) -> %void { | ||
%return self.resize(m.len); | ||
mem.copy(u8, self.list.toSlice(), m); | ||
} | ||
}; | ||
|
||
test "simple Buffer" { | ||
const cstr = @import("cstr.zig"); | ||
|
||
var buf = %%Buffer.init(&debug.global_allocator, ""); | ||
assert(buf.len() == 0); | ||
%%buf.append("hello"); | ||
%%buf.appendByte(' '); | ||
%%buf.append("world"); | ||
assert(buf.eql("hello world")); | ||
assert(mem.eql(u8, cstr.toSliceConst(buf.toSliceConst().ptr), buf.toSliceConst())); | ||
|
||
var buf2 = %%Buffer.initFromBuffer(&buf); | ||
assert(buf.eql(buf2.toSliceConst())); | ||
|
||
assert(buf.startsWith("hell")); | ||
|
||
%%buf2.resize(4); | ||
assert(buf.startsWith(buf2.toSliceConst())); | ||
} |
Oops, something went wrong.