Changeset 457
- Timestamp:
- Mar 6, 2008, 9:49:43 PM (17 years ago)
- Location:
- trunk
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
r400 r457 205 205 */ 206 206 Function FormatFloatF_Core(s As String, e As Long, negative As Boolean, precision As DWord, ByRef flags As FormatFlags) As System.Text.StringBuilder 207 FormatFloatF_Core = New System.Text.StringBuilder 207 FormatFloatF_Core = New System.Text.StringBuilder(128) 208 208 With FormatFloatF_Core 209 209 AppendSign(FormatFloatF_Core, negative, flags) … … 818 818 819 819 Dim sb = New System.Text.StringBuilder 820 If sb.Length = &hfeeefeee Then Debug821 820 With sb 822 821 Dim prefixFunc = tr.Prefix 823 822 Dim prefix = prefixFunc(x, flags) 824 823 sb.Append(prefix) 825 If sb.Length = &hfeeefeee Then Debug826 824 827 825 Dim prefixLen = 0 As DWord … … 830 828 End If 831 829 832 Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar 830 ' Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar 831 Dim buf[MaxSizeLO] As StrChar 833 832 Dim convertFunc = tr.Convert 834 833 Dim bufStartPos = convertFunc(buf, x, flags) 835 834 836 If sb.Length = &hfeeefeee Then Debug837 835 Dim len = (tr.MaxSize - bufStartPos) As Long 838 836 If len < 0 Then … … 844 842 845 843 .Append(buf, bufStartPos + 1, len) 846 If sb.Length = &hfeeefeee Then Debug847 844 848 845 AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen) 849 If sb.Length = &hfeeefeee Then Debug850 846 End With 851 847 FormatIntegerEx = sb.ToString() … … 855 851 End If 856 852 End Function 853 Sub FormatIntegerEx(sb As System.Text.StringBuilder, ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags) 854 855 If d = DWORD_MAX Then 856 d = 1 857 Else 858 '精度が指定されているとき、ゼロフラグは無視される。 859 '仕様上、左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。 860 flags And= Not Zero 861 End If 862 863 Dim lastLength = sb.Length 864 865 With sb 866 Dim prefixFunc = tr.Prefix 867 Dim prefix = prefixFunc(x, flags) 868 sb.Append(prefix) 869 870 Dim prefixLen = 0 As DWord 871 If String.IsNullOrEmpty(prefix) = False Then 872 prefixLen = prefix.Length As DWord 873 End If 874 875 ' Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar 876 Dim buf[MaxSizeLO] As StrChar 877 Dim convertFunc = tr.Convert 878 Dim bufStartPos = convertFunc(buf, x, flags) 879 880 Dim len = (tr.MaxSize - bufStartPos) As Long 881 If len < 0 Then 882 Debug 883 End If 884 If len < d Then 885 .Append(&h30 As StrChar, d - len) 886 End If 887 888 .Append(buf, bufStartPos + 1, len) 889 890 AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen, lastLength) 891 End With 892 Dim t = sb.ToString() 893 894 If (flags And Cap) = 0 Then 895 Dim len = sb.Length 896 Dim i As Long 897 For i = lastLength To ELM(len) 898 sb[i] = CType.ToLower(sb[i]) 899 Next 900 End If 901 End Sub 857 902 858 903 /*! … … 864 909 865 910 /*! 866 @brief 文字列をフィールド幅まで満たされるように空白などを挿入する。911 @brief 書式化の仕上げとして、変換部分がフィールド幅まで満たされるように空白などを挿入する。 867 912 @author Egtra 868 913 @date 2007/10/13 … … 872 917 @param[in] flags フラグ 873 918 @param[in] prefixLen (あれば)接頭辞の文字数。ゼロ埋めする際、この数だけ挿入位置を後ろにする。 919 @param[in] offset 変換した部分へのオフセット。AppendではなくInsertを行う際に用いられる。 874 920 sbが"-1"のように負符号を持っている場合は、呼出元でSignフラグ(またはBlank)を立てること。 875 921 */ 876 Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, flags As FormatFlags, prefixLen = 0 As DWord )922 Sub AdjustFieldWidth(sb As System.Text.StringBuilder, field As DWord, flags As FormatFlags, prefixLen = 0 As DWord, offset = 0 As Long) 877 923 With sb 878 If .Length < field Then 879 Dim embeddedSize = field - .Length 924 Dim len = .Length - offset 925 If len < field Then 926 Dim embeddedSize = field - len 880 927 If flags And LeftSide Then 881 928 .Append(&h20, embeddedSize) 882 929 Else 883 Dim insPos As Long884 930 If (flags And Zero) <> 0 Then 931 offset += prefixLen 885 932 If (flags And Blank) Or (flags And Sign) Then 886 insPos++933 offset++ 887 934 End If 888 insPos += prefixLen 889 .Insert(insPos, String$(embeddedSize, "0")) 935 .Insert(offset, String$(embeddedSize, "0")) 890 936 Else 891 .Insert( insPos, String$(embeddedSize, " "))937 .Insert(offset, String$(embeddedSize, " ")) 892 938 End If 893 939 End If … … 1005 1051 End If 1006 1052 1007 s.Append(FormatIntegerEx(ByVal traits, x, precision, field, flags)) 1053 ' s.Append(FormatIntegerEx(ByVal traits, x, precision, field, flags)) 1054 FormatIntegerEx(s, ByVal traits, x, precision, field, flags) 1008 1055 End Sub 1009 1056 … … 1028 1075 Do 1029 1076 Dim c = s[i] 1030 If Not IsDigit(c) Then Exit Do1077 If Not CType.IsDigit(c) Then Exit Do 1031 1078 StrToLong *= 10 1032 1079 StrToLong += ((c As DWord) And &h0f) As Long … … 1037 1084 End If 1038 1085 p = VarPtr(s[i]) 1039 End Function1040 1041 /*!1042 @brief 文字が十進数字かどうか調べる。1043 @author Egtra1044 @date 2007/11/111045 @param[in] c 調べる文字1046 @retval True 0から9の文字である1047 @retval False そうでない1048 */1049 Function IsDigit(c As StrChar) As Boolean1050 Dim dw = (c As DWord)1051 IsDigit = (dw - &h30) < 101052 1086 End Function 1053 1087 -
trunk/Include/Classes/ActiveBasic/Strings/Strings.ab
r391 r457 67 67 Return s1[i] As Long - s2[i] 68 68 End Function 69 70 71 69 72 70 Function ChrCmp(s1 As PCWSTR, s2 As PCWSTR, size As SIZE_T) As Long -
trunk/Include/Classes/System/IO/TextReader.ab
r432 r457 36 36 ElseIf count < 0 Then 37 37 End If 38 Read = ReadImpl(buffer, index, count) 38 39 End Function 39 40 … … 80 81 End Function 81 82 /* 83 @brief 現在位置からストリームの終わりまで読み込む。 82 84 @date 2008/02/26 83 85 @auther Egtra … … 93 95 sb.Append(ch As StrChar) 94 96 Loop 97 End Function 98 99 Static Function Synchronized(reader As TextReader) As TextReader 95 100 End Function 96 101 … … 118 123 End Class 119 124 125 Namespace Detail 126 127 Class SynchronizedTextReader 128 Inherits TextReader 129 Public 130 Sub SynchronizedTextReader(reader As TextReader) 131 cs = New ActiveBasic.Windows.CriticalSection 132 base = reader 133 End Sub 134 135 Override Function Peek() As Long 136 ' Using lock = cs.Lock 137 Peek = base.Peek 138 ' End Using 139 End Function 140 141 Override Function Read() As Long 142 ' Using lock = cs.Lock 143 Read = base.Read 144 ' End Using 145 End Function 146 147 Override Function ReadLine() As String 148 ' Using lock = cs.Lock 149 ReadLine = base.ReadLine 150 ' End Using 151 End Function 152 153 Override Function ReadToEnd() As String 154 ' Using lock = cs.Lock 155 ReadToEnd = base.ReadToEnd 156 ' End Using 157 End Function 158 159 Protected 160 Override Sub Dispose(disposing As Boolean) 161 Dim s = Nothing As Stream 162 SetPointer(VarPtr(s) As *VoidPtr, InterlockedExchangePointer(ByVal VarPtr(base) As *VoidPtr, 0)) 163 If disposing Then 164 If Not ActiveBasic.IsNothing(s) Then 165 s.Dispose() 166 End If 167 cs.Dispose() 168 End If 169 End Sub 170 171 Override Function ReadImpl(buffer As *StrChar, index As Long, count As Long) As Long 172 ' Using lock = cs.Lock 173 ReadImpl = base.ReadImpl(buffer, index, count) 174 ' End Using 175 End Function 176 Private 177 cs As ActiveBasic.Windows.CriticalSection 178 base As TextReader 179 End Class 180 181 End Namespace 182 120 183 End NameSpace 121 184 End NameSpace -
trunk/Include/Classes/System/Math.ab
r299 r457 127 127 128 128 Static Function Ceiling(x As Double) As Long 129 If Floor(x) = x then 130 Return x As Long 131 Else 132 Return Floor(x) + 1 129 Ceiling = Floor(x) 130 If Ceiling <> x Then 131 Ceiling++ 133 132 End If 134 133 End Function … … 145 144 146 145 Static Function Cosh(value As Double) As Double 147 Dim t As Double 148 t = Math.Exp(value) 146 Dim t = Math.Exp(value) 149 147 return (t + 1 / t) * 0.5 150 148 End Function … … 156 154 157 155 Static Function DivRem(x As Int64, y As Int64, ByRef ret As Int64) As Int64 158 ret = x - (x \ y) *y159 ret urn x \y156 DivRem = x \ y 157 ret = x - (DivRem) * y 160 158 End Function 161 159 … … 196 194 Return Int(value) 197 195 End Function 198 199 'GetHashCode200 201 'GetType202 196 203 197 Static Function IEEERemainder(x As Double, y As Double) As Double … … 513 507 514 508 Static Function Sqrt(x As Double) As Double 515 Dim s As Double, last As Double516 Dim i As *Word, j As Long, jj As Long, k As Long517 509 If x > 0 Then 518 510 If ActiveBasic.Math.IsInf(x) Then … … 520 512 Else 521 513 Sqrt = x 522 i = (VarPtr(Sqrt) + 6) As *Word523 jj = GetWord(i)524 j = jj >> 5525 k = jj And &h0000001f526 j = (j +511) << 4 + k514 Dim i = (VarPtr(Sqrt) + 6) As *Word 515 Dim jj = GetWord(i) As Long 516 Dim j = jj >> 5 As Long 517 Dim k = (jj And &h0000001f) As Long 518 j = (j + 511) << 4 + k 527 519 SetWord(i, j) 520 Dim last As Double 528 521 Do 529 522 last = Sqrt 530 Sqrt = (x / Sqrt + Sqrt) * 0.5523 Sqrt = (x / Sqrt + Sqrt) * 0.5 531 524 Loop While Sqrt <> last 532 525 End If -
trunk/Include/Classes/System/String.ab
r428 r457 27 27 28 28 Class String 29 ' Inherits IComparable, ICloneable, IConvertible, IEnumerable29 Implements /*IComparable, ICloneable, IConvertible, IComparable<String>, IEnumerable, IEnumerable<StrChar>, IEquatable<String>*/ 30 30 31 31 m_Length As Long … … 34 34 Sub validPointerCheck(p As VoidPtr, size = 1 As Long) 35 35 If p As ULONG_PTR < &h10000 Then 36 'Throw ArgumentException 37 Debug 36 Throw New ArgumentException 38 37 ElseIf IsBadReadPtr(p, size As ULONG_PTR) Then 39 'Throw ArgumentException 40 Debug 38 Throw New ArgumentException 41 39 End If 42 40 End Sub … … 153 151 154 152 Const Function Operator == (y As String) As Boolean 155 Return String.Compare(This, y) = 0153 Return Compare(This, y) = 0 156 154 End Function 157 155 158 156 Const Function Operator == (y As *StrChar) As Boolean 159 Return String.Compare(This, y) = 0157 Return Compare(This, y) = 0 160 158 End Function 161 159 162 160 Const Function Operator <> (y As String) As Boolean 163 Return String.Compare(This, y) <> 0161 Return Compare(This, y) <> 0 164 162 End Function 165 163 166 164 Const Function Operator <> (y As *StrChar) As Boolean 167 Return String.Compare(This, y) <> 0165 Return Compare(This, y) <> 0 168 166 End Function 169 167 170 168 Const Function Operator < (y As String) As Boolean 171 Return String.Compare(This, y) < 0169 Return Compare(This, y) < 0 172 170 End Function 173 171 174 172 Const Function Operator < (y As *StrChar) As Boolean 175 Return String.Compare(This, y) < 0173 Return Compare(This, y) < 0 176 174 End Function 177 175 178 176 Const Function Operator > (y As String) As Boolean 179 Return String.Compare(This, y) > 0177 Return Compare(This, y) > 0 180 178 End Function 181 179 182 180 Const Function Operator > (y As *StrChar) As Boolean 183 Return String.Compare(This, y) > 0181 Return Compare(This, y) > 0 184 182 End Function 185 183 186 184 Const Function Operator <= (y As String) As Boolean 187 Return String.Compare(This, y) <= 0185 Return Compare(This, y) <= 0 188 186 End Function 189 187 190 188 Const Function Operator <= (y As *StrChar) As Boolean 191 Return String.Compare(This, y) <= 0189 Return Compare(This, y) <= 0 192 190 End Function 193 191 194 192 Const Function Operator >= (y As String) As Boolean 195 Return String.Compare(This, y) >= 0193 Return Compare(This, y) >= 0 196 194 End Function 197 195 198 196 Const Function Operator >= (y As *StrChar) As Boolean 199 Return String.Compare(This, y) >= 0197 Return Compare(This, y) >= 0 200 198 End Function 201 199 … … 205 203 206 204 Public 205 'Compareなどで、x.Charsではなく、StrPtr(x)と書く理由は、xがNothingの場合のため。 206 207 207 Static Function Compare(x As String, indexX As Long, y As String, indexY As Long, length As Long) As Long 208 Return String.CompareOrdinal(x, indexX, y, indexY, length)208 Return CompareOrdinal(x, indexX, y, indexY, length) 209 209 End Function 210 210 211 211 Static Function CompareOrdinal(x As String, y As String) As Long 212 Return String.CompareOrdinal(x.Chars, y.Chars)212 Return CompareOrdinal(StrPtr(x), StrPtr(y)) 213 213 End Function 214 214 215 215 Static Function CompareOrdinal(x As String, indexX As Long, y As String, indexY As Long, length As Long) As Long 216 Return String.CompareOrdinal(x.Chars, indexX, y.Chars, indexY, length)216 Return CompareOrdinal(StrPtr(x), indexX, StrPtr(y), indexY, length) 217 217 End Function 218 218 Private 219 219 Static Function Compare(x As String, y As *StrChar) As Long 220 Return String.CompareOrdinal(x, y)220 Return CompareOrdinal(x, y) 221 221 End Function 222 222 223 223 Static Function CompareOrdinal(x As String, y As *StrChar) As Long 224 Return String.CompareOrdinal(x.Chars, y)224 Return CompareOrdinal(StrPtr(x), y) 225 225 End Function 226 226 … … 257 257 Function CompareTo(y As Object) As Long 258 258 If Not Object.Equals(This.GetType(), y.GetType()) Then 259 Throw New ArgumentException("String.CompareTo: An argument is out of range value.", "y")259 Throw New ArgumentException("String.CompareTo: The type of the argument y is not String.", "y") 260 260 End If 261 261 Return CompareTo(y As String) … … 351 351 End Function 352 352 353 Static Function Concat(x As String, y As String, z As String) As String 354 Dim sb = New Text.StringBuilder(removeNull(x).Length + removeNull(y).Length + removeNull(z).Length) 355 sb.Append(x).Append(y).Append(z) 356 Concat = sb.ToString 357 End Function 358 359 Static Function Concat(x As String, y As String, z As String, w As String) As String 360 Dim sb = New Text.StringBuilder(removeNull(x).Length + removeNull(y).Length + removeNull(z).Length + removeNull(w).Length) 361 sb.Append(x).Append(y).Append(z).Append(w) 362 Concat = sb.ToString 363 End Function 364 353 365 Static Function Concat(x As Object, y As Object) As String 354 Return String.Concat(x.ToString, y.ToString) 366 Return Concat(x.ToString, y.ToString) 367 End Function 368 369 Static Function Concat(x As Object, y As Object, z As Object) As String 370 Return Concat(x.ToString, y.ToString, z.ToString) 371 End Function 372 373 Static Function Concat(x As Object, y As Object, z As Object, w As Object) As String 374 Return Concat(x.ToString, y.ToString, z.ToString, w.ToString) 355 375 End Function 356 376 … … 575 595 Clone = This 576 596 End Function 577 597 /* 598 Function Clone() As Object 599 Clone = This 600 End Function 601 */ 578 602 Static Function Copy(s As String) As String 579 603 Copy = New String(s.Chars, s.m_Length) … … 656 680 End If 657 681 End Sub 682 683 Static Function removeNull(s As String) As String 684 If ActiveBasic.IsNothing(s) Then 685 removeNull = Empty 686 Else 687 removeNull = s 688 End If 689 End Function 658 690 End Class 659 691 -
trunk/Include/Classes/System/Text/StringBuilder.ab
r435 r457 182 182 ElseIf c > Capacity Then 183 183 Dim p = GC_malloc_atomic((c + 1) * SizeOf (StrChar)) As *StrChar 184 If p = 0 Then185 'Throw OutOfMemoryException186 Debug187 End If188 184 ActiveBasic.Strings.ChrCopy(p, chars, size As SIZE_T) 189 185 chars = p … … 488 484 This.size = 0 489 485 This.chars = GC_malloc_atomic((This.capacity + 1) * SizeOf (StrChar)) 490 If chars = 0 Then491 'Throw OutOfMemoryException492 Debug493 End If494 495 486 End Sub 496 487 -
trunk/Include/api_commctrl.sbp
r300 r457 997 997 Const MCN_SELCHANGE = MCN_FIRST + &H1 998 998 999 Declare Function _TrackMouseEvent Lib "comctl32" (ByRef EventTrack As TRACKMOUSEEVENT) As BOOL 999 1000 1000 1001 #endif '_INC_COMMCTRL -
trunk/Include/basic/command.sbp
r391 r457 247 247 FileNumber-- 248 248 249 WriteFile(_System_hFile(FileNumber), buf, Len(buf), VarPtr(dwAccessByte), ByVal 0)249 WriteFile(_System_hFile(FileNumber), StrPtr(buf), Len(buf), VarPtr(dwAccessByte), ByVal 0) 250 250 End Sub 251 251 -
trunk/Include/basic/function.sbp
r400 r457 946 946 @author Egtra 947 947 @date 2007/08/24 948 @param[in] p COMインタフェースを指すポインタ948 @param[in] p オブジェクトを指すポインタ 949 949 @return Object参照型 950 950 */ -
trunk/TestCase/SimpleTestCase/SimpleTestCase.ab
r438 r457 40 40 End Sub 41 41 42 Print "Please enter any key" 43 Dim a As Long 44 Input a 42 Print "Please Enter key" 43 System.Console.ReadLine() -
trunk/TestCase/SimpleTestCase/StringBuilderTest.ab
r299 r457 9 9 Sub TestMain() 10 10 Dim sb = New StringBuilder("Hello") 11 UnitTest("StringBuilder - Constractor & ToString", sb.ToString ="Hello")12 UnitTest("StringBuilder.ToString(index, count)", sb.ToString(1, 3) ="ell")13 UnitTest("StringBuilder.Append", sb.Append("StringBuilder").ToString ="HelloStringBuilder")14 UnitTest("StringBuilder.Insert (String)", sb.Insert(5, ", ").ToString ="Hello, StringBuilder")11 UnitTest("StringBuilder - Constractor & ToString", sb.ToString, "Hello") 12 UnitTest("StringBuilder.ToString(index, count)", sb.ToString(1, 3), "ell") 13 UnitTest("StringBuilder.Append", sb.Append("StringBuilder").ToString, "HelloStringBuilder") 14 UnitTest("StringBuilder.Insert (String)", sb.Insert(5, ", ").ToString, "Hello, StringBuilder") 15 15 sb.Length = 0 16 UnitTest("StringBuilder.Length = 0", sb.ToString ="")16 UnitTest("StringBuilder.Length = 0", sb.ToString, "") 17 17 sb.Append("でてこいでてこいいけのこい") 18 18 sb.Replace("こい", "いけ").Replace("いけ", "こい") 19 UnitTest("StringBuilder.Replace (String)", sb.ToString = "でてこいでてこいいけのこい")19 UnitTest("StringBuilder.Replace (String)", sb.ToString, "でてこいでてこいこいのこい") 20 20 End Sub 21 21
Note:
See TracChangeset
for help on using the changeset viewer.