Ignore:
Timestamp:
Feb 16, 2009, 4:26:24 PM (15 years ago)
Author:
イグトランス (egtra)
Message:

UTF8Encodingクラスをとりあえず使える状態に。ただし、BOM出力はまだ不可能。
(#231)

Location:
trunk/ab5.0/ablib/src/Classes/System
Files:
6 edited

Legend:

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

    r602 r682  
    1414Const AB_E_PLATFORMNOTSUPPORTED = &h80041539 '80131539
    1515Const AB_E_KEYNOTFOUND = &h80041577 '80131577
     16Const AB_E_ARITHMETIC = &h80040216 '80070216
     17Const AB_E_OVERFLOW = &h80041516 '80131516
    1618
    1719End Namespace
     
    3840MulticastNotSupportedException
    3941NullReferenceException
    40 OverflowException
    4142RankException
    4243StackOverflowException
     
    712713End Class
    713714
     715/*!
     716@brief  算術演算例外
     717@author Egtra
     718@date   2009/02/16
     719*/
     720Class ArithmeticException
     721    Inherits SystemException
     722Public
     723    /*!
     724    @biref  コンストラクタ
     725    */
     726    Sub ArithmeticException()
     727        SystemException("ArithmeticException", Nothing)
     728        HResult = ActiveBasic.AB_E_ARITHMETIC
     729    End Sub
     730    /*!
     731    @biref  コンストラクタ
     732    @param[in] message  エラーメッセージ
     733    */
     734    Sub ArithmeticException(message As String)
     735        SystemException(message, Nothing)
     736        HResult = ActiveBasic.AB_E_ARITHMETIC
     737    End Sub
     738    /*!
     739    @biref  コンストラクタ
     740    @param[in] message  エラーメッセージ
     741    @param[in] innerException   内部例外
     742    */
     743    Sub ArithmeticException(message As String, innerException As Exception)
     744        SystemException(message, innerException)
     745        HResult = ActiveBasic.AB_E_ARITHMETIC
     746    End Sub
     747End Class
     748
     749/*!
     750@brief  オーバーフロー例外
     751@author Egtra
     752@date   2009/02/16
     753*/
     754Class OverflowException
     755    Inherits ArithmeticException
     756Public
     757    /*!
     758    @biref  コンストラクタ
     759    */
     760    Sub OverflowException()
     761        ArithmeticException("OverflowException", Nothing)
     762        HResult = ActiveBasic.AB_E_OVERFLOW
     763    End Sub
     764    /*!
     765    @biref  コンストラクタ
     766    @param[in] message  エラーメッセージ
     767    */
     768    Sub OverflowException(message As String)
     769        ArithmeticException(message, Nothing)
     770        HResult = ActiveBasic.AB_E_OVERFLOW
     771    End Sub
     772    /*!
     773    @biref  コンストラクタ
     774    @param[in] message  エラーメッセージ
     775    @param[in] innerException   内部例外
     776    */
     777    Sub OverflowException(message As String, innerException As Exception)
     778        ArithmeticException(message, innerException)
     779        HResult = ActiveBasic.AB_E_OVERFLOW
     780    End Sub
     781End Class
    714782
    715783End Namespace
  • trunk/ab5.0/ablib/src/Classes/System/IO/MemoryStream.ab

    r617 r682  
    339339    End Function*/
    340340
     341    Function ToPointer() As VoidPtr
     342        ToPointer = pointer
     343    End Function
     344
    341345    /*!
    342346    @brief  ストリームの内容全体をまるごと別のストリームに書き込みます。
  • trunk/ab5.0/ablib/src/Classes/System/IO/Stream.ab

    r609 r682  
    155155End Class
    156156
     157/*!
     158@brief 書き込みバイト数を記憶するヌルストリーム
     159Encoding関連で使用
     160@date 2009/02/16
     161@auther Egtra
     162*/
     163Class WriteCountingNullStream
     164    Inherits NullStream
     165Public
     166    Sub WriteCountingNullStream()
     167        writeCount = 0
     168    End Sub
     169
     170    Override Sub Write(buffer As *Byte, offset As Long, count As Long)
     171        If count < 0 Then
     172            Throw New ArgumentOutOfRangeException("count")
     173        End If
     174        writeCount += count
     175    End Sub
     176
     177    Override Sub WriteByte(b As Byte)
     178        writeCount++
     179    End Sub
     180
     181    /*!
     182    @brief 書き込まれたバイト数を返す。
     183    */
     184    Function WriteCount() As Long
     185        WriteCount = writeCount
     186    End Function
     187
     188Private
     189    writeCount As Long
     190End Class
     191
    157192End Namespace
    158193
  • trunk/ab5.0/ablib/src/Classes/System/IO/StreamWriter.ab

    r676 r682  
    2020    */
    2121    Sub StreamWriter(path As String)
    22         init(New FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
     22        init(New FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None), Nothing)
    2323    End Sub
    2424
     
    2828    */
    2929    Sub StreamWriter(stream As Stream)
    30         init(stream)
     30        init(stream, Nothing)
     31    End Sub
     32
     33    /*
     34    @date 2009/02/16
     35    @auther Egtra
     36    */
     37    Sub StreamWriter(stream As Stream, encoding As Text.Encoding)
     38        init(stream, encoding)
    3139    End Sub
    3240
     
    8391
    8492Private
    85     Sub init(stream As Stream)
     93    Sub init(stream As Stream, e As Text.Encoding)
    8694        s = stream
    8795        buf = New Text.StringBuilder(4096)
    88         '暫定。正式版ではUTF-8を標準とする。
    89         encoder = New Text.Detail.WindowsCodePageEncoder(CP_ACP)
     96        If ActiveBasic.IsNothing(e) Then
     97            '暫定。正式版ではUTF-8を標準とする。
     98            encoder = New Text.Detail.WindowsCodePageEncoder(CP_ACP)
     99        Else
     100            encoder = e.GetEncoder()
     101        End If
    90102    End Sub
    91103
  • trunk/ab5.0/ablib/src/Classes/System/Text/Encoding.ab

    r676 r682  
    7474    @date   2007/12/08
    7575    */
    76     Abstract Function GetBytesCountCore(src As *WCHAR, srcCount As Long) As Long
     76    Virtual Function GetBytesCountCore(src As *WCHAR, srcCount As Long) As Long
     77        Dim s = New IO.Detail.WriteCountingNullStream
     78        GetEncoder().Encode(src, srcCount, s, True)
     79        GetBytesCountCore = s.WriteCount
     80        If GetBytesCountCore < 0 Then
     81            Throw New OverflowException
     82        End If
     83    End Function
    7784Public
    7885    /*!
     
    110117    @date   2007/12/08
    111118    */
    112     Abstract Function GetBytesCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long) As Long
     119    Virtual Function GetBytesCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long) As Long
     120        Dim s = New IO.MemoryStream
     121        GetEncoder().Encode(src, srcCount, s, True)
     122        Dim size = s.Position()
     123        If size > (dstCount As QWord) Then
     124            Throw New ArgumentException("dstCount")
     125        End If
     126        GetBytesCore = size As Long
     127        memcpy(dst, s.ToPointer(), size As SIZE_T)
     128    End Function
    113129Public
    114130    /*!
     
    136152    @date   2007/12/08
    137153    */
    138     Abstract Function GetCharsCountCore(src As *Byte, srcCount As Long) As Long
     154    Virtual Function GetCharsCountCore(src As *Byte, srcCount As Long) As Long
     155        Dim s = New IO.MemoryStream(src, srcCount)
     156        Dim l = New Collections.Generic.List<WCHAR>
     157        GetDecoder().Decode(l, s)
     158        GetCharsCountCore = l.Count
     159    End Function
    139160Public
    140161    /*!
     
    172193    @date   2007/12/08
    173194    */
    174     Abstract Function GetCharsCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long) As Long
     195    Virtual Function GetCharsCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long) As Long
     196        Dim s = New IO.MemoryStream(src, srcCount)
     197        Dim l = New Collections.Generic.List<WCHAR>
     198        GetDecoder().Decode(l, s)
     199        If l.Count > dstCount Then
     200            Throw New ArgumentException("dstCount")
     201        End If
     202        Dim p As *WCHAR
     203        p = l
     204        memcpy(dst, p, (l.Count As SIZE_T) * 2)
     205    End Function
    175206Public
    176207#ifdef UNICODE
  • trunk/ab5.0/ablib/src/Classes/System/Text/UTF8Encoding.ab

    r676 r682  
    111111                            dst.Add((&hDC00 Or (buffer And &h3FF)) As WCHAR)
    112112                        Else
    113                             '最短形式でないもの、4バイト形式で10FFFFを超えるコードポイントのもの
     113                            '最短形式でないもの、または4バイト形式で10FFFFを超えるコードポイントのもの
    114114                            dst.Add(&hfffd As WCHAR)
    115115                        End If
     
    196196    End Function
    197197*/
    198 Protected
    199     Override Function GetBytesCountCore(src As *WCHAR, srcCount As Long) As Long
    200     End Function
    201 
    202     Override Function GetBytesCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long) As Long
    203     End Function
    204 
    205     Override Function GetCharsCountCore(src As *Byte, srcCount As Long) As Long
    206     End Function
    207 
    208     Override Function GetCharsCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long) As Long
    209     End Function
    210198
    211199Private
Note: See TracChangeset for help on using the changeset viewer.