woollybah 5 лет назад
Родитель
Сommit
036e8b7a04
3 измененных файлов с 35 добавлено и 4 удалено
  1. 1 0
      stringbuilder.mod/common.bmx
  2. 17 0
      stringbuilder.mod/glue.c
  3. 17 4
      stringbuilder.mod/stringbuilder.bmx

+ 1 - 0
stringbuilder.mod/common.bmx

@@ -67,6 +67,7 @@ Extern
 	Function bmx_stringbuilder_rightalign(buffer:Byte Ptr, length:Int)
 	Function bmx_stringbuilder_toutf8string:Byte Ptr(buffer:Byte Ptr)
 	Function bmx_stringbuilder_towstring:Short Ptr(buffer:Byte Ptr)
+	Function bmx_stringbuilder_join_strings(buffer:Byte Ptr, bits:String[], joiner:String)
 	
 	Function bmx_stringbuilder_splitbuffer_length:Int(splitPtr:Byte Ptr)
 	Function bmx_stringbuilder_splitbuffer_text:String(splitPtr:Byte Ptr, index:Int)

+ 17 - 0
stringbuilder.mod/glue.c

@@ -358,6 +358,23 @@ void bmx_stringbuilder_join(struct MaxStringBuilder * buf, BBArray * bits, struc
 	}
 }
 
+void bmx_stringbuilder_join_strings(struct MaxStringBuilder * buf, BBArray * bits, BBString * joiner) {
+	if (bits == &bbEmptyArray) {
+		return;
+	}
+
+	int i;
+	int n_bits = bits->scales[0];
+	int n = joiner->length;
+	BBString **p = (BBString**)BBARRAYDATA( bits,1 );
+	for(i = 0; i < n_bits; ++i) {
+		if (i && n) {
+			bmx_stringbuilder_append_string(buf, joiner);
+		}
+		bmx_stringbuilder_append_string(buf, *p++);
+	}
+}
+
 struct MaxSplitBuffer * bmx_stringbuilder_split(struct MaxStringBuilder * buf, BBString * separator) {
 	struct MaxSplitBuffer * splitBuffer = malloc(sizeof(struct MaxSplitBuffer));
 	splitBuffer->buffer = buf;

+ 17 - 4
stringbuilder.mod/stringbuilder.bmx

@@ -23,10 +23,12 @@ bbdoc: A string builder.
 End Rem	
 Module BRL.StringBuilder
 
-ModuleInfo "Version: 1.09"
+ModuleInfo "Version: 1.10"
 ModuleInfo "License: zlib/libpng"
 ModuleInfo "Copyright: 2018-2019 Bruce A Henderson"
 
+ModuleInfo "History: 1.10"
+ModuleInfo "History: Added JoinStrings() method."
 ModuleInfo "History: 1.09"
 ModuleInfo "History: Added ToUTF8String() and ToWString() methods."
 ModuleInfo "History: 1.08"
@@ -479,14 +481,25 @@ Public
 	
 	Rem
 	bbdoc: Joins @bits together by inserting this string builder between each bit.
-	returns: A new TStringBuilder object.
+	returns: @buf or a new TStringBuilder object of @buf is #Null.
+	about: Optionally accepts a preassigned string builder for populating with the result of the join.
 	End Rem
-	Method Join:TStringBuilder(bits:String[])
-		Local buf:TStringBuilder = New TStringBuilder
+	Method Join:TStringBuilder(bits:String[], buf:TStringBuilder = Null)
+		If Not buf Then
+			buf = New TStringBuilder
+		End If
 		bmx_stringbuilder_join(buffer, bits, buf.buffer)
 		Return buf
 	End Method
 
+	Rem
+	bbdoc: Joins @bits together by inserting @joiner between each bit, appending to the end of this string builder.
+	End Rem
+	Method JoinStrings:TStringBuilder(bits:String[], joiner:String)
+		bmx_stringbuilder_join_strings(buffer, bits, joiner)
+		Return Self
+	End Method
+
 	Rem
 	bbdoc: Converts all of the characters in the buffer to lower case.
 	End Rem