/* cmdtab.c */

/*  $RCSfile: cmdtab.c,v $
*  $Revision: 14020.11 $
*  $Date: 93/07/09 11:04:56 $
*/

#include "sys.h"
#include "util.h"
#include "cmds.h"
#include "main.h"
#include "ftp.h"
#include "ftprc.h"
#include "glob.h"
#include "open.h"
#include "set.h"
#include "copyright.h"

#define REMOTEFILE " remote-file-name"
#define REMOTEFILES " remote-file-names and/or UNIX-style-wildcards"
#define LOCALFILE " local-file-name"
#define LOCALFILES " local-file-names and/or UNIX-style-wildcards"
#define LDIRNAME " local-directory-name"
#define RMTDIRNAME " remote-directory-name"
#define EMPTYSTR ""
#define TOGGLE " [on | off] (no argument toggles the switch)"

#define BINARYHELP "transfer files as binary files, without CR/LF translation"
#define BINARYUSAGE EMPTYSTR

#define CHDIRHELP "changes the current remote working directory"
#define CHDIRUSAGE RMTDIRNAME

#define CLOSEHELP "closes FTP connection to current remote host"
#define CLOSEUSAGE EMPTYSTR

#define DELETEHELP "deletes the specified file on the remote host"
#define DELETEUSAGE REMOTEFILE

#define DIRUSAGE " \
[flags] [remote-items] [>outfile or \"|pipecmd [cmd-args]\"]\n\
   Note that there must be no whitespace between > and outfile, or | and\n\
   pipecmd, and if the pipe-command needs arguments, you must enclose the\n\
   whole thing with double quotes.\n\
Examples:\n\
   dir -s\n\
   dir remoteFile\n\
   dir /pub/mac \"|head -20\"\n\
   dir -rtR file1 file2 dir1 >contents.txt"

#define GETUSAGE " remote-file-name [local-file-name or |pipecommand]\n\
Examples:\n\
   get myfile.txt\n\
   get MYFILE.ZIP myfile.zip\n\
       get myfile.txt |head\n\
       get myfile.txt \"|head -20\"\n\
   get ./help/newuser.txt    (./newuser.txt will be local-file-name)\n\
   get ./help/newuser.txt ./docs/newbie.help\n\
   get my*.txt  (pseudo-filename-completion if match is unique, i.e. myfile.txt)"

#define HELPHELP "shows commands, and optionally tell you how to use a specific one"
#define HELPUSAGE " [command-name | showall (shows hidden commands) | helpall"

#define LSHELP "prints remote directory contents (short-mode)"
#define LSUSAGE " \
[flags] [remote-items] [>outfile or \"|pipecmd [cmd-args]\"]\n\
   Note that there must be no whitespace between > and outfile, or | and\n\
   pipecmd, and if the pipe-command needs arguments, you must enclose the\n\
   whole thing with double quotes.\n\
Examples:\n\
   ls -s\n\
   ls remoteFile\n\
   ls /pub/mac \"|head -20\"\n\
   ls -lrtR file1 file2 dir1 >contents.txt"

#define OPENHELP "connects to a new remote host, and optionally fetches a file\n\
   or sets the current remote working directory"
#define OPENUSAGE " \
[-a | -u] [-i] [-p N] [-r [-d N] [-g N]] hostname[:pathname]\n\
   -a     : Open anonymously (this is the default).\n\
   -u     : Open, specify user/password.\n\
   -i     : Ignore machine entry in your .netrc.\n\
   -p N   : Use port #N for connection.\n\
   -r     : \"Redial\" until connected.\n\
   -d N   : Redial, pausing N seconds between tries.\n\
   -g N   : Redial, giving up after N tries.\n\
   :path  : Open site, then retrieve file \"path.\"  WWW-style paths are\n\
            also acceptable, i.e. 'ftp://cse.unl.edu/mgleason/README.'"

#define PAGEHELP "view a file on the remote host with your $PAGER"
#define PAGEUSAGE REMOTEFILE

#define PDIRUSAGE " [flags] [remote-files]"

#define PUTHELP "sends a local file to the current remote host"
#define PUTUSAGE " local-file-name [remote-file-name]"

#define QUITHELP "quits the program"
#define QUITUSAGE EMPTYSTR

#define RHELPHELP "asks the remote-server for help"
#define RHELPUSAGE " [help-topic (i.e. FTP command)]"

#define UNIMPLHELP "this command is not supported"
#define UNIMPLUSAGE (NULL)

struct cmd cmdtab[] = {
       /* name ; must-be-connected ; hidden ; help-string ; usage-string */
       { "!",                     0,  0,  shell,
               "spawns a shell for you to run other commands",
               " [single-command-and-arguments]" },
       { "$",                     0,  0,  domacro,
               "runs a macro previously defined in your NETRC, or with the macdef cmd",
               "macro-number" },
       { "account",       0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "append",        0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "ascii",                 1,  1,  setascii,
               "transfer files as text files, with proper CR/LF translation",
               "" },
       { "bell",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "binary",                1,  1,  setbinary, BINARYHELP, BINARYUSAGE },
       { "bye",                   0,  1,  quit, QUITHELP, QUITUSAGE },
       { "case",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "cd",                    1,  0,  cd, CHDIRHELP, CHDIRUSAGE },
       { "cdup",                  1,  0,  cdup,
               "changes the current remote working directory to it's parent",
               "" },
       { "chdir",                 1,  1,  cd, CHDIRHELP, CHDIRUSAGE },
       { "close",                 1,  1,  disconnect, CLOSEHELP, CLOSEUSAGE },
       { "connect",       0,  1,  cmdOpen, OPENHELP, OPENUSAGE },
       { "cr",            0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "create",                1,  0,  create,
               "create an empty file on the remote host",
               REMOTEFILE },
       { "delete",                1,  0,  do_delete, DELETEHELP, DELETEUSAGE },
       { "debug",                 0,  1,  setdebug,
               "to print debugging messages during execution of the program",
               TOGGLE },
       { "dir",                   1,  0,  ls,
               "prints remote directory contents (long-mode)",
               DIRUSAGE },
       { "erase",                 1,  1,  do_delete, DELETEHELP, DELETEUSAGE },
       { "exit",                  0,  1,  quit, QUITHELP, QUITUSAGE },
       { "form",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "get",                   1,  0,  get,
               "fetches a file from the current remote host", GETUSAGE },
       { "glob",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "hash",                  0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "help",                  0,  0,  help, HELPHELP, HELPUSAGE },
       { "idle",                  0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "image",                 1,  1,  setbinary, BINARYHELP, BINARYUSAGE },
       { "lcd",                   0,  0,  lcd,
               "changes the current local directory", LDIRNAME },
       { "lookup",                0,  0,  lookup,
               "uses the name-server to tell you a host's IP number given it's\n\
   name, or it's name given it's IP number",
       " hostname | host-IP-number" },
       { "ls",                    1,  0,  ls, LSHELP, LSUSAGE },
       { "macdef",                0,  0,  macdef,
               "defines a macro which is expanded when you use the $ command",
               " new-macro-name" },
       { "mdelete",       1,  0,  mdelete,
               "deletes multiple files on the remote host", REMOTEFILES  },
       { "mdir",                  1,  1,  ls, LSHELP, LSUSAGE },
#if LIBMALLOC != LIBC_MALLOC
       { "memchk",        0,  0,  MallocStatusCmd,
               "show debugging information about memory usage.", EMPTYSTR },
#endif
       { "mget",                  1,  0,  mget,
               "fetches multiple files from the remote host", REMOTEFILES },
       { "mkdir",                 1,  0,  makedir,
               "creates a new sub-directory on the current remote host",
               RMTDIRNAME },
       { "mls",                   1,  0,  ls, LSHELP, LSUSAGE },
       { "mode",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "modtime",       1,  0,  modtime,
               "shows the last modification date for a remote file",
               REMOTEFILE },
       { "more",                  1,  1,  get, PAGEHELP, PAGEUSAGE },
       { "mput",                  1,  0,  mput,
               "sends multiple local files to the current remote host",
               LOCALFILES },
       { "newer",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "nlist",                 1,  1,  ls, LSHELP, LSUSAGE },
       { "nmap",          0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "ntrans",        0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "open",                  0,  0,  cmdOpen, OPENHELP, OPENUSAGE },
       { "p",                     1,  1,  get, PAGEHELP, PAGEUSAGE },
       { "page",                  1,  0,  get, PAGEHELP, PAGEUSAGE },
       { "pdir",                  1,  0,  ls,
               "view a remote directory listing (long mode) with your $PAGER",
               PDIRUSAGE },
       { "pls",                   1,  0,  ls,
               "view a remote directory listing (short mode) with your $PAGER",
               PDIRUSAGE },
       { "predir",                1,  0,  ShowLineBuffer,
               "view the last remote directory listing with your $PAGER",
               EMPTYSTR },
       { "prompt",                0,  1,  setprompt,
               "toggle interactive prompting on multiple commands",
               TOGGLE },
       { "proxy",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "put",                   1,  0,  put, PUTHELP, PUTUSAGE },
       { "pwd",                   1,  0,  pwd,
               "prints the name of the current remote directory",
               EMPTYSTR },
       { "quit",                  0,  0,  quit, QUITHELP, QUITUSAGE },
       { "quote",                 1,  0,  quote,
               "allows advanced users to directly enter FTP commands verbatim",
               " FTP-commands" },
       { "redir",                 1,  0,  ShowLineBuffer,
               "re-prints the last directory listing",
               EMPTYSTR },
       { "reget",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "remotehelp",    1,  0,  rmthelp, RHELPHELP, RHELPUSAGE },
       { "reset",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "restart",       0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "rm",                    1,  1,  do_delete, DELETEHELP, DELETEUSAGE },
       { "rstatus",       1,  0,  rmtstatus,
               "asks the remote-server for it's status",
               EMPTYSTR },
       { "rhelp",                 1,  1,  rmthelp, RHELPHELP, RHELPUSAGE },
       { "rename",                1,  0,  renamefile,
               "changes the name of a file on the current remote host",
               " old-name new-name" },
       { "rmdir",                 1,  0,  removedir,
               "deletes a directory on the current remote host",
               RMTDIRNAME },
       { "runique",       0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "send",                  1,  1,  put, PUTHELP, PUTUSAGE },
       { "sendport",      0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "show",                  0,  0,  do_show,
               "prints the value of some or all program variables",
               " all | variable-names" },
       { "set",                   0,  0,  set,
               "changes the value of a program variable; for numeric/boolean\n\
   variables sets them to 1/true",
               " variable-name [= new-value]" },
       { "site",                  1,  0,  quote,
               "allows advanced users to send site-specific commands to the host",
               " site-specific-commands\n\
Example (to try on wuarchive.wustl.edu):\n\
       site locate emacs" },
       { "size",                  1,  0,  sizecmd,
               "shows the size of a remote file",
               REMOTEFILE },
       { "struct",        0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "sunique",       0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "system",                1,  0,  syst,
               "tells you what type of machine the current remote host is",
               EMPTYSTR },
       { "tenex",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "umask",         0,  1,  unimpl, UNIMPLHELP, UNIMPLUSAGE },
       { "unset",                 0,  0,  set,
               "resets the value of a program variable to it's default state, or for\n\
   numeric/boolean variables, sets them to 0/false",
               " variable-name" },
       { "user",                  1,  0,  do_user,
               "lets you login as a new user (with appropriate password)",
               " new-user-name [new-password]" },
       { "type",                  1,  0,  settype,
               "changes the current file transfer method",
               " ascii | binary | ebcdic | tenex" },
       { "verbose",       0,  0,  setverbose,
               "controls how many message the program prints in response to commands",
               " -1 (quiet) | 0 (errs) | 1 (terse) | 2 (verbose)" },
       { "version",       0,  0,  show_version,
               "prints information about the program",
               EMPTYSTR },
       { "?",                     0,  1,  help, HELPHELP, HELPUSAGE },
       { NULL,                    0,  0,  NULL, NULL, NULL }
};

/* eof cmdtab.c */