One new file added.

This patch delegates all the hard work to emulate opendir() to a Perl script.
The current implementation of this script is not very portable (requires
that ls is present), but now there is no limit for perfection.

Enjoy,
Ilya

--- ./MANIFEST-pre-mic1	Tue Apr  1 21:43:30 2003
+++ ./MANIFEST	Wed Apr  2 14:01:44 2003
@@ -1323,6 +1323,7 @@ lib/Memoize/t/tie_sdbm.t	Memoize SDBM in
 lib/Memoize/t/tie_storable.t	Memoize Storable interface test
 lib/Memoize/t/unmemoize.t	Memoize 'unmemoize' function test
 lib/Memoize/TODO		Memoize to-do list
+lib/microperl/mktools.pl	Makes microperl/tools.pm
 lib/Net/ChangeLog.libnet	libnet
 lib/Net/Cmd.pm			libnet
 lib/Net/Config.eg		libnet
--- ./Makefile.micro-pre-mic1	Tue Apr  1 13:10:48 2003
+++ ./Makefile.micro	Wed Apr  2 14:21:28 2003
@@ -7,7 +7,7 @@ LIBS = -lm
 _O = .o
 ENV = env
 
-all:	microperl
+all:	microperl lib/microperl/tools.pm
 
 O = uav$(_O) udeb$(_O) udoio$(_O) udoop$(_O) udump$(_O) \
 	uglobals$(_O) ugv$(_O) uhv$(_O) \
@@ -21,6 +21,10 @@ O = uav$(_O) udeb$(_O) udoio$(_O) udoop$
 
 microperl:	$(O)
 	$(LD) -o $@ $(O) $(LIBS)
+
+lib/microperl/tools.pm: microperl
+	-./microperl -Ilib lib/microperl/mktools.pl
+	-microperl   -Ilib lib/microperl/mktools.pl
 
 H = av.h uconfig.h cop.h cv.h embed.h embedvar.h form.h gv.h handy.h \
 	hv.h intrpvar.h iperlsys.h mg.h op.h opcode.h opnames.h pad.h \
--- ./perl.c-pre-mic1	Tue Apr  1 20:06:12 2003
+++ ./perl.c	Wed Apr  2 14:26:16 2003
@@ -1118,31 +1118,23 @@ S_parse_body(pTHX_ char **env, XSINIT_t 
     {		/* Microperl has no support for opendir... */
 	char s[] =				/* Should fit one line */
 		"BEGIN {"
-		"  my $f='0000pdir.lst';"
 		"  *CORE::GLOBAL::opendir = sub (*$) {"
-		"	my $dir = $_[1];"
-				/* Double-quotes are most portable... */
-		"	my $r = eval {open $_[0], qq(ls \"$dir\" |)};"
-		"	return $r if $r;"
-		"	system qq(ls \"$dir\" > $f) and die 'system() failed';"
-		"        open $_[0], $f};"
+		"	require microperl::tools;"
+		"	microperl::tools::opendir($_[0], $_[1])"
+		"  };"
 		"  *CORE::GLOBAL::readdir = sub (*) {"
-		"    my($h) = @_; if (wantarray) {"
-		"	  my @in = <$h>;"
-		"	  chop @in;"
-		"	  return @in"
-		"	} else {"
-		"	  my $in = <$h>;"
-		"	  chop $in;"
-		"	  $in"
-		"	}};"
+		"	require microperl::tools;"
+		"	microperl::tools::readdir($_[0])"
+		"  };"
 		"  *CORE::GLOBAL::closedir = sub (*) {"
-		"	my($h) = @_;"
-		"	my $res = close $h;"
-		"	unlink $f;"
-		"	$res};"
+		"	require microperl::tools;"
+		"	microperl::tools::closedir($_[0])"
+		"  };"
 		"  *CORE::GLOBAL::times = sub () {"
-		"	(0,0,0,0)};"
+		"	require microperl::tools;"
+		"	microperl::tools::times()"
+		"  };"
+		"  $microperl::isa = $microperl::isa = 1;"
 		"}"
 	;
 
--- ./t/op/readdir.t-pre-mic1	Fri Jul 19 16:50:10 2002
+++ ./t/op/readdir.t	Wed Apr  2 14:29:08 2003
@@ -10,7 +10,7 @@ if ($@) { print "1..0\n"; exit; }
 
 print "1..3\n";
 
-for $i (1..2000) {
+for $i (1..($microperl::isa ? 250 : 2000)) {
     local *OP;
     opendir(OP, "op") or die "can't opendir: $!";
     # should auto-closedir() here
--- ./lib/microperl/mktools.pl-pre-mic1	Wed Apr  2 14:00:52 2003
+++ ./lib/microperl/mktools.pl	Wed Apr  2 14:22:52 2003
@@ -0,0 +1,54 @@
+#!./perl -w
+use strict;
+
+my $me = $0;
+(my $him = $me) =~ s/mktools\.pl/tools.pm/i;
+if (eval {require microperl::tools; 1}) {
+  print "Module microperl::tools exists and can be successfully loaded.\n";
+  exit 0;
+}
+die "panic: file `$him' exists and can be successfully loaded, but microperl::tools can't"
+  if -f $him and eval {do $him; 1};
+
+warn "Overwriting existing (non-working) `$him'" if -f $him;
+
+open HIM, '>', $him or die "error opening `$him' for write: $!";
+
+print HIM <<'EOP';
+package microperl::tools;
+
+my $f='0000pdir.lst';
+sub opendir (*$) {
+    my $dir = $_[1];
+    my $r = eval {open $_[0], qq(ls "$dir" |)};
+    return $r if $r;
+    system qq(ls "$dir" > $f) and die 'system() failed';
+    open $_[0], $f
+}
+sub readdir (*) {
+    my($h) = @_;
+    if (wantarray) {
+         my @in = <$h>;
+         chop @in;
+         return @in
+    } else {
+         my $in = <$h>;
+         chop $in;
+         $in
+    }
+}
+sub closedir (*) {
+     my($h) = @_;
+     my $res = close $h;
+     unlink $f;
+     $res
+}
+sub times () {
+     (0,0,0,0)
+}
+
+1;
+EOP
+
+close HIM or die "error closing `$him' for write: $!";
+print "Module `$him' written.\n";
