zig_example 0.1.0 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 260dd4c8b12f9b2c17421f30a42f1b3db48f5c8aa829da99bf9401e8792eb545
4
- data.tar.gz: 15de9092ee7235cfdb0b8631bdf5ac322e3725f0768f988d251907b76d1ddedb
3
+ metadata.gz: 78cf562dbd8af1b7d9badd8701f811d23c53566e0533fd85d708d7aa8aacfae8
4
+ data.tar.gz: 16379b58200d91656978a9ec696efc9f13b0b4b43ee4be590efe82504cfc4d29
5
5
  SHA512:
6
- metadata.gz: ab303f22055fd6f39993ad4d99a5069ec69c8f134606ee04bae141b1f29057125a52a8a1796c1f0e66fc64d8f2bbdb5f2f7654e3d2f9c4b48ec09449a3932ee6
7
- data.tar.gz: 906c175473e4f67ac945002d0db22ce0b2437b5530483fa51a5f2919b11e22486e077efe028140281a71da836ecfeb0e7245cdcbdf8924b9d3d8a6cde98be0b1
6
+ metadata.gz: e3130b68fb94dbbe6de189f122c9bf3b43be22a8fdff6fa827604cd081608a96e88252eb051f39669a7b216c69ed0c460b79ba1a85508f86887d9f3b653c1f96
7
+ data.tar.gz: 8ca455621357daafa0f059f4137e4370bad1c813367bb13e86a9d9c658fa9a131bf105dd3699d76190d1c2a85d4c1eb2e316491142f0734d44c2485f07146ae9
@@ -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_ackermann",
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_ackermann'
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,37 @@
1
+ const std = @import("std");
2
+ const ruby = @cImport(@cInclude("ruby/ruby.h"));
3
+ const testing = std.testing;
4
+
5
+ // https://rosettacode.org/wiki/Ackermann_function#Zig
6
+ pub fn ack(m: c_int, n: c_int) c_int {
7
+ if (m == 0) return n + 1;
8
+ if (n == 0) return ack(m - 1, 1);
9
+ return ack(m - 1, ack(m, n - 1));
10
+ }
11
+
12
+ fn rb_ack(...) callconv(.C) ruby.VALUE {
13
+ var ap = @cVaStart();
14
+ defer @cVaEnd(&ap);
15
+
16
+ // first argument is `self` in ruby; discard it
17
+ var self = @cVaArg(&ap, ruby.VALUE); _ = self;
18
+
19
+ // back and forth type conversions + delegation
20
+ var m = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
21
+ var n = ruby.NUM2INT(@cVaArg(&ap, ruby.VALUE));
22
+ return ruby.INT2NUM(ack(m, n));
23
+ }
24
+
25
+ export fn Init_libzigrb_ackermann() void {
26
+ ruby.ruby_init();
27
+ var zig_rb_class: ruby.VALUE = ruby.rb_define_class("ZigExample", ruby.rb_cObject);
28
+ _ = ruby.rb_define_method(zig_rb_class, "ack", rb_ack, 2);
29
+ }
30
+
31
+ test "ack(0, 0) passes" {
32
+ try testing.expect(ack(0, 0) == 1);
33
+ }
34
+
35
+ test "ack(3, 4) passes" {
36
+ try testing.expect(ack(3, 4) == 125);
37
+ }
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class ZigExample
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/zig_example.rb CHANGED
@@ -1,7 +1,12 @@
1
1
  require_relative 'zig_example/version'
2
2
 
3
- begin
4
- require 'libzigrb_100doors'
5
- rescue LoadError
6
- require_relative '../ext/zigrb_100doors/libzigrb_100doors'
3
+ %w{
4
+ zigrb_100doors
5
+ zigrb_ackermann
6
+ }.each do |lib|
7
+ begin
8
+ require "lib#{lib}"
9
+ rescue LoadError
10
+ require_relative "../ext/#{lib}/lib#{lib}"
11
+ end
7
12
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zig_example
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Frank J. Cameron
@@ -16,11 +16,15 @@ email:
16
16
  executables: []
17
17
  extensions:
18
18
  - ext/zigrb_100doors/extconf.rb
19
+ - ext/zigrb_ackermann/extconf.rb
19
20
  extra_rdoc_files: []
20
21
  files:
21
22
  - ext/zigrb_100doors/build.zig
22
23
  - ext/zigrb_100doors/extconf.rb
23
24
  - ext/zigrb_100doors/src/main.zig
25
+ - ext/zigrb_ackermann/build.zig
26
+ - ext/zigrb_ackermann/extconf.rb
27
+ - ext/zigrb_ackermann/src/main.zig
24
28
  - lib/zig_example.rb
25
29
  - lib/zig_example/version.rb
26
30
  homepage: https://gitlab.com/fjc/ruby-zig_example