Ignore:
Timestamp:
Dec 28, 2008, 12:18:53 AM (15 years ago)
Author:
イグトランス (egtra)
Message:

TextWriter同様TextReaderでバッファリングし、StreamReaderはMultiByteToWideChar固定で仮実装。これで、マルチバイトモードでもStringReaderが使えるようにした。
(#235)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/ablib/src/Classes/System/IO/TextReader.ab

    r655 r665  
    2020    End Sub
    2121
    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
    2436    /*
    2537    @date 2008/02/26
    2638    @auther Egtra
    2739    */
    28     Function Read(buffer As *WCHAR, index As Long, count As Long) As Long
     40    Virtual Function Read(buffer As *Char, index As Long, count As Long) As Long
    2941        If buffer = 0 Then
    3042            Throw New ArgumentNullException("buffer")
     
    4759    @retval 有効なStringインスタンス 読み取った1行
    4860    */
    49     Function ReadLine() As String
     61    Virtual Function ReadLine() As String
    5062        If Peek() = -1 Then
    5163            Exit Function
    5264        End If
    53         Dim sb = New Collections.Generic.List<WCHAR>
     65        Dim sb = New Text.StringBuilder
     66        Dim isLead = FALSE
    5467        Do
    5568            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
    5976                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
    9697            End If
    9798            sb.Append(ch As Char)
     99#ifndef UNICODE
     100            isLead = IsDBCSLeadByte(ch As Byte)
     101#endif
    98102        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()
    99116    End Function
    100117
    101118Protected
    102119    Sub TextReader()
     120        buf = New Text.StringBuilder
     121        pos = 0
    103122    End Sub
    104123
     
    106125    End Sub
    107126
    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
     162Private
     163    buf As Text.StringBuilder
     164    pos As Long
    125165End Class
    126166
     
    136176
    137177    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
    138196'       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
    146198'       End Using
    147199    End Function
     
    159211    End Sub
    160212
    161     Override Function ReadImpl(buffer As *WCHAR, count As Long) As Long
    162 '       Using lock = cs.Lock
    163             ReadImpl = base.ReadImpl(buffer, count)
    164 '       End Using
    165     End Function
    166213Private
    167214    cs As ActiveBasic.Windows.CriticalSection
Note: See TracChangeset for help on using the changeset viewer.