Index: trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab
===================================================================
--- trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 467)
+++ trunk/Include/Classes/ActiveBasic/Strings/SPrintF.ab	(revision 468)
@@ -1,3 +1,21 @@
-'Classes/ActiveBasic/Strings/SPrintF.ab
+/*!
+@file Include/Classes/ActiveBasic/Strings/SPrintF.ab
+@brief SPrintfとその補助ルーチンが含まれるファイル。
+
+SPrintfで数値変換が行われるとき、呼出の階層は、
+SPrintf→FormatInteger, FormatFloat→FormatIntegerEx, FormatFloatExとなる。
+
+また、次のような変換ルーチンが存在する。
+@li FormatFloatE
+@li FormatFloatF
+@li FormatFloatG
+@li FormatFloatA
+@li FormatIntegerD
+@li FormatIntegerU
+@li FormatIntegerO
+@li FormatIntegerX
+@li FormatCharacter
+@li FormatString
+*/
 
 Namespace ActiveBasic
@@ -92,9 +110,7 @@
 	LeftSide = &h8
 	/*! 代替表記、#。
-	<ul>
-		<li>[OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul>
-		<li>[AaEeFfGg]では、精度0でも小数点を付ける。</ul>
-		<li>[Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul>
-	</ul>
+	@li [OoXx]では、値が0でない場合、先頭に0、0xを付ける。</ul>
+	@li [AaEeFfGg]では、精度0でも小数点を付ける。</ul>
+	@li [Gg]では、それに加え、小数部末尾の0の省略を行わないようにする。</ul>
 	*/
 	Alt = &h10
@@ -121,19 +137,43 @@
 @param[in] flags	書式フラグ。
 @return	xの文字列表現
-
+*/
+Function FormatFloatE(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+	FormatFloatE = FormatFloatEx(AddressOf(FormatFloatE_Convert), x, precision, field, flags)
+End Function
+
+/*
+@brief	浮動小数点数をprintfの%e, %E（指数形式、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/08
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in] field	フィールド幅。
+@param[in] flags	書式フラグ。
+*/
+Sub FormatFloatE(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
+	FormatFloatEx(sb, AddressOf(FormatFloatE_Convert), x, precision, field, flags)
+End Sub
+
+/*!
+@brief	浮動小数点数をprintfの%e, %E（指数形式、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして15となる。
+@param[in] field	フィールド幅。
+@param[in,out] flags	書式フラグ。
 @todo	他の実装での末尾桁の扱いを調べる（このコードでは何もしていないので切捨となっている）。
 */
-Function FormatFloatE(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+Sub FormatFloatE_Convert(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
 	If precision = DWORD_MAX Then
-		precision = 6
-	End If
-
+		precision = 15
+	End If
 	Dim e As Long, negative As Boolean
 	Dim s = FloatToChars(x, e, negative)
-	Dim sb = FormatFloatE_Base(s, negative, precision, flags)
+	FormatFloatE_Base(sb, s, negative, precision, flags)
 	FormatFloatE_Exponent(sb, e, flags)
-	AdjustFieldWidth(sb, field, flags)
-	FormatFloatE = sb.ToString()
-End Function
+End Sub
 
 /**
@@ -142,11 +182,8 @@
 @date	2007/10/27
 */
-Function FormatFloatE_Base(s As String, negative As Boolean, precision As DWord, ByRef flags As FormatFlags) As System.Text.StringBuilder
-	FormatFloatE_Base = New System.Text.StringBuilder
-	With FormatFloatE_Base
-		AppendSign(FormatFloatE_Base, negative, flags)
-
+Sub FormatFloatE_Base(sb As System.Text.StringBuilder, s As String, negative As Boolean, precision As DWord, ByRef flags As FormatFlags)
+	With sb
+		AppendSign(sb, negative, flags)
 		.Append(s[0])
-
 		If (flags And Alt) Or precision > 0 Then
 			.Append(".")
@@ -156,9 +193,9 @@
 			Else 'sで用意された桁が指定された精度より少ないとき
 				.Append(s, 1, outputLen)
-				.Append(&h30 As StrChar, precision - outputLen) '足りない桁は0埋め
+				.Append(&h30 As Char, precision - outputLen) '足りない桁は0埋め
 			End If
 		End If
 	End With
-End Function
+End Sub
 
 /**
@@ -167,6 +204,6 @@
 @date	2007/10/27
 */
-Sub FormatFloatE_Exponent(buf As System.Text.StringBuilder, e As Long, flags As FormatFlags)
-	With buf
+Sub FormatFloatE_Exponent(sb As System.Text.StringBuilder, e As Long, flags As FormatFlags)
+	With sb
 		If flags And Cap Then
 			.Append("E")
@@ -174,5 +211,5 @@
 			.Append("e")
 		End If
-		.Append(FormatIntegerD(e, 2, 0, Sign Or Zero))
+		FormatIntegerD(sb, e, 2, 0, Sign Or Zero)
 	End With
 End Sub
@@ -183,5 +220,5 @@
 @date	2007/10/23
 @param[in]	x	文字列化する浮動小数点数値。
-@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値15となる。
 @param[in]	field	フィールド幅。
 @param[in]	flags	書式フラグ。
@@ -189,14 +226,39 @@
 */
 Function FormatFloatF(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+	FormatFloatF = FormatFloatEx(AddressOf(FormatFloatF_Convert), x, precision, field, flags)
+End Function
+
+/*
+@brief	浮動小数点数をprintfの%f（小数形式、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/08
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in] field	フィールド幅。
+@param[in] flags	書式フラグ。
+*/
+Sub FormatFloatF(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
+	FormatFloatEx(sb, AddressOf(FormatFloatF_Convert), x, precision, field, flags)
+End Sub
+
+/*!
+@brief	浮動小数点数をprintfの%f（小数形式、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in]	x	文字列化する浮動小数点数値。
+@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値15となる。
+@param[in]	field	フィールド幅。
+@param[in,out]	flags	書式フラグ。
+*/
+Sub FormatFloatF_Convert(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
 	If precision = DWORD_MAX Then
-		precision = 6
-	End If
-
+		precision = 15
+	End If
 	Dim e As Long, negative As Boolean
 	Dim s = FloatToChars(x, e, negative)
-	Dim sb = FormatFloatF_Core(s, e, negative, precision, flags)
-	AdjustFieldWidth(sb, field, flags)
-	FormatFloatF = sb.ToString()
-End Function
+	FormatFloatF_Core(sb, s, e, negative, precision, flags)
+End Sub
 
 /**
@@ -204,8 +266,7 @@
 @date	2007/10/27
 */
-Function FormatFloatF_Core(s As String, e As Long, negative As Boolean, precision As DWord, ByRef flags As FormatFlags) As System.Text.StringBuilder
-	FormatFloatF_Core = New System.Text.StringBuilder(128)
-	With FormatFloatF_Core
-		AppendSign(FormatFloatF_Core, negative, flags)
+Sub FormatFloatF_Core(sb As System.Text.StringBuilder, s As String, e As Long, negative As Boolean, precision As DWord, ByRef flags As FormatFlags)
+	With sb
+		AppendSign(sb, negative, flags)
 
 		Dim intPartLen = e + 1
@@ -214,5 +275,5 @@
 			'有効桁が全て整数部に収まる場合
 			.Append(s)
-			.Append(&h30 As StrChar, intPartLen - 17)
+			.Append(&h30 As Char, intPartLen - 17)
 			outputDigit = 17
 		ElseIf intPartLen > 0 Then
@@ -222,5 +283,5 @@
 		Else
 			'有効桁が全く整数部にかからない場合
-			.Append(&h30 As StrChar)
+			.Append(&h30 As Char)
 		End If
 
@@ -234,14 +295,14 @@
 					'1.23e-4 = 0.000123のように指数が負のため小数点以下に0が続く場合
 					zeroDigit = System.Math.Min(-intPartLen As DWord, precision)
-					.Append(&h30 As StrChar, zeroDigit As Long)
+					.Append(&h30 As Char, zeroDigit As Long)
 				End If
 				.Append(s, outputDigit, (precision - zeroDigit) As Long)
 			Else
 				.Append(s, outputDigit, lastDigit)
-				.Append(&h30 As StrChar, (precision - lastDigit) As Long) '残りの桁は0埋め
+				.Append(&h30 As Char, (precision - lastDigit) As Long) '残りの桁は0埋め
 			End If
 		End If
 	End With
-End Function
+End Sub
 
 /*!
@@ -250,5 +311,5 @@
 @date	2007/10/23
 @param[in]	x	文字列化する浮動小数点数値。
-@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXまたは0のとき、指定なしとして既定値6となる。
+@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXまたは0のとき、指定なしとして既定値15となる。
 @param[in]	field	フィールド幅。
 @param[in]	flags	書式フラグ。
@@ -257,28 +318,51 @@
 */
 Function FormatFloatG(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+	FormatFloatG = FormatFloatEx(AddressOf(FormatFloatG_Convert), x, precision, field, flags)
+End Function
+
+/*
+@brief	浮動小数点数をprintfの%g, %G（小数・指数、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/08
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in] field	フィールド幅。
+@param[in] flags	書式フラグ。
+*/
+Sub FormatFloatG(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
+	FormatFloatEx(sb, AddressOf(FormatFloatG_Convert), x, precision, field, flags)
+End Sub
+
+/*!
+@brief	浮動小数点数をprintfの%g, %G（小数・指数、十進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2007/10/23
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in]	x	文字列化する浮動小数点数値。
+@param[in]	precision	精度。小数点以下の桁数。DWORD_MAXまたは0のとき、指定なしとして既定値15となる。
+@param[in]	field	フィールド幅。
+@param[in,out]	flags	書式フラグ。
+@todo	下位桁の扱いの調査。
+*/
+Sub FormatFloatG_Convert(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
 	'GではE/Fと違い整数部も有効桁数に数えるのでその分を引いておく。
 	If precision = DWORD_MAX Or precision = 0 Then
-		precision = 5
+		precision = 14
 	Else
 		precision--
 	End If
-
+	Dim lastLength = sb.Length
 	Dim e As Long, negative As Boolean
 	Dim s = FloatToChars(x, e, negative)
-
-	Dim sb = Nothing As System.Text.StringBuilder
-
 	If -5 < e And e < precision Then
-		sb = FormatFloatF_Core(s, e, negative, -e + precision, flags)
-		FormatFloatG_RemoveLowDigit(sb, flags)
+		FormatFloatF_Core(sb, s, e, negative, -e + precision, flags)
+		FormatFloatG_RemoveLowDigit(sb, lastLength, flags)
 	Else
-		sb = FormatFloatE_Base(s, negative, precision, flags)
-		FormatFloatG_RemoveLowDigit(sb, flags)
+		FormatFloatE_Base(sb, s, negative, precision, flags)
+		FormatFloatG_RemoveLowDigit(sb, lastLength, flags)
 		FormatFloatE_Exponent(sb, e, flags)
 	End If
-
-	AdjustFieldWidth(sb, field, flags)
-	FormatFloatG = sb.ToString()
-End Function
+End Sub
 
 /*!
@@ -290,10 +374,11 @@
 flagsでAltが立っているとき、この関数は何もしない。
 */
-Sub FormatFloatG_RemoveLowDigit(sb As System.Text.StringBuilder, flags As FormatFlags)
+Sub FormatFloatG_RemoveLowDigit(sb As System.Text.StringBuilder, start As Long, flags As FormatFlags)
 	Imports ActiveBasic.Strings
 	
 	Dim count = sb.Length
 	If (flags And Alt) = 0 Then
-		Dim point = ChrFind(StrPtr(sb), count As SIZE_T, Asc("."))
+		Dim p = StrPtr(sb)
+		Dim point = ChrFind(VarPtr(p[start]), (count - start) As SIZE_T, Asc("."))
 		If point = -1 Then
 			Debug
@@ -327,11 +412,41 @@
 */
 Function FormatFloatA(x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+	FormatFloatA = FormatFloatEx(AddressOf(FormatFloatA_Convert), x, precision, field, flags)
+End Function
+
+/*
+@brief	浮動小数点数をprintfの%a, %A（指数形式、十六進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/08
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値6となる。
+@param[in] field	フィールド幅。
+@param[in] flags	書式フラグ。
+*/
+Sub FormatFloatA(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
+	FormatFloatEx(sb, AddressOf(FormatFloatA_Convert), x, precision, field, flags)
+End Sub
+
+/*!
+@brief	浮動小数点数をprintfの%a, %A（指数形式、十六進法）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x	文字列化する浮動小数点数値。
+@param[in] precision	精度。小数点以下の桁数。DWORD_MAXのとき、指定なしとして既定値13となる。
+@param[in] field	フィールド幅。
+@param[in,out] flags	書式フラグ。
+
+C99では、末尾の0を取り除いても良いとあるので、
+このルーチンでは取り除くことにしている。
+*/
+Sub FormatFloatA_Convert(sb As System.Text.StringBuilder, x As Double, precision As DWord, field As DWord, ByRef flags As FormatFlags)
 	If precision = DWORD_MAX Then
 		precision = 13
 	End If
-
+	Dim lastLength = sb.Length
 	Dim pqw = VarPtr(x) As *QWord
 
-	Dim sb = New System.Text.StringBuilder
 	With sb
 		Dim sign = (GetQWord(pqw) And &H8000000000000000) As Boolean
@@ -362,25 +477,20 @@
 		If precision > 0 Or (flags And Alt) Then
 			.Append(".")
-			Dim base = FormatIntegerLX(GetQWord(pqw) And &h000fffffffffffff, 13, 0, flags And Cap)
-			Dim diff = precision - 13 As Long
-			If diff <= 0 Then
-				.Append(Left$(base, precision))
+			Dim fraction = GetQWord(pqw) And &h000fffffffffffff
+			If precision < 13 Then
+				Dim dropped = 13 - precision
+				fraction >>= dropped * 4
+				FormatIntegerLX(sb, fraction, precision, 0, flags And Cap)
 			Else
-				.Append(base).Append(&h30, diff)
+				FormatIntegerLX(sb, fraction, 13, 0, flags And Cap)
+				.Append(&h30, precision - 13)
 			End If
 		End If
-
-		FormatFloatG_RemoveLowDigit(sb, flags)
-
+		FormatFloatG_RemoveLowDigit(sb, lastLength, flags)
 		.Append("P")
-		.Append(FormatIntegerD(exp, 1, 0, Sign))
-		
-		FormatFloatA = .ToString()
+		FormatIntegerD(sb, exp, 1, 0, Sign)
+		AdjustAlphabet(sb, flags, lastLength)
 	End With
-
-	If (flags And Cap) = 0 Then
-		FormatFloatA = FormatFloatA.ToLower()
-	End If
-End Function
+End Sub
 
 /*!
@@ -408,11 +518,4 @@
 
 /*!
-@brief	DWordの最大値4294967295の文字数 - 1。FormatIntegerU内で使用。
-@author	Egtra
-@date	2007/09/18
-*/
-Const MaxSizeU = 9
-
-/*!
 @brief	符号無し整数をprintfの%u（十進法表現）相当の変換で文字列化する関数。
 @author	Egtra
@@ -429,4 +532,18 @@
 
 /*!
+@brief	符号無し整数をprintfの%u（十進法表現）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+*/
+Sub FormatIntegerU(sb As System.Text.StringBuilder, x As DWord, d As DWord, field As DWord, flags As FormatFlags)
+	FormatIntegerEx(sb, TraitsIntegerU[0], x As QWord, d, field, flags And (Not (Sign Or Blank)))
+End Sub
+
+/*!
 @brief	FormatIntegerUのQWord版
 @author	Egtra
@@ -436,4 +553,18 @@
 	Return FormatIntegerEx(TraitsIntegerU[1], x, d, field, flags And (Not (Sign Or Blank)))
 End Function
+
+/*!
+@brief	FormatIntegerUのQWord版
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+*/
+Sub FormatIntegerLU(sb As System.Text.StringBuilder, x As QWord, d As DWord, field As DWord, flags As FormatFlags)
+	FormatIntegerEx(sb, TraitsIntegerU[0], x, d, field, flags And (Not (Sign Or Blank)))
+End Sub
 
 /*!
@@ -452,4 +583,18 @@
 
 /*!
+@brief	符号有り整数をprintfの%d（十進法表現）相当の変換で文字列化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in]	x	文字列化する整数値。
+@param[in]	d	精度、最小限表示される桁数。DWORD_MAXのとき、指定なしとして、既定値1となる。
+@param[in]	field	フィールド幅。
+@param[in]	flags	書式フラグ。
+*/
+Sub FormatIntegerD(sb As System.Text.StringBuilder, x As Long, d As DWord, field As DWord, flags As FormatFlags)
+	FormatIntegerEx(sb, TraitsIntegerD[0], (x As Int64) As QWord, d, field, flags)
+End Sub
+
+/*!
 @brief	FormatIntegerDのInt64版
 @author	Egtra
@@ -459,4 +604,13 @@
 	Return FormatIntegerEx(TraitsIntegerD[1], x As QWord, d, field, flags)
 End Function
+
+/*!
+@brief	FormatIntegerDのInt64版
+@author	Egtra
+@date	2007/10/26
+*/
+Sub FormatIntegerLD(sb As System.Text.StringBuilder, x As Int64, d As DWord, field As DWord, flags As FormatFlags)
+	FormatIntegerEx(sb, TraitsIntegerD[1], x As QWord, d, field, flags)
+End Sub
 
 /*!
@@ -468,5 +622,4 @@
 	.Convert = AddressOf(IntegerU_Convert)
 	.Prefix = AddressOf(IntegerU_Prefix)
-	.MaxSize = MaxSizeU
 End With
 
@@ -474,5 +627,4 @@
 	.Convert = AddressOf(IntegerLU_Convert)
 	.Prefix = AddressOf(IntegerU_Prefix)
-	.MaxSize = MaxSizeLU
 End With
 
@@ -485,5 +637,4 @@
 	.Convert = AddressOf(IntegerD_Convert)
 	.Prefix = AddressOf(IntegerD_Prefix)
-	.MaxSize = MaxSizeU
 End With
 
@@ -491,5 +642,4 @@
 	.Convert = AddressOf(IntegerLD_Convert)
 	.Prefix = AddressOf(IntegerD_Prefix)
-	.MaxSize = MaxSizeLU
 End With
 
@@ -505,9 +655,9 @@
 @date	2007/10/26
 */
-Function IntegerU_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
+Function IntegerU_Convert(buf As *Char, xq As QWord, flags As FormatFlags) As DWord
 	Dim x = xq As DWord
-	Dim i = MaxSizeU
+	Dim i = MaxSizeLO
 	While x <> 0
-		buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
+		buf[i] = (x As Int64 Mod 10 + &h30) As Char 'Int64への型変換は#117対策
 		x \= 10
 		i--
@@ -522,8 +672,8 @@
 @bug	#117のため、現在Int64の最大値を超える値を正しく処理できない。
 */
-Function IntegerLU_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
-	Dim i = MaxSizeLU
+Function IntegerLU_Convert(buf As *Char, x As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLO
 	While x <> 0
-		buf[i] = (x As Int64 Mod 10 + &h30) As StrChar 'Int64への型変換は#117対策
+		buf[i] = (x As Int64 Mod 10 + &h30) As Char 'Int64への型変換は#117対策
 		x \= 10
 		i--
@@ -543,5 +693,5 @@
 @date	2007/10/28
 */
-Function IntegerD_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
+Function IntegerD_Convert(buf As *Char, xq As QWord, flags As FormatFlags) As DWord
 	Return IntegerU_Convert(buf, Abs((xq As DWord) As Long) As DWord, flags)
 End Function
@@ -552,5 +702,5 @@
 @date	2007/10/28
 */
-Function IntegerLD_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+Function IntegerLD_Convert(buf As *Char, x As QWord, flags As FormatFlags) As DWord
 	Return IntegerLU_Convert(buf, Abs(x As Int64) As QWord, flags)
 End Function
@@ -570,11 +720,5 @@
 End Function
 
-/*!
-@brief	DWordの最大値の八進法表現37777777777の文字数 - 1 + 1。IntegerO_Convert内で使用。
-@author	Egtra
-@date	2007/10/19
-上の式で1を加えているのは、八進接頭辞の分。
-*/
-Const MaxSizeO = 11
+
 
 /*!
@@ -594,5 +738,4 @@
 	.Convert = AddressOf(IntegerO_Convert)
 	.Prefix = AddressOf(IntegerO_Prefix)
-	.MaxSize = MaxSizeO
 End With
 
@@ -600,5 +743,4 @@
 	.Convert = AddressOf(IntegerLO_Convert)
 	.Prefix = AddressOf(IntegerO_Prefix)
-	.MaxSize = MaxSizeLO
 End With
 
@@ -630,9 +772,9 @@
 @date	2007/10/22
 */
-Function IntegerO_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
+Function IntegerO_Convert(buf As *Char, xq As QWord, flags As FormatFlags) As DWord
 	Dim x = xq As DWord
-	Dim i = MaxSizeO
+	Dim i = MaxSizeLO
 	While x <> 0
-		buf[i] = ((x And &o7) + &h30) As StrChar
+		buf[i] = ((x And &o7) + &h30) As Char
 		x >>= 3
 		i--
@@ -650,8 +792,8 @@
 @date	2007/10/26
 */
-Function IntegerLO_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+Function IntegerLO_Convert(buf As *Char, x As QWord, flags As FormatFlags) As DWord
 	Dim i = MaxSizeLO
 	While x <> 0
-		buf[i] = ((x And &o7) + &h30) As StrChar
+		buf[i] = ((x And &o7) + &h30) As Char
 		x >>= 3
 		i--
@@ -678,18 +820,4 @@
 
 /*!
-@brief	DWordの最大値の十六進法表現ffffffffの文字数 - 1。FormatIntegerO内で使用。
-@author	Egtra
-@date	2007/10/24
-*/
-Const MaxSizeX = 7
-
-/*!
-@brief	QWordの最大値の十六進法表現ffffffffffffffffの文字数 - 1。FormatIntegerO内で使用。
-@author	Egtra
-@date	2007/10/26
-*/
-Const MaxSizeLX = 15
-
-/*!
 @author	Egtra
 @date	2007/10/24
@@ -699,5 +827,4 @@
 	.Convert = AddressOf(IntegerX_Convert)
 	.Prefix = AddressOf(IntegerX_Prefix)
-	.MaxSize = MaxSizeX
 End With
 
@@ -705,5 +832,4 @@
 	.Convert = AddressOf(IntegerLX_Convert)
 	.Prefix = AddressOf(IntegerX_Prefix)
-	.MaxSize = MaxSizeLX
 End With
 
@@ -731,4 +857,13 @@
 End Function
 
+/*!
+@brief	FormatIntegerXのQWord, StringBuilder版。
+@author	Egtra
+@date	2008/03/07
+*/
+Sub FormatIntegerLX(sb As System.Text.StringBuilder, x As QWord, d As DWord, field As DWord, flags As FormatFlags)
+	FormatIntegerEx(sb, TraitsIntegerX[1], x, d, field, flags)
+End Sub
+
 /*
 @brief	0からFまでの文字を収めた表
@@ -741,6 +876,6 @@
 @date	2007/10/22
 */
-Function IntegerX_Convert(buf As *StrChar, xq As QWord, flags As FormatFlags) As DWord
-	Dim i = MaxSizeX
+Function IntegerX_Convert(buf As *Char, xq As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLO
 	Dim x = xq As DWord
 	While x <> 0
@@ -757,6 +892,6 @@
 @date	2007/10/22
 */
-Function IntegerLX_Convert(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
-	Dim i = MaxSizeLX
+Function IntegerLX_Convert(buf As *Char, x As QWord, flags As FormatFlags) As DWord
+	Dim i = MaxSizeLO
 	While x <> 0
 		buf[i] = HexadecimalTable[x And &h0f]
@@ -791,13 +926,11 @@
 Type IntegerConvertTraits
 	'!変換を行う関数へのポインタ。
-	Convert As *Function(buf As *StrChar, x As QWord, flags As FormatFlags) As DWord
+	Convert As *Function(buf As *Char, x As QWord, flags As FormatFlags) As DWord
 	'!接頭辞を取得する関数へのポインタ。
 	Prefix As *Function(x As QWord, flags As FormatFlags) As String
-	'!必要なバッファの大きさ。
-	MaxSize As DWord
 End Type
 
 /*!
-@brief	整数変換全てを行う関数。これを雛形とし、形式毎の差異はIntegerConvertTraitsで表現する。
+@brief	整数変換全てを行う関数。
 @author	Egtra
 @date 2007/10/22
@@ -807,6 +940,24 @@
 @param[in] field	フィールド幅。
 @param[in] flags	フラグ。
+@return 変換された文字列
 */
 Function FormatIntegerEx(ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags) As String
+	Dim sb = New System.Text.StringBuilder(32)
+	FormatIntegerEx(sb, tr, x, d, field, flags)
+	FormatIntegerEx = sb.ToString
+End Function
+
+/*!
+@brief	整数変換全てを行う関数。これを雛形とし、形式毎の差異はIntegerConvertTraitsで表現する。
+@author	Egtra
+@date 2008/03/06
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] tr	特性情報。
+@param[in] x	変換元の数値。
+@param[in] d	精度。ここでは最低限出力する桁数。
+@param[in] field	フィールド幅。
+@param[in] flags	フラグ。
+*/
+Sub FormatIntegerEx(sb As System.Text.StringBuilder, ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags)
 	If d = DWORD_MAX Then
 		d = 1
@@ -817,5 +968,6 @@
 	End If
 
-	Dim sb = New System.Text.StringBuilder
+	Dim lastLength = sb.Length
+
 	With sb
 		Dim prefixFunc = tr.Prefix
@@ -828,83 +980,83 @@
 		End If
 
-'		Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar
-		Dim buf[MaxSizeLO] As StrChar
+		'バッファの量は最も必要文字数の多くなるUInt64の8進法変換にあわせている
+		Dim buf[MaxSizeLO] As Char
 		Dim convertFunc = tr.Convert
 		Dim bufStartPos = convertFunc(buf, x, flags)
 
-		Dim len = (tr.MaxSize - bufStartPos) As Long
+		Dim len = (MaxSizeLO - bufStartPos) As Long
 		If len < 0 Then
 			Debug
 		End If
 		If len < d Then
-			.Append(&h30 As StrChar, d - len)
-		End If
-
+			.Append(&h30 As Char, d - len)
+		End If
 		.Append(buf, bufStartPos + 1, len)
-
-		AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen)
+		AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen, lastLength)
+		AdjustAlphabet(sb, flags, lastLength)
 	End With
-	FormatIntegerEx = sb.ToString()
-	
-	If (flags And Cap) = 0 Then
-		FormatIntegerEx = FormatIntegerEx.ToLower()
-	End If
-End Function
-Sub FormatIntegerEx(sb As System.Text.StringBuilder, ByRef tr As IntegerConvertTraits, x As QWord, d As DWord, field As DWord, flags As FormatFlags)
-
-	If d = DWORD_MAX Then
-		d = 1
+End Sub
+
+/*!
+@brief 浮動小数点数変換全てを行う関数。これを雛形とし、実際の変換関数は引数converterで与える。
+@author Egtra
+@date 2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] converter 変換関数。
+@param[in] x 変換元の数値。
+@param[in] d 精度。ここでは最低限出力する桁数。
+@param[in] field フィールド幅。
+@param[in] flags フラグ。
+*/
+Sub FormatFloatEx(sb As System.Text.StringBuilder, converter As FormatFloatProc, x As Double, precision As DWord, field As DWord, flags As FormatFlags)
+	Dim lastLength = sb.Length
+	If Math.IsNaN(x) Then
+		sb.Append("NAN")
+		AdjustAlphabet(sb, flags, lastLength)
+	ElseIf Math.IsInf(x) Then
+		AppendSign(sb, (GetQWord(VarPtr(x)) >> 63) As Boolean, flags)
+		sb.Append("INFINITY")
+		AdjustAlphabet(sb, flags, lastLength)
 	Else
-		'精度が指定されているとき、ゼロフラグは無視される。
-		'仕様上、左揃えのときも無視されるが、それはAdjustFieldWidthが行ってくれる。
-		flags And= Not Zero
-	End If
-
-	Dim lastLength = sb.Length
-
-	With sb
-		Dim prefixFunc = tr.Prefix
-		Dim prefix = prefixFunc(x, flags)
-		sb.Append(prefix)
-
-		Dim prefixLen = 0 As DWord
-		If String.IsNullOrEmpty(prefix) = False Then
-			prefixLen = prefix.Length As DWord
-		End If
-
-'		Dim buf = GC_malloc_atomic((tr.MaxSize + 1) * SizeOf (StrChar)) As *StrChar
-		Dim buf[MaxSizeLO] As StrChar
-		Dim convertFunc = tr.Convert
-		Dim bufStartPos = convertFunc(buf, x, flags)
-
-		Dim len = (tr.MaxSize - bufStartPos) As Long
-		If len < 0 Then
-			Debug
-		End If
-		If len < d Then
-			.Append(&h30 As StrChar, d - len)
-		End If
-
-		.Append(buf, bufStartPos + 1, len)
-
-		AdjustFieldWidth(sb, field, flags And (Not (Sign Or Blank)), prefixLen, lastLength)
-	End With
-	Dim t = sb.ToString()
-	
+		converter(sb, x, precision, field, flags)
+	End If
+	AdjustFieldWidth(sb, field, flags, 0, lastLength)
+End Sub
+
+
+/*!
+@brief 浮動小数点数変換全てを行う関数。
+@author Egtra
+@date 2008/03/08
+@param[in] converter 変換関数。
+@param[in] x 変換元の数値。
+@param[in] d 精度。ここでは最低限出力する桁数。
+@param[in] field フィールド幅。
+@param[in] flags フラグ。
+@return 変換された文字列。
+*/
+Function FormatFloatEx(converter As FormatFloatProc, x As Double, precision As DWord, field As DWord, flags As FormatFlags) As String
+	Dim sb = New System.Text.StringBuilder
+	FormatFloatEx(sb, converter, x, precision, field, flags)
+	FormatFloatEx = sb.ToString
+End Function
+
+/*!
+@brief	書式化の仕上げとして、Capフラグが指定されていないときに小文字化する作業を行う。
+@author	Egtra
+@date 2008/03/06
+@param[in,out] sb 書式化した文字列を格納しているバッファ。
+@param[in] flags フラグ。
+@param[in] offset 書式変換した部分の開始位置。
+*/
+Sub AdjustAlphabet(sb As System.Text.StringBuilder, flags As FormatFlags, offset As Long)
 	If (flags And Cap) = 0 Then
 		Dim len = sb.Length
 		Dim i As Long
-		For i = lastLength To ELM(len)
+		For i = offset To ELM(len)
 			sb[i] = CType.ToLower(sb[i])
 		Next
 	End If
 End Sub
-
-/*!
-@brief	QWordの最大値18446744073709551615の文字数 - 1。FormatIntegerLU内で使用。
-@author	Egtra
-@date	2007/09/18
-*/
-Const MaxSizeLU = 19
 
 /*!
@@ -953,9 +1105,28 @@
 */
 Function FormatString(x As String, d As DWord, field As DWord, flags As FormatFlags) As String
+	Imports System
 	Dim sb = New System.Text.StringBuilder(
-		x, 0, System.Math.Min(x.Length As DWord, d) As Long, field)
+		Math.Max(Math.Min(x.Length As DWord, d), field) As Long + 1)
+	FormatString(sb, x, d, field, flags)
 	AdjustFieldWidth(sb, field, flags And LeftSide)
 	FormatString = sb.ToString()
 End Function
+
+/*!
+@brief	文字列をprintfの%s相当の変換で書式化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x 文字列。
+@param[in] d 精度、最大の文字数。
+@param[in] field フィールド幅。
+@param[in] flags 書式フラグ。
+@return 書式化された文字列。
+*/
+Sub FormatString(sb As System.Text.StringBuilder, x As String, d As DWord, field As DWord, flags As FormatFlags)
+	Dim len = sb.Length
+	sb.Append(x, 0, System.Math.Min(x.Length As DWord, d) As Long)
+	AdjustFieldWidth(sb, field, flags And LeftSide, 0, len)
+End Sub
 
 /*!
@@ -969,10 +1140,26 @@
 @return 書式化された文字列。
 */
-Function FormatCharacter(x As StrChar, d As DWord, field As DWord, flags As FormatFlags) As String
-	Dim sb = New System.Text.StringBuilder(field + 1)
+Function FormatCharacter(x As Char, d As DWord, field As DWord, flags As FormatFlags) As String
+	Dim sb = New System.Text.StringBuilder(field + 2)
+	FormatCharacter(sb, x, d, field, flags)
+	FormatCharacter = sb.ToString()
+End Function
+
+/*!
+@brief	文字列をprintfの%s相当の変換で書式化する関数。
+@author	Egtra
+@date	2008/03/07
+@param[in,out] sb 書式化した文字列を追加するバッファ。
+@param[in] x 文字。
+@param[in] d 精度、最大の文字数。
+@param[in] field フィールド幅。
+@param[in] flags 書式フラグ。
+@return 書式化された文字列。
+*/
+Sub FormatCharacter(sb As System.Text.StringBuilder, x As Char, d As DWord, field As DWord, flags As FormatFlags)
+	Dim len = sb.Length
 	sb.Append(x)
-	AdjustFieldWidth(sb, field, flags And LeftSide)
-	FormatCharacter = sb.ToString()
-End Function
+	AdjustFieldWidth(sb, field, flags And LeftSide, 0, len)
+End Sub
 
 /*!
@@ -980,5 +1167,5 @@
 @date	2007/10/28
 */
-TypeDef FormatFloatProc = *Function(x As Double, precision As DWord, fieldWidth As DWord, flags As FormatFlags) As String
+TypeDef FormatFloatProc = *Sub(sb As System.Text.StringBuilder, x As Double, precision As DWord, fieldWidth As DWord, ByRef flags As FormatFlags)
 
 /*!
@@ -997,5 +1184,5 @@
 		x = param As System.Single
 	End If
-	s.Append(formatProc(x, precision, field, flags))
+	FormatFloatEx(s, formatProc, x, precision, field, flags)
 End Sub
 
@@ -1050,6 +1237,4 @@
 		End If
 	End If
-
-'	s.Append(FormatIntegerEx(ByVal traits, x, precision, field, flags))
 	FormatIntegerEx(s, ByVal traits, x, precision, field, flags)
 End Sub
@@ -1066,5 +1251,5 @@
 @return	変換して得られた数値。変換できなければ0。
 */
-Function StrToLong(s As *StrChar, ByRef p As *StrChar) As Long
+Function StrToLong(s As *Char, ByRef p As *Char) As Long
 	Dim negative As Boolean
 	Dim i = 0 As Long
@@ -1099,5 +1284,5 @@
 そうでなく、fmtに数字（先頭に-符号があっても可）が並んでいれば、それを読み取る。
 */
-Function ReadInt(ByRef fmt As *StrChar, params As *Object, ByRef paramsCount As SIZE_T, ByRef ret As Long) As Boolean
+Function ReadInt(ByRef fmt As *Char, params As *Object, ByRef paramsCount As SIZE_T, ByRef ret As Long) As Boolean
 	If fmt[0] = &h2a Then '*
 		fmt = VarPtr(fmt[1]) 'po
@@ -1106,5 +1291,5 @@
 		ReadInt = True
 	Else
-		Dim p As *StrChar
+		Dim p As *Char
 		ret = StrToLong(fmt, p)
 		If fmt <> p Then
@@ -1126,5 +1311,5 @@
 @retval False	読み取り中に文字列が終了した（ヌル文字が現れた）。
 */
-Function ReadFlags(ByRef fmt As *StrChar, ByRef flags As FormatFlags) As Boolean
+Function ReadFlags(ByRef fmt As *Char, ByRef flags As FormatFlags) As Boolean
 	ReadFlags = False
 	Do
@@ -1162,5 +1347,5 @@
 @param[in, out] flags
 */
-Sub ReadFieldWidth(ByRef fmt As *StrChar, params As *Object, ByRef paramsCount As SIZE_T,
+Sub ReadFieldWidth(ByRef fmt As *Char, params As *Object, ByRef paramsCount As SIZE_T,
 	ByRef fieldWidth As DWord, ByRef flags As FormatFlags)
 	Dim t As Long
@@ -1186,5 +1371,5 @@
 @return	読み取った精度。指定がなかったときには、DWORD_MAX。
 */
-Function ReadPrecision(ByRef fmt As *StrChar,
+Function ReadPrecision(ByRef fmt As *Char,
 	params As *Object, ByRef paramsCount As SIZE_T) As DWord
 
@@ -1216,5 +1401,5 @@
 @param[out] lengthSpec
 */
-Sub ReadLength(ByRef fmt As *StrChar, ByRef lengthSpec As Long)
+Sub ReadLength(ByRef fmt As *Char, ByRef lengthSpec As Long)
 	Do
 		Select Case fmt[0]
@@ -1240,4 +1425,15 @@
 
 /*!
+@brief efg変換用に、精度が指定されていないときに既定の精度を設定する。
+@auther Egtra
+@date 2008/03/07
+*/
+Sub AdjustPrecision(ByRef precision As DWord)
+	If precision = DWORD_MAX Then
+		precision = 6
+	End If
+End Sub
+
+/*!
 @biref	Cのsprintfのような書式文字列出力関数
 @author	Egtra
@@ -1255,6 +1451,6 @@
 	Dim s = New System.Text.StringBuilder
 	Do
-		Dim last = format.Length - (((fmt - StrPtr(format)) \ SizeOf (StrChar)) As LONG_PTR) As Long 'po
-		Dim pos = ActiveBasic.Strings.ChrFind(fmt, last, &h25 As StrChar) As Long '&h25 = %
+		Dim last = format.Length - (((fmt - StrPtr(format)) \ SizeOf (Char)) As LONG_PTR) As Long 'po
+		Dim pos = ChrFind(fmt, last, &h25 As Char) As Long '&h25 = %
 		If pos = -1 Then
 			s.Append(fmt, 0, last)
@@ -1285,38 +1481,53 @@
 			Case &h75 'u
 				FormatInteger(s, TraitsIntegerU, params[i], False, typeWidth, precision, fieldWidth, flags)
+			Case &h4f 'O
+				flags Or= Cap
+				Goto *O
 			Case &h6f 'o
+			*O
 				FormatInteger(s, TraitsIntegerO, params[i], False, typeWidth, precision, fieldWidth, flags)
-			Case &h4f 'O
-				FormatInteger(s, TraitsIntegerO, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
+			Case &h58 'X
+				flags Or= Cap
+				Goto *X
 			Case &h78 'x
+			*X
 				FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags)
-			Case &h58 'X
-				FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
 '現状ではVoidPtrを引数にする手段は無いはず
 '			Case &h58 'p
 '				FormatInteger(s, TraitsIntegerX, params[i], False, typeWidth, precision, fieldWidth, flags Or Cap)
+			Case &h45 'E
+				flags Or= Cap
+				Goto *E
 			Case &h65 'e
-				FormatFloat(s, AddressOf(FormatFloatE), params[i], precision, fieldWidth, flags)
-			Case &h45 'E
-				FormatFloat(s, AddressOf(FormatFloatE), params[i], precision, fieldWidth, flags Or Cap)
+			*E
+				AdjustPrecision(precision)
+				FormatFloat(s, AddressOf(FormatFloatE_Convert), params[i], precision, fieldWidth, flags)
+			Case &h46 'F
+				flags Or= Cap
+				Goto *F
 			Case &h66 'f
-				FormatFloat(s, AddressOf(FormatFloatF), params[i], precision, fieldWidth, flags)
-			Case &h46 'F
-				FormatFloat(s, AddressOf(FormatFloatF), params[i], precision, fieldWidth, flags Or Cap)
+			*F
+				AdjustPrecision(precision)
+				FormatFloat(s, AddressOf(FormatFloatF_Convert), params[i], precision, fieldWidth, flags)
+			Case &h47 'G
+				flags Or= Cap
+				Goto *G
 			Case &h67 'g
-				FormatFloat(s, AddressOf(FormatFloatG), params[i], precision, fieldWidth, flags)
-			Case &h47 'G
-				FormatFloat(s, AddressOf(FormatFloatG), params[i], precision, fieldWidth, flags Or Cap)
+			*G
+				AdjustPrecision(precision)
+				FormatFloat(s, AddressOf(FormatFloatG_Convert), params[i], precision, fieldWidth, flags)
+			Case &h41 'A
+				flags Or= Cap
+				Goto *A
 			Case &h61 'a
+			*A
 				FormatFloat(s, AddressOf(FormatFloatA), params[i], precision, fieldWidth, flags)
-			Case &h41 'A
-				FormatFloat(s, AddressOf(FormatFloatA), params[i], precision, fieldWidth, flags Or Cap)
 			Case &h73 's
-				s.Append(FormatString(params[i] As String, precision, fieldWidth, flags))
+				FormatString(s, params[i] As String, precision, fieldWidth, flags)
 			Case &h63 'c
-				s.Append(FormatCharacter(params[i] As BoxedStrChar, precision, fieldWidth, flags))
+				FormatCharacter(s, params[i] As BoxedStrChar, precision, fieldWidth, flags)
 '			Case &h6e 'n
 			Case &h25 '%
-				s.Append(&h25 As StrChar)
+				s.Append(&h25 As Char)
 				i--
 			Case 0
Index: trunk/Include/Classes/System/IO/DirectoryInfo.ab
===================================================================
--- trunk/Include/Classes/System/IO/DirectoryInfo.ab	(revision 467)
+++ trunk/Include/Classes/System/IO/DirectoryInfo.ab	(revision 468)
@@ -59,5 +59,5 @@
 			Select Case error
 				Case ERROR_ALREADY_EXISTS
-					Throw New IOException("DirectoryInfo.CreateDirectory: The directory has already existed.")
+					Exit Sub 'ディレクトリが既に存在するときは、何もしない。
 				Case Else
 					Throw New IOException("DirectoryInfo.CreateDirectory: Failed to CreateDirectory")
Index: trunk/Include/Classes/System/IO/Path.ab
===================================================================
--- trunk/Include/Classes/System/IO/Path.ab	(revision 467)
+++ trunk/Include/Classes/System/IO/Path.ab	(revision 468)
@@ -88,5 +88,9 @@
 	*/
 	Static Function GetFullPath(path As String) As String
-		Return Combine(System.Environment.CurrentDirectory, path)
+		If IsPathRooted(path) Then
+			Return path
+		Else
+			Return Combine(System.Environment.CurrentDirectory, path)
+		End If
 	End Function
 
@@ -172,10 +176,12 @@
 	Static Function GetTempPath() As String
 		Dim size = WIN32API_GetTempPath(0, 0)
-		Dim p = GC_malloc_atomic(SizeOf (TCHAR) * size) As PCTSTR
-		Dim len = WIN32API_GetTempPath(size, p)
+		Dim buf = New Text.StringBuilder(size)
+		buf.Length = size
+		Dim len = WIN32API_GetTempPath(size, StrPtr(buf))
 		If (len > size) or len = 0 Then
 			Throw New IOException("Path.GetTempPath: Failed to GetTempPath.")
 		Else
-			Return New String(p, len As Long)
+			buf.Length = len
+			Return buf.ToString
 		End If
 	End Function
@@ -209,5 +215,5 @@
 	Static Const ExtensionSeparatorChar = &H2E As StrChar
 	Static Const InvalidPathChars = Ex"\q<>|\0\t" As String
-	Static Const UniformNamingConventionString = Ex"\\\\" As String
+	Static Const UniformNamingConventionString = "\\" As String
 
 	'----------------------------------------------------------------
@@ -227,5 +233,5 @@
 		Dim i As Long
 		For i = 0 To ELM(InvalidPathChars.Length)
-			If path.Contains(InvalidPathChars.Substring(i, 1)) Then
+			If path.Contains(InvalidPathChars[i]) Then
 				Throw New IOException("Path.CheckPath: The path contains invalidPathChars.")
 			End If
Index: trunk/Include/Classes/System/IO/Stream.ab
===================================================================
--- trunk/Include/Classes/System/IO/Stream.ab	(revision 467)
+++ trunk/Include/Classes/System/IO/Stream.ab	(revision 468)
@@ -7,5 +7,6 @@
 
 Public 'Protected
-	Sub Stream():	End Sub
+	Sub Stream()
+	End Sub
 Public
 	Virtual Sub ~Stream()
@@ -54,6 +55,8 @@
 		Dispose(True)
 	End Sub
-	Virtual Function EndRead(ByRef asyncResult As System.IAsyncResult) As Long:	End Function
-	Virtual Sub EndWrite(ByRef asyncResult As System.IAsyncResult):	End Sub
+	Virtual Function EndRead(ByRef asyncResult As System.IAsyncResult) As Long
+	End Function
+	Virtual Sub EndWrite(ByRef asyncResult As System.IAsyncResult)
+	End Sub
 	Abstract Sub Flush()
 	Abstract Function Read(buffer As *Byte, offset As Long, count As Long) As Long
@@ -72,5 +75,4 @@
 	Abstract Sub SetLength(value As Int64)
 	Abstract Sub Write(buffer As *Byte, offset As Long, count As Long)
-
 	Virtual Sub WriteByte(b As Byte)
 		Write(VarPtr(b), 0, 1)
Index: trunk/Include/Classes/System/IO/StreamWriter.ab
===================================================================
--- trunk/Include/Classes/System/IO/StreamWriter.ab	(revision 467)
+++ trunk/Include/Classes/System/IO/StreamWriter.ab	(revision 468)
@@ -4,5 +4,98 @@
 	
 Class StreamWriter
-	' TODO: 実装
+	Inherits TextWriter
+Public
+	/*
+	@date 2008/02/25
+	@auther Egtra
+	*/
+	Sub StreamWriter(path As String)
+		init(New FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
+	End Sub
+
+	/*
+	@date 2008/02/25
+	@auther Egtra
+	*/
+	Sub StreamWriter(stream As Stream)
+		init(stream)
+	End Sub
+
+	Override Sub Write(str As String)
+		buf.Append(str)
+		Dim len = buf.Length
+		If len >= 2048 Then
+			s.Write(StrPtr(buf) As *Byte, 0, len)
+			buf.Length = 0
+		End If
+	End Sub
+
+	Override Sub Write(x As Boolean)
+		buf.Append(x)
+	End Sub
+	
+	Override Sub Write(x As Char)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Byte)
+		buf.Append(x)
+	End Sub
+#ifdef UNICODE
+	Override Sub Write(x As SByte)
+		buf.Append(x)
+	End Sub
+#else
+	Override Sub Write(x As Word)
+		buf.Append(x)
+	End Sub
+#endif
+	Override Sub Write(x As Integer)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As DWord)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Long)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As QWord)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Int64)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Single)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Double)
+		buf.Append(x)
+	End Sub
+
+	Override Sub Write(x As Object)
+		Write(x.ToString)
+	End Sub
+
+Protected
+	Override Sub Dispose(disposing As Boolean)
+		If disposing Then
+			s.Dispose()
+		End If
+	End Sub
+
+Private
+	Sub init(stream As Stream)
+		s = stream
+		buf = New System.Text.StringBuilder(4096)
+	End Sub
+
+	buf As Text.StringBuilder
+	s As System.IO.Stream
 End Class
 
Index: trunk/Include/Classes/System/IO/TextReader.ab
===================================================================
--- trunk/Include/Classes/System/IO/TextReader.ab	(revision 467)
+++ trunk/Include/Classes/System/IO/TextReader.ab	(revision 468)
@@ -101,5 +101,6 @@
 
 Protected
-	Abstract Sub Dispose(disposing As Boolean)
+	Virtual Sub Dispose(disposing As Boolean)
+	End Sub
 
 	/*
Index: trunk/Include/Classes/System/IO/TextWriter.ab
===================================================================
--- trunk/Include/Classes/System/IO/TextWriter.ab	(revision 468)
+++ trunk/Include/Classes/System/IO/TextWriter.ab	(revision 468)
@@ -0,0 +1,184 @@
+'Classes/System/IO/TextWriter.ab
+
+Namespace System
+Namespace IO
+
+/*
+@brief テキスト書き込みの抽象基底クラス
+@date 2007/03/05
+@auther Egtra
+*/
+Class TextWriter
+Public
+	Virtual Sub ~TextWriter()
+		Dispose(False)
+	End Sub
+
+'	Static Null = StreamWriter.Null As StreamWriter
+
+Public
+	Sub Close()
+		Dispose(True)
+	End Sub
+
+	Sub Dispose()
+		Dispose(True)
+	End Sub
+
+	Sub TextWriter()
+		newLine = Environment.NewLine
+	End Sub
+
+	Abstract Sub Write(s As String)
+	Virtual Sub Write(x As Boolean)
+		Write(Str$(x))
+	End Sub
+	
+	Virtual Sub Write(x As Char)
+		Write(Chr$(x))
+	End Sub
+
+	Virtual Sub Write(x As Byte)
+		Write(Str$(x))
+	End Sub
+#ifdef UNICODE
+	Virtual Sub Write(x As SByte)
+		Write(Str$(x))
+	End Sub
+#else
+	Virtual Sub Write(x As Word)
+		Write(Str$(x))
+	End Sub
+#endif
+	Virtual Sub Write(x As Integer)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As DWord)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As Long)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As QWord)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As Int64)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As Single)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As Double)
+		Write(Str$(x))
+	End Sub
+
+	Virtual Sub Write(x As Object)
+		Write(x.ToString)
+	End Sub
+
+	Sub WriteLine()
+		Write(newLine)
+	End Sub
+
+	Sub WriteLine(s As String)
+		Write(s)
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Boolean)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+	
+	Sub WriteLine(x As Char)
+		Write(Chr$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Byte)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+#ifdef UNICODE
+	Sub WriteLine(x As SByte)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+#else
+	Sub WriteLine(x As Word)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+#endif
+	Sub WriteLine(x As Integer)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As DWord)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Long)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As QWord)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Int64)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Single)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Double)
+		Write(Str$(x))
+		WriteLine()
+	End Sub
+
+	Sub WriteLine(x As Object)
+		Write(x.ToString)
+		WriteLine()
+	End Sub
+
+	/*
+	@brief 改行文字の設定
+	@date 2007/03/05
+	@auther Egtra
+	*/
+	Sub NewLine(n As String)
+		newLine = n
+	End Sub
+	/*
+	@brief 改行文字の取得
+	@date 2007/03/05
+	@auther Egtra
+	*/
+	Function NewLine() As String
+	End Function
+
+Protected
+	Virtual Sub Dispose(disposing As Boolean)
+	End Sub
+
+Private
+	newLine As String
+End Class
+
+End Namespace
+End Namespace
Index: trunk/Include/Classes/System/String.ab
===================================================================
--- trunk/Include/Classes/System/String.ab	(revision 467)
+++ trunk/Include/Classes/System/String.ab	(revision 468)
@@ -5,30 +5,19 @@
 #require <Classes/ActiveBasic/Strings/Strings.ab>
 
-#ifdef __STRING_IS_NOT_ALWAYS_UNICODE
-
-#ifndef UNICODE
 TypeDef StrChar = Char
-#define __STRING_IS_NOT_UNICODE
-#endif
-
-#endif
-
-#ifndef __STRING_IS_NOT_UNICODE
-TypeDef StrChar = WCHAR
 
 #ifdef UNICODE
 #define __STRING_IS_UNICODE
 #else
-#define __STRING_UNICODE_WINDOWS_ANSI
+#define __STRING_IS_NOT_UNICODE
 #endif
-#endif
 
 Namespace System
 
 	Class String
-		Implements /*IComparable, ICloneable, IConvertible, IComparable<String>, IEnumerable, IEnumerable<StrChar>, IEquatable<String>*/
+		Implements /*IComparable, ICloneable, IConvertible, IComparable<String>, IEnumerable, IEnumerable<Char>, IEquatable<String>*/
 
 		m_Length As Long
-		Chars As *StrChar
+		Chars As *Char
 
 		Sub validPointerCheck(p As VoidPtr, size = 1 As Long)
@@ -89,5 +78,5 @@
 		End Sub
 
-		Sub String(initChar As StrChar, length As Long)
+		Sub String(initChar As Char, length As Long)
 			AllocStringBuffer(length)
 			ActiveBasic.Strings.ChrFill(Chars, length, initChar)
@@ -105,9 +94,9 @@
 		End Function
 
-		Function Operator() As *StrChar
+		Function Operator() As *Char
 			Return Chars
 		End Function
 
-		Const Function Operator [] (n As Long) As StrChar
+		Const Function Operator [] (n As Long) As Char
 			rangeCheck(n)
 			Return Chars[n]
@@ -154,5 +143,5 @@
 		End Function
 
-		Const Function Operator == (y As *StrChar) As Boolean
+		Const Function Operator == (y As *Char) As Boolean
 			Return Compare(This, y) = 0
 		End Function
@@ -162,5 +151,5 @@
 		End Function
 
-		Const Function Operator <> (y As *StrChar) As Boolean
+		Const Function Operator <> (y As *Char) As Boolean
 			Return Compare(This, y) <> 0
 		End Function
@@ -170,5 +159,5 @@
 		End Function
 
-		Const Function Operator < (y As *StrChar) As Boolean
+		Const Function Operator < (y As *Char) As Boolean
 			Return Compare(This, y) < 0
 		End Function
@@ -178,5 +167,5 @@
 		End Function
 
-		Const Function Operator > (y As *StrChar) As Boolean
+		Const Function Operator > (y As *Char) As Boolean
 			Return Compare(This, y) > 0
 		End Function
@@ -186,5 +175,5 @@
 		End Function
 
-		Const Function Operator <= (y As *StrChar) As Boolean
+		Const Function Operator <= (y As *Char) As Boolean
 			Return Compare(This, y) <= 0
 		End Function
@@ -194,5 +183,5 @@
 		End Function
 
-		Const Function Operator >= (y As *StrChar) As Boolean
+		Const Function Operator >= (y As *Char) As Boolean
 			Return Compare(This, y) >= 0
 		End Function
@@ -217,13 +206,13 @@
 		End Function
 	Private
-		Static Function Compare(x As String, y As *StrChar) As Long
+		Static Function Compare(x As String, y As *Char) As Long
 			Return CompareOrdinal(x, y)
 		End Function
 
-		Static Function CompareOrdinal(x As String, y As *StrChar) As Long
+		Static Function CompareOrdinal(x As String, y As *Char) As Long
 			Return CompareOrdinal(StrPtr(x), y)
 		End Function
 
-		Static Function CompareOrdinal(x As *StrChar, y As *StrChar) As Long
+		Static Function CompareOrdinal(x As *Char, y As *Char) As Long
 			If x = 0 Then
 				If y = 0 Then
@@ -238,5 +227,5 @@
 		End Function
 
-		Static Function CompareOrdinal(x As *StrChar, indexX As Long, y As *StrChar, indexY As Long, length As Long) As Long
+		Static Function CompareOrdinal(x As *Char, indexX As Long, y As *Char, indexY As Long, length As Long) As Long
 			If x = 0 Then
 				If y = 0 Then
@@ -273,5 +262,5 @@
 		End Function
 
-		Const Function StrPtr() As *StrChar
+		Const Function StrPtr() As *Char
 			Return Chars
 		End Function
@@ -280,5 +269,5 @@
 		Sub Assign(text As PCSTR, textLengthA As Long)
 #ifdef __STRING_IS_NOT_UNICODE
-			AssignFromStrChar(text, textLengthA)
+			AssignFromCharPtr(text, textLengthA)
 #else
 			Dim textLengthW = MultiByteToWideChar(CP_THREAD_ACP, 0, text, textLengthA, 0, 0)
@@ -298,12 +287,12 @@
 			End If
 #else
-			AssignFromStrChar(text, textLengthW)
+			AssignFromCharPtr(text, textLengthW)
 #endif
 		End Sub
 
 	Private
-		Static Function ConcatStrChar(text1 As *StrChar, text1Length As Long, text2 As *StrChar, text2Length As Long) As String
-			ConcatStrChar = New String()
-			With ConcatStrChar
+		Static Function ConcatChar(text1 As *Char, text1Length As Long, text2 As *Char, text2Length As Long) As String
+			ConcatChar = New String()
+			With ConcatChar
 				.AllocStringBuffer(text1Length + text2Length)
 				ActiveBasic.Strings.ChrCopy(.Chars, text1, text1Length As SIZE_T)
@@ -315,5 +304,5 @@
 		Const Function Concat(text As PCSTR, len As Long) As String
 #ifdef __STRING_IS_NOT_UNICODE
-			Return ConcatStrChar(This.Chars, m_Length, text, len)
+			Return ConcatChar(This.Chars, m_Length, text, len)
 #else
 			With Concat
@@ -339,5 +328,5 @@
 			End With
 #else
-			Return ConcatStrChar(This.Chars, m_Length, text, len)
+			Return ConcatChar(This.Chars, m_Length, text, len)
 #endif
 		End Function
@@ -375,5 +364,5 @@
 		End Function
 
-		Const Function Contains(c As StrChar) As Boolean
+		Const Function Contains(c As Char) As Boolean
 			Return IndexOf(c) >= 0
 		End Function
@@ -389,19 +378,19 @@
 		End Function
 
-		Const Function IndexOf(c As StrChar) As Long
+		Const Function IndexOf(c As Char) As Long
 			Return indexOfCore(c, 0, m_Length)
 		End Function
 
-		Const Function IndexOf(c As StrChar, start As Long) As Long
+		Const Function IndexOf(c As Char, start As Long) As Long
 			rangeCheck(start)
 			Return indexOfCore(c, start, m_Length - start)
 		End Function
 
-		Const Function IndexOf(c As StrChar, start As Long, count As Long) As Long
+		Const Function IndexOf(c As Char, start As Long, count As Long) As Long
 			rangeCheck(start, count)
 			Return indexOfCore(c, start, count)
 		End Function
 	Private
-		Const Function indexOfCore(c As StrChar, start As Long, count As Long) As Long
+		Const Function indexOfCore(c As Char, start As Long, count As Long) As Long
 			indexOfCore = ActiveBasic.Strings.ChrFind(VarPtr(Chars[start]), count, c) As Long
 			If indexOfCore <> -1 Then
@@ -440,14 +429,14 @@
 		End Function
 
-		Const Function LastIndexOf(c As StrChar) As Long
+		Const Function LastIndexOf(c As Char) As Long
 			Return lastIndexOf(c, m_Length - 1, m_Length)
 		End Function
 
-		Const Function LastIndexOf(c As StrChar, start As Long) As Long
+		Const Function LastIndexOf(c As Char, start As Long) As Long
 			rangeCheck(start)
 			Return lastIndexOf(c, start, start + 1)
 		End Function
 
-		Const Function LastIndexOf(c As StrChar, start As Long, count As Long) As Long
+		Const Function LastIndexOf(c As Char, start As Long, count As Long) As Long
 			rangeCheck(start)
 			Dim lastFindPos = start - (count - 1)
@@ -458,5 +447,5 @@
 		End Function
 	Private
-		Const Function lastIndexOf(c As StrChar, start As Long, count As Long) As Long
+		Const Function lastIndexOf(c As Char, start As Long, count As Long) As Long
 			Dim lastFindPos = start - (count - 1)
 			Dim i As Long
@@ -504,5 +493,5 @@
 		End Function
 
-		Const Function StartsWith(c As StrChar) As Boolean
+		Const Function StartsWith(c As Char) As Boolean
 			Return IndexOf(c) = 0
 		End Function
@@ -512,5 +501,5 @@
 		End Function
 
-		Const Function EndsWith(c As StrChar) As Boolean
+		Const Function EndsWith(c As Char) As Boolean
 			Return LastIndexOf(c) = m_Length - 1
 		End Function
@@ -556,5 +545,5 @@
 		End Function
 
-		Const Function Replace(oldChar As StrChar, newChar As StrChar) As String
+		Const Function Replace(oldChar As Char, newChar As Char) As String
 			Dim sb = New Text.StringBuilder(This)
 			sb.Replace(oldChar, newChar)
@@ -604,5 +593,5 @@
 		End Function
 
-		Sub CopyTo(sourceIndex As Long, destination As *StrChar, destinationIndex As Long, count As Long)
+		Sub CopyTo(sourceIndex As Long, destination As *Char, destinationIndex As Long, count As Long)
 			ActiveBasic.Strings.ChrCopy(VarPtr(destination[destinationIndex]), VarPtr(Chars[sourceIndex]), count As SIZE_T)
 		End Sub
@@ -618,8 +607,8 @@
 
 		Function PadLeft(total As Long) As String
-			PadLeft(total, &h30 As StrChar)
-		End Function
-
-		Function PadLeft(total As Long, c As StrChar) As String
+			PadLeft(total, &h30 As Char)
+		End Function
+
+		Function PadLeft(total As Long, c As Char) As String
 			If total < 0 Then
 				Throw New ArgumentOutOfRangeException("String.PadLeft: An arguments is out of range value.", "total")
@@ -635,8 +624,8 @@
 
 		Function PadRight(total As Long) As String
-			PadRight(total, &h30 As StrChar)
-		End Function
-
-		Function PadRight(total As Long, c As StrChar) As String
+			PadRight(total, &h30 As Char)
+		End Function
+
+		Function PadRight(total As Long, c As Char) As String
 			If total < 0 Then
 				Throw New ArgumentOutOfRangeException("String.PadRight: An arguments is out of range value.", "total")
@@ -651,9 +640,9 @@
 		End Function
 	Private
-		Function AllocStringBuffer(textLength As Long) As *StrChar
+		Function AllocStringBuffer(textLength As Long) As *Char
 			If textLength < 0 Then
 				Return 0
 			End If
-			AllocStringBuffer = GC_malloc_atomic(SizeOf(StrChar) * (textLength + 1))
+			AllocStringBuffer = GC_malloc_atomic(SizeOf(Char) * (textLength + 1))
 			If AllocStringBuffer = 0 Then
 				'Throw New OutOfMemoryException
@@ -663,5 +652,5 @@
 		End Function
 
-		Sub AssignFromStrChar(text As *StrChar, textLength As Long)
+		Sub AssignFromCharPtr(text As *Char, textLength As Long)
 			AllocStringBuffer(textLength)
 			ActiveBasic.Strings.ChrCopy(Chars, text, textLength As SIZE_T)
Index: trunk/Include/Classes/System/Text/StringBuilder.ab
===================================================================
--- trunk/Include/Classes/System/Text/StringBuilder.ab	(revision 467)
+++ trunk/Include/Classes/System/Text/StringBuilder.ab	(revision 468)
@@ -40,5 +40,5 @@
 	End Function
 
-	Function Append(x As StrChar) As StringBuilder
+	Function Append(x As Char) As StringBuilder
 		EnsureCapacity(size + 1)
 		separateBuffer()
@@ -47,54 +47,52 @@
 		Return This
 	End Function
-
-#ifdef __STRING_IS_NOT_UNICODE
+#ifdef UNICODE
+	Function Append(x As SByte) As StringBuilder
+		ActiveBasic.Strings.Detail.FormatIntegerD(This, x, DWORD_MAX, 0, 0)
+		Return This
+	End Function
+#endif
+	Function Append(x As Byte) As StringBuilder
+		ActiveBasic.Strings.Detail.FormatIntegerU(This, x, DWORD_MAX, 0, 0)
+		Return This
+	End Function
+
+	Function Append(x As Integer) As StringBuilder
+		ActiveBasic.Strings.Detail.FormatIntegerD(This, x, DWORD_MAX, 0, 0)
+		Return This
+	End Function
+#ifndef UNICODE
 	Function Append(x As Word) As StringBuilder
-		Append(Str$(x As DWord))
-		Return This
-	End Function
-#else
-	Function Append(x As SByte) As StringBuilder
-		Append(Str$(x As Long))
+		ActiveBasic.Strings.Detail.FormatIntegerU(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 #endif
-	
-	Function Append(x As Byte) As StringBuilder
-		Append(Str$(x As DWord))
-		Return This
-	End Function
-
-	Function Append(x As Integer) As StringBuilder
-		Append(Str$(x As Long))
-		Return This
-	End Function
-
 	Function Append(x As Long) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatIntegerD(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 
 	Function Append(x As DWord) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatIntegerU(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 
 	Function Append(x As Int64) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatIntegerLD(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 
 	Function Append(x As QWord) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatIntegerLU(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 
 	Function Append(x As Single) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatFloatG(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
 
 	Function Append(x As Double) As StringBuilder
-		Append(Str$(x))
+		ActiveBasic.Strings.Detail.FormatFloatG(This, x, DWORD_MAX, 0, 0)
 		Return This
 	End Function
@@ -105,5 +103,5 @@
 	End Function
 
-	Function Append(c As StrChar, n As Long) As StringBuilder
+	Function Append(c As Char, n As Long) As StringBuilder
 		EnsureCapacity(size + n)
 		ActiveBasic.Strings.ChrFill(VarPtr(chars[size]), n As SIZE_T, c)
@@ -123,5 +121,5 @@
 	End Function
 
-	Function Append(s As *StrChar, startIndex As Long, count As Long) As StringBuilder
+	Function Append(s As *Char, startIndex As Long, count As Long) As StringBuilder
 		If s = 0 Then
 			If startIndex = 0 And count = 0 Then
@@ -137,5 +135,5 @@
 	End Function
 Private
-	Sub appendCore(s As *StrChar, start As Long, count As Long)
+	Sub appendCore(s As *Char, start As Long, count As Long)
 		EnsureCapacity(size + count)
 		separateBuffer()
@@ -167,5 +165,5 @@
 	End Function
 
-	Const Sub CopyTo(sourceIndex As Long, ByRef dest[] As StrChar, destIndex As Long, count As Long)
+	Const Sub CopyTo(sourceIndex As Long, ByRef dest[] As Char, destIndex As Long, count As Long)
 		If dest = 0 Then
 			Throw New ArgumentNullException("StringBuilder.CopyTo: An argument is null", "sourceIndex")
@@ -174,5 +172,5 @@
 		End If
 
-		memcpy(VarPtr(dest[destIndex]), VarPtr(chars[sourceIndex]), count * SizeOf (StrChar))
+		memcpy(VarPtr(dest[destIndex]), VarPtr(chars[sourceIndex]), count * SizeOf (Char))
 	End Sub
 
@@ -181,5 +179,5 @@
 			Throw New ArgumentOutOfRangeException("StringBuilder.Append: An argument is out of range value.", "c")
 		ElseIf c > Capacity Then
-			Dim p = GC_malloc_atomic((c + 1) * SizeOf (StrChar)) As *StrChar
+			Dim p = GC_malloc_atomic((c + 1) * SizeOf (Char)) As *Char
 			ActiveBasic.Strings.ChrCopy(p, chars, size As SIZE_T)
 			chars = p
@@ -212,5 +210,5 @@
 	End Function
 
-	Function Insert(i As Long, x As StrChar) As StringBuilder
+	Function Insert(i As Long, x As Char) As StringBuilder
 		Insert(i, VarPtr(x), 0, 1)
 		Return This
@@ -303,5 +301,5 @@
 	End Function
 
-	Function Insert(i As Long, x As *StrChar, index As Long, count As Long) As StringBuilder
+	Function Insert(i As Long, x As *Char, index As Long, count As Long) As StringBuilder
 		rangeCheck(i)
 		If x = 0 Then
@@ -342,5 +340,5 @@
 	End Function
 
-	Function Replace(oldChar As StrChar, newChar As StrChar) As StringBuilder
+	Function Replace(oldChar As Char, newChar As Char) As StringBuilder
 		replaceCore(oldChar, newChar, 0, size)
 		Return This
@@ -352,5 +350,5 @@
 	End Function
 
-	Function Replace(oldChar As StrChar, newChar As StrChar, startIndex As Long, count As Long) As StringBuilder
+	Function Replace(oldChar As Char, newChar As Char, startIndex As Long, count As Long) As StringBuilder
 		rangeCheck(startIndex, count)
 		replaceCore(oldChar, newChar, startIndex, count)
@@ -364,5 +362,5 @@
 	End Function
 Private
-	Sub replaceCore(oldChar As StrChar, newChar As StrChar, start As Long, count As Long)
+	Sub replaceCore(oldChar As Char, newChar As Char, start As Long, count As Long)
 		separateBuffer()
 		Dim i As Long
@@ -386,5 +384,5 @@
 		Dim last = start + count
 		Do
-			Dim nextPos = ActiveBasic.Strings.ChrFind(VarPtr(chars[curPos]) As *StrChar, size As SIZE_T, StrPtr(oldStr), oldStr.Length As SIZE_T) As Long
+			Dim nextPos = ActiveBasic.Strings.ChrFind(VarPtr(chars[curPos]) As *Char, size As SIZE_T, StrPtr(oldStr), oldStr.Length As SIZE_T) As Long
 			If nextPos = -1 As SIZE_T Or curPos > last Then
 				s.appendCore(chars, curPos, size - curPos)
@@ -411,9 +409,9 @@
 	End Function
 
-	Const Function Operator [](i As Long) As StrChar
+	Const Function Operator [](i As Long) As Char
 		Return Chars[i]
 	End Function
 
-	Sub Operator []=(i As Long, c As StrChar)
+	Sub Operator []=(i As Long, c As Char)
 		Chars[i] = c
 	End Sub
@@ -431,5 +429,5 @@
 	End Sub
 
-	Const Function Chars(i As Long) As StrChar
+	Const Function Chars(i As Long) As Char
 		If i >= Length Or i < 0 Then
 			Throw New IndexOutOfRangeException("StringBuilder.Chars: The index argument 'i' is out of range value.")
@@ -438,5 +436,5 @@
 	End Function
 
-	Sub Chars(i As Long, c As StrChar)
+	Sub Chars(i As Long, c As Char)
 		If i >= Length Or i < 0 Then
 			Throw New ArgumentOutOfRangeException("StringBuilder.Chars: An argument is out of range value.", "i")
@@ -452,5 +450,5 @@
 		EnsureCapacity(i) 'iが適切な値かどうかの確認はこの中で行う
 		If size < i Then
-			ActiveBasic.Strings.ChrFill(VarPtr(chars[size]), (i - size + 1) As SIZE_T, 0 As StrChar)
+			ActiveBasic.Strings.ChrFill(VarPtr(chars[size]), (i - size + 1) As SIZE_T, 0 As Char)
 		End If
 		size = i
@@ -461,5 +459,5 @@
 	End Function
 
-	Function __Chars() As *StrChar
+	Function __Chars() As *Char
 		Return chars
 	End Function
@@ -483,5 +481,5 @@
 		This.maxCapacity = maxCapacity
 		This.size = 0
-		This.chars = GC_malloc_atomic((This.capacity + 1) * SizeOf (StrChar))
+		This.chars = GC_malloc_atomic((This.capacity + 1) * SizeOf (Char))
 	End Sub
 
@@ -516,5 +514,5 @@
 	Sub separateBuffer()
 		If stringized Then
-			Dim newChars = GC_malloc_atomic(SizeOf (StrChar) * capacity) As *StrChar
+			Dim newChars = GC_malloc_atomic(SizeOf (Char) * capacity) As *Char
 			ActiveBasic.Strings.ChrCopy(newChars, chars, capacity As SIZE_T)
 			chars = newChars
@@ -523,5 +521,5 @@
 	End Sub
 
-	chars As *StrChar
+	chars As *Char
 	maxCapacity As Long
 	capacity As Long
@@ -534,5 +532,5 @@
 
 '暫定
-Function StrPtr(sb As System.Text.StringBuilder) As *StrChar
+Function StrPtr(sb As System.Text.StringBuilder) As *Char
 	Return sb.__Chars
 End Function
Index: trunk/Include/Classes/System/Xml/XmlDocument.ab
===================================================================
--- trunk/Include/Classes/System/Xml/XmlDocument.ab	(revision 467)
+++ trunk/Include/Classes/System/Xml/XmlDocument.ab	(revision 468)
@@ -136,4 +136,12 @@
 		Save( fileStream )
 	End Sub
+
+	/*!
+	@brief	指定したテキストライタにXML文書を保存する。
+	@param	テキストライタ。
+	*/
+	Virtual Sub Save( writer As System.IO.TextWriter )
+		writer.Write(InnerXmlSupportedIndent( True ))
+	End Sub
 End Class
 
Index: trunk/Include/Classes/System/misc.ab
===================================================================
--- trunk/Include/Classes/System/misc.ab	(revision 467)
+++ trunk/Include/Classes/System/misc.ab	(revision 468)
@@ -1,8 +1,3 @@
 ' Classes/System/misc.ab
-
-#ifndef __SYSTEM_MISC_AB__
-#define __SYSTEM_MISC_AB__
-
-'#require <Classes/System/Threading/WaitHandle.ab>
 
 Namespace System
@@ -36,9 +31,7 @@
 End Class
 
+Delegate Sub EventHandler(sender As Object, e As EventArgs)
+
 Delegate Sub AsyncCallback(ar As IAsyncResult)
 
-
 End Namespace 'System
-#require <Classes/System/Threading/WaitHandle.ab>
-
-#endif '__SYSTEM_MISC_AB__
Index: trunk/Include/Classes/index.ab
===================================================================
--- trunk/Include/Classes/index.ab	(revision 467)
+++ trunk/Include/Classes/index.ab	(revision 468)
@@ -68,4 +68,5 @@
 #require "./System/IO/Stream.ab"
 #require "./System/IO/TextReader.ab"
+#require "./System/IO/TextWriter.ab"
 #require "./System/IO/StreamReader.ab"
 #require "./System/IO/StringReader.ab"
