Changeset 676 for trunk/ab5.0/ablib/src/Classes/System/IO
- Timestamp:
- Jan 13, 2009, 2:01:38 AM (15 years ago)
- Location:
- trunk/ab5.0/ablib/src/Classes/System/IO
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/ab5.0/ablib/src/Classes/System/IO/StreamReader.ab
r666 r676 1 1 'Classes/System/IO/StreamReader.ab 2 3 'ToDo: コンソールで入力待ちになる問題への対処 2 4 3 5 Namespace System … … 38 40 End Function 39 41 40 41 42 Protected 42 43 /* … … 58 59 */ 59 60 Override Function Underflow() As Boolean 60 Dim wcBuf[4095] As WCHAR61 Dim mbBuf[4095] As SByte62 Dim pNext = mbBuf As PSTR63 Dim mbBufSize = Len(buf)64 If leadByte <> 0 Then65 pNext[0] = leadByte66 leadByte = 067 pNext++68 mbBufSize--69 End If70 Dim mbLen = s.Read(pNext As *Byte, 0, mbBufSize)71 If mbLen = 0 Then72 Underflow = False73 Exit Function74 End If75 Do76 Dim q = CharNextExA(cp, pNext, 0)77 If q = pNext Then78 Exit Do79 End If80 pNext = q As PSTR81 Loop82 If pNext <> mbBuf + mbLen Then83 leadByte = mbBuf[mbLen - 1]84 End If85 Dim wcLen = MultiByteToWideChar(cp, 0, mbBuf, (pNext - mbBuf) As Long, wcBuf, 4095)86 Dim s = New String(wcBuf, wcLen)87 61 Dim buf = Buffer 62 Dim tmp = New Collections.Generic.List<WCHAR> 63 Underflow = decoder.Decode(tmp, s) 64 'ToDo: 非UNICODEのとき、 65 ' サロゲートペアや結合文字列 (Combining Character Sequence)の途中でバッファが途切れている場合に対応する 66 Dim s = New String(tmp.Data, tmp.Count) 88 67 buf.Append(s) 89 Underflow = True90 68 End Function 91 69 Private … … 97 75 Sub init(str As Stream) 98 76 s = str 99 cp = CP_ACP '暫定。 100 leadByte = 0 77 decoder = New Text.Detail.WindowsCodePageDecoder(CP_ACP) 101 78 End Sub 102 79 103 80 s As Stream 104 cp As Word 105 leadByte As Byte 81 decoder As Text.Decoder 106 82 End Class 107 83 -
trunk/ab5.0/ablib/src/Classes/System/IO/StreamWriter.ab
r653 r676 41 41 42 42 Override Sub Flush() 43 Dim buf = Buffer() 44 Dim pws As PCWSTR 45 Dim size = GetWCStr(buf.ToString(), pws) 46 Dim pwsEnd = VarPtr(pws[size]) 47 Dim charConverted As Long 48 Dim byteBuf[4095] As Byte 49 Dim byteSize As Long 50 Dim completed As Boolean 51 Do 52 Dim converted As Long 53 encoder.Convert(pws, size, byteBuf, Len(byteBuf), False, charConverted, byteSize, completed) 54 s.Write(byteBuf, 0, byteSize) 55 pws = VarPtr(pws[charConverted]) 56 size -= charConverted 57 Loop Until pws = pwsEnd 58 buf.Length = 0 43 Flush(False) 44 End Sub 45 46 Sub Flush(last As Boolean) 47 #ifdef UNICODE 48 encoder.Encode(StrPtr(buf), buf.Length As SIZE_T, s, last) 49 buf.Remove(0, buf.Length As SIZE_T) 50 #else 51 Dim p = StrPtr(buf) 52 Dim i = 0 As SIZE_T 53 Dim mbLen = 0 As SIZE_T 54 While i <= buf.Length 55 mbLen = i 56 'ヌル文字で終わっていないので、CharNextは使えない 57 If IsDBCSLeadByte(p[i]) Then 58 i += 2 59 Else 60 i += 1 61 End If 62 Wend 63 Dim wcBuf As PCWSTR 64 Dim wcLen = GetStr(p, mbLen, wcBuf) 65 encoder.Encode(wcBuf, wcLen, s, last) 66 buf.Remove(0, mbLen) 67 If last Then 68 If buf.Length <> 0 Then 69 s.WriteByte(Asc("?")) 70 buf.Length = 0 71 End If 72 End If 73 #endif 59 74 End Sub 60 75 … … 62 77 Override Sub Dispose(disposing As Boolean) 63 78 If disposing Then 64 Flush() 65 flushLast() 79 Flush(True) 66 80 s.Dispose() 67 81 End If … … 73 87 buf = New Text.StringBuilder(4096) 74 88 '暫定。正式版ではUTF-8を標準とする。 75 encoding = New Text.Detail.WindowsCodePageEncoding(CP_ACP) 76 encoder = encoding.GetEncoder() 89 encoder = New Text.Detail.WindowsCodePageEncoder(CP_ACP) 77 90 End Sub 78 91 79 Sub flushLast()80 Dim charConverted As Long81 Dim byteBuf[63] As Byte82 Dim byteSize As Long83 Dim completed As Boolean84 Do85 encoder.Convert(0, 0, byteBuf, Len(byteBuf), False, charConverted, byteSize, completed)86 s.Write(byteBuf, 0, byteSize)87 Loop Until completed88 End Sub89 90 encoding As Text.Encoding91 92 encoder As Text.Encoder 92 93 s As System.IO.Stream -
trunk/ab5.0/ablib/src/Classes/System/IO/StringReader.ab
r665 r676 16 16 @date 2008/02/26 17 17 @auther Egtra 18 @param str 読み取る 基となる文字列。18 @param str 読み取る元となる文字列。 19 19 @exception ArgumentNullException strがNothingのとき。 20 20 */ … … 23 23 Throw New ArgumentNullException("str") 24 24 End If 25 Buffer.Append(str) 26 End Sub 27 28 29 Protected 30 /* 31 @date 2008/02/26 32 @auther Egtra 33 */ 34 Override Sub Dispose(disposing As Boolean) 25 Dim b = Buffer 26 b.Append(str) 35 27 End Sub 36 28 End Class -
trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab
r668 r676 22 22 Virtual Function Peek() As Long 23 23 If pos >= buf.Length Then 24 buf.Length = 0 25 pos = 0 24 26 If Not Underflow() Then 25 27 Peek = -1 … … 114 116 Wend 115 117 ReadToEnd = buf.ToString() 118 buf.Length = 0 119 pos = 0 116 120 End Function 117 121 … … 141 145 @auther Egtra 142 146 @return 内部バッファ 147 内部バッファの既存の要素は、一切の変更をしないこと。また、空であるという仮定を置かないこと。 143 148 */ 144 149 Function Buffer() As Text.StringBuilder … … 151 156 */ 152 157 Function ReadImpl(buffer As *Char, count As Long) As Long 158 'ToDo 適当なところでバッファの読み取り済みの部分を除去する処理を入れる(現在Peekのみ)。 153 159 Dim p = StrPtr(buf) 154 160 While buf.Length - pos < count … … 156 162 Wend 157 163 ReadImpl = Math.Min(buf.Length - pos, count) 158 ActiveBasic.Strings.ChrCopy(buffer, VarPtr(p[pos]) , ReadImpl As SIZE_T)164 ActiveBasic.Strings.ChrCopy(buffer, VarPtr(p[pos]) As *Char, ReadImpl As SIZE_T) 159 165 pos += ReadImpl 160 166 End Function
Note:
See TracChangeset
for help on using the changeset viewer.