source: trunk/Include/Classes/System/IO/StreamReader.ab@ 432

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

StreamReaderの完成。StringReaderの追加。
Consoleの追加(現在入力関係の一部のみ)。

File size: 2.9 KB
RevLine 
[432]1'Classes/System/IO/StreamReader.ab
2
[271]3Namespace System
4Namespace IO
5
[432]6/*
7@brief ストリームから読み取りを行うTextReaderの実装。
8@date 2008/02/25
9@auther Egtra
10*/
[426]11Class StreamReader
12 Inherits TextReader
13Public
[432]14 /*
15 @date 2008/02/25
16 @auther Egtra
17 */
[426]18 Sub StreamReader(path As String)
19 init(New FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
20 End Sub
[271]21
[432]22 /*
23 @date 2008/02/25
24 @auther Egtra
25 */
[426]26 Sub StreamReader(stream As Stream)
27 init(stream)
28 End Sub
29
[432]30 /*
31 @date 2008/02/25
32 @auther Egtra
33 */
[426]34 Override Function Peek() As Long
35 If cur = last Then
36 last = s.Read(buf, 0, size)
37 cur = 0
38 If last = 0 Then
39 Peek = -1
40 Exit Function
41 End If
42 End If
43 Peek = buf[cur]
44 End Function
45
[432]46 /*
47 @date 2008/02/25
48 @auther Egtra
49 */
[426]50 Override Function Read() As Long
51 Read = Peek()
52 cur++
53 End Function
54
[432]55 /*
56 @date 2008/02/26
57 @auther Egtra
58 */
59 Override Function ReadToEnd() As String
60 Dim sb = New Text.StringBuilder(65536)
61 sb.Append(buf, cur, last - cur)
62 Do
63 Dim read = Read(buf, 0, size)
64 sb.Append(buf, 0, read)
65 If read < size Then
66 ReadToEnd = sb.ToString
67 Exit Function
68 End If
69 Loop
70 End Function
71
72Protected
73 /*
74 @date 2008/02/25
75 @auther Egtra
76 */
77 Override Sub Dispose(disposing As Boolean)
78 If disposing Then
79 If Not ActiveBasic.IsNothing(s) Then
80 s.Dispose(True)
81 End If
[426]82 End If
[432]83 s = Nothing
84 size = 0
85 cur = 0
86 last = 0
87 End Sub
[426]88
[432]89 /*
90 @date 2008/02/25
91 @auther Egtra
92 */
93 Override Function ReadImpl(buffer As *StrChar, index As Long, count As Long) As Long
[426]94 Dim n = last - cur
95 If count <= n Then
[432]96 ReadImpl = ReadFromBuffer(buffer, index, count)
[426]97 Exit Function
98 End If
99 Dim p = VarPtr(buffer[index])
[432]100 ReadImpl = ReadFromBuffer(p, 0, n)
101 If ReadImpl = count Then 'バッファの中身で足りた場合
[426]102 Exit Function
103 End If
104 p = VarPtr(p[n])
105 count -= n
106 If count > size Then
107 n = (count \ size) * size 'sizeの倍数分だけは直接bufferへ読み込ませる
108 Dim read = s.Read(p, 0, n)
109 If read = 0 Then 'EOF
110 Exit Function
111 End If
112 p = VarPtr(p[n])
[432]113 ReadImpl += n
[426]114 count -= n
115 End If
116 last = s.Read(buffer, 0, size)
117 cur = 0
118 If last = 0 Then 'EOF
119 Exit Function
120 End If
[432]121 ReadImpl += ReadFromBuffer(p, 0, Math.Min(last, count))
[426]122 End Function
123
124Private
[432]125 /*
126 @date 2008/02/25
127 @auther Egtra
128 */
[426]129 Sub init(str As Stream)
130 s = str
131 size = 4096
132 last = 0
133 cur = 0
134 buf = GC_malloc(size)
135 End Sub
136
137 /**
138 @brief バッファの中身から読み取る。
[432]139 @date 2008/02/25
140 @auther Egtra
[426]141 文字数が足りなくても、元のストリームまで読みには行かない。
142 */
143 Function ReadFromBuffer(p As *StrChar, index As Long, count As Long) As Long
144 memcpy(VarPtr(p[index]), VarPtr(buf[cur]), count * SizeOf (StrChar))
145 cur += count
146 ReadFromBuffer = count
147 End Function
148
149 s As Stream
150 size As Long
151 cur As Long
152 last As Long '中身の終わり
[432]153 buf As *SByte '暫定
[271]154End Class
155
156End Namespace
157End Namespace
Note: See TracBrowser for help on using the repository browser.