@@ -8,6 +8,53 @@
88
99import Foundation
1010
11+#if os(Linux)
12+ import Glibc
13+
14+ // Use fopen/fwrite to output string
15+ func writeStringToFile(string: String, path: String) -> Bool {
16+ let fp = fopen(path, "w"); defer { fclose(fp) }
17+ let byteArray = Array(string.utf8)
18+ let count = fwrite(byteArray, 1, byteArray.count, fp)
19+ return count == string.utf8.count
20+ }
21+
22+ // Use fread to input string
23+ func readStringFromFile(path: String) -> String {
24+ let fp = fopen(path, "r"); defer { fclose(fp) }
25+ var outputString = ""
26+ let chunkSize = 1024
27+ let buffer: UnsafeMutablePointer<CChar> = UnsafeMutablePointer.allocate(capacity: chunkSize)
28+ defer { buffer.deallocate(capacity: chunkSize) }
29+ repeat {
30+ let count: Int = fread(buffer, 1, chunkSize, fp)
31+ guard ferror(fp) == 0 else { break }
32+ if count > 0 {
33+ let ptr = unsafeBitCast(buffer, to: UnsafePointer<CChar>.self)
34+ if let newString = String(validatingUTF8: ptr) {
35+ outputString += newString
36+ }
37+ }
38+ } while feof(fp) == 0
39+
40+ return outputString
41+ }
42+
43+ extension String {
44+ func write(with name: String) throws {
45+ if !writeStringToFile(string: self, path: "diskraDz3/\(name)") {
46+ print("Couldn't write files ¯\\_(ツ)_/¯")
47+ }
48+ }
49+ }
50+#else
51+ private extension String {
52+ func write(with name: String) throws {
53+ try self.write(toFile: "diskraDz3/\(name)", atomically: true, encoding: .utf8)
54+ }
55+ }
56+#endif
57+
1158private extension String {
1259 var sub: String {
1360 return self.map { c in
@@ -112,7 +159,7 @@ class Printer<Vertex> where Vertex: Hashable & Comparable {
112159
113160 func processInitialMinimization(minimization: Graph<Vertex>.Minimization, counter: Int) -> () {
114161 do {
115− try FileManager.default.createDirectory(atPath: "diskraDz3", withIntermediateDirectories: true)
162+ try FileManager.default.createDirectory(atPath: "diskraDz3", withIntermediateDirectories: false)
116163 FileManager.default.createFile(atPath: "diskraDz3/solutions.txt", contents: nil)
117164 solutions = FileHandle(forWritingAtPath: "diskraDz3/solutions.txt")
118165 try table(for: minimization.before, with: minimization.reductions, prefix: "", coef: false).write(with: "\(counter)_1.csv")
@@ -206,8 +253,4 @@ extension Tree {
206253 }
207254}
208255
209−private extension String {
210− func write(with name: String) throws {
211− try self.write(toFile: "diskraDz3/\(name)", atomically: true, encoding: .utf8)
212− }
213−}
256+