This is the mail archive of the kawa@sources.redhat.com mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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;
+      }
+  }
+}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]