Changeset 665 for trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab
- Timestamp:
- Dec 28, 2008, 12:18:53 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab
r655 r665 20 20 End Sub 21 21 22 Abstract Function Peek() As Long 23 Abstract Function Read() As Long 22 Virtual Function Peek() As Long 23 If pos >= buf.Length Then 24 If Not Underflow() Then 25 Peek = -1 26 Exit Function 27 End If 28 End If 29 Peek = buf[pos] 30 End Function 31 32 Virtual Function Read() As Long 33 Read = Peek() 34 pos++ 35 End Function 24 36 /* 25 37 @date 2008/02/26 26 38 @auther Egtra 27 39 */ 28 Function Read(buffer As *WCHAR, index As Long, count As Long) As Long40 Virtual Function Read(buffer As *Char, index As Long, count As Long) As Long 29 41 If buffer = 0 Then 30 42 Throw New ArgumentNullException("buffer") … … 47 59 @retval 有効なStringインスタンス 読み取った1行 48 60 */ 49 Function ReadLine() As String61 Virtual Function ReadLine() As String 50 62 If Peek() = -1 Then 51 63 Exit Function 52 64 End If 53 Dim sb = New Collections.Generic.List<WCHAR> 65 Dim sb = New Text.StringBuilder 66 Dim isLead = FALSE 54 67 Do 55 68 Dim ch = Read() 56 If ch = &h0D Then 57 If Peek() = &h0A Then 58 Read() 'CR LFの場合 69 If ch = -1 Then Exit Do 70 If isLead = FALSE Then 71 If ch = &h0D Then 72 If Peek() = &h0A Then 73 Read() 'CR LFの場合 74 End If 75 Exit Do 59 76 End If 60 Exit Do 61 End If 62 Select Case ch 63 Case -1 'EOF 64 Exit Do 65 Case &h0A 'LF 66 Exit Do 67 Case &h0B 'VT 68 Exit Do 69 Case &h0C 'FF 70 Exit Do 71 Case &h0D 'CR 72 Exit Do 73 Case &h85 'NEL 74 Exit Do 75 Case &h2028 'LS 76 Exit Do 77 Case &h2029 'PS 78 Exit Do 79 End Select 80 sb.Add(ch As WCHAR) 81 Loop 82 ReadLine = New String(sb As *WCHAR, sb.Count) 83 End Function 84 /* 85 @brief 現在位置からストリームの終わりまで読み込む。 86 @date 2008/02/26 87 @auther Egtra 88 */ 89 Virtual Function ReadToEnd() As String 90 Dim sb = New Text.StringBuilder(8192) 91 Do 92 Dim ch = Read() 93 If ch = -1 Then 94 ReadToEnd = sb.ToString 95 Exit Function 77 Select Case ch 78 Case -1 'EOF 79 Exit Do 80 Case &h0A 'LF 81 Exit Do 82 Case &h0B 'VT 83 Exit Do 84 Case &h0C 'FF 85 Exit Do 86 Case &h0D 'CR 87 Exit Do 88 #ifdef UNICODE 89 Case &h85 'NEL 90 Exit Do 91 Case &h2028 'LS 92 Exit Do 93 Case &h2029 'PS 94 Exit Do 95 #endif 96 End Select 96 97 End If 97 98 sb.Append(ch As Char) 99 #ifndef UNICODE 100 isLead = IsDBCSLeadByte(ch As Byte) 101 #endif 98 102 Loop 103 ReadLine = sb.ToString() 104 End Function 105 106 /*! 107 @brief 現在位置からストリームの終わりまで読み込む。 108 @date 2008/02/26 109 @auther Egtra 110 */ 111 Virtual Function ReadToEnd() As String 112 buf.Remove(0, pos) 113 While Underflow() 114 Wend 115 ReadToEnd = buf.ToString() 99 116 End Function 100 117 101 118 Protected 102 119 Sub TextReader() 120 buf = New Text.StringBuilder 121 pos = 0 103 122 End Sub 104 123 … … 106 125 End Sub 107 126 108 /* 109 @date 2008/02/26 110 @auther Egtra 111 */ 112 Virtual Function ReadImpl(buffer As *WCHAR, count As Long) As Long 113 Dim i As Long 114 For i = 0 To ELM(count) 115 Dim c = Read() 116 If c = -1 Then 117 ReadImpl = i 118 Exit Function 119 Else 120 buffer[i] = c As Char 121 End If 122 Next 123 ReadImpl = i 124 End Function 127 /*! 128 @brief バッファが足りなくなったときに呼ばれる。 129 @date 2008/12/27 130 @auther Egtra 131 @retval True まだEOFに達していない場合 132 @retval False EOFに達した場合 133 */ 134 Virtual Function Underflow() As Boolean 135 Underflow = False 136 End Function 137 138 /*! 139 @brief 内部バッファを返す 140 @date 2008/12/27 141 @auther Egtra 142 @return 内部バッファ 143 */ 144 Function Buffer() As Text.StringBuilder 145 Buffer = buf 146 End Function 147 148 /*! 149 @date 2008/02/26 150 @auther Egtra 151 */ 152 Function ReadImpl(buffer As *Char, count As Long) As Long 153 Dim p = StrPtr(buf) 154 While buf.Length - pos < count 155 If Underflow() = False Then Exit While 156 Wend 157 ReadImpl = Math.Min(buf.Length - pos, count) 158 ActiveBasic.Strings.ChrCopy(buffer, VarPtr(p[buf]), ReadImpl As SIZE_T) 159 pos += ReadImpl 160 End Function 161 162 Private 163 buf As Text.StringBuilder 164 pos As Long 125 165 End Class 126 166 … … 136 176 137 177 Override Function Peek() As Long 178 ' Using lock = cs.Lock() 179 Peek = base.Peek() 180 ' End Using 181 End Function 182 183 Override Function Read() As Long 184 ' Using lock = cs.Lock() 185 Read = base.Read() 186 ' End Using 187 End Function 188 189 Override Function Read(buffer As *Char, index As Long, count As Long) As Long 190 ' Using lock = cs.Lock() 191 Read = base.Read(buffer, index, count) 192 ' End Using 193 End Function 194 195 Override Function ReadToEnd() As String 138 196 ' Using lock = cs.Lock 139 Peek = base.Peek 140 ' End Using 141 End Function 142 143 Override Function Read() As Long 144 ' Using lock = cs.Lock 145 Read = base.Read 197 ReadToEnd = base.ReadToEnd 146 198 ' End Using 147 199 End Function … … 159 211 End Sub 160 212 161 Override Function ReadImpl(buffer As *WCHAR, count As Long) As Long162 ' Using lock = cs.Lock163 ReadImpl = base.ReadImpl(buffer, count)164 ' End Using165 End Function166 213 Private 167 214 cs As ActiveBasic.Windows.CriticalSection
Note:
See TracChangeset
for help on using the changeset viewer.