0001    //
0002    //  BlueSocketUtils.swift
0003    //  BlueSocket
0004    //
0005    //  Created by Bill Abt on 11/19/15.
0006    //  Copyright © 2016 IBM. All rights reserved.
0007    //
0008    // 	Licensed under the Apache License, Version 2.0 (the "License");
0009    // 	you may not use this file except in compliance with the License.
0010    // 	You may obtain a copy of the License at
0011    //
0012    // 	http://www.apache.org/licenses/LICENSE-2.0
0013    //
0014    // 	Unless required by applicable law or agreed to in writing, software
0015    // 	distributed under the License is distributed on an "AS IS" BASIS,
0016    // 	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0017    // 	See the License for the specific language governing permissions and
0018    // 	limitations under the License.
0019    //
0020    
0021    #if os(OSX) || os(iOS) || os(tvOS) || os(watchOS)
0022    	import Darwin
0023    	import Foundation
0024    #elseif os(Linux)
0025    	import Foundation
0026    	import Glibc
0027    #endif
0028    
0029    // MARK: String Extensions
0030    
0031    public extension String {
0032    	
0033    	///
0034    	/// This function returns an Optional String based on passed C string.
0035    	///
0036    	/// - Parameter cs: 	Pointer C string
0037    	/// - Parameter length:	Length of cs
0038    	///
0039    	///	- Returns: An Optional String based on the passed C string
0040    	///
0041    	static func fromCString(cs: UnsafePointer<CChar>, length: Int!) -> String?	{
0042    		
0043    		guard length != .None else {
0044    			return String.fromCString(cs)
0045    		}
0046    		
0047    		let buflen = length + 1
0048    		let buf = UnsafeMutablePointer<CChar>.alloc(buflen)
0049    		memcpy(buf, cs, length)
0050    		buf[length] = 0
0051    		let s = String.fromCString(buf)
0052    		buf.dealloc(buflen)
0053    		return s
0054    	}
0055    
0056    	///
0057    	/// This function converts a String to a C string
0058    	///
0059    	/// - Returns: Pointer to a C string **Note: This pointer must be dealloc'd when no longer in use.**
0060    	///
0061    	public func toCString() -> UnsafeMutablePointer<Int8> {
0062    		
0063    		return strdup(self)
0064    	}
0065    
0066    }
0067    
0068    #if os(Linux)
0069    	
0070    	/// Replacement for FD_ZERO macro
0071    	
0072    	func fdZero(inout set: fd_set) {
0073    		set.__fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
0074    	}
0075    	
0076    	
0077    	/// Replacement for FD_SET macro
0078    	
0079    	func fdSet(fd: Int32, inout set: fd_set) {
0080    		let intOffset = Int(fd / 16)
0081    		let bitOffset: Int = Int(fd % 16)
0082    		let mask: Int = 1 << bitOffset
0083    		switch intOffset {
0084    		case 0: set.__fds_bits.0 = set.__fds_bits.0 | mask
0085    		case 1: set.__fds_bits.1 = set.__fds_bits.1 | mask
0086    		case 2: set.__fds_bits.2 = set.__fds_bits.2 | mask
0087    		case 3: set.__fds_bits.3 = set.__fds_bits.3 | mask
0088    		case 4: set.__fds_bits.4 = set.__fds_bits.4 | mask
0089    		case 5: set.__fds_bits.5 = set.__fds_bits.5 | mask
0090    		case 6: set.__fds_bits.6 = set.__fds_bits.6 | mask
0091    		case 7: set.__fds_bits.7 = set.__fds_bits.7 | mask
0092    		case 8: set.__fds_bits.8 = set.__fds_bits.8 | mask
0093    		case 9: set.__fds_bits.9 = set.__fds_bits.9 | mask
0094    		case 10: set.__fds_bits.10 = set.__fds_bits.10 | mask
0095    		case 11: set.__fds_bits.11 = set.__fds_bits.11 | mask
0096    		case 12: set.__fds_bits.12 = set.__fds_bits.12 | mask
0097    		case 13: set.__fds_bits.13 = set.__fds_bits.13 | mask
0098    		case 14: set.__fds_bits.14 = set.__fds_bits.14 | mask
0099    		case 15: set.__fds_bits.15 = set.__fds_bits.15 | mask
0100    		default: break
0101    		}
0102    	}
0103    	
0104    	
0105    	/// Replacement for FD_CLR macro
0106    	
0107    	func fdClr(fd: Int32, inout set: fd_set) {
0108    		let intOffset = Int(fd / 16)
0109    		let bitOffset: Int = Int(fd % 16)
0110    		let mask: Int = ~(1 << bitOffset)
0111    		switch intOffset {
0112    		case 0: set.__fds_bits.0 = set.__fds_bits.0 & mask
0113    		case 1: set.__fds_bits.1 = set.__fds_bits.1 & mask
0114    		case 2: set.__fds_bits.2 = set.__fds_bits.2 & mask
0115    		case 3: set.__fds_bits.3 = set.__fds_bits.3 & mask
0116    		case 4: set.__fds_bits.4 = set.__fds_bits.4 & mask
0117    		case 5: set.__fds_bits.5 = set.__fds_bits.5 & mask
0118    		case 6: set.__fds_bits.6 = set.__fds_bits.6 & mask
0119    		case 7: set.__fds_bits.7 = set.__fds_bits.7 & mask
0120    		case 8: set.__fds_bits.8 = set.__fds_bits.8 & mask
0121    		case 9: set.__fds_bits.9 = set.__fds_bits.9 & mask
0122    		case 10: set.__fds_bits.10 = set.__fds_bits.10 & mask
0123    		case 11: set.__fds_bits.11 = set.__fds_bits.11 & mask
0124    		case 12: set.__fds_bits.12 = set.__fds_bits.12 & mask
0125    		case 13: set.__fds_bits.13 = set.__fds_bits.13 & mask
0126    		case 14: set.__fds_bits.14 = set.__fds_bits.14 & mask
0127    		case 15: set.__fds_bits.15 = set.__fds_bits.15 & mask
0128    		default: break
0129    		}
0130    	}
0131    	
0132    	
0133    	/// Replacement for FD_ISSET macro
0134    	
0135    	func fdIsSet(fd: Int32, inout set: fd_set) -> Bool {
0136    		let intOffset = Int(fd / 16)
0137    		let bitOffset = Int(fd % 16)
0138    		let mask: Int = 1 << bitOffset
0139    		switch intOffset {
0140    		case 0: return set.__fds_bits.0 & mask != 0
0141    		case 1: return set.__fds_bits.1 & mask != 0
0142    		case 2: return set.__fds_bits.2 & mask != 0
0143    		case 3: return set.__fds_bits.3 & mask != 0
0144    		case 4: return set.__fds_bits.4 & mask != 0
0145    		case 5: return set.__fds_bits.5 & mask != 0
0146    		case 6: return set.__fds_bits.6 & mask != 0
0147    		case 7: return set.__fds_bits.7 & mask != 0
0148    		case 8: return set.__fds_bits.8 & mask != 0
0149    		case 9: return set.__fds_bits.9 & mask != 0
0150    		case 10: return set.__fds_bits.10 & mask != 0
0151    		case 11: return set.__fds_bits.11 & mask != 0
0152    		case 12: return set.__fds_bits.12 & mask != 0
0153    		case 13: return set.__fds_bits.13 & mask != 0
0154    		case 14: return set.__fds_bits.14 & mask != 0
0155    		case 15: return set.__fds_bits.15 & mask != 0
0156    		default: return false
0157    		}
0158    		
0159    	}
0160    	
0161    #else
0162    	
0163    	/// Replacement for FD_ZERO macro
0164    	
0165    	func fdZero
BlueSocket.swift:609
		fdZero(&readfds)
BlueSocket.swift:613
		fdZero(&writefds)
(inout set: fd_set) { 0166 set.fds_bits = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) 0167 } 0168 0169 0170 /// Replacement for FD_SET macro 0171 0172 func fdSet
BlueSocket.swift:610
		fdSet(self.socketfd, set: &readfds)
BlueSocket.swift:614
		fdSet(self.socketfd, set: &writefds)
(fd: Int32, inout set: fd_set) { 0173 let intOffset = Int(fd / 32) 0174 let bitOffset = fd % 32 0175 let mask = 1 << bitOffset 0176 switch intOffset { 0177 case 0: set.fds_bits.0 = set.fds_bits.0 | mask 0178 case 1: set.fds_bits.1 = set.fds_bits.1 | mask 0179 case 2: set.fds_bits.2 = set.fds_bits.2 | mask 0180 case 3: set.fds_bits.3 = set.fds_bits.3 | mask 0181 case 4: set.fds_bits.4 = set.fds_bits.4 | mask 0182 case 5: set.fds_bits.5 = set.fds_bits.5 | mask 0183 case 6: set.fds_bits.6 = set.fds_bits.6 | mask 0184 case 7: set.fds_bits.7 = set.fds_bits.7 | mask 0185 case 8: set.fds_bits.8 = set.fds_bits.8 | mask 0186 case 9: set.fds_bits.9 = set.fds_bits.9 | mask 0187 case 10: set.fds_bits.10 = set.fds_bits.10 | mask 0188 case 11: set.fds_bits.11 = set.fds_bits.11 | mask 0189 case 12: set.fds_bits.12 = set.fds_bits.12 | mask 0190 case 13: set.fds_bits.13 = set.fds_bits.13 | mask 0191 case 14: set.fds_bits.14 = set.fds_bits.14 | mask 0192 case 15: set.fds_bits.15 = set.fds_bits.15 | mask 0193 case 16: set.fds_bits.16 = set.fds_bits.16 | mask 0194 case 17: set.fds_bits.17 = set.fds_bits.17 | mask 0195 case 18: set.fds_bits.18 = set.fds_bits.18 | mask 0196 case 19: set.fds_bits.19 = set.fds_bits.19 | mask 0197 case 20: set.fds_bits.20 = set.fds_bits.20 | mask 0198 case 21: set.fds_bits.21 = set.fds_bits.21 | mask 0199 case 22: set.fds_bits.22 = set.fds_bits.22 | mask 0200 case 23: set.fds_bits.23 = set.fds_bits.23 | mask 0201 case 24: set.fds_bits.24 = set.fds_bits.24 | mask 0202 case 25: set.fds_bits.25 = set.fds_bits.25 | mask 0203 case 26: set.fds_bits.26 = set.fds_bits.26 | mask 0204 case 27: set.fds_bits.27 = set.fds_bits.27 | mask 0205 case 28: set.fds_bits.28 = set.fds_bits.28 | mask 0206 case 29: set.fds_bits.29 = set.fds_bits.29 | mask 0207 case 30: set.fds_bits.30 = set.fds_bits.30 | mask 0208 case 31: set.fds_bits.31 = set.fds_bits.31 | mask 0209 default: break 0210 } 0211 } 0212 0213 0214 /// Replacement for FD_CLR macro 0215 0216 func fdClr(fd: Int32, inout set: fd_set) { 0217 let intOffset = Int(fd / 32) 0218 let bitOffset = fd % 32 0219 let mask = ~(1 << bitOffset) 0220 switch intOffset { 0221 case 0: set.fds_bits.0 = set.fds_bits.0 & mask 0222 case 1: set.fds_bits.1 = set.fds_bits.1 & mask 0223 case 2: set.fds_bits.2 = set.fds_bits.2 & mask 0224 case 3: set.fds_bits.3 = set.fds_bits.3 & mask 0225 case 4: set.fds_bits.4 = set.fds_bits.4 & mask 0226 case 5: set.fds_bits.5 = set.fds_bits.5 & mask 0227 case 6: set.fds_bits.6 = set.fds_bits.6 & mask 0228 case 7: set.fds_bits.7 = set.fds_bits.7 & mask 0229 case 8: set.fds_bits.8 = set.fds_bits.8 & mask 0230 case 9: set.fds_bits.9 = set.fds_bits.9 & mask 0231 case 10: set.fds_bits.10 = set.fds_bits.10 & mask 0232 case 11: set.fds_bits.11 = set.fds_bits.11 & mask 0233 case 12: set.fds_bits.12 = set.fds_bits.12 & mask 0234 case 13: set.fds_bits.13 = set.fds_bits.13 & mask 0235 case 14: set.fds_bits.14 = set.fds_bits.14 & mask 0236 case 15: set.fds_bits.15 = set.fds_bits.15 & mask 0237 case 16: set.fds_bits.16 = set.fds_bits.16 & mask 0238 case 17: set.fds_bits.17 = set.fds_bits.17 & mask 0239 case 18: set.fds_bits.18 = set.fds_bits.18 & mask 0240 case 19: set.fds_bits.19 = set.fds_bits.19 & mask 0241 case 20: set.fds_bits.20 = set.fds_bits.20 & mask 0242 case 21: set.fds_bits.21 = set.fds_bits.21 & mask 0243 case 22: set.fds_bits.22 = set.fds_bits.22 & mask 0244 case 23: set.fds_bits.23 = set.fds_bits.23 & mask 0245 case 24: set.fds_bits.24 = set.fds_bits.24 & mask 0246 case 25: set.fds_bits.25 = set.fds_bits.25 & mask 0247 case 26: set.fds_bits.26 = set.fds_bits.26 & mask 0248 case 27: set.fds_bits.27 = set.fds_bits.27 & mask 0249 case 28: set.fds_bits.28 = set.fds_bits.28 & mask 0250 case 29: set.fds_bits.29 = set.fds_bits.29 & mask 0251 case 30: set.fds_bits.30 = set.fds_bits.30 & mask 0252 case 31: set.fds_bits.31 = set.fds_bits.31 & mask 0253 default: break 0254 } 0255 } 0256 0257 0258 /// Replacement for FD_ISSET macro 0259 0260 func fdIsSet
BlueSocket.swift:629
		return (fdIsSet(self.socketfd, set: &readfds), fdIsSet(self.socketfd, set: &writefds))
BlueSocket.swift:629
		return (fdIsSet(self.socketfd, set: &readfds), fdIsSet(self.socketfd, set: &writefds))
(fd: Int32, inout set: fd_set) -> Bool { 0261 let intOffset = Int(fd / 32) 0262 let bitOffset = fd % 32 0263 let mask = 1 << bitOffset 0264 switch intOffset { 0265 case 0: return set.fds_bits.0 & mask != 0 0266 case 1: return set.fds_bits.1 & mask != 0 0267 case 2: return set.fds_bits.2 & mask != 0 0268 case 3: return set.fds_bits.3 & mask != 0 0269 case 4: return set.fds_bits.4 & mask != 0 0270 case 5: return set.fds_bits.5 & mask != 0 0271 case 6: return set.fds_bits.6 & mask != 0 0272 case 7: return set.fds_bits.7 & mask != 0 0273 case 8: return set.fds_bits.8 & mask != 0 0274 case 9: return set.fds_bits.9 & mask != 0 0275 case 10: return set.fds_bits.10 & mask != 0 0276 case 11: return set.fds_bits.11 & mask != 0 0277 case 12: return set.fds_bits.12 & mask != 0 0278 case 13: return set.fds_bits.13 & mask != 0 0279 case 14: return set.fds_bits.14 & mask != 0 0280 case 15: return set.fds_bits.15 & mask != 0 0281 case 16: return set.fds_bits.16 & mask != 0 0282 case 17: return set.fds_bits.17 & mask != 0 0283 case 18: return set.fds_bits.18 & mask != 0 0284 case 19: return set.fds_bits.19 & mask != 0 0285 case 20: return set.fds_bits.20 & mask != 0 0286 case 21: return set.fds_bits.21 & mask != 0 0287 case 22: return set.fds_bits.22 & mask != 0 0288 case 23: return set.fds_bits.23 & mask != 0 0289 case 24: return set.fds_bits.24 & mask != 0 0290 case 25: return set.fds_bits.25 & mask != 0 0291 case 26: return set.fds_bits.26 & mask != 0 0292 case 27: return set.fds_bits.27 & mask != 0 0293 case 28: return set.fds_bits.28 & mask != 0 0294 case 29: return set.fds_bits.29 & mask != 0 0295 case 30: return set.fds_bits.30 & mask != 0 0296 case 31: return set.fds_bits.31 & mask != 0 0297 default: return false 0298 } 0299 0300 } 0301 0302 #endif 0303