Fix argcargv.i in Perl5, Tcl, PHP
Add missing type map for type check.
Add testing of argcargv.i for Perl5, Tcl, PHP and Ruby.

Signed-off-by: Erez Geva <ErezGeva2@gmail.com>
diff --git a/Examples/test-suite/perl5/argcargvtest_runme.pl b/Examples/test-suite/perl5/argcargvtest_runme.pl
new file mode 100644
index 0000000..c4157eb
--- /dev/null
+++ b/Examples/test-suite/perl5/argcargvtest_runme.pl
@@ -0,0 +1,20 @@
+use strict;
+use warnings;
+use Test::More tests => 8;
+BEGIN { use_ok('argcargvtest') }
+require_ok('argcargvtest');
+
+my $largs = ["hi", "hola", "hello"];
+is(argcargvtest::mainc($largs), 3, "test main typemap 1");
+
+my $targs = ["hi", "hola"];
+is(argcargvtest::mainv($targs, 1), "hola", "test main typemap 2");
+
+my $errorVal = 0;
+my $ret = eval qq(argcargvtest::mainv("hello", 1); \$errorVal = 1;);
+is($ret, undef, "test main typemap 3");
+is($errorVal, 0, "test main typemap 4");
+
+is(argcargvtest::initializeApp($largs), undef, "test main typemap 5");
+
+ok(1, "done");
diff --git a/Examples/test-suite/php/argcargvtest_runme.php b/Examples/test-suite/php/argcargvtest_runme.php
new file mode 100644
index 0000000..4a675d0
--- /dev/null
+++ b/Examples/test-suite/php/argcargvtest_runme.php
@@ -0,0 +1,29 @@
+<?php
+
+require "tests.php";
+
+// New functions
+check::functions(array('mainc', 'mainv', 'initializeapp'));
+// New classes
+check::classes(array('argcargvtest'));
+// No new vars
+check::globals(array());
+
+$largs = array('hi', 'hola', 'hello');
+check::equal(mainc($largs), 3, 'Test main typemap 1');
+
+$targs = array('hi', 'hola');
+check::equal(mainv($targs, 1), 'hola', 'Test main typemap 2');
+
+$error = 0;
+try {
+    mainv('hello', 1);
+    $error = 1;
+}
+catch (exception $e) {
+}
+check::equal($error, 0, 'Test main typemap 3');
+
+initializeApp($largs);
+
+check::done();
diff --git a/Examples/test-suite/ruby/argcargvtest_runme.rb b/Examples/test-suite/ruby/argcargvtest_runme.rb
new file mode 100644
index 0000000..8f4cd7d
--- /dev/null
+++ b/Examples/test-suite/ruby/argcargvtest_runme.rb
@@ -0,0 +1,32 @@
+#!/usr/bin/env ruby
+
+require 'swig_assert'
+require 'argcargvtest'
+
+include Argcargvtest
+
+
+$largs = ["hi", "hola", "hello"]
+if mainc($largs) != 3
+    raise RuntimeError, "bad main typemap"
+end
+
+$targs = ["hi", "hola"]
+if mainv($targs, 1) != "hola"
+    raise RuntimeError, "bad main typemap"
+end
+
+$error = 0
+$ret = 0
+begin
+    mainv("hello", 1)
+    $error = 1
+rescue => e
+    $ret = 1
+end
+
+if $error == 1 or $ret != 1
+    raise RuntimeError, "bad main typemap"
+end
+
+initializeApp($largs)
diff --git a/Examples/test-suite/tcl/argcargvtest_runme.tcl b/Examples/test-suite/tcl/argcargvtest_runme.tcl
new file mode 100644
index 0000000..14c0e92
--- /dev/null
+++ b/Examples/test-suite/tcl/argcargvtest_runme.tcl
@@ -0,0 +1,28 @@
+if [ catch { load ./argcargvtest[info sharedlibextension] argcargvtest} err_msg ] {
+	puts stderr "Could not load shared object:\n$err_msg"
+}
+
+set largs {hi hola hello}
+if {[mainc $largs] != 3} {
+     puts stderr "bad main typemap"
+     exit 1
+}
+
+set targs {hi hola}
+if {[mainv $targs 1] != "hola"} {
+     puts stderr "bad main typemap"
+     exit 1
+}
+
+set targs " hi hola "
+if {[mainv $targs 1] != "hola"} {
+     puts stderr "bad main typemap"
+     exit 1
+}
+
+if { ! [ catch { mainv("hello", 1) } ] } {
+    puts stderr "bad main typemap"
+    exit 1
+}
+
+initializeApp $largs
diff --git a/Lib/perl5/argcargv.i b/Lib/perl5/argcargv.i
index de7b626..5c3968e 100644
--- a/Lib/perl5/argcargv.i
+++ b/Lib/perl5/argcargv.i
@@ -24,6 +24,11 @@
   $2[i] = NULL;
 }
 
+%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) {
+  AV *av = (AV *)SvRV($input);
+  $1 = SvTYPE(av) == SVt_PVAV;
+}
+
 %typemap(freearg) (int ARGC, char **ARGV) {
   if ($2 != NULL) {
     free((void *)$2);
diff --git a/Lib/php/argcargv.i b/Lib/php/argcargv.i
index 14b0cf2..15a86a9 100644
--- a/Lib/php/argcargv.i
+++ b/Lib/php/argcargv.i
@@ -33,6 +33,10 @@
   $2[i] = NULL;
 }
 
+%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) {
+  $1 = Z_TYPE($input) == IS_ARRAY;
+}
+
 %typemap(freearg) (int ARGC, char **ARGV) {
   if ($2 != NULL) {
     free((void *)$2);
diff --git a/Lib/tcl/argcargv.i b/Lib/tcl/argcargv.i
index e43f2e6..bcc3dc8 100644
--- a/Lib/tcl/argcargv.i
+++ b/Lib/tcl/argcargv.i
@@ -21,6 +21,11 @@
   $2[i] = NULL;
 }
 
+%typemap(typecheck, precedence=SWIG_TYPECHECK_STRING_ARRAY) (int ARGC, char **ARGV) {
+  int len;
+  $1 = Tcl_ListObjLength(interp, $input, &len) == TCL_OK;
+}
+
 %typemap(freearg) (int ARGC, char **ARGV) {
   if ($2 != NULL) {
     free((void *)$2);