- Timestamp:
- Jan 5, 2009, 1:40:11 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branch/egtra-stream-without-en_dec/Classes/System/IO/StreamReader.ab
r666 r673 58 58 */ 59 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 60 Dim nextRead As *Byte 61 Dim readSize = s.Read(mbBuf + bufSize, 0, bufCapacity - bufSize) 62 If readSize = 0 Then 63 If bufSize <> 0 Then 64 #ifdef UNCODE 65 Buffer.Append(&hfffd As WCHAR) 66 #else 67 Buffer.Append("?") 68 #endif 69 End If 72 70 Underflow = False 73 71 Exit Function 74 72 End If 73 Dim mbLen = bufSize + readSize 74 '文字全体が揃っている部分を抽出する。 75 Dim pNext = mbBuf 75 76 Do 76 Dim q = CharNextExA(cp, pNext, 0)77 Dim q = e.NextChar(pNext, ((mbBuf + mbLen) - pNext) As Long) 77 78 If q = pNext Then 78 79 Exit Do 79 80 End If 80 pNext = q As PSTR81 pNext = q 81 82 Loop 82 If pNext <> mbBuf + mbLen Then 83 leadByte = mbBuf[mbLen - 1] 83 '文字全体が揃っている部分を変換しTextReaderのバッファに送る。 84 Dim wcBufCapacity = e.GetMaxCharCount(mbLen) 85 Dim wcBuf = GC_malloc_atomic(wcBufCapacity * SizeOf (WCHAR)) As *WCHAR 86 Dim wcLen = e.GetChars(mbBuf, (pNext - mbBuf) As Long, wcBuf, wcBufCapacity) 87 Dim appendStr As PCTSTR 88 Dim appendLen = GetStr(wcBuf, wcLen As SIZE_T, appendStr) 89 Dim readerBuffer = Buffer 90 readerBuffer.Append(appendStr, 0, appendLen) 91 'マルチバイトの揃っていない部分を手前に連れてくる。 92 bufSize = ((mbBuf + mbLen) - pNext) As Long 93 If bufSize <> 0 Then 94 memmove(mbBuf, mbBuf + mbLen, bufSize) 84 95 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 = Buffer88 buf.Append(s)89 96 Underflow = True 90 97 End Function … … 97 104 Sub init(str As Stream) 98 105 s = str 99 cp = CP_ACP '暫定。 100 leadByte = 0 106 e = New Text.Detail.WindowsCodePageEncoding(CP_ACP) '暫定。 107 bufCapacity = 8192 108 mbBuf = GC_malloc_atomic(bufCapacity) As *Byte 109 bufSize = 0 101 110 End Sub 102 111 103 112 s As Stream 104 cp As Word 105 leadByte As Byte 113 e As Text.Encoding 114 mbBuf As *Byte 115 bufSize As Long 116 bufCapacity As Long 106 117 End Class 107 118
Note:
See TracChangeset
for help on using the changeset viewer.