#!/usr/bin/perl
#interprets the first parameter as a c file, and runs it

#use Math::Random qw(:all);
#use Carp;
use strict;

my ($files, @args, @res, @res2, @res3, $foo, $val, $i, $xargs, $prog);


sub random_permute {
   my (@list) = (@_);

   my(@newlist, $ran, $new);

   while ($#list != -1) {
     $ran = int(rand $#list+1);
     $new = splice(@list, $ran, 1);
     push(@newlist, $new);
   }
   
   return @newlist;
}


srand;        # used for perl versions < 5.0004


if ( $#ARGV < 2 ) {
  print "usage: $0 <usexargs (1,0)> <program name> <file pattern>\n";
  exit;
}

$xargs=$ARGV[0];
$prog=$ARGV[1];

print "Finding files below current directory now\n";
$files = "";
for ($i = 2; $i <= $#ARGV; $i++) {
  $files = $files . `find . -follow -name "$ARGV[$i]"`;
}
$files =~ s/\\/\\\\/g;
$files =~ s/\&/\\\&/g;
$files =~ s/\;/\\\;/g;
$files =~ s/\"/\\\"/g;
$files =~ s/\'/\\\'/g;
$files =~ s/\ /\\\ /g;
$files =~ s/\(/\\\(/g;
$files =~ s/\)/\\\)/g;
#print "$files\n";
print "Found all files\n";
@args = split(/\n/,$files);
print "split files\n";
@res3 = random_permute(@args);
@res2 = random_permute(@res3);
@res = random_permute(@res2);
print "Permuted files\n";

print "Running command\n";
if ($xargs == 0) {
	$foo = "";
	$i = 0;
	foreach $val (@res) { 
		if ($i < 1024) {
			$foo = $foo . " " . $val; 
			$i = $i + 1;
		}
	}
	system("\"$prog\" $foo &");
} else {
	open (XARGS, "| /usr/bin/xargs \"$prog\"");
	print XARGS "@res";
	close XARGS;
}
