Selaa lähdekoodia

TStringBuilder usage improvements.

Brucey 5 vuotta sitten
vanhempi
commit
cf0bd85b93
2 muutettua tiedostoa jossa 52 lisäystä ja 49 poistoa
  1. 30 28
      format.mod/format.bmx
  2. 22 21
      format.mod/glue.c

+ 30 - 28
format.mod/format.bmx

@@ -25,11 +25,13 @@ bbdoc: String Formatter
 End Rem
 Module Text.Format
 
-ModuleInfo "Version: 1.03"
+ModuleInfo "Version: 1.04"
 ModuleInfo "License: MIT"
 ModuleInfo "Copyright: 2007-2020 Bruce A Henderson"
 ModuleInfo "Modserver: BRL"
 
+ModuleInfo "History: 1.04"
+ModuleInfo "History: TStringBuilder usage improvements."
 ModuleInfo "History: 1.03"
 ModuleInfo "History: Updated for inclusion into NG/BRL."
 ModuleInfo "History: 1.02"
@@ -50,15 +52,15 @@ Import "glue.c"
 
 Private
 Extern
-	Function bmx_sprintf_string:String(format:Byte Ptr, value:String)
-	Function bmx_sprintf_float:String(format:Byte Ptr, value:Float)
-	Function bmx_sprintf_int:String(format:Byte Ptr, value:Int)
-	Function bmx_sprintf_uint:String(format:Byte Ptr, value:UInt)
-	Function bmx_sprintf_double:String(format:Byte Ptr, value:Double)
-	Function bmx_sprintf_long:String(format:Byte Ptr, value:Long)
-	Function bmx_sprintf_ulong:String(format:Byte Ptr, value:ULong)
-	Function bmx_sprintf_sizet:String(format:Byte Ptr, value:Size_T)
-	Function bmx_sprintf_ptr:String(format:Byte Ptr, value:Byte Ptr)
+	Function bmx_sprintf_string(format:Byte Ptr, value:String, sb:Byte Ptr)
+	Function bmx_sprintf_float(format:Byte Ptr, value:Float, sb:Byte Ptr)
+	Function bmx_sprintf_int(format:Byte Ptr, value:Int, sb:Byte Ptr)
+	Function bmx_sprintf_uint(format:Byte Ptr, value:UInt, sb:Byte Ptr)
+	Function bmx_sprintf_double(format:Byte Ptr, value:Double, sb:Byte Ptr)
+	Function bmx_sprintf_long(format:Byte Ptr, value:Long, sb:Byte Ptr)
+	Function bmx_sprintf_ulong(format:Byte Ptr, value:ULong, sb:Byte Ptr)
+	Function bmx_sprintf_sizet(format:Byte Ptr, value:Size_T, sb:Byte Ptr)
+	Function bmx_sprintf_ptr(format:Byte Ptr, value:Byte Ptr, sb:Byte Ptr)
 End Extern
 Public
 
@@ -290,8 +292,10 @@ Public
 	bbdoc: Processes and returns the formatted string.
 	returns: The formatted String.
 	End Rem
-	Method Format:String()
-		Local sb:TStringBuilder = New TStringBuilder
+	Method Format:String(sb:TStringBuilder = Null)
+		If Not sb Then
+			sb = New TStringBuilder
+		End If
 
 		Local arg:Int = 0
 		
@@ -306,14 +310,14 @@ Public
 						sb.Append("%")
 					Else
 						If (Not fpart.invalid) And (args And arg < argCount) Then
-							sb.Append(fpart.processArg(args[arg]))
+							fpart.processArg(args[arg], sb)
 							' next arg only if this was a "real" arg format
 							If fpart.formatType <> TFormattingText.FTYPE_LINEBREAK Then
 								arg:+ 1
 							End If
 						Else	
 							If Not fpart.invalid Then
-								sb.Append(fpart.processArg(New TNullArg))
+								fpart.processArg(New TNullArg, sb)
 							Else
 								sb.Append(part.ToString())
 							End If
@@ -397,35 +401,33 @@ Type TFormattingText Extends TStringFormatPart
 		formatPtr = formatText.ToCString()
 	End Method
 	
-	Method ProcessArg:String(arg:TArg)
-		Local s:String
+	Method ProcessArg(arg:TArg, sb:TStringBuilder)
 
 		Select arg.ArgType()
 			Case TArg.ARG_STRING
-				s = bmx_sprintf_string(formatText, TStringArg(arg).value)
+				bmx_sprintf_string(formatText, TStringArg(arg).value, sb.buffer)
 			Case TArg.ARG_INT
-				s = bmx_sprintf_int(formatText, TIntArg(arg).value)
+				bmx_sprintf_int(formatText, TIntArg(arg).value, sb.buffer)
 			Case TArg.ARG_UINT
-				s = bmx_sprintf_uint(formatText, TUIntArg(arg).value)
+				bmx_sprintf_uint(formatText, TUIntArg(arg).value, sb.buffer)
 			Case TArg.ARG_FLOAT
-					s = bmx_sprintf_float(formatText, TFloatArg(arg).value)
+				bmx_sprintf_float(formatText, TFloatArg(arg).value, sb.buffer)
 			Case TArg.ARG_DOUBLE
-				s = bmx_sprintf_double(formatText, TDoubleArg(arg).value)
+				bmx_sprintf_double(formatText, TDoubleArg(arg).value, sb.buffer)
 			Case TArg.ARG_LONG
-				s = bmx_sprintf_long(formatText, TLongArg(arg).value)
+				bmx_sprintf_long(formatText, TLongArg(arg).value, sb.buffer)
 			Case TArg.ARG_ULONG
-				s = bmx_sprintf_ulong(formatText, TULongArg(arg).value)
+				bmx_sprintf_ulong(formatText, TULongArg(arg).value, sb.buffer)
 			Case TArg.ARG_SIZET
-				s = bmx_sprintf_sizet(formatText, TSizeTArg(arg).value)
+				bmx_sprintf_sizet(formatText, TSizeTArg(arg).value, sb.buffer)
 			Case TArg.ARG_SHORT
-				s = bmx_sprintf_int(formatText, Int(TShortArg(arg).value))
+				bmx_sprintf_int(formatText, Int(TShortArg(arg).value), sb.buffer)
 			Case TArg.ARG_BYTE
-				s = bmx_sprintf_int(formatText, Int(TByteArg(arg).value))
+				bmx_sprintf_int(formatText, Int(TByteArg(arg).value), sb.buffer)
 			Case TArg.ARG_PTR
-				s = bmx_sprintf_ptr(formatText, TPtrArg(arg).value)
+				bmx_sprintf_ptr(formatText, TPtrArg(arg).value, sb.buffer)
 		End Select
 
-		Return s
 	End Method
 
 	Method ToString:String()

+ 22 - 21
format.mod/glue.c

@@ -21,59 +21,60 @@
 */ 
 
 #include <brl.mod/blitz.mod/blitz.h>
+#include "brl.mod/stringbuilder.mod/glue.h"
 
-BBString * bmx_sprintf_string(const char * format, BBString * value) {
+void bmx_sprintf_string(const char * format, BBString * value, struct MaxStringBuilder * buf) {
+	char vbuffer[2048];
+	bmx_stringbuilder_toutf8_buffer(value, vbuffer, sizeof(vbuffer));
 	char buffer[2048];
-	char *p = bbStringToUTF8String( value );
-	snprintf(buffer, sizeof(buffer), format, p);
-	bbMemFree( p );
-	return bbStringFromUTF8String(buffer);
+	snprintf(buffer, sizeof(buffer), format, vbuffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_float(const char * format, float value) {
+void bmx_sprintf_float(const char * format, float value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_int(const char * format, int value) {
+void bmx_sprintf_int(const char * format, int value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_uint(const char * format, unsigned int value) {
+void bmx_sprintf_uint(const char * format, unsigned int value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_double(const char * format, double value) {
+void bmx_sprintf_double(const char * format, double value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_long(const char * format, BBInt64 value) {
+void bmx_sprintf_long(const char * format, BBInt64 value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_ulong(const char * format, BBUInt64 value) {
+void bmx_sprintf_ulong(const char * format, BBUInt64 value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_sizet(const char * format, BBSIZET value) {
+void bmx_sprintf_sizet(const char * format, BBSIZET value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }
 
-BBString * bmx_sprintf_ptr(const char * format, void * value) {
+void bmx_sprintf_ptr(const char * format, void * value, struct MaxStringBuilder * buf) {
 	char buffer[2048];
 	snprintf(buffer, sizeof(buffer), format, value);
-	return bbStringFromCString(buffer);
+	bmx_stringbuilder_append_utf8string(buf, buffer);
 }