Files
swift-mirror/stdlib/public/core/InputStream.swift
Andrew Trick 0b75ee975e Remove "illegal" UnsafePointer casts from the stdlib.
Update for SE-0107: UnsafeRawPointer

This adds a "mutating" initialize to UnsafePointer to make
Immutable -> Mutable conversions explicit.

These are quick fixes to stdlib, overlays, and test cases that are necessary
in order to remove arbitrary UnsafePointer conversions.

Many cases can be expressed better up by reworking the surrounding
code, but we first need a working starting point.
2016-07-28 20:42:23 -07:00

69 lines
2.3 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import SwiftShims
/// Returns `Character`s read from standard input through the end of the
/// current line or until EOF is reached, or `nil` if EOF has already been
/// reached.
///
/// If `strippingNewline` is `true`, newline characters and character
/// combinations will be stripped from the result. This is the default.
///
/// Standard input is interpreted as `UTF-8`. Invalid bytes
/// will be replaced by Unicode [replacement characters](http://en.wikipedia.org/wiki/Specials_(Unicode_block)#Replacement_character).
public func readLine(strippingNewline: Bool = true) -> String? {
var linePtrVar: UnsafeMutablePointer<UInt8>? = nil
var readBytes = swift_stdlib_readLine_stdin(&linePtrVar)
if readBytes == -1 {
return nil
}
_sanityCheck(readBytes >= 0,
"unexpected return value from swift_stdlib_readLine_stdin")
if readBytes == 0 {
return ""
}
let linePtr = linePtrVar!
if strippingNewline {
// FIXME: Unicode conformance. To fix this, we need to reimplement the
// code we call above to get a line, since it will only stop on LF.
//
// <rdar://problem/20013999> Recognize Unicode newlines in readLine()
//
// Recognize only LF and CR+LF combinations for now.
let cr = UInt8(ascii: "\r")
let lf = UInt8(ascii: "\n")
if readBytes == 1 && linePtr[0] == lf {
return ""
}
if readBytes >= 2 {
switch (linePtr[readBytes - 2], linePtr[readBytes - 1]) {
case (cr, lf):
readBytes -= 2
break
case (_, lf):
readBytes -= 1
break
default:
()
}
}
}
let result = String._fromCodeUnitSequenceWithRepair(UTF8.self,
input: UnsafeMutableBufferPointer(
start: linePtr,
count: readBytes)).0
_swift_stdlib_free(linePtr)
return result
}