This is the mail archive of the
kawa@sources.redhat.com
mailing list for the Kawa project.
Re: string-append/shared
Per Bothner <per@bothner.com> wrote:
> A more optimal implementation would be to do an initial
> pass over the arguments to calculate the needed length.
>
> We should probably also re-consider the implementation
> of string-append in kawa/standard/string_append.java.
How about the patch below? We add a few new methods to FString and
implement string_append.java and string_append_shared.java in terms of
the new functions.
Regards,
Chris Dean
Index: ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/ChangeLog,v
retrieving revision 1.375
diff -u -w -r1.375 ChangeLog
--- ChangeLog 9 Sep 2003 03:56:36 -0000 1.375
+++ ChangeLog 13 Sep 2003 22:10:54 -0000
@@ -1,3 +1,12 @@
+2003-09-13 Chris Dean <Chris.Dean@sokitomi.com>
+
+ * kawa/standard/string_append_shared.java: added
+ * kawa/standard/string_append.java: use FString.addAllStrings
+ instead of a StringBuffer.
+ * kawa/standard/Scheme.java (LispInterpreter): definition for
+ string-append/shared
+ * kawa/standard/Makefile.am (java_sources): Updated.
+
2003-09-08 Per Bothner <per@bothner.com>
* kawa/lang/Translator.java (rewrite): Resolve hygiene using
Index: gnu/lists/ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/gnu/lists/ChangeLog,v
retrieving revision 1.58
diff -u -w -r1.58 ChangeLog
--- gnu/lists/ChangeLog 9 Sep 2003 20:08:07 -0000 1.58
+++ gnu/lists/ChangeLog 13 Sep 2003 22:10:55 -0000
@@ -1,3 +1,9 @@
+2003-09-13 Chris Dean <Chris.Dean@sokitomi.com>
+
+ * FString.java (addAll): new method to add an FString directly.
+ * FString.java (addAllStrings): new method to add an array of
+ FStrings.
+
2003-09-09 Per Bothner <per@bothner.com>
* AbstractSequence.java (nextIndex): Use getIndexDifference.
Index: gnu/lists/FString.java
===================================================================
RCS file: /cvs/kawa/kawa/gnu/lists/FString.java,v
retrieving revision 1.8
diff -u -w -r1.8 FString.java
--- gnu/lists/FString.java 10 Jan 2003 04:49:38 -0000 1.8
+++ gnu/lists/FString.java 13 Sep 2003 22:10:55 -0000
@@ -202,6 +202,42 @@
return new FString(copy);
}
+ public boolean addAll(FString s)
+ {
+ int newSize = size + s.size;
+ if (data.length < newSize)
+ setBufferLength(newSize);
+ System.arraycopy(s.data, 0, data, size, s.size);
+ size = newSize;
+ return s.size > 0;
+ }
+
+ public boolean addAllStrings(Object[] args)
+ {
+ return addAllStrings(args, 0);
+ }
+
+ public boolean addAllStrings(Object[] args, int startIndex)
+ {
+ int total = size;
+ for (int i = startIndex; i < args.length; ++i)
+ {
+ total += ((FString) args[i]).size;
+ }
+ setBufferLength(total);
+
+ boolean changed = false;
+ for (int i = startIndex; i < args.length; ++i)
+ {
+ if (addAll((FString) args[i]))
+ {
+ changed = true;
+ }
+ }
+
+ return changed;
+ }
+
public String toString ()
{
return new String (data, 0, size);
Index: kawa/standard/Makefile.am
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/Makefile.am,v
retrieving revision 1.96
diff -u -w -r1.96 Makefile.am
--- kawa/standard/Makefile.am 21 Aug 2003 05:44:47 -0000 1.96
+++ kawa/standard/Makefile.am 13 Sep 2003 22:10:55 -0000
@@ -25,6 +25,7 @@
string2number.java \
string_v.java \
string_append.java \
+string_append_shared.java \
vector_append.java \
force.java \
call_with_input_file.java \
Index: kawa/standard/Makefile.in
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/Makefile.in,v
retrieving revision 1.116
diff -u -w -r1.116 Makefile.in
--- kawa/standard/Makefile.in 21 Aug 2003 05:44:47 -0000 1.116
+++ kawa/standard/Makefile.in 13 Sep 2003 22:10:55 -0000
@@ -221,6 +221,7 @@
string2number.java \
string_v.java \
string_append.java \
+string_append_shared.java \
vector_append.java \
force.java \
call_with_input_file.java \
Index: kawa/standard/Scheme.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/Scheme.java,v
retrieving revision 1.140
diff -u -w -r1.140 Scheme.java
--- kawa/standard/Scheme.java 4 Sep 2003 18:41:30 -0000 1.140
+++ kawa/standard/Scheme.java 13 Sep 2003 22:10:55 -0000
@@ -305,6 +305,7 @@
define_proc ("substring", "kawa.lib.strings");
define_proc ("string-append", "kawa.standard.string_append");
+ define_proc ("string-append/shared", "kawa.standard.string_append_shared");
define_field("string->list", "kawa.lib.strings");
define_field("list->string", "kawa.lib.strings");
define_proc ("string-copy", "kawa.lib.strings");
Index: kawa/standard/string_append.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/string_append.java,v
retrieving revision 1.8
diff -u -w -r1.8 string_append.java
--- kawa/standard/string_append.java 2 Jul 2002 22:15:12 -0000 1.8
+++ kawa/standard/string_append.java 13 Sep 2003 22:10:55 -0000
@@ -9,20 +9,10 @@
public class string_append extends ProcedureN
{
- public static FString stringAppend$V (Object[] args)
- {
- int count = args.length;
- java.lang.StringBuffer result = new java.lang.StringBuffer();
-
- for (int t=0; t<count; t++)
- {
- result.append(args[t]);
- }
- return new FString (result);
- }
-
public Object applyN (Object[] args)
{
- return stringAppend$V(args);
+ FString str = new FString();
+ str.addAllStrings(args);
+ return str;
}
}
Index: testsuite/ChangeLog
===================================================================
RCS file: /cvs/kawa/kawa/testsuite/ChangeLog,v
retrieving revision 1.125
diff -u -w -r1.125 ChangeLog
--- testsuite/ChangeLog 11 Sep 2003 18:57:49 -0000 1.125
+++ testsuite/ChangeLog 13 Sep 2003 22:10:55 -0000
@@ -1,7 +1,11 @@
+2003-09-13 Chris Dean <Chris.Dean@sokitomi.com>
+
+ * misc-test.scm: added string-append/shared tests
+
2003-09-11 Per Bothner <per@bothner.com>
* testing.scm (test): Catch exception.
- * misc-test.scm: New generic procedure tests. One is expected to fsil.
+ * misc-test.scm: New generic procedure tests. One is expected to fail.
2003-09-08 Per Bothner <per@bothner.com>
Index: testsuite/misc-test.scm
===================================================================
RCS file: /cvs/kawa/kawa/testsuite/misc-test.scm,v
retrieving revision 1.39
diff -u -w -r1.39 misc-test.scm
--- testsuite/misc-test.scm 11 Sep 2003 18:57:49 -0000 1.39
+++ testsuite/misc-test.scm 13 Sep 2003 22:10:56 -0000
@@ -1,4 +1,4 @@
-(test-init "Miscellaneous" 121)
+(test-init "Miscellaneous" 126)
;;; DSSSL spec example 11
(test '(3 4 5 6) (lambda x x) 3 4 5 6)
@@ -547,3 +547,11 @@
(define (not-a) ((lambda (x) (not x)) 'a))
(test #f not-a)
+
+;;; Test SRFI-13 string-append/shared
+(let ((str "abc"))
+ (test "" string-append/shared)
+ (test "" string-append/shared "")
+ (test "abc" string-append/shared str)
+ (test "abc123xy" string-append/shared str "123" "xy")
+ (test #t equal? "abc123xy" str))
Index: kawa/standard/string_append_shared.java
===================================================================
--- /dev/null Tue Dec 10 02:57:38 2002
+++ kawa/standard/string_append_shared.java Sat Sep 13 13:40:30 2003
@@ -0,0 +1,25 @@
+package kawa.standard;
+import gnu.lists.*;
+import gnu.mapping.*;
+
+/**
+ * Implement the Scheme function "string-append/shared" defined in
+ * SRFI-13.
+ */
+
+public class string_append_shared extends ProcedureN
+{
+ public Object applyN (Object[] args)
+ {
+ if (args.length == 0)
+ {
+ return new FString();
+ }
+ else
+ {
+ FString str = (FString) args[0];
+ str.addAllStrings(args, 1);
+ return str;
+ }
+ }
+}