Changeset 653


Ignore:
Timestamp:
2008/11/03 23:42:22 (4 years ago)
Author:
egtra
Message:

TextWriter及びその派生クラスをEncodingを用いるように変更。UTF8EncodingをEncodingの変更に追従させていないので、それ関連を一時的にコメントアウト。

Location:
trunk/ab5.0/ablib
Files:
1 added
1 deleted
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/ab5.0/ablib/TestCase/SimpleTestCase/EncodingTest.ab

    r411 r653  
    11Imports System.Text 
    22Imports System.Text.Detail 
    3  
     3/* 
    44Namespace EncodingTest 
    55 
     
    4040 
    4141EncodingTest.TestMain() 
     42*/ 
  • trunk/ab5.0/ablib/src/Classes/System/IO/BinaryReader.ab

    r553 r653  
    1 NameSpace System 
    2 NameSpace IO 
     1Namespace System 
     2Namespace IO 
    33 
    44Class BinaryReader 
     
    1313    Sub BinaryReader(input As Stream) 
    1414        stream = input 
    15         enc = New System.Text.UTF8Encoding() 
     15'       enc = New System.Text.UTF8Encoding() 
    1616    End Sub 
    1717    /*! 
  • trunk/ab5.0/ablib/src/Classes/System/IO/StreamWriter.ab

    r627 r653  
    4141 
    4242    Override Sub Flush() 
    43         Dim len = buf.Length 
    44         If len > 0 Then 
    45             s.Write(StrPtr(buf) As *Byte, 0, len) 
    46             buf.Length = 0 
    47         End If 
    48     End Sub 
    49  
    50     Override Sub Write(str As String) 
    51         buf.Append(str) 
    52         Dim len = buf.Length 
    53         If len >= 2048 Then 
    54             s.Write(StrPtr(buf) As *Byte, 0, len) 
    55             buf.Length = 0 
    56         End If 
    57     End Sub 
    58  
    59     Override Sub Write(x As Boolean) 
    60         buf.Append(x) 
    61     End Sub 
    62      
    63     Override Sub Write(x As Char) 
    64         buf.Append(x) 
    65     End Sub 
    66  
    67     Override Sub Write(x As Byte) 
    68         buf.Append(x) 
    69     End Sub 
    70 #ifdef UNICODE 
    71     Override Sub Write(x As SByte) 
    72         buf.Append(x) 
    73     End Sub 
    74 #else 
    75     Override Sub Write(x As Word) 
    76         buf.Append(x) 
    77     End Sub 
    78 #endif 
    79     Override Sub Write(x As Integer) 
    80         buf.Append(x) 
    81     End Sub 
    82  
    83     Override Sub Write(x As DWord) 
    84         buf.Append(x) 
    85     End Sub 
    86  
    87     Override Sub Write(x As Long) 
    88         buf.Append(x) 
    89     End Sub 
    90  
    91     Override Sub Write(x As QWord) 
    92         buf.Append(x) 
    93     End Sub 
    94  
    95     Override Sub Write(x As Int64) 
    96         buf.Append(x) 
    97     End Sub 
    98  
    99     Override Sub Write(x As Single) 
    100         buf.Append(x) 
    101     End Sub 
    102  
    103     Override Sub Write(x As Double) 
    104         buf.Append(x) 
    105     End Sub 
    106  
    107     Override Sub Write(x As Object) 
    108         Write(x.ToString) 
     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 
    10959    End Sub 
    11060 
     
    11262    Override Sub Dispose(disposing As Boolean) 
    11363        If disposing Then 
    114             Dim len = buf.Length 
    115             If len > 0 Then 
    116                 s.Write(StrPtr(buf) As *Byte, 0, len) 
    117             End If 
     64            Flush() 
     65            flushLast() 
    11866            s.Dispose() 
    11967        End If 
     
    12371    Sub init(stream As Stream) 
    12472        s = stream 
    125         buf = New System.Text.StringBuilder(4096) 
     73        buf = New Text.StringBuilder(4096) 
     74        '暫定。正式版ではUTF-8を標準とする。 
     75        encoding = New Text.Detail.WindowsCodePageEncoding(CP_ACP) 
     76        encoder = encoding.GetEncoder() 
    12677    End Sub 
    12778 
    128     buf As Text.StringBuilder 
     79    Sub flushLast() 
     80        Dim charConverted As Long 
     81        Dim byteBuf[63] As Byte 
     82        Dim byteSize As Long 
     83        Dim completed As Boolean 
     84        Do 
     85            encoder.Convert(0, 0, byteBuf, Len(byteBuf), False, charConverted, byteSize, completed) 
     86            s.Write(byteBuf, 0, byteSize) 
     87        Loop Until completed 
     88    End Sub 
     89 
     90    encoding As Text.Encoding 
     91    encoder As Text.Encoder 
    12992    s As System.IO.Stream 
    13093End Class 
  • trunk/ab5.0/ablib/src/Classes/System/IO/TextWriter.ab

    r523 r653  
    1010*/ 
    1111Class TextWriter 
     12    Implements System.IDisposable 
    1213Public 
    1314    Virtual Sub ~TextWriter() 
     
    2627    End Sub 
    2728 
    28     Sub TextWriter() 
    29         newLine = Environment.NewLine 
    30     End Sub 
    31  
    3229    Virtual Sub Flush() 
    3330    End Sub 
    3431 
    35     Abstract Sub Write(s As String) 
    36     Virtual Sub Write(x As Boolean) 
    37         Write(Str$(x)) 
     32    'これ以外全てのWrite/WriteLineは、最終的にこのWriteを呼ぶ。 
     33    Sub Write(x As String) 
     34        buf.Append(x) 
     35        If buf.Length >= 4096 Then 
     36            Flush() 
     37        End If 
    3838    End Sub 
    3939     
    40     Virtual Sub Write(x As Char) 
    41         Write(Chr$(x)) 
     40    Sub Write(x As Boolean) 
     41        buf.Append(x) 
     42    End Sub 
     43     
     44    Sub Write(x As SByte) 
     45        buf.Append(x) 
    4246    End Sub 
    4347 
    44     Virtual Sub Write(x As Byte) 
    45         Write(Str$(x)) 
    46     End Sub 
    47 #ifdef UNICODE 
    48     Virtual Sub Write(x As SByte) 
    49         Write(Str$(x)) 
    50     End Sub 
    51 #else 
    52     Virtual Sub Write(x As Word) 
    53         Write(Str$(x)) 
    54     End Sub 
    55 #endif 
    56     Virtual Sub Write(x As Integer) 
    57         Write(Str$(x)) 
     48    Sub Write(x As Byte) 
     49        buf.Append(x) 
    5850    End Sub 
    5951 
    60     Virtual Sub Write(x As DWord) 
    61         Write(Str$(x)) 
     52    Sub Write(x As Word) 
     53        buf.Append(x) 
    6254    End Sub 
    6355 
    64     Virtual Sub Write(x As Long) 
    65         Write(Str$(x)) 
     56    Sub Write(x As Integer) 
     57        buf.Append(x) 
    6658    End Sub 
    6759 
    68     Virtual Sub Write(x As QWord) 
    69         Write(Str$(x)) 
     60    Sub Write(x As DWord) 
     61        buf.Append(x) 
    7062    End Sub 
    7163 
    72     Virtual Sub Write(x As Int64) 
    73         Write(Str$(x)) 
     64    Sub Write(x As Long) 
     65        buf.Append(x) 
    7466    End Sub 
    7567 
    76     Virtual Sub Write(x As Single) 
    77         Write(Str$(x)) 
     68    Sub Write(x As QWord) 
     69        buf.Append(x) 
    7870    End Sub 
    7971 
    80     Virtual Sub Write(x As Double) 
    81         Write(Str$(x)) 
     72    Sub Write(x As Int64) 
     73        buf.Append(x) 
    8274    End Sub 
    8375 
    84     Virtual Sub Write(x As Object) 
    85         Write(x.ToString) 
     76    Sub Write(x As Single) 
     77        buf.Append(x) 
     78    End Sub 
     79 
     80    Sub Write(x As Double) 
     81        buf.Append(x) 
     82    End Sub 
     83 
     84    Sub Write(x As Object) 
     85        buf.Append(x) 
    8686    End Sub 
    8787 
    8888    Sub WriteLine() 
    89         Write(newLine) 
     89        Write(Environment.NewLine) 
    9090    End Sub 
    9191 
    92     Sub WriteLine(s As String) 
    93         Write(s) 
     92    Sub WriteLine(x As String) 
     93        Write(x) 
    9494        WriteLine() 
    9595    End Sub 
    9696 
    9797    Sub WriteLine(x As Boolean) 
    98         Write(Str$(x)) 
    99         WriteLine() 
    100     End Sub 
    101      
    102     Sub WriteLine(x As Char) 
    103         Write(Chr$(x)) 
     98        Write(x) 
    10499        WriteLine() 
    105100    End Sub 
    106101 
    107102    Sub WriteLine(x As Byte) 
    108         Write(Str$(x)) 
     103        Write(x) 
    109104        WriteLine() 
    110105    End Sub 
    111 #ifdef UNICODE 
     106     
    112107    Sub WriteLine(x As SByte) 
    113         Write(Str$(x)) 
     108        Write(x) 
    114109        WriteLine() 
    115110    End Sub 
    116 #else 
     111 
    117112    Sub WriteLine(x As Word) 
    118         Write(Str$(x)) 
     113        Write(x) 
    119114        WriteLine() 
    120115    End Sub 
    121 #endif 
     116 
    122117    Sub WriteLine(x As Integer) 
    123         Write(Str$(x)) 
     118        Write(x) 
    124119        WriteLine() 
    125120    End Sub 
    126121 
    127122    Sub WriteLine(x As DWord) 
    128         Write(Str$(x)) 
     123        Write(x) 
    129124        WriteLine() 
    130125    End Sub 
    131126 
    132127    Sub WriteLine(x As Long) 
    133         Write(Str$(x)) 
     128        Write(x) 
    134129        WriteLine() 
    135130    End Sub 
    136131 
    137132    Sub WriteLine(x As QWord) 
    138         Write(Str$(x)) 
     133        Write(x) 
    139134        WriteLine() 
    140135    End Sub 
    141136 
    142137    Sub WriteLine(x As Int64) 
    143         Write(Str$(x)) 
     138        Write(x) 
    144139        WriteLine() 
    145140    End Sub 
    146141 
    147142    Sub WriteLine(x As Single) 
    148         Write(Str$(x)) 
     143        Write(x) 
    149144        WriteLine() 
    150145    End Sub 
    151146 
    152147    Sub WriteLine(x As Double) 
    153         Write(Str$(x)) 
     148        Write(x) 
    154149        WriteLine() 
    155150    End Sub 
    156151 
    157152    Sub WriteLine(x As Object) 
    158         Write(x.ToString) 
     153        Write(x) 
    159154        WriteLine() 
    160155    End Sub 
    161  
    162     /* 
    163     @brief 改行文字の設定 
    164     @date 2007/03/05 
    165     @auther Egtra 
    166     */ 
    167     Sub NewLine(n As String) 
    168         newLine = n 
    169     End Sub 
    170     /* 
    171     @brief 改行文字の取得 
    172     @date 2007/03/05 
    173     @auther Egtra 
    174     */ 
    175     Function NewLine() As String 
    176     End Function 
    177156 
    178157    Static Function Synchronized(writer As TextWriter) As TextWriter 
     
    180159        Return writer 
    181160    End Function 
     161 
    182162Protected 
     163    Sub TextWriter() 
     164        buf = New Text.StringBuilder 
     165    End Sub 
     166 
     167    Sub TextWriter(buffer As Text.StringBuilder) 
     168        If ActiveBasic.IsNothing(buffer) Then 
     169            Throw New ArgumentNullException("buffer") 
     170        End If 
     171        buf = buffer 
     172    End Sub 
     173 
     174    Function Buffer() As Text.StringBuilder 
     175        Buffer = buf 
     176    End Function 
     177 
    183178    Virtual Sub Dispose(disposing As Boolean) 
     179        If disposing Then 
     180            Flush() 
     181            buf = Nothing 
     182        End If 
    184183    End Sub 
    185184 
    186185Private 
    187     newLine As String 
     186    buf As Text.StringBuilder 
    188187End Class 
    189188 
  • trunk/ab5.0/ablib/src/Classes/System/Text/Encoding.ab

    r581 r653  
    1313 
    1414なお、このクラスで、文字列の長さやバッファの大きさを指定するときには、 
    15 1 chars = 2バイト(UTF-16符号単位)、1 bytes = 1バイトの単位で指定する。 
     151 WCHAR = 2バイト(UTF-16符号単位)、1 Byte = 1バイトの単位で指定する。 
    1616 
    1717*/ 
     
    2222    @brief  簡易的複製を作成する。 
    2323    */ 
    24     Abstract Function Clone() As Object 
     24    Virtual Function Clone() As Object 
     25        Clone = This 
     26    End Function 
    2527 
    2628'   Override Function Equals(y As Object) As Boolean 
     
    3234Public 
    3335    Sub Encoding() 
    34         decoderFallback = New DecoderReplacementFallback 
    3536    End Sub 
    3637 
    3738    /*! 
    3839    @brief  符号化して得られる文字列の長さを計算する。 
    39     @param[in] s    対象文字列 
    40     @param[in] n    sの長さ 
     40    @param[in] src  対象文字列 
     41    @param[in] srcCount srcの長さ 
    4142    @return 符号化して得られる文字列の長さ 
    4243    @date   2007/12/08 
    4344    */ 
    44     Function GetBytesCount(s As *WCHAR, n As Long) As Long 
    45         If s = 0 Then 
    46             Throw New ArgumentNullException("Encoding.GetBytesCount: An argument is null value.", "s") 
    47         ElseIf n < 0 Then 
    48             Throw New ArgumentOutOfRangeException("Encoding.GetBytesCount: An argument is out of range value.", "n") 
    49         End If 
    50         Return GetBytesCountCore(s, n) 
     45    Function GetBytesCount(src As *WCHAR, srcCount As Long) As Long 
     46        If src = 0 Then 
     47            Throw New ArgumentNullException("src") 
     48        ElseIf srcCount < 0 Then 
     49            Throw New ArgumentOutOfRangeException("srcCount") 
     50        End If 
     51        Return GetBytesCountCore(src, srcCount) 
    5152    End Function 
    5253#ifdef UNICODE 
    5354    /*! 
    5455    @brief  符号化して得られる文字列の長さを計算する。 
    55     @param[in] s    対象文字列 
     56    @param[in] src  対象文字列 
    5657    @return 符号化して得られる文字列の長さ 
    5758    @date   2007/12/08 
    5859    */ 
    59     Function GetBytesCount(s As String) As Long 
    60         If ActiveBasic.IsNothing(s) Then 
    61             Throw New ArgumentNullException("Encoding.GetBytesCount: An argument is null value.", "s") 
    62         End If 
    63         Return GetBytesCountCore(StrPtr(s), s.Length) 
     60    Function GetBytesCount(src As String) As Long 
     61        If ActiveBasic.IsNothing(src) Then 
     62            Throw New ArgumentNullException("src") 
     63        End If 
     64        Return GetBytesCountCore(StrPtr(src), src.Length) 
    6465    End Function 
    6566#endif 
    66     /*! 
    67     @brief  符号化して得られる文字列の長さを計算する。 
    68     @param[in] s    対象文字列 
    69     @param[in] index    開始位置 
    70     @param[in] count    符号化する文字の数 
     67 
     68Private 
     69    /*! 
     70    @brief  GetBytesCountの実装を行う。 
     71    @param[in] src  対象文字列 
     72    @param[in] srcCount srcの長さ 
    7173    @return 符号化して得られる文字列の長さ 
    7274    @date   2007/12/08 
    7375    */ 
    74     Function GetBytesCount(s As *WCHAR, index As Long, count As Long) As Long 
    75         If s = 0 Then 
    76             Throw New ArgumentNullException("Encoding.GetBytesCount: An argument is null value.", "s") 
    77         ElseIf index < 0 Then 
    78             Throw New ArgumentOutOfRangeException("Encoding.GetBytesCount: An argument is out of range value.", "index") 
    79         ElseIf count < 0 Then 
    80             Throw New ArgumentOutOfRangeException("Encoding.GetBytesCount: An argument is out of range value.", "count") 
    81         End If 
    82         Return GetBytesCountCore(VarPtr(s[index]), count) 
    83     End Function 
    84 Protected 
    85     /*! 
    86     @brief  GetBytesCountの実装を行う。 
    87     @param[in] s    対象文字列 
    88     @param[in] n    sの長さ 
     76    Function GetBytesCountCore(src As *WCHAR, srcCount As Long) As Long 
     77        Dim enc = GetEncoder() 
     78        GetBytesCountCore = enc.GetBytesCount(src, srcCount, True) 
     79    End Function 
     80Public 
     81    /*! 
     82    @brief  符号化する。 
     83    @param[in] src  入力 
     84    @param[in] srcCount srcの長さ 
     85    @param[out] dst 出力 
     86    @param[in] dstCount dstのバッファの大きさ 
     87    @return dstに書き込まれたバイト数 
     88    @date   2007/12/08 
     89    */ 
     90    Function GetBytes(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long) As Long 
     91        If src = 0 Then 
     92            Throw New ArgumentNullException("src") 
     93        ElseIf dst = 0 Then 
     94            Throw New ArgumentNullException("dst") 
     95        ElseIf srcCount < 0 Then 
     96            Throw New ArgumentOutOfRangeException("srcCount") 
     97        ElseIf dstCount < 0 Then 
     98            Throw New ArgumentOutOfRangeException("dstCount") 
     99        End If 
     100 
     101        Return GetBytesCore(src, srcCount, dst, dstCount) 
     102    End Function 
     103 
     104Private 
     105    /*! 
     106    @brief  GetBytesの処理を行う。 
     107    @param[in] src  入力 
     108    @param[in] srcCount srcの長さ 
     109    @param[out] dst 出力 
     110    @param[in] dstCount dstのバッファの大きさ 
     111    @return dstに書き込まれたバイト数 
     112    @exception ArgumentException    バッファの大きさが足りない 
     113    @date   2007/12/08 
     114    */ 
     115    Function GetBytesCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long) As Long 
     116        GetBytesCore = GetEncoder().GetBytes(src, srcCount, dst, dstCount, True) 
     117    End Function 
     118Public 
     119    /*! 
     120    @brief  復号して得られる文字列の長さを計算する。 
     121    @param[in] src  対象文字列 
     122    @param[in] srcCount srcの長さ 
     123    @return 復号して得られる文字列の長さ 
     124    @date   2007/12/08 
     125    */ 
     126    Function GetCharsCount(src As *Byte, srcCount As Long) As Long 
     127        If src = 0 Then 
     128            Throw New ArgumentNullException("src") 
     129        ElseIf srcCount < 0 Then 
     130            Throw New ArgumentOutOfRangeException("srcCount") 
     131        End If 
     132        Return GetCharsCountCore(src, srcCount) 
     133    End Function 
     134 
     135Private 
     136    /*! 
     137    @brief  GetCharsCountの処理を行う。 
     138    @param[in] src  対象文字列 
     139    @param[in] srcCount srcの長さ 
    89140    @return 符号化して得られる文字列の長さ 
    90141    @date   2007/12/08 
    91142    */ 
    92     Abstract Function GetBytesCountCore(s As *WCHAR, n As Long) As Long 
    93 Public 
    94     /*! 
    95     @brief  符号化する。 
    96     @param[in] chars    入力 
    97     @param[in] charCount    charsの長さ 
    98     @param[out] bytes   出力 
    99     @param[in] byteCount    bytesのバッファの大きさ 
    100     @return bytesに書き込まれたバイト数 
    101     @date   2007/12/08 
    102     */ 
    103     Function GetBytes(chars As *WCHAR, charCount As Long, bytes As *Byte, byteCount As Long) As Long 
    104         If chars = 0 Then 
    105             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "chars") 
    106         ElseIf bytes = 0 Then 
    107             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "bytes") 
    108         ElseIf charCount < 0 Then 
    109             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "charCount") 
    110         ElseIf byteCount < 0 Then 
    111             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "byteCount") 
    112         End If 
    113  
    114         Return GetBytesCore(chars, charCount, bytes, byteCount) 
    115     End Function 
    116     /*! 
    117     @brief  符号化する。 
    118     @param[in] chars    入力 
    119     @param[in] index    charsの開始位置 
    120     @param[in] count    符号化する文字の数 
    121     @param[out] bytes   出力 
    122     @param[in] byteCount    bytesのバッファの大きさ 
    123     @return bytesに書き込まれたバイト数 
    124     @date   2007/12/08 
    125     */ 
    126     Function GetBytes(chars As *WCHAR, index As Long, count As Long, bytes As *Byte, byteCount As Long) As Long 
    127         If chars = 0 Then 
    128             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "chars") 
    129         ElseIf bytes = 0 Then 
    130             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "bytes") 
    131         ElseIf index < 0 Then 
    132             Throw New ArgumentOutOfRangeException("Encoding.GetBytesCount: An argument is out of range value.", "index") 
    133         ElseIf count < 0 Then 
    134             Throw New ArgumentOutOfRangeException("Encoding.GetBytesCount: An argument is out of range value.", "count") 
    135         ElseIf byteCount < 0 Then 
    136             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "byteCount") 
    137         End If 
    138  
    139         Return GetBytesCore(VarPtr(chars[index]), count, bytes, byteCount) 
    140     End Function 
     143    Function GetCharsCountCore(src As *Byte, srcCount As Long) As Long 
     144        Dim dec = GetDecoder() 
     145        GetCharsCountCore = dec.GetCharsCount(src, srcCount, True) 
     146    End Function 
     147Public 
     148    /*! 
     149    @brief  復号する。 
     150    @param[in] src  入力 
     151    @param[in] srcCount srcの長さ 
     152    @param[out] dst 出力 
     153    @param[in] dstCount srcのバッファの大きさ 
     154    @return dstに書き込まれたバイト数 
     155    @date   2007/12/08 
     156    */ 
     157    Function GetChars(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long) As Long 
     158        If dst = 0 Then 
     159            Throw New ArgumentNullException("dst") 
     160        ElseIf src = 0 Then 
     161            Throw New ArgumentNullException("src") 
     162        ElseIf dstCount < 0 Then 
     163            Throw New ArgumentOutOfRangeException("dstCount") 
     164        ElseIf srcCount < 0 Then 
     165            Throw New ArgumentOutOfRangeException("srcCount") 
     166        End If 
     167 
     168        Return GetCharsCore(src, srcCount, dst, dstCount) 
     169    End Function 
     170 
     171Private 
     172    /*! 
     173    @brief  GetCharsの処理を行う。 
     174    @param[in] src  入力 
     175    @param[in] srcCount srcの長さ 
     176    @param[out] dst 出力 
     177    @param[in] dstCount dstのバッファの大きさ 
     178    @return dstに書き込まれたバイト数 
     179    @exception ArgumentException    バッファの大きさが足りない 
     180    @date   2007/12/08 
     181    */ 
     182    Function GetCharsCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long) As Long 
     183        GetCharsCore = GetDecoder().GetChars(src, srcCount, dst, dstCount, True) 
     184    End Function 
     185Public 
    141186#ifdef UNICODE 
    142187    /*! 
    143     @brief  符号化する 
    144     @param[in] s    入力 
    145     @param[in] index    sの開始位置 
    146     @param[in] count    符号化する文字の数 
    147     @param[out] bytes   出力 
    148     @param[in] byteCount    bytesのバッファの大きさ 
    149     @return bytesに書き込まれたバイト数 
    150     @date   2007/12/08 
    151     */ 
    152     Function GetBytes(s As String, index As Long, count As Long, bytes As *Byte, byteCount As Long) As Long 
    153         If ActiveBasic.IsNothing(s) Then 
    154             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "chars") 
    155         ElseIf bytes = 0 Then 
    156             Throw New ArgumentNullException("Encoding.GetBytes: An argument is null value.", "bytes") 
    157         ElseIf index < 0 Or index >= s.Length Then 
    158             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "index") 
    159         ElseIf count < 0 Or index + count >= s.Length Then 
    160             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "count") 
    161         ElseIf byteCount < 0 Then 
    162             Throw New ArgumentOutOfRangeException("Encoding.GetBytes: An argument is out of range value.", "byteCount") 
    163         End If 
    164         Dim p = StrPtr(s) 
    165         Return GetBytesCore(VarPtr(p[index]), count, bytes, byteCount) 
     188    @brief  復号し、Stringで結果を返す 
     189    @param[in] src  入力 
     190    @param[in] srcCount srcの長さ 
     191    @return 変換結果の文字列 
     192    @date   2007/12/08 
     193    */ 
     194    Function GetString(src As *Byte, srcCount As Long) As String 
     195        If src = 0 Then 
     196            Throw New ArgumentNullException("src") 
     197        ElseIf srcCount < 0 Then 
     198            Throw New ArgumentOutOfRangeException("srcCount") 
     199        End If 
     200        GetString = getStringCore(src, srcCount) 
     201    End Function 
     202 
     203Private 
     204    Function getStringCore(src As *Byte, srcCount As Long) As String 
     205        Dim sb = New StringBuilder 
     206        Dim bufCount = GetMaxCharCount(srcCount) 
     207        sb.Length = bufCount 
     208        Dim len = GetCharsCore(src, srcCount, StrPtr(sb), bufCount) 
     209        sb.Length = len 
     210        getStringCore = sb.ToString() 
    166211    End Function 
    167212#endif 
    168 Protected 
    169     /*! 
    170     @brief  GetBytesの処理を行う。 
    171     @param[in] chars    入力 
    172     @param[in] charCount    charsの長さ 
    173     @param[out] bytes   出力 
    174     @param[in] byteCount    bytesのバッファの大きさ 
    175     @return bytesに書き込まれたバイト数 
    176     @exception ArgumentException    バッファの大きさが足りない 
    177     @exception EncoderFallbackException フォールバックが発生した 
    178     @date   2007/12/08 
    179     */ 
    180     Abstract Function GetBytesCore(chars As *WCHAR, charCount As Long, bytes As *Byte, byteCount As Long) As Long 
    181  
    182 Public 
    183     /*! 
    184     @brief  復号して得られる文字列の長さを計算する。 
    185     @param[in] s    対象文字列 
    186     @param[in] n    sの長さ 
    187     @return 復号して得られる文字列の長さ 
    188     @date   2007/12/08 
    189     */ 
    190     Function GetCharsCount(s As *Byte, n As Long) As Long 
    191         If s = 0 Then 
    192             Throw New ArgumentNullException("Encoding.GetCharsCount: An argument is null value.", "s") 
    193         ElseIf n < 0 Then 
    194             Throw New ArgumentOutOfRangeException("Encoding.GetCharsCount: An argument is out of range value.", "n") 
    195         End If 
    196         Return GetCharsCountCore(s, n) 
    197     End Function 
    198     /*! 
    199     @brief  復号して得られる文字列の長さを計算する。 
    200     @param[in] s    対象文字列 
    201     @param[in] index    開始位置 
    202     @param[in] count    符号化する文字の数 
    203     @return 符号化して得られる文字列の長さ 
    204     @date   2007/12/08 
    205     */ 
    206     Function GetCharsCount(s As *Byte, index As Long, count As Long) As Long 
    207         If s = 0 Then 
    208             Throw New ArgumentNullException("Encoding.GetCharsCount: An argument is null value.", "s") 
    209         ElseIf index < 0 Then 
    210             Throw New ArgumentOutOfRangeException("Encoding.GetCharsCount: An argument is out of range value.", "index") 
    211         ElseIf count < 0 Then 
    212             Throw New ArgumentOutOfRangeException("Encoding.GetCharsCount: An argument is out of range value.", "count") 
    213         End If 
    214         Return GetCharsCountCore(VarPtr(s[index]), count) 
    215     End Function 
    216 Protected 
    217     /*! 
    218     @brief  GetCharsCountの処理を行う。 
    219     @param[in] s    対象文字列 
    220     @param[in] n    sの長さ 
    221     @return 符号化して得られる文字列の長さ 
    222     @date   2007/12/08 
    223     */ 
    224     Abstract Function GetCharsCountCore(s As *Byte, n As Long) As Long 
    225     /*! 
    226     */ 
    227 Public 
    228     /*! 
    229     @brief  復号する。 
    230     @param[in] bytes    入力 
    231     @param[in] byteCount    charsの長さ 
    232     @param[out] chars   出力 
    233     @param[in] charCount    bytesのバッファの大きさ 
    234     @return bytesに書き込まれたバイト数 
    235     @date   2007/12/08 
    236     */ 
    237     Function GetChars(bytes As *Byte, byteCount As Long, chars As *WCHAR, charCount As Long) As Long 
    238         If chars = 0 Then 
    239             Throw New ArgumentNullException("Encoding.GetChars: An argument is null value.", "chars") 
    240         ElseIf bytes = 0 Then 
    241             Throw New ArgumentNullException("Encoding.GetChars: An argument is null value.", "bytes") 
    242         ElseIf charCount < 0 Then 
    243             Throw New ArgumentOutOfRangeException("Encoding.GetChars: An argument is out of range value.", "charCount") 
    244         ElseIf byteCount < 0 Then 
    245             Throw New ArgumentOutOfRangeException("Encoding.GetChars: An argument is out of range value.", "byteCount") 
    246         End If 
    247  
    248         Return GetCharsCore(bytes, byteCount, chars, charCount) 
    249     End Function 
    250     /*! 
    251     @brief  復号する。 
    252     @param[in] bytes    入力 
    253     @param[in] index    charsの開始位置 
    254     @param[in] count    符号化する文字の数 
    255     @param[out] chars   出力 
    256     @param[in] charCount    bytesのバッファの大きさ 
    257     @return bytesに書き込まれたバイト数 
    258     @date   2007/12/08 
    259     */ 
    260     Function GetChars(bytes As *Byte, index As Long, count As Long, chars As *WCHAR, charCount As Long) As Long 
    261         If chars = 0 Then 
    262             Throw New ArgumentNullException("Encoding.GetChars: An argument is null value.", "chars") 
    263         ElseIf bytes = 0 Then 
    264             Throw New ArgumentNullException("Encoding.GetChars: An argument is null value.", "bytes") 
    265         ElseIf index < 0 Then 
    266             Throw New ArgumentOutOfRangeException("Encoding.GetChars: An argument is out of range value.", "index") 
    267         ElseIf count < 0 Then 
    268             Throw New ArgumentOutOfRangeException("Encoding.GetChars: An argument is out of range value.", "count") 
    269         ElseIf charCount < 0 Then 
    270             Throw New ArgumentOutOfRangeException("Encoding.GetChars: An argument is out of range value.", "byteCount") 
    271         End If 
    272  
    273         Return GetCharsCore(VarPtr(bytes[index]), count, chars, charCount) 
    274     End Function 
    275 Protected 
    276     /*! 
    277     @brief  GetCharsの処理を行う。 
    278     @param[in] bytes    入力 
    279     @param[in] byteCount    charsの長さ 
    280     @param[out] chars   出力 
    281     @param[in] charCount    bytesのバッファの大きさ 
    282     @return bytesに書き込まれたバイト数 
    283     @exception ArgumentException    バッファの大きさが足りない 
    284     @exception EncoderFallbackException フォールバックが発生した 
    285     @date   2007/12/08 
    286     */ 
    287     Abstract Function GetCharsCore(bytes As *Byte, byteCount As Long, chars As *WCHAR, charCount As Long) As Long 
    288 Public 
    289 #ifdef UNICODE 
    290     /*! 
    291     @brief  復号し、Stringで結果を返す。 
    292     @param[in] bytes    入力 
    293     @param[in] byteCount    charsの長さ 
    294     @return 変換結果の文字列 
    295     @date   2007/12/08 
    296     */ 
    297     Function GetString(bytes As *Byte, byteCount As Long) As String 
    298         If bytes = 0 Then 
    299             Throw New ArgumentNullException("Encoding.GetString: An argument is null value.", "bytes") 
    300         ElseIf byteCount < 0 Then 
    301             Throw New ArgumentOutOfRangeException("Encoding.GetString: An argument is out of range value.", "byteCount") 
    302         End If 
    303         Return getStringCore(bytes, byteCount) 
    304     End Function 
    305     /*! 
    306     @brief  復号し、Stringで結果を返す。 
    307     @param[in] bytes    入力 
    308     @param[in] index    charsの開始位置 
    309     @param[in] count    符号化する文字の数 
    310     @return 変換結果の文字列 
    311     @date   2007/12/08 
    312     */ 
    313     Function GetString(bytes As *Byte, index As Long, count As Long) As String 
    314         If bytes = 0 Then 
    315             Throw New ArgumentNullException("Encoding.GetString: An argument is null value.", "bytes") 
    316         ElseIf index < 0 Then 
    317             Throw New ArgumentOutOfRangeException("Encoding.GetString: An argument is out of range value.", "index") 
    318         ElseIf count < 0 Then 
    319             Throw New ArgumentOutOfRangeException("Encoding.GetString: An argument is out of range value.", "count") 
    320         End If 
    321         Return getStringCore(VarPtr(bytes[index]), count) 
    322     End Function 
    323 Private 
    324  
    325     Function getStringCore(bytes As *Byte, byteCount As Long) As String 
    326         Dim sb = New StringBuilder 
    327         Dim bufSize = GetMaxCharCount(byteCount) 
    328         sb.Length = bufSize 
    329         Dim len = GetCharsCore(bytes, byteCount, StrPtr(sb), bufSize) 
    330         sb.Length = len 
    331         getStringCore = sb.ToString 
    332     End Function 
    333 #endif 
    334213 
    335214Public 
     
    347226    @brief  ある長さの文字列を符号化して得られるバイト列の最大の長さを返す。 
    348227    */ 
    349     Abstract Function GetMaxByteCount(charCount As Long) As Long 
     228    Abstract Function GetMaxByteCount(srcCount As Long) As Long 
    350229 
    351230    /*! 
    352231    @brief  ある長さのバイト列を復号して得られる文字列の最大の長さを返す。 
    353232    */ 
    354     Abstract Function GetMaxCharCount(charCount As Long) As Long 
     233    Abstract Function GetMaxCharCount(srcCount As Long) As Long 
    355234 
    356235    /*! 
    357236    @brief  符号化された文字列の先頭につける識別文字列の取得 
    358     ようするにUTFのBOM 
     237    ようするにUTFのBOM 
    359238    */ 
    360239    Virtual Function GetPreamble() As *Byte 
     
    369248    End Function 
    370249 
    371     /*! 
    372     @brief  正規化されるかどうか。 
    373     */ 
    374     Abstract Function IsAlwaysNormalized() As Boolean 
    375  
    376     /*! 
    377     @brief  指定された方式で正規化されるかどうか。 
    378     */ 
    379     Abstract Function IsAlwaysNormalized(form As NormalizationForm) As Boolean 
    380  
    381     Abstract Function BodyName() As String 
    382     Abstract Function HeaderName() As String 
     250'   Abstract Function BodyName() As String 
     251'   Abstract Function HeaderName() As String 
    383252 
    384253    /*! 
     
    391260'   Abstract Function WindowsCodePage() As Long 
    392261 
    393     Function DecoderFallback() As DecoderFallback 
    394         Return decoderFallback 
    395     End Function 
    396  
    397     Sub DecoderFallback(f As DecoderFallback) 
    398         If ActiveBasic.IsNothing(f) Then 
    399             Throw New ArgumentNullException("f") 
    400         End If 
    401         decoderFallback = f 
    402     End Sub 
    403  
    404     Function EncoderFallback() As EncoderFallback 
    405         Return encoderFallback 
    406     End Function 
    407  
    408     Sub EncoderFallback(f As EncoderFallback) 
    409         If ActiveBasic.IsNothing(f) Then 
    410             Throw New ArgumentNullException("f") 
    411         End If 
    412         encoderFallback = f 
    413     End Sub 
    414  
    415 Private 
    416     decoderFallback As DecoderFallback 
    417     encoderFallback As EncoderFallback 
    418262Public 
    419263    /*! 
    420264    @brief  この符号化形式の名前の取得。 
    421265    */ 
    422     Abstract Function EncodingName() As String 
     266'   Abstract Function EncodingName() As String 
    423267 
    424268    /*! 
    425269    @brief  この符号化形式のIANA登録名の取得。 
    426270    */ 
    427     Abstract Function WebName() As String 
     271'   Abstract Function WebName() As String 
    428272 
    429273'   Abstract Function IsBrowserDisplay() As Boolean 
     
    432276'   Abstract Function IsMailNewsSave() As Boolean 
    433277 
    434 '   Abstract Function IsReadOnly() Boolean 
    435  
    436278    /*! 
    437279    @brief  この符号化形式が、1バイト文字だけを使う(複数バイト文字を使わない)かどうか。 
    438280    */ 
    439     Abstract Function IsSingleByte() As Boolean 
     281'   Abstract Function IsSingleByte() As Boolean 
    440282 
    441283    'GetPreamble 
     
    450292    @exception ArgumentNullException    srcEncoding, dstEncoding, bytesの少なくとも1つ以上がNothing/NULLのとき。 
    451293    @exception ArgumentOutOfRangeException  sizeが明らかに範囲外(負の値など)のとき。 
    452     @exception DecoderFallbackException 
    453     @exception EncoderFallbackException 
    454     */ 
    455     Static Function Convert(srcEncoding As Encoding, dstEncoding As Encoding, bytes As *Byte, size As Long) As *Byte 
    456     End Function 
     294    */ 
     295'   Static Function Convert(srcEncoding As Encoding, dstEncoding As Encoding, bytes As *Byte, size As Long) As *Byte 
     296'   End Function 
    457297     
    458     Static Function Convert(srcEncoding As Encoding, dstEncoding As Encoding, bytes As *Byte, index As Long, count As Long) As *Byte 
    459     End Function 
     298'   Static Function Convert(srcEncoding As Encoding, dstEncoding As Encoding, bytes As *Byte, index As Long, count As Long) As *Byte 
     299'   End Function 
    460300 
    461301    /*! 
    462302    @brief  指定したコードページ用のEncodingインスタンスの取得。 
    463303    */ 
    464     Static Function GetEncoding(codepage As Long) As Encoding 
    465     End Function 
    466 '   Static Function GetEncoding(codepage As Long, encoderFallback As EncoderFallback, decoderFallback As DecoderFallback) As Encoding 
     304'   Static Function GetEncoding(codepage As Long) As Encoding 
    467305'   End Function 
    468306    /*! 
    469307    @brief  指定した符号化形式名用のEncodingインスタンスの取得。 
    470308    */ 
    471     Static Function GetEncoding(name As String) As Encoding 
    472     End Function 
    473 '   Static Function GetEncoding(name As String, encoderFallback As EncoderFallback, decoderFallback As DecoderFallback) As Encoding 
     309'   Static Function GetEncoding(name As String) As Encoding 
    474310'   End Function 
    475  
    476     /*! 
    477     @brief  システム既定のANSIコードページ用のEncodingインスタンスの取得。 
     311    /*! 
     312    @brief  システムで標準のANSIコードページ用のEncodingインスタンスの取得。 
    478313    */ 
    479314    Static Function Default() As Encoding 
    480315    End Function 
    481316    /*! 
    482     @brief  UTF-7用のEncodingインスタンスの取得。 
    483     */ 
    484     Static Function UTF7() As Encoding 
    485     End Function 
    486     /*! 
    487317    @brief  UTF-8用のEncodingインスタンスの取得。 
    488318    */ 
     
    498328    */ 
    499329    Static Function UTF16BE() As Encoding 
    500     End Function 
    501     /*! 
    502     @brief  UTF-32LE用のEncodingインスタンスの取得。 
    503     */ 
    504     Static Function UTF32() As Encoding 
    505330    End Function 
    506331End Class 
     
    515340    /*! 
    516341    @brief  変換する 
    517     @param[in] bytes    入力 
    518     @param[in] byteIndex 入力開始位置 
    519     @param[in] byteCount 入力要素数 
    520     @param[out] chars   出力 
    521     @param[in] charIndex 出力開始位置 
    522     @param[in] charCount 出力要素数 
     342    @param[in] src  入力 
     343    @param[in] srcCount 入力要素数 
     344    @param[out] dst 出力 
     345    @param[in] dstCount 出力要素数 
    523346    @param[in] flush    終了後に内部状態を初期化するかどうか 
    524     @param[out] charsUsed   使用された入力の要素数 
    525     @param[out] bytesUsed   出力の内、実際に書き込まれた要素数 
     347    @param[out] srcUsed 使用された入力の要素数 
     348    @param[out] dstUsed 出力の内、実際に書き込まれた要素数 
    526349    @param[out] completed   入力の全ての文字が変換に使われたかどうか 
    527350    */ 
    528     Sub Convert(bytes As *Byte, byteIndex As Long, byteCount As Long, 
    529         chars As *WCHAR, charIndex As Long, charCount As Long, flush As Boolean, 
    530         ByRef bytesUsed As Long, ByRef charsUsed As Long, ByRef completed As Boolean) 
    531  
    532         If bytes = 0 Then 
    533             Throw New ArgumentNullException("bytes") 
    534         ElseIf byteIndex < 0 Then 
    535             Throw New ArgumentOutOfRangeException("byteIndex") 
    536         ElseIf byteCount < 0 Then 
    537             Throw New ArgumentOutOfRangeException("byteCount") 
    538         ElseIf chars = 0 Then 
    539             Throw New ArgumentNullException("chars") 
    540         ElseIf charIndex < 0 Then 
    541             Throw New ArgumentOutOfRangeException("charIndex") 
    542         ElseIf charCount < 0 Then 
    543             Throw New ArgumentOutOfRangeException("charCount") 
    544         End If 
    545         ConvertCore(VarPtr(bytes[byteIndex]), byteCount, VarPtr(chars[charIndex]), charCount, flush, bytesUsed, charsUsed, completed) 
    546     End Sub 
    547  
    548     /*! 
    549     @overload Sub Convert(bytes As *Byte, byteIndex As Long, byteCount As Long, 
    550         chars As *WCHAR, charIndex As Long, charCount As Long, flush As Boolean, 
    551         ByRef bytesUsed As Long, ByRef charsUsed As Long, ByRef completed As Boolean) 
    552     */ 
    553     Sub Convert(bytes As *Byte, byteCount As Long, 
    554         chars As *WCHAR, charCount As Long, flush As Boolean, 
    555         ByRef bytesUsed As Long, ByRef charsUsed As Long, ByRef completed As Boolean) 
    556  
    557         If bytes = 0 Then 
    558             Throw New ArgumentNullException("bytes") 
    559         ElseIf byteCount < 0 Then 
    560             Throw New ArgumentOutOfRangeException("byteCount") 
    561         ElseIf chars = 0 Then 
    562             Throw New ArgumentNullException("chars") 
    563         ElseIf charCount < 0 Then 
    564             Throw New ArgumentOutOfRangeException("charCount") 
    565         End If 
    566         ConvertCore(bytes, byteCount, chars, charCount, flush, bytesUsed, charsUsed, completed) 
     351    Sub Convert(src As *Byte, srcCount As Long, 
     352        dst As *WCHAR, dstCount As Long, flush As Boolean, 
     353        ByRef srcUsed As Long, ByRef dstUsed As Long, ByRef completed As Boolean) 
     354 
     355        If src = 0 Then 
     356            Throw New ArgumentNullException("src") 
     357        ElseIf srcCount < 0 Then 
     358            Throw New ArgumentOutOfRangeException("srcCount") 
     359        ElseIf dst = 0 Then 
     360            Throw New ArgumentNullException("dst") 
     361        ElseIf dstCount < 0 Then 
     362            Throw New ArgumentOutOfRangeException("dstCount") 
     363        End If 
     364        ConvertCore(src, srcCount, dst, dstCount, flush, srcUsed, dstUsed, completed) 
    567365    End Sub 
    568366 
    569367    /*! 
    570368    @brief  変換する 
    571     @param[in] bytes    入力 
    572     @param[in] byteIndex 入力開始位置 
    573     @param[in] byteCount 入力要素数 
    574     @param[out] chars   出力 
    575     @param[in] charIndex 出力開始位置 
    576     @param[in] charCount 出力要素数 
     369    @param[in] src  入力 
     370    @param[in] srcCount 入力要素数 
     371    @param[out] dst 出力 
     372    @param[in] dstCount 出力要素数 
    577373    @param[in] flush    終了後に内部状態を初期化するかどうか 
    578     @return 出力の内、実際に書き込まれた要素数 
    579     */ 
    580     Function GetChars(bytes As *Byte, byteIndex As Long, byteCount As Long, chars As *WCHAR, charIndex As Long, charCount As Long, flush As Boolean) As Long 
    581         Dim bytesUsed As Long 
     374    @return 出力の内、実際に書き込まれた要素数 
     375    */ 
     376    Function GetChars(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long, flush As Boolean) As Long 
     377        Dim srcUsed As Long 
    582378        Dim completed As Boolean 
    583         Convert(bytes, byteIndex, byteCount, chars, charIndex, charCount, flush, bytesUsed, GetChars, completed) 
    584     End Function 
    585  
    586     /*! 
    587     @overload Function GetChars(bytes As *Byte, byteIndex As Long, byteCount As Long, chars As *WCHAR, charIndex As Long, charCount As Long, flush As Boolean) As Long 
    588     */ 
    589     Function GetChars(bytes As *Byte, byteCount As Long, chars As *WCHAR, charCount As Long, flush As Boolean) As Long 
    590         Dim bytesUsed As Long 
    591         Dim completed As Boolean 
    592         Convert(bytes, byteCount, chars, charCount, flush, bytesUsed, GetChars, completed) 
    593     End Function 
    594  
    595     /*! 
    596     @overload Function GetChars(bytes As *Byte, byteIndex As Long, byteCount As Long, chars As *WCHAR, charIndex As Long, charCount As Long, flush As Boolean) As Long 
    597     */ 
    598     Function GetChars(bytes As *Byte, byteIndex As Long, byteCount As Long, chars As *WCHAR, charIndex As Long, charCount As Long) As Long 
    599         GetChars = GetChars(bytes, byteIndex, byteCount, chars, charIndex, charCount, False) 
    600     End Function 
    601  
    602     /*! 
    603     @brief  フォールバックの取得 
    604     */ 
    605     Function Fallback() As DecoderFallback 
    606         Return fallback 
    607     End Function 
    608  
    609     /*! 
    610     @brief  フォールバックの設定 
    611     */ 
    612     Sub Fallback(newFallback As DecoderFallback) 
    613         If ActiveBasic.IsNothing(newFallback) Then 
    614             Throw New ArgumentNullException("newFallback") 
    615         End If 
    616         fallback = newFallback 
    617     End Sub 
     379        Convert(src, srcCount, dst, dstCount, flush, srcUsed, GetChars, completed) 
     380        If srcUsed < srcCount Then 
     381            Throw New ArgumentException("src", "buffer is too small") 
     382        End If 
     383    End Function 
     384 
     385    /*! 
     386    @brief  変換すると何文字になるか数える 
     387    @param[in] src  入力 
     388    @param[in] srcCount 入力要素数 
     389    @param[in] flush    終了後に内部状態を初期化するとして計算するかどうか 
     390    @return 必要な文字数 
     391    */ 
     392    Function GetCharsCount(src As *Byte, srcCount As Long, flush As Boolean) As Long 
     393        If src = 0 Then 
     394            Throw New ArgumentNullException("src") 
     395        ElseIf srcCount < 0 Then 
     396            Throw New ArgumentOutOfRangeException("srcCount") 
     397        End If 
     398        GetCharsCountCore(src, srcCount, flush) 
     399    End Function 
     400 
     401    /*! 
     402    @brief  内部状態を初期状態に戻す 
     403    */ 
     404    Virtual Sub Reset() 
     405    End Sub 
     406 
    618407Protected 
    619408    /*! 
    620     @brief  実際に変換するメソッド 
    621     @param[in] bytes    入力 
    622     @param[in] byteCount 入力要素数 
    623     @param[out] chars   出力 
    624     @param[in] charCount 出力要素数 
     409    @brief  実際に変換する 
     410    @param[in] src  入力 
     411    @param[in] srcCount 入力要素数 
     412    @param[out] dst 出力 
     413    @param[in] dstCount 出力要素数 
    625414    @param[in] flush    終了後に内部状態を初期化するかどうか 
    626     @param[out] charsUsed   使用された入力の要素数 
    627     @param[out] bytesUsed   出力の内、実際に書き込まれた要素数 
     415    @param[out] dstUsed 使用された入力の要素数 
     416    @param[out] srcUsed 出力の内、実際に書き込まれた要素数 
    628417    @param[out] completed   入力の全ての文字が変換に使われたかどうか 
    629418    */ 
    630     Abstract Sub ConvertCore(bytes As *Byte, byteCount As Long, chars As *WCHAR, charCount As Long, flush As Boolean, 
    631         ByRef bytesUsed As Long, ByRef charsUsed As Long, ByRef completed As Boolean) 
    632  
    633 Private 
    634     fallback As DecoderFallback 
     419    Abstract Sub ConvertCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long, flush As Boolean, 
     420        ByRef srcUsed As Long, ByRef dstUsed As Long, ByRef completed As Boolean) 
     421 
     422    /*! 
     423    @brief  変換すると何文字になるか数える 
     424    @param[in] src  入力 
     425    @param[in] srcCount 入力要素数 
     426    @param[in] flush    終了後に内部状態を初期化するとして計算するかどうか 
     427    @return 必要な文字数 
     428    */ 
     429    Abstract Function GetCharsCountCore(src As *Byte, srcCount As Long, flush As Boolean) As Long 
    635430End Class 
    636431 
     
    644439    /*! 
    645440    @brief  変換する 
    646     @param[in] chars    入力 
    647     @param[in] charIndex 入力開始位置 
    648     @param[in] charCount 入力要素数 
    649     @param[out] bytes   出力 
    650     @param[in] byteIndex 出力開始位置 
    651     @param[in] byteCount 出力要素数 
     441    @param[in] src  入力 
     442    @param[in] srcCount 入力要素数 
     443    @param[out] dst 出力 
     444    @param[in] dstCount 出力要素数 
    652445    @param[in] flush    終了後に内部状態を初期化するかどうか 
    653     @param[out] charsUsed   使用された入力の要素数 
    654     @param[out] bytesUsed   出力の内、実際に書き込まれた要素数 
     446    @param[out] srcUsed 使用された入力の要素数 
     447    @param[out] dstUsed 出力の内、実際に書き込まれた要素数 
    655448    @param[out] completed   入力の全ての文字が変換に使われたかどうか 
    656449    */ 
    657     Sub Convert(chars As *WCHAR, charIndex As Long, charCount As Long, 
    658         bytes As *Byte, byteIndex As Long, byteCount As Long, flush As Boolean, 
    659         ByRef charsUsed As Long, ByRef bytesUsed As Long, ByRef completed As Boolean) 
    660  
    661         If chars = 0 Then 
    662             Throw New ArgumentNullException("chars") 
    663         ElseIf charIndex < 0 Then 
    664             Throw New ArgumentOutOfRangeException("charIndex") 
    665         ElseIf charCount < 0 Then 
    666             Throw New ArgumentOutOfRangeException("charCount") 
    667         ElseIf bytes = 0 Then 
    668             Throw New ArgumentNullException("bytes") 
    669         ElseIf byteIndex < 0 Then 
    670             Throw New ArgumentOutOfRangeException("byteIndex") 
    671         ElseIf byteCount < 0 Then 
    672             Throw New ArgumentOutOfRangeException("byteCount") 
    673         End If 
    674         ConvertCore(VarPtr(chars[charIndex]), charCount, VarPtr(bytes[byteIndex]), byteCount, flush, charsUsed, bytesUsed, completed) 
    675     End Sub 
    676  
    677     /*! 
    678     @overload Sub Convert(chars As *WCHAR, charIndex As Long, charCount As Long, 
    679         bytes As *Byte, byteIndex As Long, byteCount As Long, flush As Boolean, 
    680         ByRef charsUsed As Long, ByRef bytesUsed As Long, ByRef completed As Boolean) 
    681     */ 
    682     Sub Convert(chars As *WCHAR, charCount As Long, 
    683         bytes As *Byte, byteCount As Long, flush As Boolean, 
    684         ByRef charsUsed As Long, ByRef bytesUsed As Long, ByRef completed As Boolean) 
    685  
    686         If chars = 0 Then 
    687             Throw New ArgumentNullException("chars") 
    688         ElseIf charCount < 0 Then 
    689             Throw New ArgumentOutOfRangeException("charCount") 
    690         ElseIf bytes = 0 Then 
    691             Throw New ArgumentNullException("bytes") 
    692         ElseIf byteCount < 0 Then 
    693             Throw New ArgumentOutOfRangeException("byteCount") 
    694         End If 
    695         ConvertCore(chars, charCount, bytes, byteCount, flush, charsUsed, bytesUsed, completed) 
     450    Sub Convert(src As *WCHAR, srcCount As Long, 
     451        dst As *Byte, dstCount As Long, flush As Boolean, 
     452        ByRef srcUsed As Long, ByRef dstUsed As Long, ByRef completed As Boolean) 
     453 
     454        If src = 0 Then 
     455            Throw New ArgumentNullException("src") 
     456        ElseIf srcCount < 0 Then 
     457            Throw New ArgumentOutOfRangeException("srcCount") 
     458        ElseIf dst = 0 Then 
     459            Throw New ArgumentNullException("dst") 
     460        ElseIf dstCount < 0 Then 
     461            Throw New ArgumentOutOfRangeException("dstCount") 
     462        End If 
     463        ConvertCore(src, srcCount, dst, dstCount, flush, srcUsed, dstUsed, completed) 
    696464    End Sub 
    697465 
    698466    /*! 
    699467    @brief  変換する 
    700     @param[in] chars    入力 
    701     @param[in] charIndex 入力開始位置 
    702     @param[in] charCount 入力要素数 
    703     @param[out] bytes   出力 
    704     @param[in] byteIndex 出力開始位置 
    705     @param[in] byteCount 出力要素数 
     468    @param[in] src  入力 
     469    @param[in] srcCount 入力要素数 
     470    @param[out] dst 出力 
     471    @param[in] dstCount 出力要素数 
    706472    @param[in] flush    終了後に内部状態を初期化するかどうか 
    707     @return bytesUsed   出力の内、実際に書き込まれた要素数 
    708     */ 
    709     Function GetBytes(chars As *WCHAR, charIndex As Long, charCount As Long, bytes As *Byte, byteIndex As Long, byteCount As Long, flush As Boolean) As Long 
    710         Dim charsUsed As Long 
     473    @return 出力の内、実際に書き込まれた要素数 
     474    */ 
     475    Function GetBytes(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long, flush As Boolean) As Long 
     476        Dim srcUsed As Long 
    711477        Dim completed As Boolean 
    712         Convert(chars, charIndex, charCount, bytes, byteIndex, byteCount, flush, charsUsed, GetBytes, completed) 
    713     End Function 
    714  
    715     /*! 
    716     @overload Function GetBytes(chars As *WCHAR, charIndex As Long, charCount As Long, bytes As *Byte, byteIndex As Long, byteCount As Long, flush As Boolean) As Long 
    717     */ 
    718     Function GetBytes(chars As *WCHAR, charCount As Long, bytes As *Byte, byteCount As Long, flush As Boolean) As Long 
    719         Dim charsUsed As Long 
    720         Dim completed As Boolean 
    721         Convert(chars, charCount, bytes, byteCount, flush, charsUsed, GetBytes, completed) 
    722     End Function 
    723  
    724     /*! 
    725     @overload Function GetBytes(chars As *WCHAR, charIndex As Long, charCount As Long, bytes As *Byte, byteIndex As Long, byteCount As Long, flush As Boolean) As Long 
    726     */ 
    727     Function GetBytes(chars As *WCHAR, charIndex As Long, charCount As Long, bytes As *Byte, byteIndex As Long, byteCount As Long) As Long 
    728         GetBytes = GetBytes(chars, charIndex, charCount, bytes, byteIndex, byteCount, False) 
    729     End Function 
    730  
    731     /*! 
    732     @brief  フォールバックの取得 
    733     */ 
    734     Function Fallback() As EncoderFallback 
    735         Return fallback 
    736     End Function 
    737  
    738     /*! 
    739     @brief  フォールバックの設定 
    740     */ 
    741     Sub Fallback(newFallback As EncoderFallback) 
    742         If ActiveBasic.IsNothing(newFallback) Then 
    743             Throw New ArgumentNullException("newFallback") 
    744         End If 
    745         fallback = newFallback 
    746     End Sub 
     478        Convert(src, srcCount, dst, dstCount, flush, srcUsed, GetBytes, completed) 
     479        If srcUsed < srcCount Then 
     480            Throw New ArgumentException("src", "buffer is too small") 
     481        End If 
     482    End Function 
     483 
     484    /*! 
     485    @brief  変換すると何文字になるか数える 
     486    @param[in] src  入力 
     487    @param[in] srcCount 入力要素数 
     488    @param[in] flush    終了後に内部状態を初期化するとして計算するかどうか 
     489    @return 必要な文字数 
     490    */ 
     491    Function GetBytesCount(src As *WCHAR, srcCount As Long, flush As Boolean) As Long 
     492        If src = 0 Then 
     493            Throw New ArgumentNullException("src") 
     494        ElseIf srcCount < 0 Then 
     495            Throw New ArgumentOutOfRangeException("srcCount") 
     496        End If 
     497        GetBytesCountCore(src, srcCount, flush) 
     498    End Function 
     499 
     500    /*! 
     501    @brief  内部状態を初期状態に戻す 
     502    */ 
     503    Virtual Sub Reset() 
     504    End Sub 
     505 
    747506Protected 
    748507    /*! 
    749     @brief  実際に変換するメソッド 
    750     @param[in] chars    入力 
    751     @param[in] charCount 入力要素数 
    752     @param[out] bytes   出力 
    753     @param[in] byteCount 出力要素数 
     508    @brief  実際に変換する 
     509    @param[in] src  入力 
     510    @param[in] srcCount 入力要素数 
     511    @param[out] dst 出力 
     512    @param[in] dstCount 出力要素数 
    754513    @param[in] flush    終了後に内部状態を初期化するかどうか 
    755     @param[out] bytesUsed   使用された入力の要素数 
    756     @param[out] charsUsed   出力の内、実際に書き込まれた要素数 
     514    @param[out] dstUsed 使用された入力の要素数 
     515    @param[out] srcUsed 出力の内、実際に書き込まれた要素数 
    757516    @param[out] completed   入力の全ての文字が変換に使われたかどうか 
    758517    */ 
    759     Abstract Sub ConvertCore(chars As *WCHAR, charCount As Long, bytes As *Byte, byteCount As Long, flush As Boolean, 
    760         ByRef bytesUsed As Long, ByRef charsUsed As Long, ByRef completed As Boolean) 
    761  
    762 Private 
    763     fallback As EncoderFallback 
     518    Abstract Sub ConvertCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long, flush As Boolean, 
     519        ByRef dstUsed As Long, ByRef srcUsed As Long, ByRef completed As Boolean) 
     520 
     521    /*! 
     522    @brief  変換すると何文字になるか数える 
     523    @param[in] src  入力 
     524    @param[in] srcCount 入力要素数 
     525    @param[in] flush    終了後に内部状態を初期化するとして計算するかどうか 
     526    @return 必要な文字数 
     527    */ 
     528    Abstract Function GetBytesCountCore(src As *WCHAR, srcCount As Long, flush As Boolean) As Long 
    764529End Class 
    765530 
     
    771536End Enum 
    772537 
    773 Class EncoderFallback 
     538Namespace Detail 
     539 
     540/*! 
     541@brief WideCharToMultiByte/MultiByteToWideCharで変換を行うエンコーディング。 
     542DBCS/SBCS限定。UTF-8やUTF-7は非対応。 
     543*/ 
     544Class WindowsCodePageEncoding 
     545    Inherits Encoding 
     546Public 
     547    Sub WindowsCodePageEncoding(codepage As DWord) 
     548        cp = codepage 
     549    End Sub 
     550 
     551    /*! 
     552    @brief  符号器を取得する。 
     553    */ 
     554    Override Function GetDecoder() As Decoder 
     555        GetDecoder = New WindowsCodePageDecoder(cp) 
     556    End Function 
     557 
     558    /*! 
     559    @brief  復号器を取得する。 
     560    */ 
     561    Override Function GetEncoder() As Encoder 
     562        GetEncoder = New WindowsCodePageEncoder(cp) 
     563    End Function 
     564 
     565    Override Function GetHashCode() As Long 
     566        GetHashCode = cp As Long 
     567    End Function 
     568 
     569    Override Function Equals(x As Object) As Boolean 
     570        If GetType().Equals(x.GetType()) Then 
     571            Dim xe = x As WindowsCodePageEncoding 
     572            Equals = cp = xe.cp 
     573        Else 
     574            Equals = False 
     575        End If 
     576    End Function 
     577 
     578    /*! 
     579    @brief  ある長さの文字列を符号化して得られるバイト列の最大の長さを返す。 
     580    */ 
     581    Override Function GetMaxByteCount(srcCount As Long) As Long 
     582        GetMaxByteCount = srcCount * 2 
     583    End Function 
     584 
     585    /*! 
     586    @brief  ある長さのバイト列を復号して得られる文字列の最大の長さを返す。 
     587    */ 
     588    Override Function GetMaxCharCount(srcCount As Long) As Long 
     589        GetMaxCharCount = srcCount 
     590    End Function 
     591 
     592Private 
     593    cp As DWord 
    774594End Class 
     595 
     596Class WindowsCodePageEncoder 
     597    Inherits Encoder 
     598Public 
     599    Sub WindowsCodePageEncoder(codepage As DWord) 
     600        cp = codepage 
     601    End Sub 
     602 
     603    Override Sub Reset() 
     604        nextByte = 0 
     605    End Sub 
     606 
     607Protected 
     608    Override Sub ConvertCore(src As *WCHAR, srcCount As Long, dst As *Byte, dstCount As Long, flush As Boolean, 
     609        ByRef srcUsed As Long, ByRef dstUsed As Long, ByRef completed As Boolean) 
     610 
     611        Dim srcPos = 0 As Long 
     612        Dim dstPos = 0 As Long 
     613        If dstCount > 0 And nextByte <> 0 Then 
     614            dst[0] = nextByte 
     615            nextByte = 0 
     616            dstPos++ 
     617        End If 
     618        While srcPos < srcCount And dstPos < srcCount 
     619            Dim buf[1] As CHAR 
     620            Dim len = WideCharToMultiByte(cp, WC_COMPOSITECHECK Or WC_DEFAULTCHAR, VarPtr(src[srcPos]), 1, buf, Len(buf), 0, 0) 
     621            If len = 0 Then 
     622                ActiveBasic.Windows.ThrowWithLastError() 
     623            End If 
     624            dst[dstPos] = buf[0] As Byte 
     625            If len = 2 Then 
     626                If dstCount = 1 Then 
     627                    nextByte = buf[1] As Byte 
     628                    Exit While 
     629                End If 
     630                dstPos++ 
     631                dst[dstPos] = buf[1] As Byte 
     632                nextByte = 0 
     633            End If 
     634            srcPos++ 
     635            dstPos++ 
     636        Wend 
     637        srcUsed = srcPos 
     638        dstUsed = dstPos 
     639        completed = (srcPos = srcCount And dstPos = srcCount And nextByte = 0) 
     640    End Sub 
     641 
     642    Override Function GetBytesCountCore(src As *WCHAR, srcCount As Long, flush As Boolean) As Long 
     643    End Function 
     644 
     645Private 
     646    cp As DWord 
     647    nextByte As Byte 
     648End Class 
     649 
     650Class WindowsCodePageDecoder 
     651    Inherits Decoder 
     652Public 
     653    Sub WindowsCodePageDecoder(codepage As DWord) 
     654        cp = codepage 
     655    End Sub 
     656 
     657Protected 
     658    Override Sub ConvertCore(src As *Byte, srcCount As Long, dst As *WCHAR, dstCount As Long, flush As Boolean, 
     659        ByRef srcUsed As Long, ByRef dstUsed As Long, ByRef completed As Boolean) 
     660    End Sub 
     661 
     662    Override Function GetCharsCountCore(src As *Byte, srcCount As Long, flush As Boolean) As Long 
     663    End Function 
     664 
     665Private 
     666    cp As DWord 
     667End Class 
     668 
     669End Namespace 
    775670 
    776671End Namespace 'Text 
  • trunk/ab5.0/ablib/src/Classes/index.ab

    r646 r653  
    1010#require "./ActiveBasic/Windows/Registry.ab" 
    1111#require "./ActiveBasic/Windows/Windows.ab" 
    12 #require "./ActiveBasic/Windows/UI/WindowHandle.ab" 
     12'#require "./ActiveBasic/Windows/UI/WindowHandle.ab" 
    1313#require "./ActiveBasic/Windows/Version/Version.ab" 
    1414#require "./ActiveBasic/Xml/Parser.ab" 
     
    8383#require "./System/IO/TextWriter.ab" 
    8484#require "./System/IO/StreamReader.ab" 
     85#require "./System/IO/StreamWriter.ab" 
    8586#require "./System/IO/StringReader.ab" 
    86 #require "./System/IO/StreamWriter.ab" 
    87 #require "./System/IO/TextReader.ab" 
     87#require "./System/IO/StringWriter.ab" 
    8888#require "./System/Media/SystemSound.ab" 
    8989#require "./System/Media/SystemSounds.ab" 
     
    9393#require "./System/Text/StringBuilder.ab" 
    9494#require "./System/Text/Encoding.ab" 
    95 #require "./System/Text/UTF8Encoding.ab" 
    96 #require "./System/Text/DecoderFallback.ab" 
     95'#require "./System/Text/UTF8Encoding.ab" 
    9796#require "./System/Threading/AutoResetEvent.ab" 
    9897#require "./System/Threading/EventWaitHandle.ab" 
Note: See TracChangeset for help on using the changeset viewer.