This file is test.def, from which is created test.c.
It implements the builtin "test" in Bash.

Copyright (C) 1987-2002 Free Software Foundation, Inc.

This file is part of GNU Bash, the Bourne Again SHell.

Bash is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 2, or (at your option) any later
version.

Bash is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License along
with Bash; see the file COPYING.  If not, write to the Free Software
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.

$PRODUCES test.c

$BUILTIN test
$FUNCTION test_builtin
$SHORT_DOC test [expr]
Exits with a status of 0 (true) or 1 (false) depending on
the evaluation of EXPR.  Expressions may be unary or binary.  Unary
expressions are often used to examine the status of a file.  There
are string operators as well, and numeric comparison operators.

File operators:

    -a FILE        True if file exists.
    -b FILE        True if file is block special.
    -c FILE        True if file is character special.
    -d FILE        True if file is a directory.
    -e FILE        True if file exists.
    -f FILE        True if file exists and is a regular file.
    -g FILE        True if file is set-group-id.
    -h FILE        True if file is a symbolic link.
    -L FILE        True if file is a symbolic link.
    -k FILE        True if file has its `sticky' bit set.
    -p FILE        True if file is a named pipe.
    -r FILE        True if file is readable by you.
    -s FILE        True if file exists and is not empty.
    -S FILE        True if file is a socket.
    -t FD          True if FD is opened on a terminal.
    -u FILE        True if the file is set-user-id.
    -w FILE        True if the file is writable by you.
    -x FILE        True if the file is executable by you.
    -O FILE        True if the file is effectively owned by you.
    -G FILE        True if the file is effectively owned by your group.
    -N FILE        True if the file has been modified since it was last read.

  FILE1 -nt FILE2  True if file1 is newer than file2 (according to
                   modification date).

  FILE1 -ot FILE2  True if file1 is older than file2.

  FILE1 -ef FILE2  True if file1 is a hard link to file2.

All file operators except -h and -L are acting on the target of a symbolic
link, not on the symlink itself, if FILE is a symbolic link.

String operators:

    -z STRING      True if string is empty.

    -n STRING
    STRING         True if string is not empty.

    STRING1 = STRING2
                   True if the strings are equal.
    STRING1 != STRING2
                   True if the strings are not equal.
    STRING1 < STRING2
                   True if STRING1 sorts before STRING2 lexicographically.
    STRING1 > STRING2
                   True if STRING1 sorts after STRING2 lexicographically.

Other operators:

    -o OPTION      True if the shell option OPTION is enabled.
    ! EXPR         True if expr is false.
    EXPR1 -a EXPR2 True if both expr1 AND expr2 are true.
    EXPR1 -o EXPR2 True if either expr1 OR expr2 is true.

    arg1 OP arg2   Arithmetic tests.  OP is one of -eq, -ne,
                   -lt, -le, -gt, or -ge.

Arithmetic binary operators return true if ARG1 is equal, not-equal,
less-than, less-than-or-equal, greater-than, or greater-than-or-equal
than ARG2.

See the bash manual page bash(1) for the handling of parameters (i.e.
missing parameters).
$END

$BUILTIN [
$DOCNAME test_bracket
$FUNCTION test_builtin
$SHORT_DOC [ arg... ]
This is a synonym for the "test" builtin, but the last
argument must be a literal `]', to match the opening `['.
$END

#include <config.h>

#if defined (HAVE_UNISTD_H)
#  ifdef _MINIX
#    include <sys/types.h>
#  endif
#  include <unistd.h>
#endif

#include "../bashansi.h"

#include "../shell.h"
#include "../test.h"
#include "common.h"

extern char *this_command_name;

/* TEST/[ builtin. */
int
test_builtin (list)
     WORD_LIST *list;
{
  char **argv;
  int argc, result;

  /* We let Matthew Bradburn and Kevin Braunsdorf's code do the
     actual test command.  So turn the list of args into an array
     of strings, since that is what their code wants. */
  if (list == 0)
    {
      if (this_command_name[0] == '[' && !this_command_name[1])
	{
	  builtin_error ("missing `]'");
	  return (EX_BADUSAGE);
	}

      return (EXECUTION_FAILURE);
    }

  argv = make_builtin_argv  (list, &argc);
  result = test_command (argc, argv);
  free ((char *)argv);

  return (result);
}
