Index: trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab
===================================================================
--- trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab	(revision 664)
+++ trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab	(revision 665)
@@ -38,29 +38,4 @@
 	End Function
 
-	/*
-	@date 2008/02/25
-	@auther Egtra
-	*/
-	Override Function Peek() As Long
-		If charSize = charCur Then
-			fillCharBuf()
-			If charSize = charCur Then
-				Peek = -1
-				Exit Function
-			End If
-		End If
-		Peek = charBuf[charCur]
-	End Function
-
-	/*
-	@date 2008/02/25
-	@auther Egtra
-	*/
-	Override Function Read() As Long
-		Read = Peek()
-		If Read <> -1 Then
-			charCur++
-		End If
-	End Function
 
 Protected
@@ -79,22 +54,34 @@
 
 	/*
-	@date 2008/02/25
+	@date 2008/12/27
 	@auther Egtra
 	*/
-	Override Function ReadImpl(buffer As *WCHAR, count As Long) As Long
-		Dim n = charSize - charCur '現在のバッファに溜まっている文字数
-		If count <= n And charEof <> False Then
-			ReadImpl = readFromBuffer(buffer, count)
+	Override Function Underflow() As Boolean
+		Dim wcBuf[4095] As WCHAR
+		Dim mbBuf[4095] As SByte
+		Dim mbLen = s.Read(mbBuf As *Byte, 0, Len(buf))
+		If mbLen = 0 Then
+			Underflow = False
 			Exit Function
 		End If
-		ReadImpl = readFromBuffer(buffer, n)
-		If ReadImpl = count Then 'バッファの中身で足りた場合
-			Exit Function
+		Dim pNext = mbBuf As PSTR
+		Do
+			Dim q = CharNextExA(cp, pNext, 0)
+			If q = pNext Then
+				Exit Do
+			End If
+			pNext = q As PSTR
+		Loop
+		If pNext <> mbBuf + mbLen Then
+			leadByte = mbBuf[mbLen - 1]
 		End If
-		fillCharBuf()
-		ReadImpl += ReadImpl(VarPtr(buffer[n]), count - n)
+		Dim wcLen = MultiByteToWideChar(cp, 0, mbBuf, (pNext - mbBuf) As Long, wcBuf, 4095)
+		Dim s = New String(wcBuf, wcLen)
+		Dim buf = Buffer
+		buf.Append(s)
+		Underflow = True
 	End Function
+Private
 
-Private
 	/*
 	@date 2008/02/25
@@ -103,73 +90,11 @@
 	Sub init(str As Stream)
 		s = str
-		'暫定。正式版ではUTF-8を標準とする。
-		encoding = New Text.Detail.WindowsCodePageEncoding(CP_ACP)
-		decoder = encoding.GetDecoder()
-		charCapacity = 4096
-		byteCapacity = 4096
-		charBuf = GC_malloc(charCapacity * SizeOf(WCHAR))
-		byteBuf = GC_malloc(byteCapacity)
-		charCur = 0
-		byteCur = 0
-		charSize = 0
-		byteSize = 0
-		charEof = False
-		byteEof = False
-	End Sub
-
-	/**
-	@brief バッファの中身から読み取る。
-	@date 2008/02/25
-	@auther Egtra
-	文字数が足りなくても、元のストリームまで読みには行かない。
-	*/
-	Function readFromBuffer(p As *WCHAR, count As Long) As Long
-		memcpy(p, VarPtr(charBuf[charCur]), count * SizeOf (WCHAR))
-		charCur += count
-		readFromBuffer = count
-	End Function
-
-	/*!
-	@brief byteBufを基にcharBufを埋める。charBufが空になったときに用いる。
-	@date 2008/11/08
-	@auther Egtra
-	*/
-	Sub fillCharBuf()
-		charCur = 0
-		charSize = 0
-		If charEof = False Then
-			If byteCur = byteSize Then
-				byteSize = s.Read(byteBuf, 0, byteCapacity)
-				byteCur = 0
-				If byteSize = 0 Then
-					byteEof = True
-				End If
-			End If
-			Dim charUsed As Long
-			Dim byteUsed As Long
-			Dim completed As Boolean
-			decoder.Convert(VarPtr(byteBuf[byteCur]), byteSize - byteCur,
-				VarPtr(charBuf[charSize]), charCapacity - charSize,
-				byteEof, charUsed, byteUsed, completed)
-			charEof = byteEof And completed And byteCur = byteSize
-			byteCur += byteUsed
-			charSize += charUsed
-		End If
+		cp  = CP_ACP '暫定。
+		leadByte = 0
 	End Sub
 
 	s As Stream
-	encoding As Text.Encoding
-	decoder As Text.Decoder
-	charBuf As *WCHAR
-	byteBuf As *Byte
-	charCur As Long '読み取っていないデータの開始位置
-	byteCur As Long
-	charSize As Long 'Bufの内、有効なデータの数
-	byteSize As Long
-	charCapacity As Long '確保済み容量 = GC_mallocしたときの引数の値
-	byteCapacity As Long
-	charEof As Boolean 'Trueのとき、次にcur = sizeになるまでしかデータがことを示す
-	byteEof As Boolean
-	'常に0 <= cur <= size <= capacity
+	cp As Word
+	leadByte As Byte
 End Class
 
Index: trunk/ab5.0/ablib/src/Classes/System/IO/StringReader.ab
===================================================================
--- trunk/ab5.0/ablib/src/Classes/System/IO/StringReader.ab	(revision 664)
+++ trunk/ab5.0/ablib/src/Classes/System/IO/StringReader.ab	(revision 665)
@@ -23,43 +23,8 @@
 			Throw New ArgumentNullException("str")
 		End If
-		Dim length = GetStr(str, s)
-		If length > LONG_MAX Then
-			Throw New ArgumentException("Must be Length <= LONG_MAX", "str")
-		End If
-		len = length As Long
-		i = 0
+		Buffer.Append(str)
 	End Sub
 
-	/*
-	@date 2008/02/26
-	@auther Egtra
-	*/
-	Override Function Peek() As Long
-		If i >= len Then
-			Peek = -1
-		Else
-			Peek = s[i]
-		End If
-	End Function
 
-	/*
-	@date 2008/02/26
-	@auther Egtra
-	*/
-	Override Function Read() As Long
-		Read = Peek()
-		i++
-	End Function
-
-	/*
-	@date 2008/02/26
-	@auther Egtra
-	*/
-/*
-	Override Function ReadToEnd() As String
-		ReadToEnd = s.Substring(i)
-		i = s.Length
-	End Function
-*/
 Protected
 	/*
@@ -68,21 +33,5 @@
 	*/
 	Override Sub Dispose(disposing As Boolean)
-		s = Nothing
-		i = 0
 	End Sub
-
-	/*
-	@date 2008/02/26
-	@auther Egtra
-	*/
-	Override Function ReadImpl(buffer As *WCHAR, count As Long) As Long
-		ReadImpl = Math.Min(count, len - i)
-		ActiveBasic.Strings.ChrCopy(buffer, VarPtr(s[i]), ReadImpl As SIZE_T) 'ToDo: ポインタに対する+演算
-	End Function
-
-Private
-	s As *WCHAR
-	len As Long
-	i As Long
 End Class
 
Index: trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab
===================================================================
--- trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab	(revision 664)
+++ trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab	(revision 665)
@@ -20,11 +20,23 @@
 	End Sub
 
-	Abstract Function Peek() As Long
-	Abstract Function Read() As Long
+	Virtual Function Peek() As Long
+		If pos >= buf.Length Then
+			If Not Underflow() Then
+				Peek = -1
+				Exit Function
+			End If
+		End If
+		Peek = buf[pos]
+	End Function
+
+	Virtual Function Read() As Long
+		Read = Peek()
+		pos++
+	End Function
 	/*
 	@date 2008/02/26
 	@auther Egtra
 	*/
-	Function Read(buffer As *WCHAR, index As Long, count As Long) As Long
+	Virtual Function Read(buffer As *Char, index As Long, count As Long) As Long
 		If buffer = 0 Then
 			Throw New ArgumentNullException("buffer")
@@ -47,58 +59,65 @@
 	@retval 有効なStringインスタンス 読み取った1行
 	*/
-	Function ReadLine() As String
+	Virtual Function ReadLine() As String
 		If Peek() = -1 Then
 			Exit Function
 		End If
-		Dim sb = New Collections.Generic.List<WCHAR>
+		Dim sb = New Text.StringBuilder
+		Dim isLead = FALSE
 		Do
 			Dim ch = Read()
-			If ch = &h0D Then
-				If Peek() = &h0A Then
-					Read() 'CR LFの場合
+			If ch = -1 Then Exit Do
+			If isLead = FALSE Then
+				If ch = &h0D Then
+					If Peek() = &h0A Then
+						Read() 'CR LFの場合
+					End If
+					Exit Do
 				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.Add(ch As WCHAR)
-		Loop
-		ReadLine = New String(sb As *WCHAR, sb.Count)
-	End Function
-	/*
-	@brief 現在位置からストリームの終わりまで読み込む。
-	@date 2008/02/26
-	@auther Egtra
-	*/
-	Virtual Function ReadToEnd() As String
-		Dim sb = New Text.StringBuilder(8192)
-		Do
-			Dim ch = Read()
-			If ch = -1 Then
-				ReadToEnd = sb.ToString
-				Exit Function
+				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
+#ifdef UNICODE
+					Case &h85 'NEL
+						Exit Do
+					Case &h2028 'LS
+						Exit Do
+					Case &h2029 'PS
+						Exit Do
+#endif
+				End Select
 			End If
 			sb.Append(ch As Char)
+#ifndef UNICODE
+			isLead = IsDBCSLeadByte(ch As Byte)
+#endif
 		Loop
+		ReadLine = sb.ToString()
+	End Function
+
+	/*!
+	@brief 現在位置からストリームの終わりまで読み込む。
+	@date 2008/02/26
+	@auther Egtra
+	*/
+	Virtual Function ReadToEnd() As String
+		buf.Remove(0, pos)
+		While Underflow()
+		Wend
+		ReadToEnd = buf.ToString()
 	End Function
 
 Protected
 	Sub TextReader()
+		buf = New Text.StringBuilder
+		pos = 0
 	End Sub
 
@@ -106,21 +125,42 @@
 	End Sub
 
-	/*
-	@date 2008/02/26
-	@auther Egtra
-	*/
-	Virtual Function ReadImpl(buffer As *WCHAR, count As Long) As Long
-		Dim i As Long
-		For i = 0 To ELM(count)
-			Dim c = Read()
-			If c = -1 Then
-				ReadImpl = i
-				Exit Function
-			Else
-				buffer[i] = c As Char
-			End If
-		Next
-		ReadImpl = i
-	End Function
+	/*!
+	@brief バッファが足りなくなったときに呼ばれる。
+	@date 2008/12/27
+	@auther Egtra
+	@retval True まだEOFに達していない場合
+	@retval False EOFに達した場合
+	*/
+	Virtual Function Underflow() As Boolean
+		Underflow = False
+	End Function
+
+	/*!
+	@brief 内部バッファを返す
+	@date 2008/12/27
+	@auther Egtra
+	@return 内部バッファ
+	*/
+	Function Buffer() As Text.StringBuilder
+		Buffer = buf
+	End Function
+
+	/*!
+	@date 2008/02/26
+	@auther Egtra
+	*/
+	Function ReadImpl(buffer As *Char, count As Long) As Long
+		Dim p = StrPtr(buf)
+		While buf.Length - pos < count
+			If Underflow() = False Then Exit While
+		Wend
+		ReadImpl = Math.Min(buf.Length - pos, count)
+		ActiveBasic.Strings.ChrCopy(buffer, VarPtr(p[buf]), ReadImpl As SIZE_T)
+		pos += ReadImpl
+	End Function
+
+Private
+	buf As Text.StringBuilder
+	pos As Long
 End Class
 
@@ -136,12 +176,24 @@
 
 	Override Function Peek() As Long
+'		Using lock = cs.Lock()
+			Peek = base.Peek()
+'		End Using
+	End Function
+
+	Override Function Read() As Long
+'		Using lock = cs.Lock()
+			Read = base.Read()
+'		End Using
+	End Function
+
+	Override Function Read(buffer As *Char, index As Long, count As Long) As Long
+'		Using lock = cs.Lock()
+			Read = base.Read(buffer, index, count)
+'		End Using
+	End Function
+
+	Override Function ReadToEnd() As String
 '		Using lock = cs.Lock
-			Peek = base.Peek
-'		End Using
-	End Function
-
-	Override Function Read() As Long
-'		Using lock = cs.Lock
-			Read = base.Read
+			ReadToEnd = base.ReadToEnd
 '		End Using
 	End Function
@@ -159,9 +211,4 @@
 	End Sub
 
-	Override Function ReadImpl(buffer As *WCHAR, count As Long) As Long
-'		Using lock = cs.Lock
-			ReadImpl = base.ReadImpl(buffer, count)
-'		End Using
-	End Function
 Private
 	cs As ActiveBasic.Windows.CriticalSection
Index: trunk/ab5.0/ablib/src/Classes/System/IO/TextWriter.ab
===================================================================
--- trunk/ab5.0/ablib/src/Classes/System/IO/TextWriter.ab	(revision 664)
+++ trunk/ab5.0/ablib/src/Classes/System/IO/TextWriter.ab	(revision 665)
@@ -172,4 +172,10 @@
 	End Sub
 
+	/*!
+	@brief 内部バッファを返す
+	@date 2008/12/27
+	@auther Egtra
+	@return 内部バッファ
+	*/
 	Function Buffer() As Text.StringBuilder
 		Buffer = buf
