Commit f69278290de0e2aace0d7d1cf29b6aa9d335859d

Steffen Jaeckel 2021-12-01T15:31:15

Merge pull request #516 from cntrump/pr_spm_support Add Swift Package Manager support

diff --git a/Package.swift b/Package.swift
new file mode 100644
index 0000000..1ed4dd3
--- /dev/null
+++ b/Package.swift
@@ -0,0 +1,37 @@
+// swift-tools-version:5.0
+// The swift-tools-version declares the minimum version of Swift required to build this package.
+
+import PackageDescription
+
+let package = Package(
+    name: "tommath",
+    platforms: [
+        .macOS(.v10_10), .iOS(.v9), .tvOS(.v9)
+    ],
+    products: [
+        // Products define the executables and libraries a package produces, and make them visible to other packages.
+        .library(
+            name: "libtommath",
+            targets: ["libtommath"])
+    ],
+    dependencies: [
+        // Dependencies declare other packages that this package depends on.
+        // .package(url: /* package url */, from: "1.0.0"),
+    ],
+    targets: [
+        // Targets are the basic building blocks of a package. A target can define a module or a test suite.
+        // Targets can depend on other targets in this package, and on products in packages this package depends on.
+        .target(
+            name: "libtommath",
+            path: ".",
+            exclude: ["demo", "doc", "etc", "logs", "mtest"],
+            sources: ["."],
+            publicHeadersPath: "modulemap",
+            cSettings: [
+                .headerSearchPath("."),
+                .unsafeFlags(["-flto=thin"])  // for Dead Code Elimination
+            ])
+    ],
+    cLanguageStandard: .gnu11,
+    cxxLanguageStandard: .gnucxx14
+)
diff --git a/demo/tommath_tests.swift b/demo/tommath_tests.swift
new file mode 100644
index 0000000..fd254da
--- /dev/null
+++ b/demo/tommath_tests.swift
@@ -0,0 +1,94 @@
+import XCTest
+import libtommath
+
+/* ---> Basic Manipulations <--- */
+
+extension mp_int {
+    var isZero: Bool { used == 0 }
+    var isNeg: Bool { sign == MP_NEG }
+    var isEven: Bool { used == 0 || (dp[0] & 1) == 0 }
+    var isOdd: Bool { !isEven }
+}
+
+func mp_get_u32(_ a: UnsafePointer<mp_int>) -> UInt32 {
+    return UInt32(bitPattern: mp_get_i32(a))
+}
+
+class LibTommathTests: XCTestCase {
+
+    override func setUpWithError() throws {
+        // Put setup code here. This method is called before the invocation of each test method in the class.
+    }
+
+    override func tearDownWithError() throws {
+        // Put teardown code here. This method is called after the invocation of each test method in the class.
+    }
+
+    func testTrivialStuff() throws {
+        var a = mp_int()
+        var b = mp_int()
+        var c = mp_int()
+        var d = mp_int()
+        
+        XCTAssertEqual(mp_init(&a), MP_OKAY)
+        XCTAssertEqual(mp_init(&b), MP_OKAY)
+        XCTAssertEqual(mp_init(&c), MP_OKAY)
+        XCTAssertEqual(mp_init(&d), MP_OKAY)
+        
+        defer {
+            mp_clear(&a)
+            mp_clear(&b)
+            mp_clear(&c)
+            mp_clear(&d)
+        }
+        
+        XCTAssert(mp_error_to_string(MP_OKAY) != nil)
+
+        /* a: 0->5 */
+        mp_set(&a, 5)
+        /* a: 5-> b: -5 */
+        XCTAssertEqual(mp_neg(&a, &b), MP_OKAY)
+        XCTAssertEqual(mp_cmp(&a, &b), MP_GT)
+        XCTAssertEqual(mp_cmp(&b, &a), MP_LT)
+        XCTAssertTrue(b.isNeg)
+        /* a: 5-> a: -5 */
+        var t = a  // Fix compiler error: Overlapping accesses to 'a', but modification requires exclusive access; consider copying to a local variable
+        XCTAssertEqual(mp_neg(&t, &a), MP_OKAY)
+        XCTAssertEqual(mp_cmp(&b, &a), MP_EQ)
+        XCTAssertTrue(a.isNeg)
+        /* a: -5-> b: 5 */
+        XCTAssertEqual(mp_abs(&a, &b), MP_OKAY)
+        XCTAssertTrue(!b.isNeg)
+        /* a: -5-> b: -4 */
+        XCTAssertEqual(mp_add_d(&a, 1, &b), MP_OKAY)
+        XCTAssertTrue(b.isNeg)
+        XCTAssertEqual(mp_get_i32(&b), -4)
+        XCTAssertEqual(mp_get_u32(&b), UInt32(bitPattern: -4))
+        XCTAssertEqual(mp_get_mag_u32(&b), 4)
+        /* a: -5-> b: 1 */
+        XCTAssertEqual(mp_add_d(&a, 6, &b), MP_OKAY)
+        XCTAssertEqual(mp_get_u32(&b), 1)
+        /* a: -5-> a: 1 */
+        t = a
+        XCTAssertEqual(mp_add_d(&t, 6, &a), MP_OKAY)
+        XCTAssertEqual(mp_get_u32(&a), 1)
+        mp_zero(&a);
+        /* a: 0-> a: 6 */
+        t = a
+        XCTAssertEqual(mp_add_d(&t, 6, &a), MP_OKAY)
+        XCTAssertEqual(mp_get_u32(&a), 6)
+
+        mp_set(&a, 42)
+        mp_set(&b, 1)
+        t = b
+        XCTAssertEqual(mp_neg(&t, &b), MP_OKAY)
+        mp_set(&c, 1)
+        XCTAssertEqual(mp_exptmod(&a, &b, &c, &d), MP_OKAY)
+
+        mp_set(&c, 7)
+        /* same here */
+        XCTAssertTrue(mp_exptmod(&a, &b, &c, &d) != MP_OKAY)
+
+        XCTAssertTrue(a.isEven != a.isOdd)
+    }
+}
diff --git a/modulemap/module.modulemap b/modulemap/module.modulemap
new file mode 100644
index 0000000..7280be7
--- /dev/null
+++ b/modulemap/module.modulemap
@@ -0,0 +1,4 @@
+module libtommath [extern_c] {
+    header "../tommath.h"
+    export *
+}