Skip to content

Commit

Permalink
basic sort functionatlity, need performance improvment
Browse files Browse the repository at this point in the history
  • Loading branch information
avifenesh committed Oct 25, 2024
1 parent 6d2d763 commit b930f61
Show file tree
Hide file tree
Showing 13 changed files with 376 additions and 69 deletions.
10 changes: 5 additions & 5 deletions .github/workflows/test-zig-files.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ on:
branches:
- main
paths:
- "**.zig"
- "**/**.zig"
- ".github/workflows/test-zig-files.yml"
- '**.zig'
- '**/**.zig'
- '.github/workflows/test-zig-files.yml'

jobs:
Simple-tests:
Expand Down Expand Up @@ -40,9 +40,9 @@ jobs:
- uses: goto-bus-stop/setup-zig@v2
- run: |
echo 'testing P0-tests.zig'
zig test P0-tests.zig
zig test src/P0-tests.zig
echo 'testing utils.zig'
zig test utils.zig
zig test src/utils.zig
working-directory: Project0-word
shell: bash
Expand Down
21 changes: 2 additions & 19 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,25 +1,8 @@
# Ignore all
*

# Unignore all with extensions
!*.*

# Unignore all dirs
!*/

!.*

*.o
.typo

# Ignore `bin` dir
bin/
*/bin/*

.history
.vscode

*zig-cache
zig-out

test_file*
test_f*.txt**

80 changes: 78 additions & 2 deletions Project0-word/build.zig
Original file line number Diff line number Diff line change
@@ -1,15 +1,91 @@
const std = @import("std");

// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
// Standard target options allows the person running `zig build` to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});

// Standard optimization options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
// set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{});

// const lib = b.addStaticLibrary(.{
// .name = "Project0-word",
// // In this case the main source file is merely a path, however, in more
// // complicated build scripts, this could be a generated file.
// .root_source_file = b.path("src/root.zig"),
// .target = target,
// .optimize = optimize,
// });

// This declares intent for the library to be installed into the standard
// location when the user invokes the "install" step (the default step when
// running `zig build`).
// b.installArtifact(lib);

const exe = b.addExecutable(.{
.name = "project0part1",
.root_source_file = b.path("main.zig"),
.name = "Project0-word",
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});

// This declares intent for the executable to be installed into the
// standard location when the user invokes the "install" step (the default
// step when running `zig build`).
b.installArtifact(exe);

// This *creates* a Run step in the build graph, to be executed when another
// step is evaluated that depends on it. The next line below will establish
// such a dependency.
const run_cmd = b.addRunArtifact(exe);

// By making the run step depend on the install step, it will be run from the
// installation directory rather than directly from within the cache directory.
// This is not necessary, however, if the application depends on other installed
// files, this ensures they will be present and in the expected location.
run_cmd.step.dependOn(b.getInstallStep());

// This allows the user to pass arguments to the application in the build
// command itself, like this: `zig build run -- arg1 arg2 etc`
if (b.args) |args| {
run_cmd.addArgs(args);
}

// This creates a build step. It will be visible in the `zig build --help` menu,
// and can be selected like this: `zig build run`
// This will evaluate the `run` step rather than the default, which is "install".
const run_step = b.step("run", "Run the app");
run_step.dependOn(&run_cmd.step);

// Creates a step for unit testing. This only builds the test executable
// but does not run it.
const lib_unit_tests = b.addTest(.{
.root_source_file = b.path("src/root.zig"),
.target = target,
.optimize = optimize,
});

const run_lib_unit_tests = b.addRunArtifact(lib_unit_tests);

const exe_unit_tests = b.addTest(.{
.root_source_file = b.path("src/main.zig"),
.target = target,
.optimize = optimize,
});

const run_exe_unit_tests = b.addRunArtifact(exe_unit_tests);

// Similar to creating the run step earlier, this exposes a `test` step to
// the `zig build --help` menu, providing a way for the user to request
// running the unit tests.
const test_step = b.step("test", "Run unit tests");
test_step.dependOn(&run_lib_unit_tests.step);
test_step.dependOn(&run_exe_unit_tests.step);
}
72 changes: 72 additions & 0 deletions Project0-word/build.zig.zon
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
.{
// This is the default name used by packages depending on this one. For
// example, when a user runs `zig fetch --save <url>`, this field is used
// as the key in the `dependencies` table. Although the user can choose a
// different name, most users will stick with this provided value.
//
// It is redundant to include "zig" in this name because it is already
// within the Zig package namespace.
.name = "Project0-word",

// This is a [Semantic Version](https://semver.org/).
// In a future version of Zig it will be used for package deduplication.
.version = "0.0.0",

// This field is optional.
// This is currently advisory only; Zig does not yet do anything
// with this value.
//.minimum_zig_version = "0.11.0",

// This field is optional.
// Each dependency must either provide a `url` and `hash`, or a `path`.
// `zig build --fetch` can be used to fetch all dependencies of a package, recursively.
// Once all dependencies are fetched, `zig build` no longer requires
// internet connectivity.
.dependencies = .{
// See `zig fetch --save <url>` for a command-line interface for adding dependencies.
//.example = .{
// // 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.
// .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 = .{
"build.zig",
"build.zig.zon",
"src",
// For example...
//"LICENSE",
//"README.md",
},
}
10 changes: 0 additions & 10 deletions Project0-word/plain.txt

This file was deleted.

12 changes: 7 additions & 5 deletions Project0-word/P0-tests.zig → Project0-word/src/P0-tests.zig
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,19 @@ const count_words = @import("count_words.zig");
const utils = @import("utils.zig");
const expect = std.testing.expect;
const eql = std.mem.eql;
const log = std.log;
const dir = std.fs.cwd();

test "parse_args" {
var args = [_][]const u8{ "-cw", "file.txt" };
const expected = "file.txt";
var args = [_][]const u8{ "-cw", "test_file.txt" };
const expected = "test_file.txt";
const result = try utils.parseArgs(&args);
try expect(eql(u8, expected, result));
}

test "count_words" {
const path = "plain.txt";
const expected = 26;
const result = count_words.countWords(path);
const path = "test_plain.txt";
const expected = 423;
const result = try count_words.countWords(path);
try expect(result == expected);
}
24 changes: 11 additions & 13 deletions Project0-word/count_words.zig → Project0-word/src/count_words.zig
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ const std = @import("std");
const print = std.debug.print;
const split = std.mem.splitScalar;
const utils = @import("utils.zig");
const log = std.log;
const continueToNextLine = utils.continueToNextLine;

pub fn countWords(file_path: []const u8) u64 {
pub fn countWords(file_path: []const u8) !u64 {
const file = std.fs.cwd().openFile(file_path, .{ .mode = .read_only }) catch |err| {
print("Error opening file: {}\n", .{err});
return 0;
Expand All @@ -12,20 +14,16 @@ pub fn countWords(file_path: []const u8) u64 {
var buffer: [1024]u8 = undefined;
var words_count: u64 = 0;
const reader = file.reader();
while (true) {
var line: []const u8 = undefined;
const line_options = utils.nextLine(reader, &buffer) catch |err| {
print("Error reading line: {}\n", .{err});
break;
};
if (line_options) |value| {
line = value;
} else {
break;

var line_options = try utils.nextLine(reader, &buffer);
while (line_options != null) {
if (continueToNextLine(line_options.?)) {
line_options = try utils.nextLine(reader, &buffer) orelse return words_count;
continue;
}
var words = split(u8, line, ' ');
var words = split(u8, line_options.?, ' ');
while (words.next() != null) words_count += 1;
line_options = try utils.nextLine(reader, &buffer);
}
print("Words count: {}\n", .{words_count});
return words_count;
}
1 change: 1 addition & 0 deletions Project0-word/src/data-structures.zig
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
const std = @import("std");
5 changes: 3 additions & 2 deletions Project0-word/main.zig → Project0-word/src/main.zig
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
const std = @import("std");
const heap = std.heap;
const count_words = @import("count_words.zig");
const utils = @import("utils.zig");
const print = std.debug.print;
pub const log_level: std.log.Level = .debug;
const heap = std.heap;

pub fn main() !void {
const stdout = std.io.getStdOut();
Expand Down Expand Up @@ -37,7 +38,7 @@ pub fn main() !void {
line = value;
} else {
try stdout.writeAll(
\\
\\
\\ No arguments provided.
\\
);
Expand Down
Loading

0 comments on commit b930f61

Please sign in to comment.