zig_example 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 260dd4c8b12f9b2c17421f30a42f1b3db48f5c8aa829da99bf9401e8792eb545
4
+ data.tar.gz: 15de9092ee7235cfdb0b8631bdf5ac322e3725f0768f988d251907b76d1ddedb
5
+ SHA512:
6
+ metadata.gz: ab303f22055fd6f39993ad4d99a5069ec69c8f134606ee04bae141b1f29057125a52a8a1796c1f0e66fc64d8f2bbdb5f2f7654e3d2f9c4b48ec09449a3932ee6
7
+ data.tar.gz: 906c175473e4f67ac945002d0db22ce0b2437b5530483fa51a5f2919b11e22486e077efe028140281a71da836ecfeb0e7245cdcbdf8924b9d3d8a6cde98be0b1
@@ -0,0 +1,49 @@
1
+ const std = @import("std");
2
+
3
+ pub fn build(b: *std.Build) void {
4
+ const optimize = b.standardOptimizeOption(.{});
5
+ const target = b.standardTargetOptions(.{});
6
+
7
+ var rubylibdir = std.os.getenv("RUBYLIBDIR") orelse "";
8
+ var rubyhdrdir = std.os.getenv("RUBYHDRDIR") orelse "";
9
+ var rubyarchhdrdir = std.os.getenv("RUBYARCHHDRDIR") orelse "";
10
+
11
+ ////////////////////////////////////////////////////////////////
12
+ // lib
13
+
14
+ const lib = b.addSharedLibrary(.{
15
+ .name = "zigrb_100doors",
16
+ .root_source_file = .{ .path = "src/main.zig" },
17
+ .target = target,
18
+ .optimize = optimize,
19
+ });
20
+
21
+ lib.addLibraryPath(rubylibdir);
22
+ lib.addIncludePath(rubyhdrdir);
23
+ lib.addIncludePath(rubyarchhdrdir);
24
+
25
+ lib.linkSystemLibrary("ruby");
26
+ lib.linkSystemLibrary("c");
27
+
28
+ b.installArtifact(lib);
29
+
30
+ ////////////////////////////////////////////////////////////////
31
+ // test
32
+
33
+ const unit_tests = b.addTest(.{
34
+ .root_source_file = .{ .path = "src/main.zig" },
35
+ .target = target,
36
+ .optimize = optimize,
37
+ });
38
+
39
+ unit_tests.addLibraryPath(rubylibdir);
40
+ unit_tests.addIncludePath(rubyhdrdir);
41
+ unit_tests.addIncludePath(rubyarchhdrdir);
42
+
43
+ unit_tests.linkSystemLibrary("ruby");
44
+ unit_tests.linkSystemLibrary("c");
45
+
46
+ const run_unit_tests = b.addRunArtifact(unit_tests);
47
+ const test_step = b.step("test", "Run unit tests");
48
+ test_step.dependOn(&run_unit_tests.step);
49
+ }
@@ -0,0 +1,20 @@
1
+ require 'mkmf'
2
+
3
+ $objs = ['']
4
+ $srcs = ['']
5
+ TARGET = 'libzigrb_100doors'
6
+
7
+ create_makefile TARGET
8
+ File.open('Makefile', 'a') do |f|
9
+ f.puts <<~MFILE
10
+
11
+ clean: clean-zig
12
+ clean-zig:
13
+ \t-$(Q)$(RM) -rf zig-cache zig-out
14
+
15
+ #{TARGET}.so: Makefile build.zig src/main.zig
16
+ \tenv -u DESTDIR RUBYLIBDIR=$(rubylibdir) RUBYHDRDIR=$(rubyhdrdir) RUBYARCHHDRDIR=$(rubyarchhdrdir) zig build test install
17
+ \tcp -v zig-out/lib/#{TARGET}.so .
18
+
19
+ MFILE
20
+ end
@@ -0,0 +1,53 @@
1
+ const std = @import("std");
2
+ const ruby = @cImport(@cInclude("ruby/ruby.h"));
3
+ const testing = std.testing;
4
+
5
+ // Calculate number of open doors after N passes
6
+ // Code taken from Rosetta Code: https://rosettacode.org/wiki/100_doors#Zig
7
+ fn hundred_doors(passes: c_int) c_int {
8
+ var doors = [_]bool{false} ** 101;
9
+ var pass: u8 = 1;
10
+ var door: u8 = undefined;
11
+
12
+ while (pass <= passes) : (pass += 1) {
13
+ door = pass;
14
+ while (door <= 100) : (door += pass)
15
+ doors[door] = !doors[door];
16
+ }
17
+
18
+ var num_open: u8 = 0;
19
+ for (doors) |open| {
20
+ if (open)
21
+ num_open += 1;
22
+ }
23
+ return num_open;
24
+ }
25
+
26
+ // This is a wrapper for hundred_doors function to make it work with Ruby.
27
+ fn rb_hundred_doors(...) callconv(.C) ruby.VALUE {
28
+ var ap = @cVaStart();
29
+ defer @cVaEnd(&ap);
30
+
31
+ // first argument is `self`, but we don't use it so we need to discard it
32
+ var self = @cVaArg(&ap, ruby.VALUE);
33
+ _ = self;
34
+
35
+ // back and forth conversion from Ruby types to internal types + delegation to
36
+ // actual `hundred_doors` function
37
+ var passes = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
38
+ return ruby.INT2NUM(hundred_doors(passes));
39
+ }
40
+
41
+ export fn Init_libzigrb_100doors() void {
42
+ ruby.ruby_init();
43
+ var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
44
+ _ = ruby.rb_define_method(zig_rb_class, "hundred_doors", rb_hundred_doors, 1);
45
+ }
46
+
47
+ test "hundred doors 100 passes" {
48
+ try testing.expect(hundred_doors(100) == 10);
49
+ }
50
+
51
+ test "hundred_doors 1 pass" {
52
+ try testing.expect(hundred_doors(1) == 100);
53
+ }
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ZigExample
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,7 @@
1
+ require_relative 'zig_example/version'
2
+
3
+ begin
4
+ require 'libzigrb_100doors'
5
+ rescue LoadError
6
+ require_relative '../ext/zigrb_100doors/libzigrb_100doors'
7
+ end
metadata ADDED
@@ -0,0 +1,51 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: zig_example
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Frank J. Cameron
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-04-21 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email:
15
+ - fjc@fastmail.net
16
+ executables: []
17
+ extensions:
18
+ - ext/zigrb_100doors/extconf.rb
19
+ extra_rdoc_files: []
20
+ files:
21
+ - ext/zigrb_100doors/build.zig
22
+ - ext/zigrb_100doors/extconf.rb
23
+ - ext/zigrb_100doors/src/main.zig
24
+ - lib/zig_example.rb
25
+ - lib/zig_example/version.rb
26
+ homepage: https://gitlab.com/fjc/ruby-zig_example
27
+ licenses:
28
+ - MIT
29
+ metadata:
30
+ homepage_uri: https://gitlab.com/fjc/ruby-zig_example
31
+ source_code_uri: https://gitlab.com/fjc/ruby-zig_example
32
+ post_install_message:
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 2.6.0
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubygems_version: 3.2.5
48
+ signing_key:
49
+ specification_version: 4
50
+ summary: An example gem for ruby with a native zig extension.
51
+ test_files: []