AVRSack/AVRsack/ASHardware.swift

138 lines
5.4 KiB
Swift

//
// ASHardware.swift
// AVRsack
//
// Created by Matthias Neeracher on 11/23/14.
// Copyright © 2014 Aere Perennius. All rights reserved.
//
import Foundation
class ASPropertyEntry {
private var storage = [String: String]()
subscript(key: String) -> String {
get {
if let value = storage[key] {
return value
} else {
return ""
}
}
set (newValue) {
storage[key] = newValue
}
}
}
typealias ASProperties = [String: ASPropertyEntry]
private func subdirectories(path: NSString) -> [NSString] {
let fileManager = NSFileManager.defaultManager()
var subDirs = [NSString]()
var isDir : ObjCBool = false
if fileManager.fileExistsAtPath(path, isDirectory: &isDir) && isDir {
for item in fileManager.contentsOfDirectoryAtPath(path, error: nil) as [NSString] {
let subPath = path+"/"+item
if fileManager.fileExistsAtPath(subPath, isDirectory: &isDir) && isDir {
subDirs.append(subPath)
}
}
}
return subDirs
}
private let hardwareInstance = ASHardware()
class ASHardware {
class func instance() -> ASHardware { return hardwareInstance }
let directories = [NSString]()
let programmers = ASProperties()
let boards = ASProperties()
init() {
//
// Gather hardware directories
//
let userDefaults = NSUserDefaults.standardUserDefaults()
let fileManager = NSFileManager.defaultManager()
if let arduinoPath = userDefaults.stringForKey("Arduino") {
let arduinoHardwarePath = arduinoPath + "/Contents/Resources/Java/hardware"
directories += subdirectories(arduinoHardwarePath)
}
for sketchDir in userDefaults.objectForKey("Sketchbooks") as [NSString] {
let hardwarePath = sketchDir + "/hardware"
directories += subdirectories(hardwarePath)
}
let property = NSRegularExpression(pattern: "\\s*(\\w+)\\.(\\S+?)\\s*=\\s*(\\S.*\\S)\\s*", options: nil, error: nil)
//
// Gather board declarations
//
for dir in directories {
let boardsPath = dir+"/boards.txt"
if let boardsFile = NSString(contentsOfFile: boardsPath, usedEncoding: nil, error: nil) {
var seen = [String: Bool]()
for line in boardsFile.componentsSeparatedByString("\n") as [NSString] {
if let match = property?.firstMatchInString(line, options: .Anchored, range: NSMakeRange(0, line.length)) {
let board = line.substringWithRange(match.rangeAtIndex(1))
let property = line.substringWithRange(match.rangeAtIndex(2))
let value = line.substringWithRange(match.rangeAtIndex(3))
if seen.updateValue(true, forKey: board) == nil {
boards[board] = ASPropertyEntry()
}
boards[board]![property] = value
}
}
}
}
//
// Gather programmer declarations
//
for dir in directories {
let programmersPath = dir+"/programmers.txt"
if let programmersFile = NSString(contentsOfFile: programmersPath, usedEncoding: nil, error: nil) {
var seen = [String: Bool]()
for line in programmersFile.componentsSeparatedByString("\n") as [NSString] {
if let match = property?.firstMatchInString(line, options: .Anchored, range: NSMakeRange(0, line.length)) {
let programmer = line.substringWithRange(match.rangeAtIndex(1))
let property = line.substringWithRange(match.rangeAtIndex(2))
let value = line.substringWithRange(match.rangeAtIndex(3))
if seen.updateValue(true, forKey: programmer) == nil {
programmers[programmer] = ASPropertyEntry()
seen[programmer] = true
}
programmers[programmer]![property] = value
}
}
}
}
}
}
private let librariesInstance = ASLibraries()
class ASLibraries {
class func instance() -> ASLibraries { return librariesInstance }
let directories = [NSString]()
let libraries = [NSString]()
init() {
//
// Gather hardware directories
//
let userDefaults = NSUserDefaults.standardUserDefaults()
let fileManager = NSFileManager.defaultManager()
if let arduinoPath = userDefaults.stringForKey("Arduino") {
let arduinoLibrariesPath = arduinoPath + "/Contents/Resources/Java/libraries"
let dirs = subdirectories(arduinoLibrariesPath)
if dirs.count > 0 {
directories.append(arduinoLibrariesPath)
libraries += dirs
}
}
for sketchDir in userDefaults.objectForKey("Sketchbooks") as [NSString] {
let librariesPath = sketchDir + "/libraries"
let dirs = subdirectories(librariesPath)
if dirs.count > 0 {
directories.append(librariesPath)
libraries += dirs
}
}
}
}