patched utilities.c / zig build test works with parser
This commit is contained in:
parent
a30c6d9ea1
commit
e313e33487
4 changed files with 59 additions and 51 deletions
54
build.zig
54
build.zig
|
@ -26,6 +26,50 @@ pub fn build(b: *std.Build) void {
|
||||||
|
|
||||||
const upstream = download_link_step.dependency(b, .{});
|
const upstream = download_link_step.dependency(b, .{});
|
||||||
|
|
||||||
|
// mod tests fail because the library has unconditional output to stdout,
|
||||||
|
// which messes with the test runner. So...we need to patch utilities.c with search:
|
||||||
|
// printf(" Opening
|
||||||
|
//
|
||||||
|
// replace:
|
||||||
|
// if ( verbosity > 0 ) printf(" Opening
|
||||||
|
//
|
||||||
|
|
||||||
|
const Substitutions = struct { orig: []const u8, new: []const u8 };
|
||||||
|
const patterns: [4]Substitutions = .{
|
||||||
|
.{
|
||||||
|
.orig = "\tprintf(\" Opening %s\\n\", filename); ",
|
||||||
|
.new = "\tif ( verbosity > 0 ) printf(\" Opening %s\\n\", filename); ",
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.orig = "\tprintf(\" Opening %s\\n\", filename);",
|
||||||
|
.new = "\tif ( verbosity > 0 ) printf(\" Opening %s\\n\", filename);",
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.orig = "\t printf(\" Opening %s\\n\", completename); ",
|
||||||
|
.new = "\t if ( verbosity > 0 ) printf(\" Opening %s\\n\", completename); ",
|
||||||
|
},
|
||||||
|
.{
|
||||||
|
.orig = " printf(\" Opening %s\\n\", completename); ",
|
||||||
|
.new = " if ( verbosity > 0 ) printf(\" Opening %s\\n\", completename); ",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
// pat5 is same as pat3
|
||||||
|
//const pat5 = \t printf(" Opening %s\n", completename); ";
|
||||||
|
|
||||||
|
// Create sed-lite run step to patch utilities.c
|
||||||
|
const sed_lite = b.dependency("sed_lite", .{});
|
||||||
|
const sed_lite_exe = sed_lite.artifact("sed-lite");
|
||||||
|
|
||||||
|
const patch_cmd = b.addRunArtifact(sed_lite_exe);
|
||||||
|
patch_cmd.addArg("-sL");
|
||||||
|
for (patterns) |s| {
|
||||||
|
patch_cmd.addArg(s.orig);
|
||||||
|
patch_cmd.addArg(s.new);
|
||||||
|
}
|
||||||
|
patch_cmd.addFileArg(upstream.path("src/utilities.c"));
|
||||||
|
patch_cmd.step.dependOn(&download_link_step.step);
|
||||||
|
|
||||||
const lib = b.addLibrary(.{
|
const lib = b.addLibrary(.{
|
||||||
.name = "link",
|
.name = "link",
|
||||||
.linkage = .static,
|
.linkage = .static,
|
||||||
|
@ -36,7 +80,7 @@ pub fn build(b: *std.Build) void {
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
lib.step.dependOn(&download_link_step.step);
|
lib.step.dependOn(&patch_cmd.step);
|
||||||
lib.addIncludePath(upstream.path("include"));
|
lib.addIncludePath(upstream.path("include"));
|
||||||
|
|
||||||
lib.addCSourceFiles(.{
|
lib.addCSourceFiles(.{
|
||||||
|
@ -78,6 +122,7 @@ pub fn build(b: *std.Build) void {
|
||||||
"-fwrapv",
|
"-fwrapv",
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
// This creates a module, which represents a collection of source files alongside
|
// This creates a module, which represents a collection of source files alongside
|
||||||
// some compilation options, such as optimization mode and linked system libraries.
|
// some compilation options, such as optimization mode and linked system libraries.
|
||||||
// Zig modules are the preferred way of making Zig code available to consumers.
|
// Zig modules are the preferred way of making Zig code available to consumers.
|
||||||
|
@ -211,12 +256,7 @@ pub fn build(b: *std.Build) void {
|
||||||
// make the two of them run in parallel.
|
// make the two of them run in parallel.
|
||||||
const test_step = b.step("test", "Run tests");
|
const test_step = b.step("test", "Run tests");
|
||||||
|
|
||||||
// mod tests fail because we need to patch utilities.c with search:
|
test_step.dependOn(&run_mod_tests.step);
|
||||||
// printf(" Opening
|
|
||||||
//
|
|
||||||
// replace:
|
|
||||||
// if ( verbosity > 0 ) printf(" Opening
|
|
||||||
//test_step.dependOn(&run_mod_tests.step);
|
|
||||||
test_step.dependOn(&run_exe_tests.step);
|
test_step.dependOn(&run_exe_tests.step);
|
||||||
|
|
||||||
// Just like flags, top level steps are also listed in the `--help` menu.
|
// Just like flags, top level steps are also listed in the `--help` menu.
|
||||||
|
|
|
@ -32,44 +32,10 @@
|
||||||
// Once all dependencies are fetched, `zig build` no longer requires
|
// Once all dependencies are fetched, `zig build` no longer requires
|
||||||
// internet connectivity.
|
// internet connectivity.
|
||||||
.dependencies = .{
|
.dependencies = .{
|
||||||
// See `zig fetch --save <url>` for a command-line interface for adding dependencies.
|
.sed_lite = .{
|
||||||
//.example = .{
|
.path = "sed-lite",
|
||||||
// // When updating this field to a new URL, be sure to delete the corresponding
|
},
|
||||||
// // `hash`, otherwise you are communicating that you expect to find the old hash at
|
|
||||||
// // the new URL. If the contents of a URL change this will result in a hash mismatch
|
|
||||||
// // which will prevent zig from using it.
|
|
||||||
// .url = "https://example.com/foo.tar.gz",
|
|
||||||
//
|
|
||||||
// // This is computed from the file contents of the directory of files that is
|
|
||||||
// // obtained after fetching `url` and applying the inclusion rules given by
|
|
||||||
// // `paths`.
|
|
||||||
// //
|
|
||||||
// // This field is the source of truth; packages do not come from a `url`; they
|
|
||||||
// // come from a `hash`. `url` is just one of many possible mirrors for how to
|
|
||||||
// // obtain a package matching this `hash`.
|
|
||||||
// //
|
|
||||||
// // Uses the [multihash](https://multiformats.io/multihash/) format.
|
|
||||||
// .hash = "...",
|
|
||||||
//
|
|
||||||
// // When this is provided, the package is found in a directory relative to the
|
|
||||||
// // build root. In this case the package's hash is irrelevant and therefore not
|
|
||||||
// // computed. This field and `url` are mutually exclusive.
|
|
||||||
// .path = "foo",
|
|
||||||
//
|
|
||||||
// // When this is set to `true`, a package is declared to be lazily
|
|
||||||
// // fetched. This makes the dependency only get fetched if it is
|
|
||||||
// // actually used.
|
|
||||||
// .lazy = false,
|
|
||||||
//},
|
|
||||||
},
|
},
|
||||||
// Specifies the set of files and directories that are included in this package.
|
|
||||||
// Only files and directories listed here are included in the `hash` that
|
|
||||||
// is computed for this package. Only files listed here will remain on disk
|
|
||||||
// when using the zig package manager. As a rule of thumb, one should list
|
|
||||||
// files required for compilation plus any license(s).
|
|
||||||
// Paths are relative to the build root. Use the empty string (`""`) to refer to
|
|
||||||
// the build root itself.
|
|
||||||
// A directory listed here means that all files within, recursively, are included.
|
|
||||||
.paths = .{
|
.paths = .{
|
||||||
"build.zig",
|
"build.zig",
|
||||||
"build.zig.zon",
|
"build.zig.zon",
|
||||||
|
|
|
@ -37,6 +37,8 @@ pub fn main() !u8 {
|
||||||
.original = args[2 + i * 2],
|
.original = args[2 + i * 2],
|
||||||
.replacement = args[3 + i * 2],
|
.replacement = args[3 + i * 2],
|
||||||
};
|
};
|
||||||
|
// const s = substitutions[i];
|
||||||
|
// try stdout.print("Replacing {s} -> {s}\n", .{ s.original, s.replacement });
|
||||||
}
|
}
|
||||||
|
|
||||||
const file = std.fs.cwd().openFile(file_path, .{ .mode = .read_only }) catch |err| {
|
const file = std.fs.cwd().openFile(file_path, .{ .mode = .read_only }) catch |err| {
|
||||||
|
@ -61,12 +63,14 @@ pub fn main() !u8 {
|
||||||
var writer_buffer: [4096]u8 = undefined;
|
var writer_buffer: [4096]u8 = undefined;
|
||||||
var fwriter = temp_file.writer(&writer_buffer);
|
var fwriter = temp_file.writer(&writer_buffer);
|
||||||
const writer = &fwriter.interface;
|
const writer = &fwriter.interface;
|
||||||
try substituteLines(
|
const subs = try substituteLines(
|
||||||
reader,
|
reader,
|
||||||
writer,
|
writer,
|
||||||
substitutions,
|
substitutions,
|
||||||
);
|
);
|
||||||
try writer.flush();
|
try writer.flush();
|
||||||
|
_ = subs;
|
||||||
|
// try stdout.print("Made {d} substitutions in file {s}\n", .{ subs, file_path });
|
||||||
std.fs.cwd().rename(temp_path, file_path) catch |err| {
|
std.fs.cwd().rename(temp_path, file_path) catch |err| {
|
||||||
try stderr.print("Error moving temp file: {}\n", .{err});
|
try stderr.print("Error moving temp file: {}\n", .{err});
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -83,13 +87,15 @@ const Substitution = struct {
|
||||||
replacement: []const u8,
|
replacement: []const u8,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn substituteLines(reader: *std.Io.Reader, writer: *std.Io.Writer, substitutions: []const Substitution) !void {
|
fn substituteLines(reader: *std.Io.Reader, writer: *std.Io.Writer, substitutions: []const Substitution) !usize {
|
||||||
|
var subs: usize = 0;
|
||||||
while (reader.takeDelimiterExclusive('\n')) |line| {
|
while (reader.takeDelimiterExclusive('\n')) |line| {
|
||||||
var substituted = false;
|
var substituted = false;
|
||||||
for (substitutions) |sub| {
|
for (substitutions) |sub| {
|
||||||
if (std.mem.eql(u8, line, sub.original)) {
|
if (std.mem.eql(u8, line, sub.original)) {
|
||||||
try writer.writeAll(sub.replacement);
|
try writer.writeAll(sub.replacement);
|
||||||
substituted = true;
|
substituted = true;
|
||||||
|
subs += 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,8 +105,7 @@ fn substituteLines(reader: *std.Io.Reader, writer: *std.Io.Writer, substitutions
|
||||||
if (reader.peekByte() != error.EndOfStream)
|
if (reader.peekByte() != error.EndOfStream)
|
||||||
try writer.writeByte('\n');
|
try writer.writeByte('\n');
|
||||||
} else |err| if (err != error.EndOfStream) return err;
|
} else |err| if (err != error.EndOfStream) return err;
|
||||||
// write the final newline
|
return subs;
|
||||||
// try writer.writeByte('\n');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
test "substitute lines exact match" {
|
test "substitute lines exact match" {
|
||||||
|
|
|
@ -38,7 +38,6 @@ pub const Parser = struct {
|
||||||
allocator: std.mem.Allocator,
|
allocator: std.mem.Allocator,
|
||||||
|
|
||||||
pub fn init(allocator: std.mem.Allocator) !Parser {
|
pub fn init(allocator: std.mem.Allocator) !Parser {
|
||||||
std.debug.print("1", .{});
|
|
||||||
const dict = c.dictionary_create(
|
const dict = c.dictionary_create(
|
||||||
@ptrCast(@constCast("data/4.0.dict")),
|
@ptrCast(@constCast("data/4.0.dict")),
|
||||||
@ptrCast(@constCast("data/4.0.knowledge")),
|
@ptrCast(@constCast("data/4.0.knowledge")),
|
||||||
|
@ -47,10 +46,8 @@ pub const Parser = struct {
|
||||||
);
|
);
|
||||||
if (dict == null) return error.DictionaryCreationFailed;
|
if (dict == null) return error.DictionaryCreationFailed;
|
||||||
|
|
||||||
std.debug.print("2", .{});
|
|
||||||
const opts = c.parse_options_create();
|
const opts = c.parse_options_create();
|
||||||
if (opts == null) return error.ParseOptionsCreationFailed;
|
if (opts == null) return error.ParseOptionsCreationFailed;
|
||||||
std.debug.print("3", .{});
|
|
||||||
|
|
||||||
c.parse_options_set_verbosity(opts, 0);
|
c.parse_options_set_verbosity(opts, 0);
|
||||||
c.parse_options_set_linkage_limit(opts, 100);
|
c.parse_options_set_linkage_limit(opts, 100);
|
||||||
|
|
Loading…
Add table
Reference in a new issue