diff liboctave/dir-ops.cc @ 6145:14906c2745e3

[project @ 2006-11-08 20:33:51 by jwe]
author jwe
date Wed, 08 Nov 2006 20:34:01 +0000
parents b9fd54407c8d
children 93c65f2a5668
line wrap: on
line diff
--- a/liboctave/dir-ops.cc
+++ b/liboctave/dir-ops.cc
@@ -70,6 +70,10 @@
 string_vector
 dir_entry::read (void)
 {
+  static octave_idx_type grow_size = 100;
+
+  octave_idx_type len = 0;
+
   string_vector dirlist;
 
   if (ok ())
@@ -79,21 +83,24 @@
       struct dirent *dir_ent;
 
       while ((dir_ent = readdir (static_cast<DIR *> (dir))))
-	count++;
-
-      rewinddir (static_cast<DIR *> (dir));
-
-      dirlist.resize (count);
+	{
+	  if (dir_ent)
+	    {
+	      if (count >= len)
+		{
+		  len += grow_size;
+		  dirlist.resize (len);
+		}
 
-      for (int i = 0; i < count; i++)
-	{
-	  dir_ent = readdir (static_cast<DIR *> (dir));
+	      dirlist[count] = dir_ent->d_name;
 
-	  if (dir_ent)
-	    dirlist[i] = dir_ent->d_name;
+	      count++;
+	    }
 	  else
 	    break;
 	}
+
+      dirlist.resize (count);
     }
 
   return dirlist;