chiark / gitweb /
Test rig for dynamic arrays.
[mLib] / da-ref
diff --git a/da-ref b/da-ref
new file mode 100755 (executable)
index 0000000..2c1e592
--- /dev/null
+++ b/da-ref
@@ -0,0 +1,68 @@
+#! /usr/bin/perl
+#
+# Reference implementation for dynamic array testing.
+
+@a = ();
+while (<>) {
+  chomp();
+  # print "$_\n";
+  @F = split();
+  if ($F[0] eq "push") {
+    push(@a, $F[1]);
+  } elsif ($F[0] eq "unshift") {
+    unshift(@a, $F[1]);
+  } elsif ($F[0] eq "pop") {
+    if (@a == 0) {
+      print "*UFLOW*\n";
+    } else {
+      my $n = int(pop(@a));
+      print "$n\n";
+    }
+  } elsif ($F[0] eq "shift") {
+    if (@a == 0) {
+      print "*UFLOW*\n";
+    } else {
+      my $n = int(shift(@a));
+      print "$n\n";
+    }
+  } elsif ($F[0] eq "insert") {
+    shift(@F);
+    unshift(@a, @F);
+  } elsif ($F[0] eq "append") {
+    shift(@F);
+    push(@a, @F);
+  } elsif ($F[0] eq "delete") {
+    if ($F[1] > @a) {
+      # @a = ();
+      print "*UFLOW*\n";
+    } else {
+      splice(@a, 0, $F[1]);
+    }
+  } elsif ($F[0] eq "reduce") {
+    if ($F[1] > @a) {
+      # @a = ();
+      print "*UFLOW*\n";
+    } else {
+      $#a -= $F[1];
+    }
+  } elsif ($F[0] eq "set") {
+    if ($F[1] > @a) {
+      for (my $i = @a; $i < $F[1]; $i++) { $a[$i] = -1; }
+    }
+    $a[$F[1]] = int($F[2]);
+  } elsif ($F[0] eq "get") {
+    if ($F[1] >= @a) {
+      print "*RANGE*\n";
+    } else {
+      print int($a[$F[1]]), "\n";
+    }
+  } elsif ($F[0] eq "show") {
+    if (@a) {
+      print join(" ", map int, @a), "\n";
+    } else {
+      print "*EMPTY*\n";
+    }
+  } else {
+    print "*BAD*\n";
+  }
+}