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

Last change on this file since 627 was 627, checked in by NoWest, 16 years ago

さらにConsoleクラスを強化しました。
また、COLOR命令、CLS命令、LOCATE命令に対応しました。
PRINT命令はStringクラスのみ対応ですが、一応BASICの命令だけで色々できるようになりました。

File size: 3.1 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 /*
41 @date 2008/02/25
42 @auther Egtra
43 */
44 Override Function Peek() As Long
45 If cur = last Then
46 last = s.Read(buf As *Byte, 0, size)
47 cur = 0
48 If last = 0 Then
49 Peek = -1
50 Exit Function
51 End If
52 End If
53 Peek = buf[cur]
54 End Function
55
56 /*
57 @date 2008/02/25
58 @auther Egtra
59 */
60 Override Function Read() As Long
61 Read = Peek()
62 If Read <> -1 Then
63 cur++
64 End If
65 End Function
66
67 /*
68 @date 2008/02/26
69 @auther Egtra
70 */
71 Override Function ReadToEnd() As String
72 Dim sb = New Text.StringBuilder(65536)
73 sb.Append(buf, cur, last - cur)
74 Do
75 Dim read = Read(buf, 0, size)
76 sb.Append(buf, 0, read)
77 If read < size Then
78 ReadToEnd = sb.ToString
79 Exit Function
80 End If
81 Loop
82 End Function
83
84Protected
85 /*
86 @date 2008/02/25
87 @auther Egtra
88 */
89 Override Sub Dispose(disposing As Boolean)
90 If disposing Then
91 If Not ActiveBasic.IsNothing(s) Then
92 s.Dispose(True)
93 End If
94 End If
95 s = Nothing
96 size = 0
97 cur = 0
98 last = 0
99 End Sub
100
101 /*
102 @date 2008/02/25
103 @auther Egtra
104 */
105 Override Function ReadImpl(buffer As *Char, index As Long, count As Long) As Long
106 Dim n = last - cur
107 If count <= n Then
108 ReadImpl = ReadFromBuffer(buffer, index, count)
109 Exit Function
110 End If
111 Dim p = VarPtr(buffer[index])
112 ReadImpl = ReadFromBuffer(p, 0, n)
113 If ReadImpl = count Then 'バッファの中身で足りた場合
114 Exit Function
115 End If
116 p = VarPtr(p[n])
117 count -= n
118 If count > size Then
119 n = (count \ size) * size 'sizeの倍数分だけは直接bufferへ読み込ませる
120 Dim read = s.Read(p As *Byte, 0, n)
121 If read = 0 Then 'EOF
122 Exit Function
123 End If
124 p = VarPtr(p[n])
125 ReadImpl += n
126 count -= n
127 End If
128 last = s.Read(buffer As *Byte, 0, size)
129 cur = 0
130 If last = 0 Then 'EOF
131 Exit Function
132 End If
133 ReadImpl += ReadFromBuffer(p, 0, Math.Min(last, count))
134 End Function
135
136Private
137 /*
138 @date 2008/02/25
139 @auther Egtra
140 */
141 Sub init(str As Stream)
142 s = str
143 size = 4096
144 last = 0
145 cur = 0
146 buf = GC_malloc(size)
147 End Sub
148
149 /**
150 @brief バッファの中身から読み取る。
151 @date 2008/02/25
152 @auther Egtra
153 文字数が足りなくても、元のストリームまで読みには行かない。
154 */
155 Function ReadFromBuffer(p As *Char, index As Long, count As Long) As Long
156 memcpy(VarPtr(p[index]), VarPtr(buf[cur]), count * SizeOf (Char))
157 cur += count
158 ReadFromBuffer = count
159 End Function
160
161 s As Stream
162 size As Long
163 cur As Long
164 last As Long '中身の終わり
165 buf As *SByte '暫定
166End Class
167
168End Namespace
169End Namespace
Note: See TracBrowser for help on using the repository browser.