From 2394763daaedab05fe3fa35635317dfaca7092bf Mon Sep 17 00:00:00 2001 From: "joel.hinz" Date: Fri, 20 Feb 2015 07:47:43 +0000 Subject: [PATCH] translation app for iOS, replicating some of the functionality of the Android app. Compiles and works on iPad retina but may crash and has known issues. --- .../gf-ios-swift.xcodeproj/project.pbxproj | 811 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/gf-ios-swift.xccheckout | 41 + .../UserInterfaceState.xcuserstate | Bin 0 -> 14610 bytes .../UserInterfaceState.xcuserstate | Bin 0 -> 50093 bytes src/ui/ios/gf-ios-swift/AppDelegate.swift | 38 + .../gf-ios-swift/Base.lproj/LaunchScreen.xib | 32 + .../gf-ios-swift/Base.lproj/Main.storyboard | 242 ++++++ src/ui/ios/gf-ios-swift/Colors.swift | 72 ++ .../ios/gf-ios-swift/HelpViewController.swift | 24 + .../AppIcon.appiconset/Contents.json | 68 ++ src/ui/ios/gf-ios-swift/Info.plist | 47 + src/ui/ios/gf-ios-swift/Languages.swift | 39 + src/ui/ios/gf-ios-swift/Translator.swift | 210 +++++ src/ui/ios/gf-ios-swift/ViewController.swift | 223 +++++ .../gf-ios-swift-Bridging-Header.h | 13 + .../gf-ios-swift/images/ic_action_switch.png | Bin 0 -> 436 bytes .../ios/gf-ios-swift/images/ic_app copy.png | Bin 0 -> 2458 bytes src/ui/ios/gf-ios-swift/images/ic_app.png | Bin 0 -> 2073 bytes .../ios/gf-ios-swift/images/ic_keyboard.png | Bin 0 -> 695 bytes src/ui/ios/gf-ios-swift/images/ic_mic.png | Bin 0 -> 665 bytes src/ui/ios/gf-ios-swiftTests/Info.plist | 24 + .../gf-ios-swiftTests/gf_ios_swiftTests.swift | 28 + 23 files changed, 1919 insertions(+) create mode 100644 src/ui/ios/gf-ios-swift.xcodeproj/project.pbxproj create mode 100644 src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcshareddata/gf-ios-swift.xccheckout create mode 100644 src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/aarne.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/joelhinz.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 src/ui/ios/gf-ios-swift/AppDelegate.swift create mode 100644 src/ui/ios/gf-ios-swift/Base.lproj/LaunchScreen.xib create mode 100644 src/ui/ios/gf-ios-swift/Base.lproj/Main.storyboard create mode 100644 src/ui/ios/gf-ios-swift/Colors.swift create mode 100644 src/ui/ios/gf-ios-swift/HelpViewController.swift create mode 100644 src/ui/ios/gf-ios-swift/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 src/ui/ios/gf-ios-swift/Info.plist create mode 100644 src/ui/ios/gf-ios-swift/Languages.swift create mode 100644 src/ui/ios/gf-ios-swift/Translator.swift create mode 100644 src/ui/ios/gf-ios-swift/ViewController.swift create mode 100644 src/ui/ios/gf-ios-swift/gf-ios-swift-Bridging-Header.h create mode 100644 src/ui/ios/gf-ios-swift/images/ic_action_switch.png create mode 100644 src/ui/ios/gf-ios-swift/images/ic_app copy.png create mode 100644 src/ui/ios/gf-ios-swift/images/ic_app.png create mode 100644 src/ui/ios/gf-ios-swift/images/ic_keyboard.png create mode 100644 src/ui/ios/gf-ios-swift/images/ic_mic.png create mode 100644 src/ui/ios/gf-ios-swiftTests/Info.plist create mode 100644 src/ui/ios/gf-ios-swiftTests/gf_ios_swiftTests.swift diff --git a/src/ui/ios/gf-ios-swift.xcodeproj/project.pbxproj b/src/ui/ios/gf-ios-swift.xcodeproj/project.pbxproj new file mode 100644 index 000000000..ab3bf89e5 --- /dev/null +++ b/src/ui/ios/gf-ios-swift.xcodeproj/project.pbxproj @@ -0,0 +1,811 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + B62B413D1A5F513D00296901 /* Languages.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62B413C1A5F513D00296901 /* Languages.swift */; }; + B62B413F1A61CCF700296901 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = B62B413E1A61CCF700296901 /* Colors.swift */; }; + B62B41411A63241700296901 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B62B41401A63241700296901 /* UIKit.framework */; }; + B62C44F11A37A7DA003613DD /* grammars in Resources */ = {isa = PBXBuildFile; fileRef = B62C44F01A37A7DA003613DD /* grammars */; }; + B62E50921A3A628900805DD8 /* assert.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E502F1A3A628900805DD8 /* assert.c */; }; + B62E50931A3A628900805DD8 /* bits.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50311A3A628900805DD8 /* bits.c */; }; + B62E50941A3A628900805DD8 /* choice.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50331A3A628900805DD8 /* choice.c */; }; + B62E50951A3A628900805DD8 /* defs.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50351A3A628900805DD8 /* defs.c */; }; + B62E50961A3A628900805DD8 /* enum.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50371A3A628900805DD8 /* enum.c */; }; + B62E50971A3A628900805DD8 /* exn.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50391A3A628900805DD8 /* exn.c */; }; + B62E50981A3A628900805DD8 /* file.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E503B1A3A628900805DD8 /* file.c */; }; + B62E50991A3A628900805DD8 /* fun.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E503D1A3A628900805DD8 /* fun.c */; }; + B62E509A1A3A628900805DD8 /* hash.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E503F1A3A628900805DD8 /* hash.c */; }; + B62E509B1A3A628900805DD8 /* in.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50411A3A628900805DD8 /* in.c */; }; + B62E509C1A3A628900805DD8 /* map.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50431A3A628900805DD8 /* map.c */; }; + B62E509D1A3A628900805DD8 /* mem.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50451A3A628900805DD8 /* mem.c */; }; + B62E509E1A3A628900805DD8 /* out.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50471A3A628900805DD8 /* out.c */; }; + B62E509F1A3A628900805DD8 /* prime.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50491A3A628900805DD8 /* prime.c */; }; + B62E50A01A3A628900805DD8 /* seq.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E504B1A3A628900805DD8 /* seq.c */; }; + B62E50A11A3A628900805DD8 /* string.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E504D1A3A628900805DD8 /* string.c */; }; + B62E50A21A3A628900805DD8 /* ucs.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50501A3A628900805DD8 /* ucs.c */; }; + B62E50A31A3A628900805DD8 /* utf8.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50521A3A628900805DD8 /* utf8.c */; }; + B62E50A41A3A628900805DD8 /* variant.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50541A3A628900805DD8 /* variant.c */; }; + B62E50A51A3A628900805DD8 /* data.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50571A3A628900805DD8 /* data.c */; }; + B62E50A61A3A628900805DD8 /* evaluator.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50591A3A628900805DD8 /* evaluator.c */; }; + B62E50A71A3A628900805DD8 /* expr.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E505B1A3A628900805DD8 /* expr.c */; }; + B62E50A81A3A628900805DD8 /* graphviz.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E505D1A3A628900805DD8 /* graphviz.c */; }; + B62E50A91A3A628900805DD8 /* hopu.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E505F1A3A628900805DD8 /* hopu.c */; }; + B62E50AA1A3A628900805DD8 /* jit.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50611A3A628900805DD8 /* jit.c */; }; + B62E50AB1A3A628900805DD8 /* linearizer.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50841A3A628900805DD8 /* linearizer.c */; }; + B62E50AC1A3A628900805DD8 /* literals.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50861A3A628900805DD8 /* literals.c */; }; + B62E50AD1A3A628900805DD8 /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50881A3A628900805DD8 /* parser.c */; }; + B62E50AE1A3A628900805DD8 /* parseval.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50891A3A628900805DD8 /* parseval.c */; }; + B62E50AF1A3A628900805DD8 /* pgf.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E508A1A3A628900805DD8 /* pgf.c */; }; + B62E50B01A3A628900805DD8 /* printer.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E508C1A3A628900805DD8 /* printer.c */; }; + B62E50B11A3A628900805DD8 /* reader.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E508D1A3A628900805DD8 /* reader.c */; }; + B62E50B21A3A628900805DD8 /* reasoner.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E508F1A3A628900805DD8 /* reasoner.c */; }; + B62E50B31A3A628900805DD8 /* typechecker.c in Sources */ = {isa = PBXBuildFile; fileRef = B62E50911A3A628900805DD8 /* typechecker.c */; }; + B63010911A54C78400AD56A3 /* Translator.swift in Sources */ = {isa = PBXBuildFile; fileRef = B63010901A54C78400AD56A3 /* Translator.swift */; }; + B63010971A5716BF00AD56A3 /* ic_action_switch.png in Resources */ = {isa = PBXBuildFile; fileRef = B63010931A5716BF00AD56A3 /* ic_action_switch.png */; }; + B63010981A5716BF00AD56A3 /* ic_app.png in Resources */ = {isa = PBXBuildFile; fileRef = B63010941A5716BF00AD56A3 /* ic_app.png */; }; + B63010991A5716BF00AD56A3 /* ic_keyboard.png in Resources */ = {isa = PBXBuildFile; fileRef = B63010951A5716BF00AD56A3 /* ic_keyboard.png */; }; + B630109A1A5716BF00AD56A3 /* ic_mic.png in Resources */ = {isa = PBXBuildFile; fileRef = B63010961A5716BF00AD56A3 /* ic_mic.png */; }; + B630109C1A5764A700AD56A3 /* HelpViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B630109B1A5764A700AD56A3 /* HelpViewController.swift */; }; + B65248331A36598400C8BD53 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65248321A36598400C8BD53 /* AppDelegate.swift */; }; + B65248351A36598400C8BD53 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65248341A36598400C8BD53 /* ViewController.swift */; }; + B65248381A36598400C8BD53 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B65248361A36598400C8BD53 /* Main.storyboard */; }; + B652483A1A36598400C8BD53 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B65248391A36598400C8BD53 /* Images.xcassets */; }; + B652483D1A36598400C8BD53 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = B652483B1A36598400C8BD53 /* LaunchScreen.xib */; }; + B65248491A36598400C8BD53 /* gf_ios_swiftTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = B65248481A36598400C8BD53 /* gf_ios_swiftTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + B65248431A36598400C8BD53 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = B65248251A36598400C8BD53 /* Project object */; + proxyType = 1; + remoteGlobalIDString = B652482C1A36598400C8BD53; + remoteInfo = "gf-ios-swift"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXFileReference section */ + B62B413C1A5F513D00296901 /* Languages.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Languages.swift; sourceTree = ""; }; + B62B413E1A61CCF700296901 /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; + B62B41401A63241700296901 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + B62C44F01A37A7DA003613DD /* grammars */ = {isa = PBXFileReference; lastKnownFileType = folder; path = grammars; sourceTree = ""; }; + B62C44F21A37AA7F003613DD /* gf-ios-swift-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "gf-ios-swift-Bridging-Header.h"; sourceTree = ""; }; + B62E502F1A3A628900805DD8 /* assert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = assert.c; sourceTree = ""; }; + B62E50301A3A628900805DD8 /* assert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = assert.h; sourceTree = ""; }; + B62E50311A3A628900805DD8 /* bits.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bits.c; sourceTree = ""; }; + B62E50321A3A628900805DD8 /* bits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bits.h; sourceTree = ""; }; + B62E50331A3A628900805DD8 /* choice.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = choice.c; sourceTree = ""; }; + B62E50341A3A628900805DD8 /* choice.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = choice.h; sourceTree = ""; }; + B62E50351A3A628900805DD8 /* defs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = defs.c; sourceTree = ""; }; + B62E50361A3A628900805DD8 /* defs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = defs.h; sourceTree = ""; }; + B62E50371A3A628900805DD8 /* enum.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = enum.c; sourceTree = ""; }; + B62E50381A3A628900805DD8 /* enum.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = enum.h; sourceTree = ""; }; + B62E50391A3A628900805DD8 /* exn.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = exn.c; sourceTree = ""; }; + B62E503A1A3A628900805DD8 /* exn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exn.h; sourceTree = ""; }; + B62E503B1A3A628900805DD8 /* file.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = file.c; sourceTree = ""; }; + B62E503C1A3A628900805DD8 /* file.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = file.h; sourceTree = ""; }; + B62E503D1A3A628900805DD8 /* fun.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fun.c; sourceTree = ""; }; + B62E503E1A3A628900805DD8 /* fun.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fun.h; sourceTree = ""; }; + B62E503F1A3A628900805DD8 /* hash.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hash.c; sourceTree = ""; }; + B62E50401A3A628900805DD8 /* hash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hash.h; sourceTree = ""; }; + B62E50411A3A628900805DD8 /* in.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = in.c; sourceTree = ""; }; + B62E50421A3A628900805DD8 /* in.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = in.h; sourceTree = ""; }; + B62E50431A3A628900805DD8 /* map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = map.c; sourceTree = ""; }; + B62E50441A3A628900805DD8 /* map.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = map.h; sourceTree = ""; }; + B62E50451A3A628900805DD8 /* mem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mem.c; sourceTree = ""; }; + B62E50461A3A628900805DD8 /* mem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mem.h; sourceTree = ""; }; + B62E50471A3A628900805DD8 /* out.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = out.c; sourceTree = ""; }; + B62E50481A3A628900805DD8 /* out.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = out.h; sourceTree = ""; }; + B62E50491A3A628900805DD8 /* prime.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prime.c; sourceTree = ""; }; + B62E504A1A3A628900805DD8 /* prime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = prime.h; sourceTree = ""; }; + B62E504B1A3A628900805DD8 /* seq.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = seq.c; sourceTree = ""; }; + B62E504C1A3A628900805DD8 /* seq.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seq.h; sourceTree = ""; }; + B62E504D1A3A628900805DD8 /* string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = string.c; sourceTree = ""; }; + B62E504E1A3A628900805DD8 /* string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = string.h; sourceTree = ""; }; + B62E504F1A3A628900805DD8 /* sysdeps.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sysdeps.h; sourceTree = ""; }; + B62E50501A3A628900805DD8 /* ucs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ucs.c; sourceTree = ""; }; + B62E50511A3A628900805DD8 /* ucs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ucs.h; sourceTree = ""; }; + B62E50521A3A628900805DD8 /* utf8.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = utf8.c; sourceTree = ""; }; + B62E50531A3A628900805DD8 /* utf8.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utf8.h; sourceTree = ""; }; + B62E50541A3A628900805DD8 /* variant.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = variant.c; sourceTree = ""; }; + B62E50551A3A628900805DD8 /* variant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = variant.h; sourceTree = ""; }; + B62E50571A3A628900805DD8 /* data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = data.c; sourceTree = ""; }; + B62E50581A3A628900805DD8 /* data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = data.h; sourceTree = ""; }; + B62E50591A3A628900805DD8 /* evaluator.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = evaluator.c; sourceTree = ""; }; + B62E505A1A3A628900805DD8 /* evaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evaluator.h; sourceTree = ""; }; + B62E505B1A3A628900805DD8 /* expr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = expr.c; sourceTree = ""; }; + B62E505C1A3A628900805DD8 /* expr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = expr.h; sourceTree = ""; }; + B62E505D1A3A628900805DD8 /* graphviz.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = graphviz.c; sourceTree = ""; }; + B62E505E1A3A628900805DD8 /* graphviz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graphviz.h; sourceTree = ""; }; + B62E505F1A3A628900805DD8 /* hopu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hopu.c; sourceTree = ""; }; + B62E50601A3A628900805DD8 /* hopu.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hopu.h; sourceTree = ""; }; + B62E50611A3A628900805DD8 /* jit.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = jit.c; sourceTree = ""; }; + B62E50641A3A628900805DD8 /* asm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm.h; sourceTree = ""; }; + B62E50651A3A628900805DD8 /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; + B62E50661A3A628900805DD8 /* fp-swf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fp-swf.h"; sourceTree = ""; }; + B62E50671A3A628900805DD8 /* fp-vfp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fp-vfp.h"; sourceTree = ""; }; + B62E50681A3A628900805DD8 /* fp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp.h; sourceTree = ""; }; + B62E50691A3A628900805DD8 /* funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funcs.h; sourceTree = ""; }; + B62E506A1A3A628900805DD8 /* asm-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "asm-common.h"; sourceTree = ""; }; + B62E506B1A3A628900805DD8 /* core-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "core-common.h"; sourceTree = ""; }; + B62E506C1A3A628900805DD8 /* fp-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fp-common.h"; sourceTree = ""; }; + B62E506D1A3A628900805DD8 /* funcs-common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "funcs-common.h"; sourceTree = ""; }; + B62E506F1A3A628900805DD8 /* asm-32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "asm-32.h"; sourceTree = ""; }; + B62E50701A3A628900805DD8 /* asm-64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "asm-64.h"; sourceTree = ""; }; + B62E50711A3A628900805DD8 /* asm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm.h; sourceTree = ""; }; + B62E50721A3A628900805DD8 /* core-32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "core-32.h"; sourceTree = ""; }; + B62E50731A3A628900805DD8 /* core-64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "core-64.h"; sourceTree = ""; }; + B62E50741A3A628900805DD8 /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; + B62E50751A3A628900805DD8 /* fp-32.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fp-32.h"; sourceTree = ""; }; + B62E50761A3A628900805DD8 /* fp-64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fp-64.h"; sourceTree = ""; }; + B62E50771A3A628900805DD8 /* fp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp.h; sourceTree = ""; }; + B62E50781A3A628900805DD8 /* funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funcs.h; sourceTree = ""; }; + B62E507A1A3A628900805DD8 /* asm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm.h; sourceTree = ""; }; + B62E507B1A3A628900805DD8 /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; + B62E507C1A3A628900805DD8 /* fp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp.h; sourceTree = ""; }; + B62E507D1A3A628900805DD8 /* funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funcs.h; sourceTree = ""; }; + B62E507F1A3A628900805DD8 /* asm.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asm.h; sourceTree = ""; }; + B62E50801A3A628900805DD8 /* core.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = core.h; sourceTree = ""; }; + B62E50811A3A628900805DD8 /* fp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fp.h; sourceTree = ""; }; + B62E50821A3A628900805DD8 /* funcs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funcs.h; sourceTree = ""; }; + B62E50831A3A628900805DD8 /* lightning.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lightning.h; sourceTree = ""; }; + B62E50841A3A628900805DD8 /* linearizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = linearizer.c; sourceTree = ""; }; + B62E50851A3A628900805DD8 /* linearizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = linearizer.h; sourceTree = ""; }; + B62E50861A3A628900805DD8 /* literals.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = literals.c; sourceTree = ""; }; + B62E50871A3A628900805DD8 /* literals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = literals.h; sourceTree = ""; }; + B62E50881A3A628900805DD8 /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parser.c; sourceTree = ""; }; + B62E50891A3A628900805DD8 /* parseval.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = parseval.c; sourceTree = ""; }; + B62E508A1A3A628900805DD8 /* pgf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pgf.c; sourceTree = ""; }; + B62E508B1A3A628900805DD8 /* pgf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pgf.h; sourceTree = ""; }; + B62E508C1A3A628900805DD8 /* printer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = printer.c; sourceTree = ""; }; + B62E508D1A3A628900805DD8 /* reader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = reader.c; sourceTree = ""; }; + B62E508E1A3A628900805DD8 /* reader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reader.h; sourceTree = ""; }; + B62E508F1A3A628900805DD8 /* reasoner.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = reasoner.c; sourceTree = ""; }; + B62E50901A3A628900805DD8 /* reasoner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = reasoner.h; sourceTree = ""; }; + B62E50911A3A628900805DD8 /* typechecker.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = typechecker.c; sourceTree = ""; }; + B63010901A54C78400AD56A3 /* Translator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Translator.swift; sourceTree = ""; }; + B63010931A5716BF00AD56A3 /* ic_action_switch.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_action_switch.png; sourceTree = ""; }; + B63010941A5716BF00AD56A3 /* ic_app.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_app.png; sourceTree = ""; }; + B63010951A5716BF00AD56A3 /* ic_keyboard.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_keyboard.png; sourceTree = ""; }; + B63010961A5716BF00AD56A3 /* ic_mic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = ic_mic.png; sourceTree = ""; }; + B630109B1A5764A700AD56A3 /* HelpViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HelpViewController.swift; path = "gf-ios-swift/HelpViewController.swift"; sourceTree = SOURCE_ROOT; }; + B652482D1A36598400C8BD53 /* gf-ios-swift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "gf-ios-swift.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + B65248311A36598400C8BD53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B65248321A36598400C8BD53 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + B65248341A36598400C8BD53 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + B65248371A36598400C8BD53 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + B65248391A36598400C8BD53 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + B652483C1A36598400C8BD53 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; + B65248421A36598400C8BD53 /* gf-ios-swiftTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "gf-ios-swiftTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + B65248471A36598400C8BD53 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + B65248481A36598400C8BD53 /* gf_ios_swiftTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = gf_ios_swiftTests.swift; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + B652482A1A36598400C8BD53 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + B62B41411A63241700296901 /* UIKit.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B652483F1A36598400C8BD53 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + B62E502E1A3A628900805DD8 /* gu */ = { + isa = PBXGroup; + children = ( + B62E502F1A3A628900805DD8 /* assert.c */, + B62E50301A3A628900805DD8 /* assert.h */, + B62E50311A3A628900805DD8 /* bits.c */, + B62E50321A3A628900805DD8 /* bits.h */, + B62E50331A3A628900805DD8 /* choice.c */, + B62E50341A3A628900805DD8 /* choice.h */, + B62E50351A3A628900805DD8 /* defs.c */, + B62E50361A3A628900805DD8 /* defs.h */, + B62E50371A3A628900805DD8 /* enum.c */, + B62E50381A3A628900805DD8 /* enum.h */, + B62E50391A3A628900805DD8 /* exn.c */, + B62E503A1A3A628900805DD8 /* exn.h */, + B62E503B1A3A628900805DD8 /* file.c */, + B62E503C1A3A628900805DD8 /* file.h */, + B62E503D1A3A628900805DD8 /* fun.c */, + B62E503E1A3A628900805DD8 /* fun.h */, + B62E503F1A3A628900805DD8 /* hash.c */, + B62E50401A3A628900805DD8 /* hash.h */, + B62E50411A3A628900805DD8 /* in.c */, + B62E50421A3A628900805DD8 /* in.h */, + B62E50431A3A628900805DD8 /* map.c */, + B62E50441A3A628900805DD8 /* map.h */, + B62E50451A3A628900805DD8 /* mem.c */, + B62E50461A3A628900805DD8 /* mem.h */, + B62E50471A3A628900805DD8 /* out.c */, + B62E50481A3A628900805DD8 /* out.h */, + B62E50491A3A628900805DD8 /* prime.c */, + B62E504A1A3A628900805DD8 /* prime.h */, + B62E504B1A3A628900805DD8 /* seq.c */, + B62E504C1A3A628900805DD8 /* seq.h */, + B62E504D1A3A628900805DD8 /* string.c */, + B62E504E1A3A628900805DD8 /* string.h */, + B62E504F1A3A628900805DD8 /* sysdeps.h */, + B62E50501A3A628900805DD8 /* ucs.c */, + B62E50511A3A628900805DD8 /* ucs.h */, + B62E50521A3A628900805DD8 /* utf8.c */, + B62E50531A3A628900805DD8 /* utf8.h */, + B62E50541A3A628900805DD8 /* variant.c */, + B62E50551A3A628900805DD8 /* variant.h */, + ); + path = gu; + sourceTree = ""; + }; + B62E50561A3A628900805DD8 /* pgf */ = { + isa = PBXGroup; + children = ( + B62E50571A3A628900805DD8 /* data.c */, + B62E50581A3A628900805DD8 /* data.h */, + B62E50591A3A628900805DD8 /* evaluator.c */, + B62E505A1A3A628900805DD8 /* evaluator.h */, + B62E505B1A3A628900805DD8 /* expr.c */, + B62E505C1A3A628900805DD8 /* expr.h */, + B62E505D1A3A628900805DD8 /* graphviz.c */, + B62E505E1A3A628900805DD8 /* graphviz.h */, + B62E505F1A3A628900805DD8 /* hopu.c */, + B62E50601A3A628900805DD8 /* hopu.h */, + B62E50611A3A628900805DD8 /* jit.c */, + B62E50621A3A628900805DD8 /* lightning */, + B62E50831A3A628900805DD8 /* lightning.h */, + B62E50841A3A628900805DD8 /* linearizer.c */, + B62E50851A3A628900805DD8 /* linearizer.h */, + B62E50861A3A628900805DD8 /* literals.c */, + B62E50871A3A628900805DD8 /* literals.h */, + B62E50881A3A628900805DD8 /* parser.c */, + B62E50891A3A628900805DD8 /* parseval.c */, + B62E508A1A3A628900805DD8 /* pgf.c */, + B62E508B1A3A628900805DD8 /* pgf.h */, + B62E508C1A3A628900805DD8 /* printer.c */, + B62E508D1A3A628900805DD8 /* reader.c */, + B62E508E1A3A628900805DD8 /* reader.h */, + B62E508F1A3A628900805DD8 /* reasoner.c */, + B62E50901A3A628900805DD8 /* reasoner.h */, + B62E50911A3A628900805DD8 /* typechecker.c */, + ); + path = pgf; + sourceTree = ""; + }; + B62E50621A3A628900805DD8 /* lightning */ = { + isa = PBXGroup; + children = ( + B62E50631A3A628900805DD8 /* arm */, + B62E506A1A3A628900805DD8 /* asm-common.h */, + B62E506B1A3A628900805DD8 /* core-common.h */, + B62E506C1A3A628900805DD8 /* fp-common.h */, + B62E506D1A3A628900805DD8 /* funcs-common.h */, + B62E506E1A3A628900805DD8 /* i386 */, + B62E50791A3A628900805DD8 /* ppc */, + B62E507E1A3A628900805DD8 /* sparc */, + ); + path = lightning; + sourceTree = ""; + }; + B62E50631A3A628900805DD8 /* arm */ = { + isa = PBXGroup; + children = ( + B62E50641A3A628900805DD8 /* asm.h */, + B62E50651A3A628900805DD8 /* core.h */, + B62E50661A3A628900805DD8 /* fp-swf.h */, + B62E50671A3A628900805DD8 /* fp-vfp.h */, + B62E50681A3A628900805DD8 /* fp.h */, + B62E50691A3A628900805DD8 /* funcs.h */, + ); + path = arm; + sourceTree = ""; + }; + B62E506E1A3A628900805DD8 /* i386 */ = { + isa = PBXGroup; + children = ( + B62E506F1A3A628900805DD8 /* asm-32.h */, + B62E50701A3A628900805DD8 /* asm-64.h */, + B62E50711A3A628900805DD8 /* asm.h */, + B62E50721A3A628900805DD8 /* core-32.h */, + B62E50731A3A628900805DD8 /* core-64.h */, + B62E50741A3A628900805DD8 /* core.h */, + B62E50751A3A628900805DD8 /* fp-32.h */, + B62E50761A3A628900805DD8 /* fp-64.h */, + B62E50771A3A628900805DD8 /* fp.h */, + B62E50781A3A628900805DD8 /* funcs.h */, + ); + path = i386; + sourceTree = ""; + }; + B62E50791A3A628900805DD8 /* ppc */ = { + isa = PBXGroup; + children = ( + B62E507A1A3A628900805DD8 /* asm.h */, + B62E507B1A3A628900805DD8 /* core.h */, + B62E507C1A3A628900805DD8 /* fp.h */, + B62E507D1A3A628900805DD8 /* funcs.h */, + ); + path = ppc; + sourceTree = ""; + }; + B62E507E1A3A628900805DD8 /* sparc */ = { + isa = PBXGroup; + children = ( + B62E507F1A3A628900805DD8 /* asm.h */, + B62E50801A3A628900805DD8 /* core.h */, + B62E50811A3A628900805DD8 /* fp.h */, + B62E50821A3A628900805DD8 /* funcs.h */, + ); + path = sparc; + sourceTree = ""; + }; + B63010921A5716BF00AD56A3 /* images */ = { + isa = PBXGroup; + children = ( + B63010931A5716BF00AD56A3 /* ic_action_switch.png */, + B63010941A5716BF00AD56A3 /* ic_app.png */, + B63010951A5716BF00AD56A3 /* ic_keyboard.png */, + B63010961A5716BF00AD56A3 /* ic_mic.png */, + ); + path = images; + sourceTree = ""; + }; + B65248241A36598400C8BD53 = { + isa = PBXGroup; + children = ( + B62B41401A63241700296901 /* UIKit.framework */, + B62E502E1A3A628900805DD8 /* gu */, + B62E50561A3A628900805DD8 /* pgf */, + B62C44F01A37A7DA003613DD /* grammars */, + B652482F1A36598400C8BD53 /* gf-ios-swift */, + B65248451A36598400C8BD53 /* gf-ios-swiftTests */, + B652482E1A36598400C8BD53 /* Products */, + ); + sourceTree = ""; + }; + B652482E1A36598400C8BD53 /* Products */ = { + isa = PBXGroup; + children = ( + B652482D1A36598400C8BD53 /* gf-ios-swift.app */, + B65248421A36598400C8BD53 /* gf-ios-swiftTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + B652482F1A36598400C8BD53 /* gf-ios-swift */ = { + isa = PBXGroup; + children = ( + B65248321A36598400C8BD53 /* AppDelegate.swift */, + B630109B1A5764A700AD56A3 /* HelpViewController.swift */, + B65248341A36598400C8BD53 /* ViewController.swift */, + B62B413C1A5F513D00296901 /* Languages.swift */, + B65248361A36598400C8BD53 /* Main.storyboard */, + B65248391A36598400C8BD53 /* Images.xcassets */, + B652483B1A36598400C8BD53 /* LaunchScreen.xib */, + B65248301A36598400C8BD53 /* Supporting Files */, + B62C44F21A37AA7F003613DD /* gf-ios-swift-Bridging-Header.h */, + B63010901A54C78400AD56A3 /* Translator.swift */, + B62B413E1A61CCF700296901 /* Colors.swift */, + ); + path = "gf-ios-swift"; + sourceTree = ""; + }; + B65248301A36598400C8BD53 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + B63010921A5716BF00AD56A3 /* images */, + B65248311A36598400C8BD53 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + B65248451A36598400C8BD53 /* gf-ios-swiftTests */ = { + isa = PBXGroup; + children = ( + B65248481A36598400C8BD53 /* gf_ios_swiftTests.swift */, + B65248461A36598400C8BD53 /* Supporting Files */, + ); + path = "gf-ios-swiftTests"; + sourceTree = ""; + }; + B65248461A36598400C8BD53 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + B65248471A36598400C8BD53 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + B652482C1A36598400C8BD53 /* gf-ios-swift */ = { + isa = PBXNativeTarget; + buildConfigurationList = B652484C1A36598400C8BD53 /* Build configuration list for PBXNativeTarget "gf-ios-swift" */; + buildPhases = ( + B65248291A36598400C8BD53 /* Sources */, + B652482A1A36598400C8BD53 /* Frameworks */, + B652482B1A36598400C8BD53 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "gf-ios-swift"; + productName = "gf-ios-swift"; + productReference = B652482D1A36598400C8BD53 /* gf-ios-swift.app */; + productType = "com.apple.product-type.application"; + }; + B65248411A36598400C8BD53 /* gf-ios-swiftTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = B652484F1A36598400C8BD53 /* Build configuration list for PBXNativeTarget "gf-ios-swiftTests" */; + buildPhases = ( + B652483E1A36598400C8BD53 /* Sources */, + B652483F1A36598400C8BD53 /* Frameworks */, + B65248401A36598400C8BD53 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + B65248441A36598400C8BD53 /* PBXTargetDependency */, + ); + name = "gf-ios-swiftTests"; + productName = "gf-ios-swiftTests"; + productReference = B65248421A36598400C8BD53 /* gf-ios-swiftTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + B65248251A36598400C8BD53 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + ORGANIZATIONNAME = Vyvyan; + TargetAttributes = { + B652482C1A36598400C8BD53 = { + CreatedOnToolsVersion = 6.1.1; + DevelopmentTeam = D6DRLEKR8M; + }; + B65248411A36598400C8BD53 = { + CreatedOnToolsVersion = 6.1.1; + TestTargetID = B652482C1A36598400C8BD53; + }; + }; + }; + buildConfigurationList = B65248281A36598400C8BD53 /* Build configuration list for PBXProject "gf-ios-swift" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = B65248241A36598400C8BD53; + productRefGroup = B652482E1A36598400C8BD53 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + B652482C1A36598400C8BD53 /* gf-ios-swift */, + B65248411A36598400C8BD53 /* gf-ios-swiftTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + B652482B1A36598400C8BD53 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B63010971A5716BF00AD56A3 /* ic_action_switch.png in Resources */, + B630109A1A5716BF00AD56A3 /* ic_mic.png in Resources */, + B63010981A5716BF00AD56A3 /* ic_app.png in Resources */, + B63010991A5716BF00AD56A3 /* ic_keyboard.png in Resources */, + B65248381A36598400C8BD53 /* Main.storyboard in Resources */, + B652483D1A36598400C8BD53 /* LaunchScreen.xib in Resources */, + B62C44F11A37A7DA003613DD /* grammars in Resources */, + B652483A1A36598400C8BD53 /* Images.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B65248401A36598400C8BD53 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + B65248291A36598400C8BD53 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B62E50B11A3A628900805DD8 /* reader.c in Sources */, + B62E50921A3A628900805DD8 /* assert.c in Sources */, + B62E509C1A3A628900805DD8 /* map.c in Sources */, + B62E50971A3A628900805DD8 /* exn.c in Sources */, + B62E50931A3A628900805DD8 /* bits.c in Sources */, + B62E50A21A3A628900805DD8 /* ucs.c in Sources */, + B62E50B01A3A628900805DD8 /* printer.c in Sources */, + B62E50A81A3A628900805DD8 /* graphviz.c in Sources */, + B62E50A51A3A628900805DD8 /* data.c in Sources */, + B62E50941A3A628900805DD8 /* choice.c in Sources */, + B62E509F1A3A628900805DD8 /* prime.c in Sources */, + B63010911A54C78400AD56A3 /* Translator.swift in Sources */, + B62E50A11A3A628900805DD8 /* string.c in Sources */, + B62E50AC1A3A628900805DD8 /* literals.c in Sources */, + B62E50AB1A3A628900805DD8 /* linearizer.c in Sources */, + B65248351A36598400C8BD53 /* ViewController.swift in Sources */, + B62E509E1A3A628900805DD8 /* out.c in Sources */, + B62E50AA1A3A628900805DD8 /* jit.c in Sources */, + B62E50A41A3A628900805DD8 /* variant.c in Sources */, + B62E50A91A3A628900805DD8 /* hopu.c in Sources */, + B62E50A31A3A628900805DD8 /* utf8.c in Sources */, + B65248331A36598400C8BD53 /* AppDelegate.swift in Sources */, + B62E50AF1A3A628900805DD8 /* pgf.c in Sources */, + B62B413D1A5F513D00296901 /* Languages.swift in Sources */, + B62E50951A3A628900805DD8 /* defs.c in Sources */, + B62E50A01A3A628900805DD8 /* seq.c in Sources */, + B62E50991A3A628900805DD8 /* fun.c in Sources */, + B62E50B21A3A628900805DD8 /* reasoner.c in Sources */, + B62E509D1A3A628900805DD8 /* mem.c in Sources */, + B62E509B1A3A628900805DD8 /* in.c in Sources */, + B62E509A1A3A628900805DD8 /* hash.c in Sources */, + B62B413F1A61CCF700296901 /* Colors.swift in Sources */, + B62E50B31A3A628900805DD8 /* typechecker.c in Sources */, + B630109C1A5764A700AD56A3 /* HelpViewController.swift in Sources */, + B62E50961A3A628900805DD8 /* enum.c in Sources */, + B62E50981A3A628900805DD8 /* file.c in Sources */, + B62E50A71A3A628900805DD8 /* expr.c in Sources */, + B62E50AD1A3A628900805DD8 /* parser.c in Sources */, + B62E50A61A3A628900805DD8 /* evaluator.c in Sources */, + B62E50AE1A3A628900805DD8 /* parseval.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + B652483E1A36598400C8BD53 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B65248491A36598400C8BD53 /* gf_ios_swiftTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + B65248441A36598400C8BD53 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = B652482C1A36598400C8BD53 /* gf-ios-swift */; + targetProxy = B65248431A36598400C8BD53 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + B65248361A36598400C8BD53 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + B65248371A36598400C8BD53 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + B652483B1A36598400C8BD53 /* LaunchScreen.xib */ = { + isa = PBXVariantGroup; + children = ( + B652483C1A36598400C8BD53 /* Base */, + ); + name = LaunchScreen.xib; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + B652484A1A36598400C8BD53 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + B652484B1A36598400C8BD53 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.1; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + B652484D1A36598400C8BD53 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = "gf-ios-swift/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/gf-ios-swift", + ); + OTHER_CFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/gf-ios-swift/gf-ios-swift-Bridging-Header.h"; + }; + name = Debug; + }; + B652484E1A36598400C8BD53 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = "gf-ios-swift/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/gf-ios-swift", + ); + OTHER_CFLAGS = ""; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "$(PROJECT_DIR)/gf-ios-swift/gf-ios-swift-Bridging-Header.h"; + }; + name = Release; + }; + B65248501A36598400C8BD53 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = "gf-ios-swiftTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/gf-ios-swift.app/gf-ios-swift"; + }; + name = Debug; + }; + B65248511A36598400C8BD53 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = "gf-ios-swiftTests/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/gf-ios-swift.app/gf-ios-swift"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + B65248281A36598400C8BD53 /* Build configuration list for PBXProject "gf-ios-swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B652484A1A36598400C8BD53 /* Debug */, + B652484B1A36598400C8BD53 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B652484C1A36598400C8BD53 /* Build configuration list for PBXNativeTarget "gf-ios-swift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B652484D1A36598400C8BD53 /* Debug */, + B652484E1A36598400C8BD53 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + B652484F1A36598400C8BD53 /* Build configuration list for PBXNativeTarget "gf-ios-swiftTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + B65248501A36598400C8BD53 /* Debug */, + B65248511A36598400C8BD53 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = B65248251A36598400C8BD53 /* Project object */; +} diff --git a/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..f22c50dca --- /dev/null +++ b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcshareddata/gf-ios-swift.xccheckout b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcshareddata/gf-ios-swift.xccheckout new file mode 100644 index 000000000..96f26dba2 --- /dev/null +++ b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcshareddata/gf-ios-swift.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + 5CFAFFCD-97BB-4806-823D-973AFB2DB882 + IDESourceControlProjectName + gf-ios-swift + IDESourceControlProjectOriginsDictionary + + 716509F1F37F996016FEDF093BF5C7F801D32B1E + bitbucket.org:devalanteriel/gf-swift.git + + IDESourceControlProjectPath + gf-ios-swift/gf-ios-swift.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 716509F1F37F996016FEDF093BF5C7F801D32B1E + ../../.. + + IDESourceControlProjectURL + bitbucket.org:devalanteriel/gf-swift.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 716509F1F37F996016FEDF093BF5C7F801D32B1E + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 716509F1F37F996016FEDF093BF5C7F801D32B1E + IDESourceControlWCCName + gf-ios-swift + + + + diff --git a/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/aarne.xcuserdatad/UserInterfaceState.xcuserstate b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/aarne.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..5cda939531e11a3491af4fff5e8a4b1c71e347db GIT binary patch literal 14610 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 Lc0p(usb2>GpNA19 literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/joelhinz.xcuserdatad/UserInterfaceState.xcuserstate b/src/ui/ios/gf-ios-swift.xcodeproj/project.xcworkspace/xcuserdata/joelhinz.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..dce88ae26a1b22f265b8b38e8f5676293599b8ff GIT binary patch literal 50093 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 literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift/AppDelegate.swift b/src/ui/ios/gf-ios-swift/AppDelegate.swift new file mode 100644 index 000000000..f70ff9aa2 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/AppDelegate.swift @@ -0,0 +1,38 @@ +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/src/ui/ios/gf-ios-swift/Base.lproj/LaunchScreen.xib b/src/ui/ios/gf-ios-swift/Base.lproj/LaunchScreen.xib new file mode 100644 index 000000000..08d58bfed --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Base.lproj/LaunchScreen.xib @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/ios/gf-ios-swift/Base.lproj/Main.storyboard b/src/ui/ios/gf-ios-swift/Base.lproj/Main.storyboard new file mode 100644 index 000000000..ff087bd67 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Base.lproj/Main.storyboard @@ -0,0 +1,242 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/ios/gf-ios-swift/Colors.swift b/src/ui/ios/gf-ios-swift/Colors.swift new file mode 100644 index 000000000..960d1bd35 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Colors.swift @@ -0,0 +1,72 @@ +import UIKit +import Foundation + +// An extension to UIColor which allows the use of hex initialisation +extension UIColor { + + convenience init(hex: Int) { + + let components = ( + red: CGFloat((hex >> 16) & 0xff) / 255, + green: CGFloat((hex >> 08) & 0xff) / 255, + blue: CGFloat((hex >> 00) & 0xff) / 255 + ) + + self.init(red: components.red, green: components.green, blue: components.blue, alpha: 1.0) + + } + +} + +class Colors { + + // Set the background colours to use by the view controller + let backgroundColors = [ + "worst": UIColor(hex: 0xff303e), + "best": UIColor(hex: 0x75cd75), + "chunks": UIColor(hex: 0xffb2a5), + "default": UIColor(hex: 0xffff99), + "source": UIColor(hex: 0xcdcded) + ] + + // Checks a given translated string to see how good it is and hence which background colour it should have + func translationToUIColor(translation: String) -> UIColor { + + if (translation.isEmpty) { + return self.backgroundColors["default"]! + } + + var firstChar = String(Array(translation)[0]) + + // Parse by words, marked by %, darkest red color + if (firstChar == "%") { + return self.backgroundColors["worst"]! + } + + // Parse by chunks, marked by *, red color + if (firstChar == "*") { + return self.backgroundColors["chunks"]! + } + + // Parse error: darkest red color + if (translation.rangeOfString("parse error:") != nil) { + return self.backgroundColors["worst"]! + } + + // Unknown linearizations in output + if (translation.rangeOfString("[") != nil) { + return self.backgroundColors["worst"]! + } + + // Parse by domain grammar, marked by +, green color + if (firstChar == "+") { + return self.backgroundColors["best"]! + } + + // Otherwise, use the default colour + return self.backgroundColors["default"]! + + } + + +} \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/HelpViewController.swift b/src/ui/ios/gf-ios-swift/HelpViewController.swift new file mode 100644 index 000000000..7f924bcd4 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/HelpViewController.swift @@ -0,0 +1,24 @@ +import UIKit + +// The HelpViewController only contains static text and a back button +class HelpViewController: UIViewController { + + @IBOutlet weak var helpView: UIWebView! + + // Closes the view when the back button is blicked + @IBAction func backToMain(sender: UIButton) { + dismissViewControllerAnimated(true, completion: nil) + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Sets the HTML for the UIWebView + self.helpView.loadHTMLString("

HTML goes here

", baseURL: nil) + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + +} diff --git a/src/ui/ios/gf-ios-swift/Images.xcassets/AppIcon.appiconset/Contents.json b/src/ui/ios/gf-ios-swift/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..36d2c80d8 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/Info.plist b/src/ui/ios/gf-ios-swift/Info.plist new file mode 100644 index 000000000..3fe4443b4 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + GF.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/src/ui/ios/gf-ios-swift/Languages.swift b/src/ui/ios/gf-ios-swift/Languages.swift new file mode 100644 index 000000000..91f0a22a4 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Languages.swift @@ -0,0 +1,39 @@ +import Foundation + +// A simple class for a language, mostly just containing its name etc. +class Language { + + let name: String + let abbreviation: String + let bcp: String + + init(name: String, abbreviation: String, bcp: String) { + self.name = name + self.abbreviation = abbreviation + self.bcp = bcp + } + +} + +// If we need to set more languages in the app, this is the place to do it! +// Don't forget to also update the grammars folder :) +let allLanguages: Array = [ + Language(name: "Bulgarian", abbreviation: "Bul", bcp: "en-GB"), // lacks bcp-47 code in iOS, would be bg-BG + Language(name: "Chinese", abbreviation: "Chi", bcp: "zh-CN"), + Language(name: "Dutch", abbreviation: "Dut", bcp: "nl-NL"), + Language(name: "English", abbreviation: "Eng", bcp: "en-GB"), + Language(name: "Finnish", abbreviation: "Fin", bcp: "fi-FI"), + Language(name: "French", abbreviation: "Fre", bcp: "fr-FR"), + Language(name: "German", abbreviation: "Ger", bcp: "de-DE"), + Language(name: "Hindi", abbreviation: "Hin", bcp: "hi-IN"), + Language(name: "Italian", abbreviation: "Ita", bcp: "it-IT"), + Language(name: "Japanese", abbreviation: "Jpn", bcp: "ja-JP"), + Language(name: "Spanish", abbreviation: "Spa", bcp: "es-ES"), + Language(name: "Swedish", abbreviation: "Swe", bcp: "sv-SE"), + Language(name: "Thai", abbreviation: "Tha", bcp: "th-TH") + +] + +// Callback for morphological analysis - if it turns out this isn't needed, it could be removed +func morphoCallback(callback: UnsafeMutablePointer, lemma: PgfCId, analysis: GuString, prob: prob_t, err: UnsafeMutablePointer) -> Void { +} \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/Translator.swift b/src/ui/ios/gf-ios-swift/Translator.swift new file mode 100644 index 000000000..bc4e1b232 --- /dev/null +++ b/src/ui/ios/gf-ios-swift/Translator.swift @@ -0,0 +1,210 @@ +import UIKit +import Foundation + +class Translator { + + // Create allocation pool, exception frame, and pgf grammar + var pool: COpaquePointer + var err: UnsafeMutablePointer + var out: UnsafeMutablePointer + let pgf: UnsafeMutablePointer + + init() { + self.pool = gu_new_pool() + self.err = gu_new_exn(self.pool) + self.out = gu_file_out(stdout, self.pool) + + // Read the PGF grammar. + var pgfBundle = NSBundle .mainBundle() + var pgfStr = pgfBundle .pathForResource("App", ofType: "pgf", inDirectory: "grammars") + self.pgf = pgf_read(pgfStr!, self.pool, self.err) + } + + // Variable to hold concrete grammars + var grammars: [String: (name: String, concr: UnsafeMutablePointer)] = [ + "to": ("", UnsafeMutablePointer()), + "from": ("", UnsafeMutablePointer()), + "previous": ("", UnsafeMutablePointer()) + ] + + // Loads a grammar (but returns it, doesn't save it) + func loadGrammar(language: String, destination: String) -> Void { + + // Switch with the previously used language if applicable + if (language == self.grammars["previous"]!.name) { + return self.switchLanguages(destination, to: "third") + } + + // Load the file + var pgfBundle = NSBundle .mainBundle() + var concr = pgf_get_language(self.pgf, "App\(language)") + var fileStr = pgfBundle.pathForResource("App\(language)", ofType: "pgf_c", inDirectory: "grammars") + var file = fopen(fileStr!, "r") + + // Load the grammar + pgf_concrete_load(concr, gu_file_in(file, self.pool), self.err) + if (self.grammars[destination]!.concr != UnsafeMutablePointer()) { + pgf_concrete_unload(self.grammars[destination]!.concr) + } + self.grammars[destination]!.concr = nil + self.grammars[destination]!.concr = concr + + } + + // Switches place of from and to concrete grammars + func switchLanguages(from: String, to: String) -> Void { + let tmp = self.grammars[from]! + self.grammars[from] = self.grammars[to]! + self.grammars[to] = tmp + } + + // Translate a string + func translate(phrase: String) -> String { + + // Intialise temporary pools + var tmpPool = gu_new_pool() + var tmpErr = gu_new_exn(tmpPool) + + // Try to parse it fully + var parse = self.parse(phrase, startCat: "Phr", tmpPool: tmpPool, tmpErr: tmpErr) + var translation = "" + if (parse != nil) { + translation = self.linearize(parse, tmpPool: tmpPool, tmpErr: tmpErr) + } else { + translation = self.translateByLookup(phrase) + } + + // Clear up resources + gu_exn_clear(tmpErr) + gu_pool_free(tmpPool) + tmpPool = nil + tmpErr = nil + + return translation + } + + // Translates by lookup - that is, each word by itself + func translateByLookup(phrase: String) -> String { + var translation = "%" + var words = phrase.componentsSeparatedByString(" ") + for word in words { + translation += self.translateWord(word) + " " + } + return translation + } + + // Translates a single word - differs from phrase translation as it does morphological analysis + func translateWord(word: String) -> String { + + // Intialise temporary pools + var tmpPool = gu_new_pool() + var tmpErr = gu_new_exn(tmpPool) + + // Try to parse it fully + var parse = self.parse(word, startCat: "Chunk", tmpPool: tmpPool, tmpErr: tmpErr) + var translation = "" + if (parse != nil) { + translation = self.linearize(parse, tmpPool: tmpPool, tmpErr: tmpErr) + } else { + + // Full parse didn't work; try to make a morphological analysis + + // This functionality is currently missing due to pointer hell in Swift. + // The full temporary code is commented out below. For now, we just return the uppercased translation instead. + translation = word.uppercaseString + +// var lcWord = word.lowercaseString +// var p = UnsafeMutablePointer<(UnsafeMutablePointer, PgfCId, GuString, prob_t, UnsafeMutablePointer) -> ()>.alloc(1) +// p.initialize(morphoCallback) +// var cp = COpaquePointer(p) +// var fp = CFunctionPointer<(UnsafeMutablePointer, PgfCId, GuString, prob_t, UnsafeMutablePointer) -> ()>(cp) +// var callback = PgfMorphoCallback(callback: fp) +// pgf_lookup_morpho(self.grammars["from"]!.concr, word, &callback, tmpErr) +// if (gu_ok(tmpErr)) { +// var analyses = [] +// for analysis in analyses { +// var lemma = ??? +// if (self.hasLinearization(lemma)) { +// var sbuf = gu_string_buf(tmpPool) +// var sbufstr = gu_string_buf_freeze(sbuf, tmpPool) +// var tmpIn = gu_data_in(String(UTF8String: sbufstr)!, strlen(sbufstr), tmpPool) +// var expr = pgf_read_expr(tmpIn, tmpPool, tmpErr) +// var ep = PgfExprProb(prob: 0, expr: expr) +// translation = self.linearize(ep, tmpPool: tmpPool, tmpErr: tmpErr) +// break +// } +// } +// } else { + // Morphological analysis failed as well - just use the uppercased version of the word +// translation = word.uppercaseString +// } + + } + + // Clear up resources + gu_exn_clear(tmpErr) + gu_pool_free(tmpPool) + tmpPool = nil + tmpErr = nil + + return translation + + } + + // Checks whether a linearization exists for a given analysis + func hasLinearization(analysis: PgfCId) -> Bool { + var tmpPool = gu_new_pool() + var result = pgf_has_linearization(self.grammars["to"]!.concr, analysis) + gu_pool_free(tmpPool) + tmpPool = nil + return result + } + + // Wrapper to perform a parse and return either the parse or + func parse(phrase: String, startCat: String, tmpPool: COpaquePointer, tmpErr: UnsafeMutablePointer) -> UnsafeMutablePointer { + var result = pgf_parse(self.grammars["from"]!.concr, startCat, phrase, tmpErr, tmpPool, tmpPool) + if (!gu_ok(tmpErr)) { + return nil + } + return result + } + + // Takes a parse result and linearizes its first result + func linearize(result: UnsafeMutablePointer, tmpPool: COpaquePointer, tmpErr: UnsafeMutablePointer) -> String { + + // Get the first result + var ep = UnsafeMutablePointer() + gu_enum_next(result, &ep, tmpPool) + var parse = ep[0] + + // Linearise it and convert it to a String literal + var sbuf = gu_string_buf(tmpPool) + var tmpOut = gu_string_buf_out(sbuf) + pgf_linearize(self.grammars["to"]!.concr, parse.expr, tmpOut, tmpErr) + var translation = String(UTF8String: gu_string_buf_freeze(sbuf, tmpPool))! + + // Clear up and return + gu_out_flush(tmpOut, tmpErr) + tmpOut = nil + return translation + + } + + // Removes characters that shouldn't be in the translated string + func formatTranslation(translation: String) -> String { + + if (translation.isEmpty) { + return translation + } + var copy = translation + var firstChar = String(Array(translation)[0]) + if (firstChar == "%" || firstChar == "*" || firstChar == "+") { + copy = copy.substringFromIndex(advance(copy.startIndex, 1)) + } + for char in ["[", "]", "_"] { + copy = copy.stringByReplacingOccurrencesOfString(char, withString: " ") + } + return copy + + } +} \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/ViewController.swift b/src/ui/ios/gf-ios-swift/ViewController.swift new file mode 100644 index 000000000..5766b340d --- /dev/null +++ b/src/ui/ios/gf-ios-swift/ViewController.swift @@ -0,0 +1,223 @@ +import UIKit +import AVFoundation + +class ViewController: UIViewController { + + // Set sizes used within the controller + let maxBoxWidth: CGFloat = 150 + let boxOffset: CGFloat = 10 + var scrollViewHeight: CGFloat = 0 + var scrollViewWidth: CGFloat = 0 + + // Translation properties + let translator = Translator() + let colors = Colors() + let synthesizer = AVSpeechSynthesizer() + let languages = allLanguages + var inLanguage: Language! + var outLanguage: Language! + + // Initiate picker views + let inPicker: UIPickerView = UIPickerView() + let outPicker: UIPickerView = UIPickerView() + + // UI connections + @IBOutlet weak var translationsView: UIScrollView! + @IBOutlet weak var inLanguageField: UITextField! + @IBOutlet weak var outLanguageField: UITextField! + + // Reverses to and from languages + @IBAction func switchLanguages(sender: UIButton) { + self.inLanguageField.text = self.outLanguage.name + self.outLanguageField.text = self.inLanguage.name + let tmpLanguage = self.inLanguage + self.inLanguage = self.outLanguage + self.outLanguage = tmpLanguage + self.translator.switchLanguages("from", to: "to") // to also switch concrete grammars + } + + // Creates a new translation field when the user clicks the keyboard icon + @IBAction func openKeyboard(sender: UIButton) { + let field = createFromView() + field.becomeFirstResponder() + } + + // Starts the speech recognition process when the user clicks the microphone icon + @IBAction func openMicrophone(sender: UIButton) { + self.createToView("microphone support is on its way") + } + + // Sums the heights of all translation boxes + margins + func calculateTranslationHeights() -> CGFloat { + var height = CGFloat(-29.5) // compensate for invisible scrollbars + for view in self.translationsView.subviews { + height += view.frame.height + self.boxOffset + } + height += self.boxOffset + return height + } + + // Creates a new "to translate" view and returns it for placement + func createFromView() -> UITextView { + let view = UITextView(frame: CGRect( + x: self.boxOffset, + y: self.calculateTranslationHeights(), + width: 20, + height: 30 + )) + view.backgroundColor = self.colors.backgroundColors["source"] + view.layer.cornerRadius = 5 + view.returnKeyType = UIReturnKeyType.Done + + view.delegate = self + self.translationsView.addSubview(view) + self.resizeTranslationsView() + return view + } + + // A UIScrollView doesn't know its own height; use this method to resize it + func resizeTranslationsView() -> Void { + var subviewHeights = self.calculateTranslationHeights() + if (subviewHeights > self.scrollViewHeight) { + self.translationsView.contentSize = CGSizeMake( + self.translationsView.frame.width, subviewHeights) + + // Also scroll to bottom + let offset = self.translationsView.contentSize.height - self.translationsView.bounds.size.height + let point = CGPointMake(0, offset) + self.translationsView.setContentOffset(point, animated: true) + + } + } + + // Creates and places a new "translated" view given the translated text + func createToView(translation: String) -> Void { + let view = UITextView(frame: CGRect( + x: 0, // we set the real value later a few lines down below + y: self.calculateTranslationHeights(), + width: self.maxBoxWidth, + height: 30 + )) + view.backgroundColor = self.colors.translationToUIColor(translation) + view.text = self.translator.formatTranslation(translation) + view.layer.cornerRadius = 5 + view.sizeToFit() + + // The view has been set, so we can now move it further to the right + view.frame.origin.x = self.scrollViewWidth - 10 - view.frame.width + self.translationsView.addSubview(view) + self.resizeTranslationsView() + } + + // Perform translation + func translate(phrase: String) -> Void { + var translation = self.translator.translate(phrase) + self.createToView(translation) + + // Run TTS except in simulator (because the simulator doesn't support it) + #if !arch(i386) && !arch(x86_64) + var utterance = AVSpeechUtterance(string: translation) + utterance.voice = AVSpeechSynthesisVoice(language: self.outLanguage.bcp) + self.synthesizer.speakUtterance(utterance) + #endif + + } + + override func viewDidLoad() { + super.viewDidLoad() + + // Set size variables (-162 for the height to compensate for the views above the scrollview) + self.scrollViewHeight = UIScreen.mainScreen().bounds.height - 162 + self.scrollViewWidth = UIScreen.mainScreen().bounds.width + + // Load view pickers + self.inPicker.delegate = self + self.inPicker.dataSource = self + + self.outPicker.delegate = self + self.outPicker.dataSource = self + + self.inLanguageField.inputView = inPicker + self.outLanguageField.inputView = outPicker + + // Load initial languages + self.inLanguage = self.languages[3] // English + self.outLanguage = self.languages[10] // Swedish + self.translator.loadGrammar("Eng", destination: "from") + self.translator.loadGrammar("Swe", destination: "to") + + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + +} + +// On selection functionality for the view pickers +extension ViewController: UIPickerViewDelegate { + + // Makes the picker views return a language rather than text + func pickerView(pickerView: UIPickerView!, titleForRow row: Int, forComponent component: Int) -> String + { + return self.languages[row].name + } + + // Row was selected: update buttons, load new grammar + func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { + var language = self.languages[row] + + var fromTo: String + var textField = UITextField() + if (pickerView == self.inPicker) { + self.inLanguage = language + fromTo = "from" + textField = self.inLanguageField + } else { + self.outLanguage = language + fromTo = "to" + textField = self.outLanguageField + } + + self.translator.loadGrammar(language.abbreviation, destination: fromTo) + textField.text = language.name + textField.resignFirstResponder() + } + +} + +// View picker layout functionality +extension ViewController: UIPickerViewDataSource { + + func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int { + return 1 + } + + func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { + return self.languages.count + } + +} + +// Keyboard input functionality +extension ViewController: UITextViewDelegate { + + // Method is called on keypress + func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { + + // UITextViews lack a method to close keyboard on enter, so we use this slight hack + if (text == "\n") { + textView.resignFirstResponder() + self.translate(textView.text) + return false + } + + // But if it wasn't the enter key, we resize the UITextView dynamically + textView.sizeToFit() + if (textView.frame.size.width < self.maxBoxWidth) { + textView.frame.size.width += 10 + } + return true + } + +} \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/gf-ios-swift-Bridging-Header.h b/src/ui/ios/gf-ios-swift/gf-ios-swift-Bridging-Header.h new file mode 100644 index 000000000..76ccbefde --- /dev/null +++ b/src/ui/ios/gf-ios-swift/gf-ios-swift-Bridging-Header.h @@ -0,0 +1,13 @@ +#ifndef gf_ios_swift_gf_ios_swift_Bridging_Header_h +#define gf_ios_swift_gf_ios_swift_Bridging_Header_h + +#import "pgf/pgf.h" +#import "gu/file.h" +#import "gu/variant.h" +#import "gu/map.h" +#import "gu/enum.h" +#import "gu/exn.h" +#import "pgf/literals.h" +#import "pgf/linearizer.h" + +#endif \ No newline at end of file diff --git a/src/ui/ios/gf-ios-swift/images/ic_action_switch.png b/src/ui/ios/gf-ios-swift/images/ic_action_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..5449a32b8aa91df7f477d64c1b5f5c69d4153128 GIT binary patch literal 436 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F(Z$|=lf1onxM_c6dswCSS!O7?jd#XnS-OnIW2kB__LJ<9XMW3Y&gnu zrnzy+@4avGCYe9B(3zKb}xJhSTYu6KEB7+3W#($I@IFg>->?ZbQF2e%iARxkTp zaHh!mVq$D`gZz;i_A3nK%z+}QCI3xUv`R4V*jDr8T9yOv3P#ffY*!kjek?E8Eb&k4 z!FR`=MnSf#4N?-?N8FfdW=dHK1`CEq&TwdOpD>?czw_dTt6mGH8YzA_ADO3aveoUt z`U@(LtK`x$^yM1vFS0%Pi?@YMUuv%ybG1p^(w4g9%3t2@lMKGRIGArBBACjMtll%< rpzV;wsfijq42B#fAzD*cUFM&=XV$7T#?mPa3=9mOu6{1-oD!M literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift/images/ic_app copy.png b/src/ui/ios/gf-ios-swift/images/ic_app copy.png new file mode 100644 index 0000000000000000000000000000000000000000..8d9bdd820089406b216cdf2964f1037787954821 GIT binary patch literal 2458 zcmeAS@N?(olHy`uVBq!ia0y~yVDJE84mJh`hS0a0-5D4dSc;uILpV4%IBGajIv5xj zI14-?iy0VL)Ipf>roU_h0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa~7;+`&!Ar*7p-l^=l8+!A=$MZW+mrT>kZ=C5Ay+LoHt3lQku80*K9PhQgOlmv5 z87{j#>iaDwnv^7!;d)fVyW_!cCVfxSkZ5hCgWD&HsWt=z2u`_GYc+T2<(byS(|6kc z|MAx?fBEHeKF{y%Y<)R-&Y81k=N8ZVY3 zg`7AzMB`lp=N@k`xcXFGAn5$27cS>c7G))rCFCXa{rEhmV_!#XYT1;VkxA)|vi+Zb z9R1=N7&1?&Hk&s?!oxa0E6sD-W@8;cgJuk9G*}=@1Eng=P$CCRGQ`LZZW-h z%^`YPC5Nk=UQs>&{-_g|HLjn!l*OjeA|RLWE@@rPqgN*DrJm?l|9mVa7k&Eu`gH9s z4fT~FA1zx=Hl4hG#z|`b;Ya2L|7y}C#$Aizm;^1Q>!;p{>d8KHM+((4vSBlG*igIqx|Dnqo2JsV!0{o~)xU)Dd@`g1&_d^xAnsf2UeE%zVjli9yx;<8x`zeJ3G z?O5${{q7#~mq9P9nkCp*h|CKAaE;~Ct&dK#COrM}v7WW;uE_ZyFzj_j%saMJd1RUhTT#q9A(X;?dG%(@#5$YWp^y=CM0udh*a4SN3$4 zCC{GD`IjozYwFT7^QP1-uAH0a{;PQZ5%=9L#eC_5+4Bv(wKvXYaVTCsUn|Ic?%}27 zH)LG{UrzY{L1>Dz+>BO%L)8MloK1e~@_pZ{)oHKV+7@7ngjcSr49g1Pgn8{-!m%zbFEsJm6*(B_zi z52bQOyvx5%G`iGuN&Uk*IWs$#d=uAlfA`HYEE!_&@0?|Rq&*{3pPeD<{2?7~`KRW6 zrTQTZT#8Hl9;6CB4b2gZzvo-Ma?1jP*^|BB+_X7+-EL|T!vZxiksH0q1wxh#7kVTv z_#J2X>#cR&QStO1rrlRKFXSqw=s&&ksL{@;bmH3_%l3WD47`CJ$N89o`7~N4yn4DT zvL^28ZgK^A?u6)_gaORZW>W-Fuq#)P_^?&pM5E ze&1-)V(_+Rg)>K@@bcv|cTYSX%G9+;F&=ym0iAk(q?PN|1%$-_pANBI8ne$ z_D`Og_Ypsj%f6R3@5s>SUnJogXd-ms!sI_`Y|Ga^J5rSq;U9T$PMVm#w7fZgVS%~U ze{+BF%zEzkGyNV1a42r=;ckBse@<;NqgS5=*XqLP&fQbbTc1*D%2Ihb z`RB2?Yr4-p+nJ}#2>Yl0CxI>9=Dc;>sjw+ArE_l|x_#}VtnwcLx4pCdl}cun7o9Gg zQ^@-Kp0q2oY1o#9&GP02N#@$=eviUb18nB;KHj;FOEKm5PJ8!tQ@?jRul>jS)F3Wm zW`A*1W9;3S^~dh5$+&U&ZYr1a7eBSBFDhnTmpWX{v+}Nv{^b45OHcIOKCH8G(XrB) zGEV!-M(?J*tLtM_&;O2MigI(7 zFQ4{eXL^&Pg?rG%hH38$|0$dot<1B2?k5(c%b@tD^)lPf|4MJSe>%4$y4O1DK?k?n zWy?K9+U3(U-=!Z-dE~sB_eGS{w~tqicKW^h&yz30{?JEbN>b3;$!jeAez1n~9B^Kt0mp35^TEz`FhFO*&Cc&+@%zP`uz=J|*T z1l_JI*1NY(;Z51UYb>0<+W=UP#)zw|LX_wEw1B>Uz?9>ck(rAU^Zyz{PI{b9GXZ^o{P#?v-EnewCKvuI>g@W*E&Q%)|N z;kE4Xlh+v?>uPN_HXoOJI`RC+6#l;w0?wLlrUlXSCVg*in}5RdlEH?D+ii@zXH*)h z>n7D{t513Hep$8p-SZc|dVhPXsLy7oVCN(46?Asqv4wp6I)wro47{Ymw4^4U%HnyV o5c`_(#ZeXgn}>g7owR3MCiXt|jc`sO0|Nttr>mdKI;Vst02t+_K>z>% literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift/images/ic_app.png b/src/ui/ios/gf-ios-swift/images/ic_app.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b17ee1c69b9a808cab428caa0b6d5b52745e71 GIT binary patch literal 2073 zcmeAS@N?(olHy`uVBq!ia0y~yU{C>J4mJh`hKCF@W-u@?Fct^7J29*~C-ahlfq}EY zBeIx*fkhpJ8E^W_HZU+Sp3V%3D2ed(u}aR*)k{ptPfFFR$Sq(10h8?tx|+m6SjhDZl{Kow)^Yi}H%0zDmx|)vrh_&^OdG z(8s2!Br^@+JQQ6Z8HhHpuON2WROA*|ITxiSmgEUV0^2IXn{e%9{)`D}Lnzd7Dl5;nOoMJln!gaxPj_+L8zHETxHrZW#(BAgtTpH#?q zn*Et6<=t!+HMdBw0~#hgPgY#>pUIQtl+W=>_oqUIompD*grd@ex72#{5;_m8Flz~1 z*dW}ybEm^8V@H|)oOe0Rl)Dp4d6^iij~Lt(32dM8Y3&?=*-F{@eOwo<6`%gJ4*c?7 zbhm`xB>Oc5;PJ@v~^R>LHf_X1KaxUGs zpHFGQ?7eKiELT_-H|*}&7i2rpvgf+v&Ihxm$Tz*eVRA88hdr-svCRsBw)1_OrH_0B z_B`;sxV*yP{<(-v3uUh8{grBqJu{oT>8*~(cTvHW@%Jr7+s^koz0|mP%cV2@(h5b* zwD8o!bKLC|qZt3q|KzoI)`xI8c?N66ZO+o?85*~%F`j>S?bE{7TdIW?*RlPdFy;OA zMzP&$Q-5vK=ZJeaZT`hIUc5|yo=i5>vgL1xPOeD%uB&P9+rWRt_^Da4&wj~MySp}C zY>#DV=9{Y$6?yp+*Hw0Xjohv&YORe6jV?SpX(7HNP-0#FwW=SsF_9;WKCZnR&=mJH@{&Na^@|?k z6$w7pTFShy&Nm!h`c7z`;vDD0k}dPE?Gad9e4$+H1K(#GPXEuf=^t25&QVfm6c=%2 z4biu34%k@yaeI8+9+tTF_HRd{{`Z<+a(d=`ZdQw_n!LtVRx_Dmwu4(vx?bD$SzX&( zs{Quw#68n@U6(3m;on>m{_L0O(r=G$YR*mGB9OcxCo}D>*Mhj1nq!-?ol^eWoDBN( zdHS^I-AsLwg>0^cHHJcqWIuJ87eBo*byCXCzeXQ#TV|)p@+oU^Y`m0l_w|lzg0byq z?x|MwSU1j^Ufi+vpo7@$YSDX7A7(A$eiKx_Q7T)1QqT^|7%#QCTQ-T-37Jk`$<-^( z&bXKNas0D7u^k#V`DgeO?p$lu?b)=jS&)Uv_>7@qiSmd2Sp6J{EdFClB`I>lQNB*(zp|f;ikFPP=r(^c`X0>DVZV~AvHBL;8Li`UVXD}aX zEw#13cf)%5TG?AY#vN}P)_I@vcJKLFwLXY_&&F<;<~MEENYri8TZ=l0Fj z+j~y8=2=YY`81ErebqZI{GM7h`KnELrokDf%^x}~>@3sXzGtXE>~Nx&y?A$6)Ra9U z4Qng;zKR?^P|0||YJR`cgzK4ql|O&}aVFNNL%K6?)8QHG-PXKq4rFH(>zwmH#$juf z)BN&sR|k2GRVUth`uJ&neVV)IW9YG(XFpeO7F)V>`@4pqYJrmDA0xM1)oy6mfA-FI z$>}=JRUe-z)pyqXG5O~9o&1jbS!?bx8}Bzu^SQ)s`ndLyLdizuEp{bcFLKl`x_@7? z=T_30#4lf`H}E~XGwqwnb<=_kOLy?BSaVG1t)zL{Us28dH>6za9gb~hO179Tl(JQL zLS61v)tvLGF8Ybp_r;w4TwC-u5u)YxVT)~A>36*5j0-)Mb%EGN{d;2&W`zLiyj5Roa?1;s&^KIVW|Fh4Z74UZN!knw1`r6ag&t;uc GLK6U!I)()R literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift/images/ic_keyboard.png b/src/ui/ios/gf-ios-swift/images/ic_keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..ce257a2697ee365ccf2f3b2525ad55f0ec593650 GIT binary patch literal 695 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F^e0|SF(iEBhjaDG}zd16s2LwR|*US?i)adKios$PCk`s{Z$ zQVa}CCY~;iAsLNtXBw_s6d=;}-})TWiaV{dD*|3H<;)8SmhNm7ZRO-#xWRa#;>>5h zCMs>RJ^8}#4v9{fQ*3*g$EBd=;>7QIYBi$&IXR#2|Ne)wU~0#MnLpEZHM+m#nX$|` zVb-~ZOe^MP*f`70KkVIc<89gAy8ZvT5*QN_)-7Ev!?33B_~SAgxz~##q&Dchp4xG* zXG@thGeiEgRK^4A7ez>2h|-@`b4&f7LG*(&4l@~*qyz+K+?3>N@0vN+eap35iD?;Y z=U&XXG9&HTtBP(87naCrp3_o;UM#w17Q24#dxj2<%vrY>CM;Wd*Ui^uDsRBiHF;*U z{iSa$`}|s?c4*0~see)_6|W0J~56;G|tSKVUQPqhx% z(f#-aTZ2Vku2Ry_J{O{-4~bz;TLaihgmc@zN>6Z4d8# zuZ?!8>+Xcr=o+poVWC~+?h(JouG&4GRC6|d~Qw)$Ga ht8b|I|4)9+uT;KVSuaIQiGhKE!PC{xWt~$(698MTF<1Zq literal 0 HcmV?d00001 diff --git a/src/ui/ios/gf-ios-swift/images/ic_mic.png b/src/ui/ios/gf-ios-swift/images/ic_mic.png new file mode 100644 index 0000000000000000000000000000000000000000..f79ff489b42ffab34cfbff2ce48fcf53d1cf8919 GIT binary patch literal 665 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F6j&295^@_6%|-o9M-crmWdW6h&epdcu=MKz~WqN-C>in z%jfz%_sU^Wn5bU6>sjJ@mIX1>Ywqt9f6mF1c>T<21qQ(#vcEYmWNp25B2~bE=W)1F zFZkI!dDD-)#TR!hdvxD>Q|0`x&l!2uKXDwm_vq(5{giDF*8ef@ zJvB3IX^^CM55r*&g=-J2k0yQG_rHEm=nVBYQ=4r!WZCy`{O$KhbVm59e4&p_t+`5X zY=sWJv`GkF@01y+t$A>_49mV%6K + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + GF.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/src/ui/ios/gf-ios-swiftTests/gf_ios_swiftTests.swift b/src/ui/ios/gf-ios-swiftTests/gf_ios_swiftTests.swift new file mode 100644 index 000000000..8829b37a3 --- /dev/null +++ b/src/ui/ios/gf-ios-swiftTests/gf_ios_swiftTests.swift @@ -0,0 +1,28 @@ +import UIKit +import XCTest + +class gf_ios_swiftTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + XCTAssert(true, "Pass") + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock() { + // Put the code you want to measure the time of here. + } + } + +}