source: trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab@ 666

Last change on this file since 666 was 666, checked in by イグトランス (egtra), 15 years ago

マルチバイト文字列の先行バイトの扱いを忘れていたことを修正
(#235)

File size: 1.9 KB
Line 
1'Classes/System/IO/StreamReader.ab
2
3Namespace System
4Namespace IO
5
6/*
7@brief ストリームから読み取りを行うTextReaderの実装。
8@date 2008/02/25
9@auther Egtra
10*/
11Class StreamReader
12 Inherits TextReader
13Public
14 /*
15 @date 2008/02/25
16 @auther Egtra
17 */
18 Sub StreamReader(path As String)
19 init(New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
20 End Sub
21
22 /*
23 @date 2008/02/25
24 @auther Egtra
25 */
26 Sub StreamReader(stream As Stream)
27 init(stream)
28 End Sub
29
30Public
31 /*
32 @brief 基になるストリームを取得する
33 @date 2008/09/02
34 @auther NoWest
35 */
36 Function BaseStream () As Stream
37 Return s
38 End Function
39
40
41Protected
42 /*
43 @date 2008/02/25
44 @auther Egtra
45 */
46 Override Sub Dispose(disposing As Boolean)
47 If disposing Then
48 If Not ActiveBasic.IsNothing(s) Then
49 s.Dispose(True)
50 End If
51 End If
52 s = Nothing
53 End Sub
54
55 /*
56 @date 2008/12/27
57 @auther Egtra
58 */
59 Override Function Underflow() As Boolean
60 Dim wcBuf[4095] As WCHAR
61 Dim mbBuf[4095] As SByte
62 Dim pNext = mbBuf As PSTR
63 Dim mbBufSize = Len(buf)
64 If leadByte <> 0 Then
65 pNext[0] = leadByte
66 leadByte = 0
67 pNext++
68 mbBufSize--
69 End If
70 Dim mbLen = s.Read(pNext As *Byte, 0, mbBufSize)
71 If mbLen = 0 Then
72 Underflow = False
73 Exit Function
74 End If
75 Do
76 Dim q = CharNextExA(cp, pNext, 0)
77 If q = pNext Then
78 Exit Do
79 End If
80 pNext = q As PSTR
81 Loop
82 If pNext <> mbBuf + mbLen Then
83 leadByte = mbBuf[mbLen - 1]
84 End If
85 Dim wcLen = MultiByteToWideChar(cp, 0, mbBuf, (pNext - mbBuf) As Long, wcBuf, 4095)
86 Dim s = New String(wcBuf, wcLen)
87 Dim buf = Buffer
88 buf.Append(s)
89 Underflow = True
90 End Function
91Private
92
93 /*
94 @date 2008/02/25
95 @auther Egtra
96 */
97 Sub init(str As Stream)
98 s = str
99 cp = CP_ACP '暫定。
100 leadByte = 0
101 End Sub
102
103 s As Stream
104 cp As Word
105 leadByte As Byte
106End Class
107
108End Namespace
109End Namespace
Note: See TracBrowser for help on using the repository browser.