Namespace System Namespace IO Class StreamReader Inherits TextReader Public Sub StreamReader(path As String) init(New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) End Sub Sub StreamReader(stream As Stream) init(stream) End Sub Override Sub Dispose(disposing As Boolean) s.Dispose(disposing) size = 0 cur = 0 last = 0 End Sub Override Function Peek() As Long If cur = last Then last = s.Read(buf, 0, size) cur = 0 If last = 0 Then Peek = -1 Exit Function End If End If Peek = buf[cur] End Function Override Function Read() As Long Read = Peek() cur++ End Function Override Function Read(buffer As *StrChar, index As Long, count As Long) As Long If buffer = 0 Then ElseIf index < 0 Then ElseIf count < 0 Then End If Dim n = last - cur If count <= n Then Read = ReadFromBuffer(buffer, index, count) Exit Function End If Dim p = VarPtr(buffer[index]) Read = ReadFromBuffer(p, 0, n) If Read = count Then 'バッファの中身で足りた場合 Exit Function End If p = VarPtr(p[n]) count -= n If count > size Then n = (count \ size) * size 'sizeの倍数分だけは直接bufferへ読み込ませる Dim read = s.Read(p, 0, n) If read = 0 Then 'EOF Exit Function End If p = VarPtr(p[n]) Read += n count -= n End If last = s.Read(buffer, 0, size) cur = 0 If last = 0 Then 'EOF Exit Function End If Read += ReadFromBuffer(p, 0, Math.Min(last, count)) End Function Override Function ReadLine() As String Dim sb = New Text.StringBuilder(256) Do Dim ch = Read() If ch = &h0D Then If Peek() = &h0A Then Read() 'CR LFの場合 End If Exit Do End If Select Case ch Case -1 'EOF Exit Do Case &h0A 'LF Exit Do Case &h0B 'VT Exit Do Case &h0C 'FF Exit Do Case &h0D 'CR Exit Do ' Case &h85 'NEL ' Exit Do ' Case &h2028 'LS ' Exit Do ' Case &h2029 'PS ' Exit Do End Select sb.Append(ch As StrChar) 'ToDo キャスト不要にすべきというチケットを書くこと Loop ReadLine = sb.ToString End Function Override Function ReadToEnd() As String End Function Private Sub init(str As Stream) s = str size = 4096 last = 0 cur = 0 buf = GC_malloc(size) End Sub /** @brief バッファの中身から読み取る。 文字数が足りなくても、元のストリームまで読みには行かない。 */ Function ReadFromBuffer(p As *StrChar, index As Long, count As Long) As Long memcpy(VarPtr(p[index]), VarPtr(buf[cur]), count * SizeOf (StrChar)) cur += count ReadFromBuffer = count End Function s As Stream size As Long cur As Long last As Long '中身の終わり buf As *Byte '暫定 End Class End Namespace End Namespace