code: private SemanticStatus argumentsMatch(final String[] myargs,
              final String[] other) {
          String my_arg, arg;
          boolean varargs = false;
          for (int i = 0, j = 0;; i++, j++) {
  
              boolean my_last = (i == (myargs.length - 1));
              boolean other_last = (j == (other.length - 1));
  
              if (myargs[i].endsWith(VARARGS_SUFFIX)) {
                  my_arg = varargsRoot(myargs[i]);
                  // stay at position in argument list
                  i = i - 1;
                  varargs = true;
              } else {
                  my_arg = myargs[i];
              }
  
              arg = other[j];
              final SemanticStatus status = argumentsMatch(my_arg, arg);
              if (status != VALID) return status;
  
              if (my_last && other_last) {
                  break;
              } else if (my_last && !varargs) {
                  // You have arguments left to match, I don't.
                  return TOO_MANY_ARGUMENTS;
              } else if (other_last) {
                  // I have arguments left to match, you don't.
                  return TOO_FEW_ARGUMENTS;
              }
          }
          return VALID;
      }
docs: Returns the {@link SemanticStatus semantic status} of the supplied
  argument lists.
  
  @param args1 Argument list
  @param args2 Argument list
  @return SemanticStatus, which may be null