#ifdef SSHTEST
#define SSHBUILTIN
#endif /* SSHTEST */

#include "ckcsym.h"
char *userv = "User Interface 8.0.278, 12 Mar 2004";

/*  C K U U S R --  "User Interface" for C-Kermit (Part 1)  */

/*
  Authors:
    Frank da Cruz <fdc@columbia.edu>,
      The Kermit Project, Columbia University, New York City
    Jeffrey E Altman <jaltman@secure-endpoints.com>
      Secure Endpoints Inc., New York City

  Copyright (C) 1985, 2004,
    Trustees of Columbia University in the City of New York.
    All rights reserved.  See the C-Kermit COPYING.TXT file or the
    copyright text in the ckcmai.c module for disclaimer and permissions.
*/

/*
  Originally the entire user interface was in one module, ckuusr.c.  Over
  the years it has been split into many modules: ckuus2.c, ckuus3.c, ...,
  ckuus7.c.  ckuus2.c contains the HELP command parser and help-text strings;
  ckuusy.c contains the UNIX-style command-line interface; ckuusx.c contains
  routines needed by both the command-line interface and the interactive
  command parser.
*/

/*
  The ckuus*.c modules depend on the existence of C library features like
  fopen, fgets, feof, (f)printf, argv/argc, etc.  Other functions that are
  likely to vary among different platforms -- like setting terminal modes or
  interrupts -- are invoked via calls to functions that are defined in the
  system- dependent modules, ck?[ft]io.c.  The command line parser processes
  any arguments found on the command line, as passed to main() via argv/argc.
  The interactive parser uses the facilities of the cmd package (developed for
  this program, but usable by any program).  Any command parser may be
  substituted for this one.  The only requirements for the Kermit command
  parser are these:

  . Set parameters via global variables like duplex, speed, ttname, etc.  See
    ckmain.c for the declarations and descriptions of these variables.

  . If a command can be executed without the use of Kermit protocol, then
    execute the command directly and set the variable sstate to 0. Examples
    include 'set' commands, local directory listings, the 'connect' command.

  . If a command requires the Kermit protocol, set the following variables:

     sstate                             string data
       'x' (enter server mode)            (none)
       'r' (send a 'get' command)         cmarg, cmarg2
       'v' (enter receive mode)           cmarg2
       'g' (send a generic command)       cmarg
       's' (send files)                   nfils, cmarg & cmarg2 OR cmlist
       'c' (send a remote host command)   cmarg

     cmlist is an array of pointers to strings.
     cmarg, cmarg2 are pointers to strings.
     nfils is an integer.

     cmarg can be a filename string (possibly wild), or
	a pointer to a prefabricated generic command string, or
	a pointer to a host command string.
     cmarg2 is an "as-name" - the name to send file(s) under, or
	the name under which to store incoming file(s); must not be wild.
	A null or empty value means to use the file's own name.
     cmlist is a list of filenames, such as passed via argv.
     nfils is an integer, interpreted as follows:
       -1: filespec (possibly wild) in cmarg, must be expanded internally.
	0: send from stdin (standard input).
       >0: number of files to send, from cmlist.

  The screen() function is used to update the screen during file transfer.
  The tlog() function writes to a transaction log.
  The debug() function writes to a debugging log.
  The intmsg() and chkint() functions provide the user i/o for interrupting
    file transfers.
*/

/* Includes */

#ifdef MULTINET
#define MULTINET_OLD_STYLE		/* Leave select prototype undefined */
#endif /* MULTINET */

#include "ckcdeb.h"
#include "ckcasc.h"
#include "ckcker.h"
#include "ckcnet.h"			/* Network symbols */
#include "ckuusr.h"
#include "ckcxla.h"

int g_fncact = -1;			/* Needed for NOICP builds */
int noinit = 0;				/* Flag for skipping init file */
int nscanfile = SCANFILEBUF;

int rcdactive = 0;			/* RCD active */
int keepallchars = 0;			/* See cmfld() */

int locus = 1;				/* Current LOCUS is LOCAL */
#ifdef OS2
int autolocus = 2;			/* Automatic LOCUS switching: ASK */
#else /* OS2 */
int autolocus = 1;			/* Automatic LOCUS switching enabled */
#endif /* OS2 */

#ifndef NOICP
#ifdef CKLEARN
#ifdef VMS
#include <time.h>			/* For CKLEARN */
#endif /* VMS */
#endif /* CKLEARN */
#ifdef OS2
#ifndef NT
#define INCL_NOPM
#define INCL_VIO			/* Needed for ckocon.h */
#include <os2.h>
#undef COMMENT
#else
#define APIRET ULONG
#include <windows.h>
#include <tapi.h>
#include "cknwin.h"
#include "ckntap.h"			/* CK_TAPI definition */
#endif /* NT */
#include "ckowin.h"
#include "ckocon.h"
extern int tcp_avail;
extern bool viewonly;
extern int k95stdout;
extern int tt_scroll;
#ifndef NOTERM
extern tt_status[VNUM];
#endif /* NOTERM */
int display_demo = 1;
#include "ckossh.h"
#ifdef KUI
#include "ikui.h"
#endif /* KUI */
#endif /* OS2 */

int optlines = 0;
int didsetlin = 0;

#ifdef NEWFTP
extern int ftpget, ftpisopen(), doftpres();
_PROTOTYP(int doftptyp,(int));
#endif /* NEWFTP */

#ifdef VMS
extern int batch;
#endif /* VMS */

#ifdef datageneral
#include <packets:common.h>
#define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd)
#endif /* datageneral */

extern int xcmdsrc, hints, cmflgs, whyclosed;

char * hlptok = NULL;

#ifdef CK_TTGWSIZ			/* Whether to use more-prompting */
int xaskmore = 1;			/* Momentary setting */
int saveask  = 1;			/* Permanent setting */
#else
int xaskmore = 0;
int saveask  = 0;
#endif /* CK_TTGWSIZ */

#ifndef NOCSETS
extern int nfilc;
extern struct keytab fcstab[];
extern int fcharset;
#endif /* NOCSETS */

char * g_pswd = NULL;
int g_pcpt = -1;
int g_pflg = -1;

extern int cmd_rows, cmd_cols;

#ifdef CKROOT
extern int ckrooterr;
#endif /* CKROOT */

extern int inserver, filepeek;

#ifdef CKLEARN
FILE * learnfp = NULL;
char * learnfile = NULL;
int learning = 0;
#endif /* CKLEARN */

#ifndef NOXFER
extern int atcapr, atdiso, nfils, moving, protocol, sendmode, epktflg, size,
  sndsrc, server, displa, fncnv, fnspath, fnrpath, xfermode, urpsiz,
  spsizf, spsiz, spsizr, spmax, wslotr, prefixing, fncact, reliable,
  setreliable;

#ifdef IKSDCONF
extern int iksdcf;
#endif /* IKSDCONF */

#ifdef CK_LOGIN
extern int isguest;
#endif /* CK_LOGIN */

extern long sendstart;

extern char *cmarg, *cmarg2, **cmlist, *dftty;

extern struct keytab fntab[]; extern int nfntab;
extern struct ck_p ptab[NPROTOS];

int sndcmd = 0;		/* Last command was a SEND-class command. */

int g_xfermode = -1;
int g_proto  = -1;
int g_urpsiz = -1;
int g_spsizf = -1;
int g_spsiz  = -1;
int g_spsizr = -1;
int g_spmax  = -1;
int g_wslotr = -1;
int g_prefixing = -1;
int g_fncnv  = -1;
int g_fnspath = -1;
int g_fnrpath = -1;
int g_fnact  = -1;
int g_displa = -1;
int g_spath  = -1;
int g_rpath  = -1;
char * g_sfilter = NULL;
char * g_rfilter = NULL;

extern int patterns;
#ifdef PATTERNS
extern char *txtpatterns[], *binpatterns[];
int g_patterns = -1;
#endif /* PATTERNS */
int g_skipbup = -1;

#ifdef PIPESEND
extern int usepipes, pipesend;
extern char * sndfilter;
#endif /* PIPESEND */

#ifndef NOSPL
extern int sndxlo, sndxhi, sndxin;
#endif /* NOSPL */

extern char fspec[];			/* Most recent filespec */
extern int fspeclen;			/* Length of fspec[] buffer */

#ifndef NOFRILLS
extern int rmailf;			/* MAIL command items */
extern char optbuf[];
#endif /* NOFRILLS */

extern int
  en_cpy, en_cwd, en_del, en_dir, en_fin, en_get, en_bye, en_mai, en_pri,
  en_hos, en_ren, en_sen, en_spa, en_set, en_typ, en_who, en_ret, en_xit,
  en_mkd, en_rmd, en_asg;

#ifndef NOMSEND				/* Multiple SEND */
extern char *msfiles[];
int filesinlist = 0;			/* And ADD ... */
extern struct filelist * filehead;
extern struct filelist * filetail;
extern struct filelist * filenext;
extern int addlist;
#endif /* NOMSEND */

static struct keytab addtab[] = {
#ifdef PATTERNS
    { "binary-patterns", ADD_BIN, 0 },
#endif /* PATTERNS */
#ifndef NOMSEND
    { "send-list", ADD_SND, 0 },
#endif /* NOMSEND */
#ifdef PATTERNS
    { "text-patterns", ADD_TXT, 0 },
#endif /* PATTERNS */
    { "", 0, 0 }
};
static int naddtab = sizeof(addtab)/sizeof(struct keytab) - 1;

#ifndef NOCSETS
struct keytab assoctab[] = {
    { "file-character-set",     ASSOC_FC, 0 },
    { "transfer-character-set", ASSOC_TC, 0 },
    { "xfer-character-set",     ASSOC_TC, CM_INV }
};
static int nassoc = sizeof(assoctab)/sizeof(struct keytab);
extern int afcset[MAXFCSETS+1];		/* Character-set associations */
extern int axcset[MAXTCSETS+1];
#endif /* NOCSETS */

#ifndef ADDCMD
#ifndef NOMSEND
#define ADDCMD
#endif /* NOMSEND */
#ifndef ADDCMD
#ifdef PATTERNS
#define ADDCMD
#endif /* PATTERNS */
#endif /* ADDCMD */
#endif /* ADDCMD */
#endif /* NOXFER */

/* External Kermit Variables, see ckmain.c for description. */

extern xx_strp xxstring;
extern long xvernum;

extern int local, xitsta, binary, msgflg, escape, duplex, quiet, tlevel,
  pflag, zincnt, ckxech, carrier, what, nopush, haveline, bye_active;
#ifdef TNCODE
extern int debses;
extern char tn_msg[];
#endif /* TNCODE */

int sleepcan = 1;
int g_binary = -1;
int g_recursive = -1;
int g_matchdot = -1;
extern int nolinks;

extern long vernum;
extern char *versio, *copyright[];
extern char *ckxsys;
#ifndef NOHELP
extern char *introtxt[];
extern char *newstxt[];
#endif /* NOHELP */

#ifndef OS2
#ifndef UNIX
extern char *PWDCMD;
#endif /* UNIX */
extern char *WHOCMD;
#endif /* OS2 */

extern char ttname[];

extern CHAR sstate;

extern int network;			/* Have active network connection */
extern int nettype;			/* Type of network */
extern int ttnproto;                    /* NET_TCPB protocol */

#ifndef NODIAL
extern int dialsta, dialatmo, dialcon, dialcq; /* DIAL status, etc. */
#endif /* NODIAL */

#ifdef CK_APC
extern int apcactive, apcstatus;
#endif /* CK_APC */

#ifndef NOPUSH
#ifndef NOFRILLS
extern char editor[];
extern char editopts[];
extern char editfile[];
#endif /* NOFRILLS */
#endif /* NOPUSH */

#ifdef BROWSER
extern char browser[];			/* Web browser application */
extern char browsopts[];		/* Web browser options */
extern char browsurl[];			/* Most recent URL */
#endif /* BROWSER */
#ifndef NOFTP
char ftpapp[CKMAXPATH+1] = { NUL, NUL }; /* ftp executable */
char ftpopts[128] = { NUL, NUL };	/* ftp command-line options */
#endif /* NOFTP */
extern struct keytab onoff[];		/* On/Off keyword table */

#ifdef CK_TMPDIR
int f_tmpdir = 0;			/* Directory changed temporarily */
char savdir[TMPDIRLEN];			/* For saving current directory */
#endif /* CK_TMPDIR */

int activecmd = -1;			/* Keyword index of active command */
int doconx = -1;			/* CONNECT-class command active */
int ooflag = 0;				/* User-settable on/off flag */

int rcflag = 0;				/* Pointer to home directory string */
int repars,				/* Reparse needed */
    techo = 0;				/* Take echo */
int secho = 1;				/* SCRIPT echo */

int xitwarn =			/* Warn about open connection on exit */
#ifdef NOWARN
0
#else
1
#endif /* NOWARN */
;

struct keytab onoffsw[] = {
    { "/off", 0, 0 },
    { "/on",  1, 0 }
};

#ifdef CKEXEC
struct keytab redirsw[] = {
    { "/redirect", 1, 0 }
};
#endif /* CKEXEC */

#ifndef NOXMIT
/* Variables for TRANSMIT command */

int xmitx = 1;			/* Whether to echo during TRANSMIT */
int xmitf = 0;			/* Character to fill empty lines */
int xmitl = 0;			/* 0 = Don't send linefeed too */
int xmitp = LF;			/* Host line prompt */
int xmits = 0;			/* Use shift-in/shift-out, 0 = no */
int xmitw = 0;			/* Milliseconds to pause during TRANSMIT */
int xmitt = 1;			/* Seconds to wait for each char to echo */
int xmita = 1;			/* Action upon timeout */

#define XMI_BIN 1
#define XMI_TXT 2
#define XMI_CMD 3
#define XMI_TRA 4
#define XMI_VRB 5
#define XMI_QUI 6
#define XMI_NOW 7
#define XMI_NOE 8

static struct keytab xmitsw[] = {	/* TRANSMIT command options */
    { "/binary",          XMI_BIN, 0 },
#ifdef PIPESEND
    { "/command",         XMI_CMD, CM_INV|CM_PSH },
#endif /* PIPESEND */
    { "/noecho",          XMI_NOE, 0 },
    { "/nowait",          XMI_NOW, 0 },
#ifdef PIPESEND
    { "/pipe",            XMI_CMD, 0 },
#endif /* PIPESEND */
#ifdef COMMENT
    { "/quiet",           XMI_QUI, 0 },
#endif /* COMMENT */
    { "/text",            XMI_TXT, 0 },
    { "/transparent",     XMI_TRA, 0 },
#ifdef COMMENT
    { "/verbose",         XMI_VRB, 0 },
#endif /* COMMENT */
    { "", 0, 0 }
};
#define NXMITSW sizeof(xmitsw)/sizeof(struct keytab) - 1
static int nxmitsw = NXMITSW;

#endif /* NOXMIT */

/* Declarations from ck?fio.c module */

extern char *SPACMD, *SPACM2;		/* SPACE commands */

/* Command-oriented items */

#ifdef DCMDBUF
extern char *cmdbuf;			/* Command buffers */
extern char *atmbuf;
extern char *line;			/* Character buffer for anything */
extern char *tmpbuf;			/* Short temporary string buffer */
extern int *ifcmd;
extern int *intime;
extern int *inpcas;
#else
extern char cmdbuf[];			/* Command buffers */
extern char atmbuf[];
extern char line[];			/* Character buffer for anything */
extern char tmpbuf[];			/* Temporary buffer */
extern int ifcmd[];
extern int intime[];
extern int inpcas[];
#endif /* DCMDBUF */

#ifndef NOSPL
extern char * prstring[];
#endif /* NOSPL */

char *lp;				/* Pointer to line buffer */

#ifndef NOSPL
int unkmacro = 0;			/* Flag for in ON_UNKNOWN_COMMAND */
int oldeval = 0;
char evalbuf[33];			/* EVALUATE result */
extern char * inpbuf;			/* Buffer for INPUT and REINPUT */
char *inpbp;				/* And pointer to same */
extern char lblbuf[];			/* Buffer for labels */
int m_found;				/* MINPUT result */
int i_active = 0;			/* INPUT command is active */
char *ms[MINPMAX];			/* Pointers to MINPUT strings */
static int mp[MINPMAX];			/* and flags */
extern int fndiags, fnerror, fnsuccess;	/* Function diagnostics */
#ifndef NOSEXP
char * lastsexp = NULL;			/* S-Expressions */
char * sexpval = NULL;
int sexpecho = SET_AUTO;
#endif /* NOSEXP */
#endif /* NOSPL */

char psave[PROMPTL] = { NUL };		/* For saving & restoring prompt */

extern int success;			/* Command success/failure flag */
extern int cmdlvl;			/* Current position in command stack */

#ifndef NOSPL
int					/* SET INPUT parameters. */
/* Note, INPUT TIMEOUT, intime[], is on the command-level stack. */
  inbufsize = 0,			/* INPUT buffer size */
  indef = 1,				/* default timeout, seconds */
  inecho = 1,				/* 1 = echo on */
  inautodl = 0,				/* INPUT autodownload */
  inintr = 1,				/* INPUT interrupion allowed */
  innomatch = 0,			/* INPUT /NOMATCH */
  insilence = 0;			/* 0 = no silence constraint */

#ifdef CKFLOAT
CKFLOAT inscale = 1.0;			/* Timeout scale factor */
#endif	/* CKFLOAT */

#ifdef OS2
int interm = 1;				/* Terminal emulator displays input */
#endif /* OS2 */
int maclvl = -1;			/* Macro nesting level */
int mecho = 0;				/* Macro echo, 0 = don't */
char varnam[6];				/* For variable names */
extern int macargc[];			/* ARGC from macro invocation */

extern char *m_arg[MACLEVEL][NARGS];	/* Stack of macro arguments */
extern char *mrval[];

extern char **a_ptr[];			/* Array pointers */
extern int a_dim[];			/* Array dimensions */
extern int a_link[];

#ifdef DCMDBUF
extern struct cmdptr *cmdstk;		/* The command stack itself */
#else
extern struct cmdptr cmdstk[];		/* The command stack itself */
#endif /* DCMDBUF */

long ck_alarm = 0;			/* SET ALARM value */
char alrm_date[24] = { ' ',' ',' ',' ',' ',' ',' ',' ',' ' };
char alrm_time[24] = { ' ',' ',' ',' ',' ',' ',' ' };

#define INPSW_NOM 1
struct keytab inputsw[] = {
    { "/nomatch", INPSW_NOM, 0 }
};
static int ninputsw = sizeof(inputsw)/sizeof(struct keytab);

#endif /* NOSPL */

static int x, y, z = 0;			/* Local workers */
static char *s;

#ifdef CK_MINPUT
static char c1chars[] = {		/* C1 control chars escept NUL */
    001,002,003,004,005,006,007,010,011,012,013,014,015,016,017,020,
    021,022,023,024,025,026,027,030,031,032,033,034,035,036,037
};
#endif /* CK_MINPUT */

#define xsystem(s) zsyscmd(s)

/* Top-Level Interactive Command Keyword Table */
/* Keywords must be in lowercase and in alphabetical order. */

struct keytab cmdtab[] = {
#ifndef NOPUSH
    { "!",	   XXSHE, CM_INV|CM_PSH }, /* Shell escape */
#else
    { "!",	   XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */
    { "#",    	   XXCOM, CM_INV },	/* Comment */
#ifndef NOSPL
    { "(",           XXSEXP,CM_INV },	/* S-Expression */
    { ".",           XXDEF, CM_INV },	/* Assignment */
    { ":",           XXLBL, CM_INV },	/* Label */
#endif /* NOSPL */
#ifdef CK_REDIR
#ifndef NOPUSH
    { "<",           XXFUN, CM_INV|CM_PSH }, /* REDIRECT */
#else
    { "<",           XXNOTAV, CM_INV|CM_PSH }, /* REDIRECT */
#endif /* NOPUSH */
#endif /* CK_REDIR */
#ifndef NOPUSH
    { "@",           XXSHE, CM_INV|CM_PSH }, /* DCL escape */
#else
    { "@",           XXNOTAV, CM_INV|CM_PSH }, /* DCL escape */
#endif /* NOPUSH */

#ifdef CK_RECALL
    { "^",           XXREDO,CM_INV|CM_NOR }, /* Synonym for REDO */
#endif /* CK_RECALL */
#ifndef NOSPL
    { "_asg",        XXASX,   CM_INV },	/* Used internally by FOR, etc */
    { "_assign",     XXASX,   CM_INV },	/* Used internally by FOR, etc */
    { "_decrement",  XX_DECR, CM_INV },
    { "_define",     XXDFX,   CM_INV },	/* Used internally by FOR, etc */
    { "_evaluate",   XX_EVAL, CM_INV },
    { "_forward",    XXXFWD,  CM_INV },	/* Used internally by SWITCH   */
    { "_getargs",    XXGTA,   CM_INV },	/* Used internally by FOR, etc */
    { "_increment",  XX_INCR, CM_INV },
    { "_putargs",    XXPTA,   CM_INV },	/* Used internally by FOR, etc */
    { "_undefine",   XXUNDFX, CM_INV },
#endif /* NOSPL */

    { "about",       XXVER,   CM_INV },	/* Synonym for VERSION */
#ifndef NOSPL
#ifdef NEWFTP
    { "account",     XXACCT,  CM_INV }, /* (FTP) Account */
#endif /* NEWFTP */
#ifdef ADDCMD
    { "add",         XXADD, 0 },	/* ADD */
#endif /* ADDCMD */
#ifndef NODIAL
    { "answer",      XXANSW, CM_LOC },	/* ANSWER the phone */
#else
    { "answer",      XXNOTAV, CM_INV|CM_LOC }, /* ANSWER the phone */
#endif /* NODIAL */
    { "apc",         XXAPC, 0 },	/* Application Program Command */
#ifndef NOSPL
    { "array",       XXARRAY, 0 },	/* Array operations */
#endif /* NOSPL */
    { "ascii",       XXASC, CM_INV },	/* == SET FILE TYPE TEXT */
    { "asg",         XXASS, CM_INV },	/* Invisible synonym for ASSIGN */
    { "ask",         XXASK, 0 },	/* ASK for text, assign to variable */
    { "askq",        XXASKQ,0 },	/* ASK quietly (no echo) */
#ifndef NOSPL
    { "ass",         XXASS, CM_INV|CM_ABR }, /* ASSIGN */
    { "assert",      XXASSER, CM_INV },	/* ASSERT */
    { "assign",      XXASS, 0 },	/* ASSIGN */
#endif /* NOSPL */
#ifndef NOXFER
#ifndef NOCSETS
    { "associate",   XXASSOC, 0 },	/* ASSOCIATE */
#else
    { "associate",   XXNOTAV, CM_INV },	/* ASSOCIATE */
#endif /* NOCSETS */
#endif /* NOXFER */
#ifdef CK_KERBEROS
#ifdef CK_AUTHENTICATION
    { "authenticate",XXAUTH, 0 },	/* Authentication */
#else
    { "authenticate",XXAUTH, CM_INV },
#endif /* CK_AUTHENTICATION */
#endif /* CK_KERBEROS */
#endif /* NOSPL */
#ifndef NOFRILLS
    { "back",        XXBACK, 0 },	/* BACK to previous directory */
#else
    { "back",        XXNOTAV,CM_INV },
#endif /* NOFRILLS */
    { "beep",        XXBEEP,CM_INV },	/* BEEP */
#ifndef NOXFER
    { "binary",      XXBIN, CM_INV },	/* == SET FILE TYPE BINARY */
#endif /* NOXFER */
#ifndef NOFRILLS
    { "bug",         XXBUG, CM_INV },	/* BUG report instructions */
#else
    { "bug",         XXNOTAV, CM_INV },
#endif /* NOFRILLS */
#ifdef BROWSER
    { "browse",      XXBROWS, CM_PSH|CM_LOC }, /* BROWSE (start browser) */
#else
    { "browse",      XXNOTAV, CM_INV|CM_PSH|CM_LOC },
#endif /* BROWSER */
#ifndef NOXFER
    { "bye",         XXBYE, 0 },	/* BYE to remote server */
#endif /* NOXFER */
#ifndef NOLOCAL
    { "c",           XXCON, CM_INV|CM_ABR|CM_LOC }, /* (CONNECT) */
#endif /* NOLOCAL */
#ifndef NOFRILLS
    { "cat",         XXCAT, CM_INV },	/* Invisible synonym for TYPE */
#endif /* NOFRILLS */
#ifndef NOSPL

#ifndef NOXFER
    { "cautious",    XXCAU, CM_INV },
#endif /* NOXFER */

#endif /* NOSPL */

    { "cd",          XXCWD, 0 },	/* Change Directory */
    { "cdup",        XXCDUP, CM_INV },	/* Change Directory Up */

#ifndef NOXFER
#ifdef PIPESEND
    { "cget",        XXCGET, CM_INV|CM_PSH }, /* CGET */
#else
    { "cget",        XXNOTAV, CM_INV|CM_PSH }, /* CGET */
#endif /* PIPESEND */
#endif /* NOXFER */
    { "ch",          XXCHK,   CM_INV|CM_ABR },
    { "check",       XXCHK,   0 },	/* CHECK for a feature */
#ifdef CK_PERMS
#ifdef UNIX
    { "chmod",       XXCHMOD, 0 },	/* CHMOD */
#else
    { "chmod",       XXNOTAV, CM_INV },
#endif /* UNIX */
#else
    { "chmod",       XXNOTAV, CM_INV },
#endif /* CK_PERMS */
#ifdef CKROOT
    { "chroot",      XXCHRT,  CM_INV },	/* CHROOT */
#endif /* CKROOT */
    { "ckermit",     XXKERMI, CM_INV },	/* CKERMIT (like KERMIT) */
    { "cl",          XXCLO,   CM_ABR|CM_INV },
#ifndef NOFRILLS
    { "clear",       XXCLE, 0 },	/* CLEAR input and/or device buffer */
#else
    { "clear",       XXNOTAV, CM_INV },
#endif /* NOFRILLS */
    { "close",	     XXCLO, 0 },	/* CLOSE a log or other file */
    { "cls",         XXCLS, CM_INV },	/* Clear Screen (CLS) */
    { "comment",     XXCOM, CM_INV },	/* Introduce a comment */
#ifndef NOLOCAL
    { "connect",     XXCON, CM_LOC },	/* Begin terminal connection */
#else
    { "connect",     XXNOTAV, CM_LOC },
#endif /* NOLOCAL */
    { "continue",    XXCONT,  CM_INV },	/* CONTINUE */
#ifndef NOFRILLS
#ifdef ZCOPY
    { "co",          XXCPY, CM_INV|CM_ABR },
    { "cop",         XXCPY, CM_INV|CM_ABR },
    { "copy",        XXCPY, 0 },	/* COPY a file */
#else
    { "copy",        XXNOTAV, CM_INV },
#endif /* ZCOPY */
    { "copyright",   XXCPR, CM_INV },	/* COPYRIGHT */
#ifdef ZCOPY
    { "cp",          XXCPY, CM_INV },	/* COPY a file */
#endif /* ZCOPY */
#ifndef NOLOCAL
#ifndef OS2
    { "cq",          XXCQ, CM_INV|CM_LOC }, /* CQ (connect quietly) */
#endif /* OS2 */
#endif /* NOLOCAL */
#ifndef NOXFER
#ifdef PIPESEND
    { "creceive",    XXCREC,CM_INV|CM_PSH }, /* RECEIVE to a command */
    { "csend",       XXCSEN,CM_INV|CM_PSH }, /* SEND from command */
#else
    { "creceive",    XXNOTAV,CM_INV|CM_PSH },
    { "csend",       XXNOTAV,CM_INV|CM_PSH },
#endif /* PIPESEND */
#endif /* NOXFER */
#endif /* NOFRILLS */

    { "cwd",	     XXCWD,   CM_INV },	/* Traditional synonym for cd */

#ifndef NOSPL
    { "date",        XXDATE,  0 },	/* DATE */
    { "dcl",         XXDCL,   CM_INV },	/* DECLARE an array (see ARRAY) */
    { "debug",       XXDEBUG, CM_INV },
    { "declare",     XXDCL,   CM_INV },	/* DECLARE an array (see ARRAY) */
    { "decrement",   XXDEC,   0 },	/* DECREMENT a numeric variable */
    { "define",      XXDEF,   0 },	/* DEFINE a macro or variable */
#else
    { "date",        XXNOTAV, CM_INV },
    { "dcl",         XXNOTAV, CM_INV },
    { "declare",     XXNOTAV, CM_INV },
    { "decrement",   XXNOTAV, CM_INV },
    { "define",      XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOFRILLS
    { "delete",      XXDEL, 0 },	/* DELETE a file */
#else
    { "delete",      XXNOTAV, CM_INV },
#endif /* NOFRILLS */

#ifndef NODIAL
    { "dial",        XXDIAL,  CM_LOC },	/* DIAL a phone number */
#else
    { "dial",        XXNOTAV, CM_INV|CM_LOC },
#endif /* NODIAL */

#ifdef NT
    { "dialer",      XXDIALER, CM_INV }, /* K95 Dialer */
#endif /* NT */

    { "directory",   XXDIR, 0 },	/* DIRECTORY of files */

#ifndef NOFRILLS
#ifndef NOSERVER
    { "disable",     XXDIS, 0 },	/* DISABLE a server function */
#else
    { "disable",     XXNOTAV, CM_INV },
#endif /* NOSERVER */
#endif /* NOFRILLS */

#ifndef NOSPL
    { "do",          XXDO,  0 },	/* DO (execute) a macro */
#else
    { "do",          XXNOTAV, CM_INV },
#endif /* NOSPL */

    { "e",           XXEXI, CM_INV|CM_ABR },

#ifndef NOFRILLS
#ifndef NOXFER
    { "e-packet",    XXERR, CM_INV },	/* Send an Error-Packet */
#endif /* NOXFER */
#endif /* NOFRILLS */

    { "echo",        XXECH, 0 },	/* ECHO text */

#ifndef NOFRILLS
#ifndef NOPUSH
    { "edit",        XXEDIT, CM_PSH },	/* EDIT */
#else
    { "edit",        XXNOTAV, CM_INV|CM_PSH }, /* EDIT */
#endif /* NOPUSH */
#endif /* NOFRILLS */

    { "eightbit",    XXEIGHT, CM_INV },	/* EIGHTBIT */

#ifndef NOSPL
    { "else",        XXELS, CM_INV },	/* ELSE part of IF statement */
#else
    { "else",        XXNOTAV, CM_INV },	/* ELSE part of IF statement */
#endif /* NOSPL */

#ifndef NOSERVER
#ifndef NOFRILLS
    { "enable",      XXENA,  0 },	/* ENABLE a server function */
#else
    { "enable",      XXNOTAV, CM_INV },
#endif /* NOFRILLS */
#endif /* NOSERVER */

#ifndef NOSPL
    { "end",         XXEND,  0 },	/* END command file or macro */
#else
    { "end",         XXNOTAV, CM_INV },
#endif /* NOSPL */

    { "erase",       XXDEL, CM_INV },	/* Synonym for DELETE */

#ifndef NOSPL
    { "evaluate",    XXEVAL, 0 },	/* EVALUATE */
#else
    { "evaluate",    XXNOTAV, CM_INV },
#endif /* NOSPL */

    { "ex",          XXEXI, CM_INV|CM_ABR }, /* Let "ex" still be EXIT */

#ifdef CKEXEC
    { "exec",        XXEXEC, CM_INV|CM_LOC }, /* exec() */
#else
    { "exec",        XXNOTAV, CM_INV|CM_LOC },
#endif /* CKEXEC */

    { "exit",	   XXEXI, 0 },		/* EXIT from C-Kermit */
    { "extended-options", XXXOPTS,CM_INV|CM_HLP }, /* Extended-Options */

#ifdef OS2
    { "extproc",     XXCOM, CM_INV },	/* Dummy command for OS/2 */
#endif /* OS2 */

#ifndef NOXFER
    { "f",           XXFIN, CM_INV|CM_ABR }, /* Invisible abbrev for FIN */
#endif /* NOXFER */

#ifndef NOSPL
    { "fail",        XXFAIL, CM_INV },	/* FAIL */

#ifndef NOXFER
    { "fast",        XXFAST, CM_INV },
#endif /* NOXFER */

#ifdef CKCHANNELIO
    { "fclose",      XXF_CL, CM_INV },	/* FCLOSE */
    { "fcount",      XXF_CO, CM_INV },	/* FCOUNT */
    { "fflush",      XXF_FL, CM_INV },	/* FFLUSH */
#endif /* CKCHANNELIO */

#ifndef NOXFER
    { "fi",          XXFIN, CM_INV|CM_ABR }, /* FINISH */
#endif /* NOXFER */

#ifdef CKCHANNELIO
    { "file",        XXFILE, 0 },	/* FILE */
#endif /* CKCHANNELIO */
#endif /* NOSPL */

#ifndef NOXFER
    { "fin",         XXFIN, CM_INV|CM_ABR }, /* FINISH */
#endif /* NOXFER */

#ifndef UNIXOROSK
    { "find",        XXGREP, 0 },	/* FIND (grep) */
#else
    { "find",        XXGREP,CM_INV },
#endif /* UNIXOROSK */

#ifndef NOXFER
    { "finish",      XXFIN, 0 },	/* FINISH */
#endif /* NOXFER */

#ifdef TCPSOCKET
    { "firewall",    XXFIREW, CM_INV|CM_HLP },
#endif /* TCPSOCKET */

#ifdef CKCHANNELIO
    { "flist",       XXF_LI, CM_INV },	/* FLIST */
    { "fopen",       XXF_OP, CM_INV },	/* FOPEN */
#endif /* CKCHANNELIO */

#ifndef NOSPL
    { "fo",          XXFOR, CM_INV|CM_ABR }, /* Invisible abbrev for... */
    { "for",         XXFOR, 0 },	/* FOR loop */
    { "forward",     XXFWD, CM_INV },	/* FORWARD */
#endif /* NOSPL */
#ifndef NOFRILLS
    { "fot",	   XXDIR, CM_INV },	/* "fot" = "dir" (for Chris) */
#endif /* NOFRILLS */

#ifdef CKCHANNELIO
    { "fread",      XXF_RE, CM_INV },	/* FREAD */
    { "frewind",    XXF_RW, CM_INV },	/* FREWIND */
    { "fseek",      XXF_SE, CM_INV },	/* FSEEK */
    { "fstatus",    XXF_ST, CM_INV },	/* FSTATUS */
#endif /* CKCHANNELIO */

#ifdef TCPSOCKET
#ifndef NOFTP
#ifdef SYSFTP
#ifndef NOPUSH
    { "ftp",	   XXFTP,   CM_INV|CM_PSH|CM_LOC }, /* System FTP */
#else
    { "ftp",	   XXNOTAV, CM_INV|CM_PSH|CM_LOC },
#endif /* NOPUSH */
#else  /* SYSFTP */
    { "ftp",	   XXFTP,   0 },	/* Built-in FTP */
#endif /* SYSFTP */
#else  /* NOFTP */
    { "ftp",	   XXNOTAV, CM_INV },	/* No FTP */
#endif /* NOFTP */
#endif /* TCPSOCKET */

#ifndef NOSPL
    { "function",    XXFUNC, CM_INV|CM_HLP }, /* (for HELP FUNCTION) */
#endif /* NOSPL */

#ifdef CKCHANNELIO
    { "fwrite",      XXF_WR, CM_INV },	/* FWRITE */
#endif /* CKCHANNELIO */

#ifndef NOXFER
    { "g",           XXGET, CM_INV|CM_ABR }, /* Invisible abbrev for GET */
#ifndef NOSPL
    { "ge",          XXGET, CM_INV|CM_ABR }, /* Ditto */
#endif /* NOSPL */
    { "get",         XXGET, 0 },	/* GET */
#endif /* NOXFER */
#ifndef NOSPL
    { "getc",        XXGETC, 0 },	/* GETC */
#ifdef OS2
    { "getkeycode",  XXGETK, 0 },	/* GETKEYCODE */
#endif /* OS2 */
#ifndef NOFRILLS
    { "getok",       XXGOK, 0 },	/* GETOK (ask for Yes/No/OK) */
#endif /* NOFRILLS */
#endif /* NOSPL */
#ifndef NOSPL
    { "goto",        XXGOTO,0 },	/* GOTO label in take file or macro */
#endif /* NOSPL */
#ifdef UNIXOROSK
    { "grep",        XXGREP,0 },	/* GREP (find) */
#else
    { "grep",        XXGREP,CM_INV },	/* GREP (find) */
#endif /* UNIXOROSK */
    { "h",           XXHLP, CM_INV|CM_ABR }, /* Invisible synonym for HELP */
    { "he",          XXHLP, CM_INV|CM_ABR }, /* Invisible synonym for HELP */
#ifndef NOFRILLS
    { "head",        XXHEAD, 0 },
#endif /* NOFRILLS */
#ifndef NOLOCAL
    { "hangup",      XXHAN, CM_LOC },	/* HANGUP the connection */
#endif /* NOLOCAL */
    { "HELP",        XXHLP, 0 },	/* Display HELP text */
#ifndef NOHTTP
#ifdef TCPSOCKET
    { "http",        XXHTTP, 0 },	/* HTTP operations */
#endif /* TCPSOCKET */
#endif /* NOHTTP */
#ifndef NOSPL
    { "i",           XXINP, CM_INV|CM_ABR }, /* Invisible synonym for INPUT */
    { "if",          XXIF,  0 },	     /* IF ( condition ) command */
#ifdef TCPSOCKET
    { "iksd",        XXIKSD, CM_INV },	     /* Make connection to IKSD */
#else
    { "iksd",        XXNOTAV, CM_INV },
#endif /* TCPSOCKET */
    { "in",          XXINP, CM_INV|CM_ABR }, /* Invisible synonym for INPUT */
    { "increment",   XXINC, 0 },	/* Increment a numeric variable */
    { "input",       XXINP, 0 },	/* INPUT text from comm device */
#endif /* NOSPL */

#ifndef NOHELP
    { "int",         XXINT, CM_INV|CM_ABR },
    { "intr",        XXINT, CM_INV|CM_ABR },
    { "INTRO",       XXINT, 0 },
    { "introduction",XXINT, CM_INV },	/* Print introductory text */
#else
    { "intro",       XXNOTAV, CM_INV },
    { "introduction",XXNOTAV, CM_INV },
#endif /* NOHELP */

#ifdef OS2
    { "k95",         XXKERMI, CM_INV },	/* Hmmm what's this... */
#endif /* OS2 */

#ifndef NOSPL
    { "kcd",         XXKCD,   0      },
#endif /* NOSPL */

    { "kermit",      XXKERMI, CM_INV },

#ifdef OS2
#ifndef NOKVERBS
    { "kverb",       XXKVRB, CM_INV|CM_HLP }, /* Keyboard verb */
#endif /* NOKVERBS */
#endif /* OS2 */

#ifndef NOFRILLS
    { "l",           XXLOG, CM_INV|CM_ABR }, /* Invisible synonym for log */
#endif /* NOFRILLS */

    { "lcd",         XXLCWD, CM_INV },
    { "lcdup",       XXLCDU, CM_INV },
    { "lcwd",        XXLCWD, CM_INV },
    { "ldelete",     XXLDEL, CM_INV },
    { "ldirectory",  XXLDIR, CM_INV },

#ifdef CKLEARN
    { "learn",       XXLEARN, 0 },	/* LEARN - automatic script writing */
#else
    { "learn",       XXNOTAV, CM_INV },
#endif /* CKLEARN */

    { "li",          XXLNOUT, CM_INV|CM_ABR },
    { "LICENSE",     XXCPR, 0 },	/* LICENSE */

#ifndef NOSPL
    { "lineout",     XXLNOUT, 0 },	/* LINEOUT = OUTPUT + eol */
#endif /* NOSPL */

#ifdef NT
    { "link",        XXLINK, 0 },       /* LINK source destination */
#endif /* NT */

    { "lmkdir",      XXLMKD, CM_INV },

#ifndef NOFRILLS
    { "lo",          XXLOG,  CM_INV|CM_ABR }, /* Invisible synonym for log */
#endif /* NOFRILLS */

#ifndef NOSPL
    { "local",       XXLOCAL, CM_INV },	/* LOCAL variable declaration */
#else
    { "local",       XXNOTAV, CM_INV },
#endif /* NOSPL */

    { "log",  	     XXLOG, 0 },	/* Open a log file */

    { "login",       XXLOGIN,  0 },	/* (REMOTE) LOGIN to server or IKSD */
    { "logout",      XXLOGOUT, 0 },	/* LOGOUT from server or IKSD */

#ifndef NOFRILLS
#ifndef NODIAL
    { "lookup",      XXLOOK,  0 },	/* LOOKUP */
#else
    { "lookup",      XXNOTAV, CM_INV },
#endif /* NODIAL */

    { "lpwd",        XXLPWD, CM_INV },
    { "lrename",     XXLREN, CM_INV },
    { "lrmdir",      XXLRMD, CM_INV },

#ifdef UNIXOROSK
    { "ls",          XXLS,  CM_INV|CM_PSH }, /* UNIX ls command */
#else
    { "ls",          XXDIR, CM_INV },	/* Invisible synonym for DIR */
#endif /* UNIXOROSK */
#ifndef NOXFER
    { "mail",        XXMAI, 0 },	/* Send a file as e-mail */
#endif /* NOXFER */
#ifndef NOHELP
    { "manual",      XXMAN, CM_PSH },	/* MAN(UAL) */
#else
    { "manual",      XXNOTAV, CM_INV|CM_PSH },
#endif /* NOHELP */
#endif /* NOFRILLS */
#ifdef CK_MKDIR
    { "md",          XXMKDIR, CM_INV },	/* Synonym for MKDIR */
#endif /* CK_MKDIR */
#ifdef CK_MINPUT
    { "minput",      XXMINP, 0 },	/* MINPUT */
#else
    { "minput",      XXNOTAV, CM_INV },
#endif /* CK_MINPUT */
#ifndef NOMSEND
    { "mget",        XXMGET, 0 },	/* MGET */
#else
    { "mget",        XXNOTAV, CM_INV },
#endif /* NOMSEND */
#ifdef CK_MKDIR
    { "mkdir",       XXMKDIR, 0 },	/* MKDIR */
#else
    { "mkdir",       XXNOTAV, CM_INV },
#endif /* CK_MKDIR */

#ifndef NOXFER
#ifndef NOMSEND
    { "mmove",       XXMMOVE, 0 },	/* MMOVE */
#else
    { "mmove",       XXNOTAV, CM_INV },
#endif /* NOMSEND */
#endif /* NOXFER */

#ifndef NOFRILLS
    { "more",        XXMORE, CM_INV },	/* MORE */
#endif /* NOFRILLS */

#ifndef NOXFER
    { "move",        XXMOVE, 0 },	/* MOVE  */
#endif /* NOXFER */

#ifndef NOSPL
    { "mpause",      XXMSL, CM_INV },	/* Millisecond sleep */
#else
    { "mpause",      XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOXFER
#ifndef NOMSEND
    { "mput",        XXMSE, CM_INV },	/* MPUT = MSEND */
    { "ms",          XXMSE, CM_INV|CM_ABR },
    { "msend",       XXMSE, 0 },	/* Multiple SEND */
#else
    { "mput",        XXNOTAV, CM_INV },
    { "msend",       XXNOTAV, CM_INV },
#endif /* NOMSEND */
#endif /* NOXFER */
#ifndef NOSPL
    { "msleep",      XXMSL, 0 },	/* Millisecond sleep */
#else
    { "msleep",      XXNOTAV, CM_INV },
#endif /* NOSPL */
#ifndef NOFRILLS
    { "mv",          XXREN, CM_INV },	/* Synonym for rename */
#endif /* NOFRILLS */
#ifndef NOHELP
    { "news",        XXNEW, CM_INV },	/* Display NEWS of new features */
#else
    { "news",        XXNOTAV, CM_INV },
#endif /* NOHELP */
    { "nolocal",     XXNLCL, CM_INV },	/* Disable SET LINE / SET HOST */
    { "nopush",      XXNPSH, CM_INV },	/* Disable PUSH command/features */
#ifdef OS2
    { "noscroll",    XXNSCR, CM_INV },  /* Disable scroll operations */
#endif /* OS2 */
#ifndef NOSPL
    { "o",           XXOUT, CM_INV|CM_ABR }, /* Invisible synonym for OUTPUT */
    { "open",        XXOPE, 0 },	/* OPEN file for reading or writing */
#else
    { "open",        XXOPE, CM_INV },	/* OPEN */
#endif /* NOSPL */
#ifndef NOHELP
    { "options",     XXOPTS,CM_INV|CM_HLP }, /* Options */
#endif /* NOHELP */
    { "orientation", XXORIE, 0 },
#ifndef NOSPL
    { "output",      XXOUT, 0 },	/* OUTPUT text to comm device */
#else
    { "output",      XXNOTAV, CM_INV },
#endif /* NOSPL */
#ifdef ANYX25
#ifndef IBMX25
    { "pad",         XXPAD, CM_LOC },	/* X.3 PAD commands */
#endif /* IBMX25 */
#endif /* ANYX25 */

#ifdef NEWFTP
    { "passive",     XXPASV, CM_INV },	/* (FTP) PASSIVE */
#endif /* NEWFTP */

#ifndef NOHELP
    { "patterns",    XXPAT,CM_INV|CM_HLP }, /* Pattern syntax */
#endif /* NOHELP */

#ifndef NOSPL
    { "pause",       XXPAU, 0 },	/* Sleep for specified interval */
#else
    { "pause",       XXNOTAV, CM_INV },
#endif /* NOSPL */
#ifndef NODIAL
    { "pdial",       XXPDIA,  CM_LOC },	/* PDIAL (partial dial) */
#else
    { "pdial",       XXNOTAV, CM_INV|CM_LOC },
#endif /* NODIAL */
#ifdef TCPSOCKET
#ifndef NOPUSH
    { "ping",        XXPNG, CM_INV|CM_PSH|CM_LOC }, /* PING */
#else
    { "ping",        XXNOTAV, CM_INV|CM_PSH|CM_LOC },
#endif /* NOPUSH */
#endif /* TCPSOCKET */
#ifdef NETCMD
#ifndef NOPUSH
    { "pipe",        XXPIPE, CM_PSH },	/* PIPE */
#else
    { "pipe",        XXNOTAV, CM_INV|CM_PSH }, /* PIPE */
#endif /* NOPUSH */
#endif /* NETCMD */

#ifndef NOSPL
    { "pop",         XXEND, CM_INV },	/* Invisible synonym for END */
#endif /* NOSPL */
#ifndef NOFRILLS
    { "print",       XXPRI, 0 },	/* PRINT a file locally */
#endif /* NOFRILLS */

    { "prompt",      XXPROMP, CM_INV },	/* Go interactive (from script) */

#ifndef NOXFER
#ifdef CK_RESEND
    { "psend",       XXPSEN, CM_INV },	/* PSEND */
#else
    { "psend",       XXNOTAV, CM_INV },
#endif /* CK_RESEND */
#endif /* NOXFER */

#ifdef NETPTY
    { "pty",         XXPTY, CM_PSH },	/* PTY */
#else
    { "pty",         XXNOTAV, CM_INV|CM_PSH },
#endif /* NETPTY */

#ifndef NOPUSH
    { "pu",          XXSHE, CM_INV|CM_ABR|CM_PSH }, /* PU = PUSH */
#endif /* NOPUSH */

#ifdef CKPURGE
    { "purge",       XXPURGE, 0 },	/* PURGE (real) */
#else
#ifdef VMS
    { "purge",       XXPURGE, 0 },	/* PURGE (fake) */
#else
    { "purge",       XXNOTAV, CM_INV },
#endif /* VMS */
#endif /* CKPURGE */

#ifndef NOPUSH
    { "push",        XXSHE, CM_PSH },	/* PUSH command (like RUN, !) */
#else
    { "push",        XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */

#ifndef NOXFER
    { "put",         XXSEN, CM_INV },	/* PUT = SEND */
#endif /* NOXFER */

    { "pwd",         XXPWD, 0 },	/* Print Working Directory */
    { "q",           XXQUI, CM_INV|CM_ABR }, /* Invisible synonym for QUIT */

#ifndef NOXFER
    { "query",       XXRQUE,CM_INV },	/* (= REMOTE QUERY) */
#endif /* NOXFER */

    { "quit",        XXQUI, 0 },	/* QUIT from program = EXIT */

#ifndef NOXFER
    { "r",           XXREC, CM_INV|CM_ABR }, /* Inv synonym for RECEIVE */
#endif /* NOXFER */

#ifndef NOXFER
    { "rasg",        XXRASG, CM_INV },	/* REMOTE ASSIGN */
    { "rassign",     XXRASG, CM_INV },	/* ditto */
    { "rcd",         XXRCWD, CM_INV },	/* REMOTE CD */
    { "rcdup",       XXRCDUP,CM_INV },	/* REMOTE CD */
    { "rcopy",       XXRCPY, CM_INV },	/* REMOTE COPY */
    { "rcwd",        XXRCWD, CM_INV },	/* REMOTE CWD */
    { "rdelete",     XXRDEL, CM_INV },	/* REMOTE DELETE */
    { "rdirectory",  XXRDIR, CM_INV },	/* REMODE DIRECTORY */
#endif /* NOXFER */

#ifndef NOSPL
    { "read",        XXREA, 0 },	/* READ a line from a file */
#else
    { "read",        XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOXFER
    { "receive",     XXREC, 0 },	/* RECEIVE files */
#endif /* NOXFER */

#ifndef NODIAL
    { "red",         XXRED, CM_INV|CM_ABR|CM_LOC }, /* Inv syn for REDIAL */
    { "redi",        XXRED, CM_INV|CM_ABR|CM_LOC }, /* ditto */
    { "redial",      XXRED, CM_LOC },	/* REDIAL last DIAL number */
#else
    { "red",         XXNOTAV, CM_INV|CM_LOC },
    { "redi",        XXNOTAV, CM_INV|CM_LOC },
    { "redial",      XXNOTAV, CM_INV|CM_LOC },
#endif /* NODIAL */

#ifdef CK_REDIR
#ifdef OS2
#ifndef NOPUSH
    { "redirect",    XXFUN, CM_INV|CM_PSH }, /* REDIRECT */
#else
    { "redirect",    XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */
#else /* OS2 */
#ifndef NOPUSH
    { "redirect",    XXFUN, CM_PSH },	/* REDIRECT */
#else
    { "redirect",    XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */
#endif /* OS2 */
#endif /* CK_REDIR */

#ifdef CK_RECALL
    { "redo",        XXREDO,  CM_NOR },	/* REDO */
#else
    { "redo",        XXNOTAV, CM_INV },
#endif /* CK_RECALL */

#ifndef NOXFER
#ifdef CK_RESEND
    { "reget",       XXREGET, 0 },	/* REGET */
#else
    { "reget",       XXNOTAV, CM_INV },
#endif /* CK_RESEND */
#endif /* NOXFER */

#ifndef NOSPL
    { "reinput",     XXREI, CM_INV },	/* REINPUT (from INPUT buffer) */
#else
    { "reinput",     XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOXFER
#ifdef ADDCMD
    { "rem",         XXREM, CM_INV|CM_ABR },
    { "remo",        XXREM, CM_INV|CM_ABR },
#endif /* ADDCMD */
    { "remote",	     XXREM, 0 },	/* Send REMOTE command to server */
#endif /* NOXFER */

#ifdef ADDCMD
    { "remove",      XXREMV,0 },	/* REMOVE (something from a list) */
#else
    { "remove",      XXNOTAV, CM_INV },
#endif /* ADDCMD */

#ifndef NOFRILLS
#ifndef NORENAME
    { "rename",      XXREN, 0 },	/* RENAME a local file */
#else
    { "rename",      XXNOTAV, CM_INV },
#endif /* NORENAME */
    { "replay",      XXTYP, CM_INV },	/* REPLAY (for now, just type) */
#endif /* NOFRILLS */

#ifndef NOXFER
#ifdef CK_RESEND
    { "res",         XXRSEN, CM_INV|CM_ABR }, /* RESEND */
    { "rese",        XXRSEN, CM_INV|CM_ABR }, /* RESEND */
    { "resend",      XXRSEN, 0 },	/* RESEND */
#else
    { "res",         XXNOTAV, CM_INV },
    { "rese",        XXNOTAV, CM_INV },
    { "resend",      XXNOTAV, CM_INV },
#endif /* CK_RESEND */
#endif /* NOXFER */

    { "reset",       XXRESET, CM_INV },	/* RESET */

#ifdef CK_RESEND
#ifndef NOSPL
    { "ret",         XXRET, CM_INV|CM_ABR },
#endif /* NOSPL */
#endif /* CK_RESEND */

#ifndef NOXFER
    { "retrieve",    XXRETR, CM_INV },	/* RETRIEVE */
#endif /* NOXFER */

#ifndef NOSPL
    { "return",      XXRET, 0 },	/* RETURN from a function */
#else
    { "return",      XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOXFER
    { "rexit",       XXRXIT, CM_INV },	/* REMOTE EXIT */
#endif /* NOXFER */

#ifdef CK_REXX
#ifndef NOPUSH
    { "rexx",        XXREXX, CM_PSH },	/* Execute a Rexx command */
#else
    { "rexx",        XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */
#endif /* CK_REXX */

#ifndef NOXFER
    { "rhelp",       XXRHLP, CM_INV },	/* REMOTE HELP */
    { "rhost",       XXRHOS, CM_INV },	/* REMOTE HOST */
    { "rkermit",     XXRKER, CM_INV },	/* REMOTE KERMIT */
#endif /* NOXFER */

#ifdef TCPSOCKET
    { "rlogin",      XXRLOG, CM_LOC },	/* Make an Rlogin connection */
#else
    { "rlogin",      XXNOTAV, CM_INV|CM_LOC },
#endif /* TCPSOCKET */

#ifndef NOFRILLS
    { "rm",          XXDEL, CM_INV },	/* Invisible synonym for delete */
#endif /* NOFRILLS */

#ifdef CK_MKDIR
    { "rmdir",       XXRMDIR, 0 },	/* RMDIR */
#else
    { "rmdir",       XXNOTAV, CM_INV },
#endif /* CK_MKDIR */

#ifndef NOXFER
    { "rmkdir",      XXRMKD, CM_INV },	/* REMOTE MKDIR */
#ifndef NOSPL
    { "robust",      XXROB,  CM_INV },
#else
    { "robust",      XXNOTAV, CM_INV },
#endif /* NOSPL */
    { "rprint",      XXRPRI, CM_INV },  /* REMOTE PRINT */
    { "rpwd",        XXRPWD, CM_INV },	/* REMOTE PWD */
    { "rquery",      XXRQUE, CM_INV },	/* REMOTE QUERY */
#endif /* NOXFER */

#ifdef CK_RECALL
    { "rr",          XXREDO, CM_INV|CM_NOR },
#endif /* CK_RECALL */

#ifndef NOXFER
    { "rrename",    XXRREN, CM_INV },	/* REMOTE RENAME */
    { "rrmdir",     XXRRMD, CM_INV },	/* REMOTE REMDIR */
    { "rset",       XXRSET, CM_INV },	/* REMOTE SET */
    { "rspace",     XXRSPA, CM_INV },	/* REMOTE SPACE */
    { "rtype",      XXRTYP, CM_INV },	/* REMOTE TYPE */
#endif /* NOXFER */

#ifndef NOPUSH
    { "run",         XXSHE, CM_PSH },	/* RUN a program or command */
#else
    { "run",         XXNOTAV, CM_INV|CM_PSH },
#endif /* NOPUSH */

#ifndef NOXFER
    { "rwho",        XXRWHO, CM_INV },	/* REMOTE WHO */
    { "s",           XXSEN, CM_INV|CM_ABR }, /* Invisible synonym for send */
#endif /* NOXFER */

#ifndef NOSETKEY
#ifdef OS2
    { "save",	   XXSAVE, 0 },		/* SAVE something */
#else
    { "save",	   XXSAVE, CM_INV },
#endif /* OS2 */
#else
    { "save",	   XXNOTAV, CM_INV },
#endif /* NOSETKEY */

#ifndef NOSCRIPT
    { "sc", 	   XXLOGI, CM_INV|CM_ABR|CM_LOC },
    { "scr",	   XXLOGI, CM_INV|CM_ABR|CM_LOC },
#endif /* NOSCRIPT */
    { "screen",      XXSCRN, 0 },	/* SCREEN actions */
#ifndef NOSCRIPT
    { "script",	   XXLOGI, CM_LOC },	/* Expect-Send-style script line */
#else
    { "script",	   XXNOTAV, CM_INV|CM_LOC },
#endif /* NOSCRIPT */

    { "search",    XXGREP,CM_INV },	/* Synonym for GREP and FIND */

#ifndef NOXFER
    { "send",	   XXSEN, 0 },		/* Send (a) file(s) */
#ifndef NOSERVER
    { "server",	   XXSER, 0 },		/* Be a SERVER */
#else
    { "server",	   XXNOTAV, CM_INV },
#endif /* NOSERVER */
#endif /* NOXFER */

    { "set",	   XXSET, 0 },		/* SET parameters */

#ifndef NOSPL
#ifndef NOSEXP
    { "sexpression", XXSEXP, CM_INV|CM_HLP }, /* SEXPR */
#endif /* NOSEXP */

#ifdef SFTP_BUILTIN
    { "sftp",        XXSFTP, 0 },   /* SFTP */
#endif /* SFTP_BUILTIN */

#ifndef NOSHOW
    { "sh",          XXSHO, CM_INV|CM_ABR }, /* SHOW parameters */
#endif /* NOSHOW */
    { "shift",       XXSHIFT, 0 },	/* SHIFT args */
#else
    { "shift",       XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOSHOW
    { "show", 	   XXSHO, 0 },		/* SHOW parameters */
#else
    { "show", 	   XXNOTAV, CM_INV },
#endif /* NOSHOW */

#ifdef NEWFTP
    { "site",        XXSITE, CM_INV },	/* (FTP) SITE */
#endif /* NEWFTP */

#ifdef SSHBUILTIN
    { "skermit",   XXSKRM, 0 },     /* SKERMIT */
#endif /* SSHBUILTIN */

#ifndef NOSPL
#ifndef NOFRILLS
    { "sleep",       XXPAU, CM_INV },	/* SLEEP for specified interval */
#endif /* NOFRILLS */
#endif /* NOSPL */

#ifndef NOSPL
    { "sort",        XXSORT, CM_INV },	/* (see ARRAY) */
#else
    { "sort",        XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef MAC
#ifndef NOFRILLS
    { "sp",          XXSPA, CM_INV|CM_ABR },
    { "spa",         XXSPA, CM_INV|CM_ABR },
#endif /* NOFRILLS */
    { "space",       XXSPA, 0 },	/* Show available disk SPACE */
#endif /* MAC */

#ifndef NOFRILLS
#ifndef NOPUSH
    { "spawn",       XXSHE, CM_INV|CM_PSH }, /* Synonym for PUSH, RUN */
#else
    { "spawn",       XXNOTAV, CM_INV|CM_PSH }, /* Synonym for PUSH, RUN */
#endif /* NOPUSH */
#endif /* NOFRILLS */

#ifdef ANYSSH
    { "ssh",         XXSSH, 0 },
#endif /* ANYSSH */

#ifndef NOXFER
    { "sta",         XXSTA, CM_INV|CM_ABR },
    { "stat",        XXSTA, CM_INV|CM_ABR },
    { "statistics",  XXSTA, 0 },	/* Display file transfer stats */
#endif /* NOXFER */

    { "status",      XXSTATUS,0 },	/* Show status of previous command */

#ifndef NOSPL
    { "stop",        XXSTO,   0 },	/* STOP all take files and macros */
    { "succeed",     XXSUCC,  CM_INV },	/* SUCCEED */
#else
    { "stop",        XXNOTAV, CM_INV },
    { "succeed",     XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOFRILLS
    { "SUPPORT",     XXBUG, 0 },	/* Tech support instructions */
#else
    { "support",     XXNOTAV, CM_INV },
#endif /* NOFRILLS */

#ifndef NOJC
    { "suspend",     XXSUS, CM_PSH },	/* SUSPEND C-Kermit (UNIX only) */
#else
    { "suspend",     XXNOTAV, CM_INV|CM_PSH },
#endif /* NOJC */

#ifndef NOSPL
    { "switch",      XXSWIT, 0 },	/* SWITCH */
#else
    { "switch",      XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifdef CK_TAPI
    { "ta",	   XXTAK, CM_INV|CM_ABR }, /* (because of TAPI) */
#endif /* CK_TAPI */

#ifndef NOFRILLS
    { "tail",        XXTAIL, 0 },	/* Display end of a local file */
#endif /* NOFRILLS */

    { "take",	   XXTAK, 0 },		/* TAKE commands from a file */

#ifdef CK_TAPI
    { "tapi",	   XXTAPI, CM_LOC },	/* Microsoft TAPI commands */
#else
    { "tapi",	   XXNOTAV, CM_INV|CM_LOC },
#endif /* CK_TAPI */

#ifndef NOFRILLS
#ifdef TCPSOCKET
    { "tel",         XXTEL, CM_INV|CM_ABR|CM_LOC },
    { "telnet",      XXTEL, CM_LOC },	/* TELNET (TCP/IP only) */
    { "telopt",      XXTELOP, CM_INV },	/* TELOPT (ditto) */
#else
    { "tel",         XXNOTAV, CM_INV|CM_LOC },
    { "telnet",      XXNOTAV, CM_INV|CM_LOC },
    { "telopt",      XXNOTAV, CM_INV },
#endif /* TCPSOCKET */
#ifdef OS2
    { "terminal",    XXTERM, CM_INV|CM_LOC }, /* == SET TERMINAL TYPE */
#else
    { "terminal",    XXTERM, CM_INV },
#endif /* OS2 */
#endif /* NOFRILLS */
#ifndef NOXFER
    { "text",        XXASC, CM_INV },	/* == SET FILE TYPE TEXT */
#endif /* NOXFER */

#ifndef NOSPL
    { "trace",       XXTRACE, 0 },	/* TRACE */
#else
    { "trace",       XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOCSETS
    { "translate",   XXXLA, 0 },	/* TRANSLATE local file char sets */
#else
    { "translate",   XXNOTAV, CM_INV },
#endif /* NOCSETS */

#ifndef NOXMIT
    { "transmit",    XXTRA, 0 },	/* Send (upload) a file, no protocol */
#else
    { "transmit",    XXNOTAV, CM_INV },
#endif /* NOXMIT */

#ifndef NOFRILLS
    { "type",        XXTYP, 0 },	/* Display a local file */
#endif /* NOFRILLS */

#ifndef NOSPL
    { "undcl",       XXUNDCL, CM_INV },
    { "undeclare",   XXUNDCL, 0 },	/* UNDECLARE an array */
    { "undefine",    XXUNDEF, 0 },	/* UNDEFINE a variable or macro */
#else
    { "undcl",       XXNOTAV, CM_INV },
    { "undeclare",   XXNOTAV, CM_INV },
    { "undefine",    XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifdef NEWFTP
    { "user",        XXUSER,  CM_INV }, /* (FTP) USER */
#endif /* NEWFTP */

    { "version",     XXVER, 0 },	/* VERSION-number display */

#ifdef OS2
    { "viewonly",    XXVIEW, CM_LOC },	/* VIEWONLY Terminal Mode */
#endif /* OS2 */

    { "void",        XXVOID, 0 },	/* VOID */

#ifndef NOSPL
    { "wait",        XXWAI, 0 },	/* WAIT */
#else
    { "wait",        XXNOTAV, CM_INV },
#endif /* NOSPL */

    { "wermit",      XXKERMI, CM_INV },

#ifndef NOXFER
    { "where",       XXWHERE, 0 },	/* WHERE (did my file go?) */
#endif /* NOXFER */

#ifndef NOSPL
    { "while",       XXWHI, 0 },	/* WHILE loop */
#else
    { "while",       XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef OS2
#ifndef MAC
#ifndef NOFRILLS
    { "who",         XXWHO, CM_PSH },	/* WHO's logged in? */
#endif /* NOFRILLS */
#endif /* MAC */
#endif /* OS2 */

#ifndef NOHELP
    { "wildcards",   XXWILD,CM_INV|CM_HLP }, /* Wildcard syntax */
#endif /* NOHELP */

#ifndef NOSPL
    { "wr",          XXWRI, CM_INV|CM_ABR },
    { "wri",         XXWRI, CM_INV|CM_ABR },
    { "writ",        XXWRI, CM_INV|CM_ABR },
    { "write",       XXWRI, 0 },	/* WRITE characters to a file */
    { "write-line",  XXWRL, CM_INV },	/* WRITE a line to a file */
    { "writeln",     XXWRL, CM_INV },	/* Pascalisch synonym for write-line */
#else
    { "wr",          XXNOTAV, CM_INV },
    { "wri",         XXNOTAV, CM_INV },
    { "writ",        XXNOTAV, CM_INV },
    { "write",       XXNOTAV, CM_INV },
    { "write-line",  XXNOTAV, CM_INV },
    { "writeln",     XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOFRILLS
    { "xecho",       XXXECH,0 },	/* XECHO */
#endif /* NOFRILLS */

#ifndef NOSPL
    { "xif",         XXIFX, CM_INV },	/* Extended IF command (obsolete) */
#else
    { "xif",         XXNOTAV, CM_INV },
#endif /* NOSPL */

#ifndef NOCSETS
    { "xlate",       XXXLA, CM_INV },	/* Synonym for TRANSLATE */
#else
    { "xlate",       XXNOTAV, CM_INV },
#endif /* NOCSETS */

#ifndef NOXMIT
    { "xmit",        XXTRA, CM_INV },	/* Synonym for TRANSMIT */
#else
    { "xmit",        XXNOTAV, CM_INV },
#endif /* NOXMIT */

#ifndef OS2
#ifndef NOJC
    { "z",           XXSUS, CM_INV|CM_PSH }, /* Synonym for SUSPEND */
#else
    { "z",           XXNOTAV, CM_INV|CM_PSH },
#endif /* NOJC */
#endif /* OS2 */

#ifndef NOSPL
    { "{",           XXMACRO, CM_INV },	/* Immediate macro */
#endif /* NOSPL */
    { "", 0, 0 }
};
int ncmd = (sizeof(cmdtab) / sizeof(struct keytab)) - 1;

/* NOTE: Tokens must also be entered above into cmdtab[]. */

char toktab[] = {
#ifndef NOPUSH
    '!',				/* Shell escape */
#endif /* NOPUSH */
    '#',				/* Comment */
#ifndef NOSPL
    '(',				/* S-Expression */
    '.',				/* Assignment */
#endif /* NOSPL */
    ';',				/* Comment */
#ifndef NOSPL
    ':',				/* Label */
#endif /* NOSPL */
#ifndef NOPUSH
#ifdef CK_REDIR
    '<',				/* REDIRECT */
#endif /* CK_REDIR */
    '@',				/* DCL escape */
#endif /* NOPUSH */
#ifdef CK_RECALL
    '^',				/* Command recall */
#endif /* CK_RECALL */
#ifndef NOSPL
    '{',				/* Immediate macro */
#endif /* NOSPL */
    '\0'				/* End of this string */
};
int xxdot = 0;				/* Used with "." token */

struct keytab yesno[] = {		/* Yes/No keyword table */
    { "no",    0, 0 },
    { "ok",    1, 0 },
    { "yes",   1, 0 }
};
int nyesno = (sizeof(yesno) / sizeof(struct keytab));

/* Save keyword table */

struct keytab savtab[] = {
#ifdef OS2
    { "command",  XSCMD, 0 },
#else
#ifdef CK_RECALL
    { "command",  XSCMD, 0 },
#endif /* CK_RECALL */
#endif /* OS2 */
#ifndef NOSETKEY
    { "keymap",   XSKEY, 0 },
#endif /* NOSETKEY */
#ifdef OS2
    { "terminal", XSTERM, 0 },
#endif /* OS2 */
    { "", 0, 0 }
};
int nsav = (sizeof(savtab) / sizeof(struct keytab)) - 1;

/* Parameter keyword table */

struct keytab prmtab[] = {
    { "alarm",            XYALRM,  0 },
#ifdef COMMENT				/* SET ANSWER not implemented yet */
#ifndef NODIAL
    { "answer",           XYANSWER,0 },
#endif /* NODIAL */
#endif /* COMMENT */
    { "ask-timer",        XYTIMER, 0 },
#ifndef NOXFER
    { "attributes",       XYATTR,  0 },
#endif /* NOXFER */
#ifdef CK_AUTHENTICATION
    { "authentication",   XYAUTH,  0 },
#else  /* CK_AUTHENTICATION */
#ifdef CK_SSL
    { "authentication",   XYAUTH,  0 },
#endif /* CK_SSL */
#endif /* CK_AUTHENTICATION */
    { "b",		  XYBACK,  CM_INV|CM_ABR|CM_PSH },
    { "ba",		  XYBACK,  CM_INV|CM_ABR|CM_PSH },
#ifdef VMS
    { "background",       XYBACK,  CM_INV|CM_PSH },
    { "batch",            XYBACK,  CM_PSH },
#else
    { "background",       XYBACK,  CM_PSH },
    { "batch",            XYBACK,  CM_INV|CM_PSH },
#endif /* VMS */
#ifndef NOLOCAL
    { "baud",	          XYSPEE,  CM_INV|CM_LOC },
#endif /* NOLOCAL */
    { "bell",             XYBELL,  0 },
#ifndef NOXFER
    { "block-check",  	  XYCHKT,  0 },
#endif /* NOXFER */
#ifdef OS2
#ifdef BPRINT
    { "bprinter",         XYBDCP,  CM_INV },
#endif /* BPRINT */
#endif /*  OS2 */
#ifdef BROWSER
    { "browser",          XYBROWSE,CM_PSH|CM_LOC },
#endif /* BROWSER */
#ifndef NOXFER
#ifdef DYNAMIC
    { "buffers",          XYBUF,   0 },
#endif /* DYNAMIC */
#endif /* NOXFER */
#ifndef NOLOCAL
#ifndef MAC
    { "carrier-watch",    XYCARR,  CM_LOC },
#endif /* MAC */
#endif /* NOLOCAL */
#ifndef NOSPL
    { "case",             XYCASE,  0 },
#endif /* NOSPL */
    { "cd",               XYCD,    0 },
#ifndef NOXFER
    { "cl",               XYCLEAR, CM_INV|CM_ABR },
    { "cle",              XYCLEAR, CM_INV|CM_ABR },
    { "clea",             XYCLEAR, CM_INV|CM_ABR },
    { "clear",            XYCLEAR, CM_INV|CM_ABR },
    { "clear-channel",    XYCLEAR, 0 },
    { "clearchannel",     XYCLEAR, CM_INV },
#endif /* NOXFER */
#ifndef NOLOCAL
    { "close-on-disconnect", XYDISC, CM_INV|CM_LOC },
#endif /* NOLOCAL */
    { "cmd",              XYCMD,   CM_INV },
    { "command",          XYCMD,   0 },
#ifdef CK_SPEED
    { "con",              XYQCTL,  CM_INV|CM_ABR },
#endif /* CK_SPEED */
    { "console",          XYCMD,   CM_INV },
#ifdef CK_SPEED
    { "control-character",XYQCTL,  0 },
#endif /* CK_SPEED */
#ifndef NOSPL
    { "count",            XYCOUN,  0 },
#endif /* NOSPL */
#ifndef NOXFER
    { "d",		  XYDELA,  CM_INV|CM_ABR },
    { "de",		  XYDELA,  CM_INV|CM_ABR },
#endif /* NOXFER */
    { "debug",            XYDEBU,  0 },
#ifdef VMS
    { "default",          XYDFLT,  0 },
#else
#ifndef MAC
    { "default",          XYDFLT,  CM_INV },
#endif /* MAC */
#endif /* VMS */
#ifndef NOXFER
    { "delay",	    	  XYDELA,  0 },
    { "destination",	  XYDEST,  0 },
#endif /* NOXFER */
#ifndef NODIAL
    { "di",		  XYDIAL,  CM_INV|CM_ABR|CM_LOC },
    { "dia",		  XYDIAL,  CM_INV|CM_ABR|CM_LOC },
    { "dial",             XYDIAL,  CM_LOC },
#endif /* NODIAL */
#ifdef OS2
    { "dialer",		  XYDLR,   CM_INV },
#endif /* OS2 */
#ifndef NOLOCAL
    { "disconnect",       XYDISC,  CM_LOC },
    { "duplex",	    	  XYDUPL,  CM_LOC },
#endif /* NOLOCAL */
#ifndef NOPUSH
#ifndef NOFRILLS
    { "editor",           XYEDIT,  CM_PSH },
#endif /*  NOFRILLS */
#endif /* NOPUSH */
#ifdef CK_CTRLZ
    { "eof",              XYEOF,   CM_INV },
#endif /* CK_CTRLZ */
#ifndef NOLOCAL
    { "escape-character", XYESC,   CM_LOC },
#endif /* NOLOCAL */
#ifndef NOSPL
    { "evaluate",         XYEVAL,  CM_INV },
#endif /* NOSPL */
    { "exit",		  XYEXIT,  0 },
#ifndef NOXFER
    { "f-ack-bug",        XYFACKB, CM_INV },
    { "f-ack-path",       XYFACKP, CM_INV },
#endif /* NOXFER */
    { "file", 	  	  XYFILE,  0 },
    { "fl",           	  XYFLOW,  CM_INV|CM_ABR },
#ifndef NOSPL
    { "flag",             XYFLAG,  0 },
#endif /* NOSPL */
#ifdef TCPSOCKET
#ifndef SYSFTP
#ifndef NOFTP
    { "ft",   	          XYFTPX,  CM_INV|CM_ABR },
    { "ftp",  	          XYFTPX,  0 },
#endif /* NOFTP */
#endif /* SYSFTP */
#endif /* TCPSOCKET */
#ifdef BROWSER
    { "ftp-client",       XYFTP,   CM_PSH },
#endif /* BROWSER */
    { "flow-control", 	  XYFLOW,  0 },
#ifndef NOSPL
    { "function",         XYFUNC,  0 },
#endif /* NOSPL */
#ifdef NEWFTP
    { "get-put-remote",   XYGPR,   0 },
#endif /* NEWFTP */
#ifdef KUI
    { "gui",              XYGUI,   0 },
#endif /* KUI */
    { "handshake",    	  XYHAND,  0 },
    { "hints",            XYHINTS, 0 },
#ifdef NETCONN
    { "host",             XYHOST,  CM_LOC },
#endif /* NETCONN */
#ifndef NOSPL
    { "i",		  XYINPU,  CM_INV|CM_ABR },
#endif /* NOSPL */
#ifdef IKSD
    { "iks",              XYIKS,   0 },
#else
    { "iks",              XYIKS,   CM_INV },
#endif /* IKSD */
#ifndef NOSPL
    { "in",		  XYINPU,  CM_INV|CM_ABR },
#endif /* NOSPL */
#ifndef NOXFER
    { "incomplete",   	  XYIFD,   CM_INV },
#endif /* NOXFER */
#ifndef NOSPL
    { "input",            XYINPU,  0 },
#endif /* NOSPL */
#ifndef NOSETKEY
    { "key",		  XYKEY,   0 },
#endif /* NOSETKEY */
    { "l",                XYLINE,  CM_INV|CM_ABR },
#ifndef NOCSETS
    { "language",         XYLANG,  0 },
#endif /* NOCSETS */
#ifndef NOLOCAL
    { "line",             XYLINE,  CM_LOC },
    { "local-echo",	  XYLCLE,  CM_INV|CM_LOC },
#endif /* NOLOCAL */
#ifdef LOCUS
    { "locus",            XYLOCUS, 0 },
#endif /* LOCUS */
#ifndef NOSPL
    { "login",		  XYLOGIN, CM_LOC },
#endif /* NOSPL */
#ifndef NOSPL
    { "macro",            XYMACR,  0 },
#endif /* NOSPL */
    { "match",            XYMATCH, 0 },
#ifdef COMMENT
#ifdef VMS
    { "messages",         XYMSGS,  0 },
#endif /* VMS */
#endif /* COMMENT */
#ifndef NODIAL
    { "modem",		  XYMODM,  CM_LOC },
#endif /* NODIAL */
#ifndef NOLOCAL
#ifdef OS2MOUSE
    { "mouse",		  XYMOUSE, 0 },
#endif /* OS2MOUSE */
#endif /* NOLOCAL */
#ifdef OS2
    { "mskermit",         XYMSK,   0 },
#endif /* OS2 */
#ifdef NETCONN
    { "network",          XYNET,   CM_LOC },
#endif /* NETCONN */
#ifndef NOSPL
    { "output",           XYOUTP,  0 },
#endif /* NOSPL */
    { "options",          XYOPTS,  0 },
    { "pause",            XYSLEEP, CM_INV },
#ifdef ANYX25
#ifndef IBMX25
    { "pad",              XYPAD,   CM_LOC },
#endif /* IBMX25 */
#endif /* ANYX25 */
    { "parity",	    	  XYPARI,  0 },
#ifndef NOLOCAL
#ifdef OS2
    { "port",             XYLINE,  CM_LOC },
#else
    { "port",             XYLINE,  CM_INV|CM_LOC },
#endif /* OS2 */
#endif /* NOLOCAL */
#ifndef NOFRILLS
    { "pr",   	    	  XYPROM,  CM_INV|CM_ABR },
    { "printer",          XYPRTR,  0 },
#endif /* NOFRILLS */
#ifdef OS2
    { "priority",         XYPRTY,  0 },
#endif /* OS2 */
#ifdef CK_SPEED
    { "prefixing",        XYPREFIX, 0 },
#endif /* CK_SPEED */
#ifndef NOFRILLS
    { "prompt",	    	  XYPROM,  0 },
#endif /* NOFRILLS */
#ifndef NOXFER
    { "protocol",	  XYPROTO, 0 },
#endif /* NOXFER */
    { "q",		  XYQUIE,  CM_INV|CM_ABR },
#ifndef NOXFER
    { "q8flag",           XYQ8FLG, CM_INV },
#endif /* NOXFER */
#ifdef QNX
    { "qnx-port-lock",    XYQNXPL, 0 },
#else
    { "qnx-port-lock",    XYQNXPL, CM_INV },
#endif /* QNX */
    { "quiet",		  XYQUIE,  0 },
#ifndef NOXFER
    { "rec",              XYRECV,  CM_INV|CM_ABR },
    { "receive",          XYRECV,  0 },
    { "recv",             XYRECV,  CM_INV },
#endif /* NOXFER */
    { "reliable",         XYRELY,  0 },
#ifndef NOXFER
    { "repeat",           XYREPT,  0 },
    { "retry-limit",      XYRETR,  0 },
#endif /* NOXFER */
#ifdef CKROOT
    { "root",             XYROOT,  0 },
#endif /* CKROOT */
#ifndef NOSCRIPT
    { "script",		  XYSCRI,  CM_LOC },
#endif /* NOSCRIPT */
#ifndef NOXFER
    { "send",             XYSEND,  0 },
#ifndef NOLOCAL
#ifndef NOSERVER
    { "ser",              XYSERV,  CM_INV|CM_ABR },
#endif /* NOSERVER */
#endif /* NOXFER */
    { "serial",           XYSERIAL,CM_LOC },
#endif /* NOLOCAL */
#ifndef NOSERVER
    { "server",           XYSERV,  0 },
#endif /* NOSERVER */
#ifdef SESLIMIT
#ifndef NOLOCAL
    { "session-l",        XYSESS,  CM_INV|CM_ABR },
#endif /* NOLOCAL */
    { "session-limit",    XYLIMIT, CM_INV|CM_LOC }, /* Session Limit */
#endif /* SESLIMIT */

#ifndef NOLOCAL
    { "session-log",      XYSESS,  CM_LOC },
#endif /* NOLOCAL */

#ifndef NOSPL
#ifndef NOSEXP
    { "sexpression",      XYSEXP,  CM_INV },
#endif /* NOSEXP */
#endif /* NOSPL */

    { "sleep",            XYSLEEP, 0 },

#ifndef NOLOCAL
    { "speed",	          XYSPEE,  CM_LOC },
#endif /* NOLOCAL */

#ifdef ANYSSH
    { "ssh",	          XYSSH,   0 },
#endif /* ANYSSH */

#ifndef NOSPL
    { "startup-file",     XYSTARTUP, CM_INV },
#endif /* NOSPL */

#ifndef NOLOCAL
#ifdef HWPARITY
    { "stop-bits",        XYSTOP, CM_LOC },
#else
#ifdef TN_COMPORT
    { "stop-bits",        XYSTOP, CM_LOC },
#endif /* TN_COMPORT */
#endif /* HWPARITY */
#endif /* NOLOCAL */

#ifndef NOXFER
#ifdef STREAMING
    { "streaming",        XYSTREAM, 0 },
#endif /* STREAMING */
#endif /* NOXFER */

#ifndef NOJC
    { "suspend",          XYSUSP,  CM_PSH },
#endif /* NOJC */
#ifdef CKSYSLOG
    { "syslog",           XYSYSL,  CM_INV },
#endif /* CKSYSLOG */
    { "take",             XYTAKE,  0 },

#ifdef CK_TAPI
    { "tapi",             XYTAPI,  CM_LOC },
#endif /* CK_TAPI */

#ifndef NOTCPOPTS
#ifdef TCPSOCKET
    { "tcp",              XYTCP,   CM_LOC },
#endif /* TCPSOCKET */
#endif /* NOTCPOPTS */

#ifdef TNCODE
    { "tel",              XYTEL,   CM_INV|CM_ABR },
    { "telnet",           XYTEL,   0 },
    { "telopt",           XYTELOP, 0 },
#endif /* TNCODE */

#ifndef NOSPL
    { "temp-directory",   XYTMPDIR,0 },
#endif /* NOSPL */

#ifndef NOLOCAL
    { "terminal",         XYTERM,  CM_LOC },
#endif /* NOLOCAL */

#ifdef OS2
    { "title",		  XYTITLE, CM_LOC },
#endif /* OS2 */
#ifdef TLOG
    { "transaction-log",  XYTLOG,  0 },
#endif /* TLOG */
#ifndef NOXFER
    { "transfer",         XYXFER,  0 },
#endif /* NOXFER */
#ifndef NOXMIT
    { "transmit",         XYXMIT,  0 },
#endif /* NOXMIT */
#ifndef NOXFER
#ifndef NOCSETS
    { "unknown-char-set", XYUNCS,  0 },
#endif /* NOCSETS */
#endif /* NOXFER */
    { "wait",             XYSLEEP, CM_INV },
#ifndef NOPUSH
#ifdef UNIX
    { "wildcard-expansion", XYWILD, 0 },
#endif /* UNIX */
#endif /* NOPUSH */
#ifdef NT
    { "w",                XYWIND,  CM_INV|CM_ABR },
    { "wi",               XYWIND,  CM_INV|CM_ABR },
    { "win",              XYWIND,  CM_INV|CM_ABR },
#endif /* NT */
    { "window-size",      XYWIND,  0 },
#ifdef NT
    { "win95",            XYWIN95, 0 },
#endif /* NT */
#ifdef ANYX25
    { "x.25",             XYX25,   CM_LOC },
    { "x25",              XYX25,   CM_INV|CM_LOC },
#endif /* ANYX25 */
    { "xfer",             XYXFER,  CM_INV },
#ifndef NOXMIT
    { "xmit",             XYXMIT,  CM_INV },
#endif /* NOXMIT */
    { "", 0, 0 }
};
int nprm = (sizeof(prmtab) / sizeof(struct keytab)) - 1; /* How many */

struct keytab scntab[] = {		/* Screen commands */
    { "clear",   SCN_CLR, 0 },
    { "cleol",   SCN_CLE, 0 },
    { "move-to", SCN_MOV, 0 }
};
int nscntab = (sizeof(scntab) / sizeof(struct keytab)); /* How many */

#ifdef ANYSSH				/* SSH command table */
#ifdef SSHBUILTIN
int    ssh_pf_lcl_n = 0,
       ssh_pf_rmt_n = 0;
struct ssh_pf ssh_pf_lcl[32] = { 0, NULL, 0 }; /* SSH Port Forwarding */
struct ssh_pf ssh_pf_rmt[32] = { 0, NULL, 0 }; /* structs... */
extern char * ssh_hst, * ssh_cmd, * ssh_prt;
extern int    ssh_ver,   ssh_xfw;
char * ssh_tmpuid = NULL, *ssh_tmpcmd = NULL, *ssh_tmpport = NULL,
     * ssh_tmpstr = NULL;

int
 sshk_type = SSHKT_2D,			/* SSH KEY CREATE /TYPE:x */
 sshk_bits = 1024,			/* SSH KEY CREATE /BITS:n */
 sshk_din  = SKDF_OSSH,			/* SSH KEY DISPLAY /IN-FORMAT: */
 sshk_dout = SKDF_OSSH;			/* SSH KEY DISPLAY /OUT-FORMAT: */

char
 * sshk1_comment = NULL,		/* SSH V1 COMMENT */
 * sshkp_old = NULL,			/* Old key passphrase */
 * sshkp_new = NULL,			/* New key passphrase */
 * sshkc_pass = NULL,			/* KEY CREATE /PASS:xxx */
 * sshkc_comm = NULL,			/* KEY CREATE /V1-RSA-COMMENT:xxx */
 * sshd_file = NULL,			/* DISPLAY file */
 * sshk_file = NULL;			/* SSH CREATE KEY file */

static struct keytab sshclr[] = {
    { "local-port-forward",  SSHC_LPF, 0 },
    { "remote-port-forward", SSHC_RPF, 0 },
    { "", 0, 0 }
};
static int nsshclr = (sizeof(sshclr) / sizeof(struct keytab)) - 1;

struct keytab sshopnsw[] = {
    { "/command",        SSHSW_CMD, CM_ARG },
    { "/password",       SSHSW_PWD, CM_ARG },
    { "/subsystem",      SSHSW_SUB, CM_ARG },
    { "/user",           SSHSW_USR, CM_ARG },
    { "/version",        SSHSW_VER, CM_ARG },
    { "/x11-forwarding", SSHSW_X11, CM_ARG },
    { "", 0, 0 }
};
int nsshopnsw = (sizeof(sshopnsw) / sizeof(struct keytab)) - 1;

static struct keytab sshkwtab[] = {
    { "add",                 XSSH_ADD, 0 },
    { "agent",               XSSH_AGT, 0 },
    { "clear",               XSSH_CLR, 0 },
    { "forward-local-port",  XSSH_FLP, CM_INV },
    { "forward-remote-port", XSSH_FRP, CM_INV },
    { "key",                 XSSH_KEY, 0 },
    { "open",                XSSH_OPN, 0 },
    { "v2",                  XSSH_V2,  0 },
    { "", 0, 0 }
};
static int nsshcmd = (sizeof(sshkwtab) / sizeof(struct keytab)) - 1;

static struct keytab ssh2tab[] = {
    { "rekey", XSSH2_RKE, 0 },
    { "", 0, 0 }
};
static int nssh2tab = (sizeof(ssh2tab) / sizeof(struct keytab));

static struct keytab addfwd[] = {	/* SET SSH ADD command table */
    { "local-port-forward",  SSHF_LCL, 0 },
    { "remote-port-forward", SSHF_RMT, 0 },
    { "", 0, 0 }
};
static int naddfwd = (sizeof(addfwd) / sizeof(struct keytab)) - 1;

static struct keytab sshagent[] = {	/* SET SSH AGENT command table */
    { "add",    SSHA_ADD, 0 },
    { "delete", SSHA_DEL, 0 },
    { "list",   SSHA_LST, 0 },
    { "", 0, 0 }
};
static int nsshagent = (sizeof(sshagent) / sizeof(struct keytab)) - 1;

static struct keytab sshagtsw[] = {	/* SET SSH AGENT LIST switch table */
    { "/fingerprint", SSHASW_FP, 0 },
    { "", 0, 0 }
};
static int nsshagtsw = (sizeof(sshagtsw) / sizeof(struct keytab)) - 1;

static struct keytab sshkey[] = {	/* SET SSH KEY command table */
    { "change-passphrase",  SSHK_PASS, 0 },
    { "create",             SSHK_CREA, 0 },
    { "display",            SSHK_DISP, 0 },
    { "v1",                 SSHK_V1,   0 },
    { "", 0, 0 }
};
static int nsshkey = (sizeof(sshkey) / sizeof(struct keytab)) - 1;

static struct keytab sshkv1[] = {	/* SET SSH KEY V1 command table */
    { "set-comment",  1, 0 }
};

static struct keytab sshkpsw[] = {	/* SET SSH KEY PASSPHRASE table */
    { "/new-passphrase",  2, CM_ARG },
    { "/old-passphrase",  1, CM_ARG }
};

static struct keytab sshkcrea[] = {	/* SSH KEY CREATE table */
    { "/bits",           SSHKC_BI, CM_ARG },
    { "/passphrase",     SSHKC_PP, CM_ARG },
    { "/type",           SSHKC_TY, CM_ARG },
    { "/v1-rsa-comment", SSHKC_1R, CM_ARG }
};
static int nsshkcrea = (sizeof(sshkcrea) / sizeof(struct keytab));

static struct keytab sshkcty[] = {	/* SSH KEY CREATE /TYPE:xxx */
    { "srp",    SSHKT_SRP, 0 },
    { "v1-rsa", SSHKT_1R, 0 },
    { "v2-dsa", SSHKT_2D, 0 },
    { "v2-rsa", SSHKT_2R, 0 }
};
static int nsshkcty = (sizeof(sshkcty) / sizeof(struct keytab));

static struct keytab sshdswi[] = {	/* SET SSH KEY DISPLAY /switches */
    { "/format", SSHKD_OUT, CM_ARG }
};
static int nsshdswi = (sizeof(sshdswi) / sizeof(struct keytab));

#ifdef COMMENT
static struct keytab sshdifmt[] = {	/* SSH KEY DISPLAY /IN-FORMAT: */
    { "openssh", SKDF_OSSH, 0 },
    { "ssh.com", SKDF_SSHC, 0 }
};
static int nsshdifmt = (sizeof(sshdifmt) / sizeof(struct keytab));
#endif /* COMMENT */

static struct keytab sshdofmt[] = {	/* SSH KEY DISPLAY /IN-FORMAT: */
    { "fingerprint", SKDF_FING, 0 },
    { "ietf",        SKDF_IETF, 0 },
    { "openssh",     SKDF_OSSH, 0 },
    { "ssh.com",     SKDF_SSHC, 0 }
};
static int nsshdofmt = (sizeof(sshdofmt) / sizeof(struct keytab));

static struct keytab sshkermit[] = { /* SKERMIT */
    { "open",       SKRM_OPN, 0 }
};
static int nsshkermit = (sizeof(sshkermit) / sizeof(struct keytab));

struct keytab sshkrmopnsw[] = {
    { "/password",       SSHSW_PWD, CM_ARG },
    { "/user",           SSHSW_USR, CM_ARG },
    { "/version",        SSHSW_VER, CM_ARG },
    { "", 0, 0 }
};
int nsshkrmopnsw = (sizeof(sshkrmopnsw) / sizeof(struct keytab)) - 1;
#endif /* SSHBUILTIN */

#ifdef SFTP_BUILTIN
static struct keytab sftpkwtab[] = {    /* SFTP */
    {  "cd",        SFTP_CD,    0 },
    {  "chgrp",     SFTP_CHGRP, 0 },
    {  "chmod",     SFTP_CHMOD, 0 },
    {  "chown",     SFTP_CHOWN, 0 },
    {  "delete",    SFTP_RM,    0 },
    {  "dir",       SFTP_DIR,   0 },
    {  "get",       SFTP_GET,   0 },
    {  "mkdir",     SFTP_MKDIR, 0 },
    {  "open",      SFTP_OPN,   0 },
    {  "put",       SFTP_PUT,   0 },
    {  "pwd",       SFTP_PWD,   0 },
    {  "rename",    SFTP_REN,   0 },
    {  "rm",        SFTP_RM,    CM_INV },
    {  "rmdir",     SFTP_RMDIR, 0 },
    {  "symlink",   SFTP_LINK,  0 },
    {  "version",   SFTP_VER,   0 }
};
static int nsftpkwtab = (sizeof(sftpkwtab) / sizeof(struct keytab));
#endif /* SFTP_BUILTIN */
#endif /* ANYSSH */

#ifdef NETCONN
struct keytab netkey[] = {		/* SET NETWORK table */
    { "directory", XYNET_D,  0 },
    { "type",      XYNET_T,  0 }
};
int nnetkey = (sizeof(netkey) / sizeof(struct keytab));

struct keytab netcmd[] = {
/*
  These are the network types.
*/
#ifdef NETCMD
    { "command",       NET_CMD,  CM_INV }, /* Command */
#endif /* NETCMD */

#ifdef DECNET				/* DECnet / PATHWORKS */
    { "decnet",        NET_DEC,  0 },
#endif /* DECNET */

#ifdef NETDLL
    { "dll",           NET_DLL,  CM_INV }, /* DLL to be loaded */
#endif /* NETDLL */

#ifdef NETFILE
    { "file",           NET_FILE, CM_INV }, /* FILE (real crude) */
#endif /* NETFILE */

#ifdef NPIPE				/* Named Pipes */
    { "named-pipe",     NET_PIPE,  0 },
#endif /* NPIPE */

#ifdef CK_NETBIOS
    { "netbios",        NET_BIOS,  0 },	/* NETBIOS */
#endif /* CK_NETBIOS */

#ifdef DECNET				/* DECnet / PATHWORKS (alias) */
    { "pathworks",     NET_DEC,  CM_INV },
#endif /* DECNET */

#ifdef NETCMD
    { "pipe",          NET_CMD,  0 },	/* Pipe */
#endif /* NETCMD */

#ifdef NETPTY
    { "pseudoterminal",NET_PTY, 0 },	/* Pseudoterminal */
#endif /* NETPTY */

#ifdef NETPTY
    { "pty",          NET_PTY,  CM_INV }, /* Inv syn for pseudoterm */
#endif /* NETPTY */

#ifdef SSHBUILTIN
    { "ssh",          NET_SSH,  0 },
#endif /* SSHBUILTIN */

#ifdef SUPERLAT
    { "superlat",     NET_SLAT, 0 },	/* Meridian Technologies' SuperLAT */
#endif /* SUPERLAT */

#ifdef TCPSOCKET			/* TCP/IP sockets library */
    { "tcp/ip",       NET_TCPB, 0 },
#endif /* TCPSOCKET */
#ifdef SUPERLAT
    { "tes32",        NET_SLAT, 0 },	/* Emulux TES32 */
#endif /* SUPERLAT */
#ifdef ANYX25				/* X.25 */
#ifdef SUNX25
    { "x",            NET_SX25, CM_INV|CM_ABR },
    { "x.25",         NET_SX25, 0 },
    { "x25",          NET_SX25, CM_INV },
#else
#ifdef STRATUSX25
    { "x",            NET_VX25, CM_INV|CM_ABR },
    { "x.25",         NET_VX25, 0 },
    { "x25",          NET_VX25, CM_INV },
#endif /* STRATUSX25 */
#endif /* SUNX25 */
#ifdef IBMX25
    { "x",            NET_IX25, CM_INV|CM_ABR },
    { "x.25",         NET_IX25, CM_INV },
    { "x25",          NET_IX25, CM_INV },
#endif /* IBMX25 */
#ifdef HPX25
    { "x",            NET_IX25, CM_INV|CM_ABR },
    { "x.25",         NET_IX25, 0 },
    { "x25",          NET_IX25, CM_INV },
#endif /* HPX25 */
#endif /* ANYX25 */
    { "", 0, 0 }
};
int nnets = (sizeof(netcmd) / sizeof(struct keytab));

#ifndef NOTCPOPTS
#ifdef TCPSOCKET

/* TCP options */

struct keytab tcpopt[] = {
    { "address",   XYTCP_ADDRESS, 0 },
#ifdef CK_DNS_SRV
    { "dns-service-records", XYTCP_DNS_SRV, 0 },
#endif /* CK_DNS_SRV */
#ifdef SO_DONTROUTE
    { "dontroute",   XYTCP_DONTROUTE, 0 },
#endif /* SO_DONTROUTE */
#ifndef NOHTTP
    { "http-proxy", XYTCP_HTTP_PROXY, 0 },
#endif /* NOHTTP */
#ifdef SO_KEEPALIVE
    { "keepalive", XYTCP_KEEPALIVE, 0 },
#endif /* SO_KEEPALIVE */
#ifdef SO_LINGER
    { "linger", XYTCP_LINGER, 0 },
#endif /* SO_LINGER */
#ifdef TCP_NODELAY
    { "nagle",  XYTCP_NAGLE,    CM_INV },
    { "nodelay", XYTCP_NODELAY, 0 },
#endif /* TCP_NODELAY */
    { "reverse-dns-lookup", XYTCP_RDNS, 0 },
#ifdef SO_RCVBUF
    { "recvbuf", XYTCP_RECVBUF, 0 },
#endif /* SO_RCVBUF */
#ifdef SO_SNDBUF
    { "sendbuf", XYTCP_SENDBUF, 0 },
#endif /* SO_SNDBUF */
#ifdef NT
#ifdef CK_SOCKS
    { "socks-server", XYTCP_SOCKS_SVR, 0 },
#endif /* CK_SOCKS */
#endif /* NT */
#ifdef VMS
#ifdef DEC_TCPIP
    { "ucx-port-bug", XYTCP_UCX, 0 },
#endif /* DEC_TCPIP */
#endif /* VMS */
    { "",0,0 }
};
int ntcpopt = (sizeof(tcpopt) / sizeof(struct keytab));
#endif /* TCPSOCKET */
#endif /* NOTCPOPTS */
#endif /* NETCONN */

#ifdef OS2
/* K95 Manual Chapter Table -- Keep these two tables in sync! */

static char * linktbl[] = {		/* Internal links in k95.htm */
    "#top",				/* 00 */
    "#what",				/* 01 */
    "#install",				/* 02 */
    "#start",				/* 03 */
    "#dialer",				/* 04 */
    "#entries",				/* 05 */
    "#command",				/* 06 */
    "#terminal",			/* 07 */
    "#transfer",			/* 08 */
    "#hostmode"				/* 09 */
};

static struct keytab chaptbl[] = {
    { "Command-Screen",     6, 0 },
    { "Contents",           0, 0 },
    { "Dialer-Entries",     5, 0 },
    { "File-Transfer",      8, 0 },
    { "Getting-Started",    3, 0 },
    { "Host-Mode",          9, 0 },
    { "Installation",       2, 0 },
    { "Terminal-Emulation", 7, 0 },
    { "Using-The-Dialer",   4, 0 },
    { "What-Is-K95",        1, 0 },
    { "",                   0, 0 }
};
static int nchaptbl = (sizeof(chaptbl) / sizeof(struct keytab) - 1);
#endif /* OS2 */

#ifndef NOXFER
/* Remote Command Table */

struct keytab remcmd[] = {
#ifndef NOSPL
    { "as",        XZASG, CM_INV|CM_ABR },
    { "asg",       XZASG, CM_INV },
    { "assign",    XZASG, 0 },
#endif /* NOSPL */
    { "cd",        XZCWD, 0 },
    { "cdup",      XZCDU, CM_INV },
    { "copy",      XZCPY, 0 },
    { "cwd",       XZCWD, CM_INV },
    { "delete",    XZDEL, 0 },
    { "directory", XZDIR, 0 },
    { "e",         XZXIT, CM_ABR|CM_INV },
    { "erase",     XZDEL, CM_INV },
    { "exit",      XZXIT, 0 },
    { "help",      XZHLP, 0 },
#ifndef NOPUSH
    { "host",      XZHOS, 0 },
#endif /* NOPUSH */
#ifndef NOFRILLS
    { "kermit",    XZKER, 0 },
    { "l",         XZLGI, CM_ABR|CM_INV },
    { "lo",        XZLGI, CM_ABR|CM_INV },
    { "log",       XZLGI, CM_ABR|CM_INV },
    { "login",     XZLGI, 0 },
    { "logout",    XZLGO, 0 },
    { "mkdir",     XZMKD, 0 },
    { "print",     XZPRI, 0 },
#endif /* NOFRILLS */
    { "pwd",       XZPWD, 0 },
#ifndef NOSPL
    { "query",	   XZQUE, 0 },
#endif /* NOSPL */
    { "rename",    XZREN, 0 },
    { "rmdir",     XZRMD, 0 },
    { "set",       XZSET, 0 },
    { "space",	   XZSPA, 0 },
#ifndef NOFRILLS
    { "type",      XZTYP, 0 },
    { "who",       XZWHO, 0 },
#endif /* NOFRILLS */
    { "", 0, 0}
};
int nrmt = (sizeof(remcmd) / sizeof(struct keytab)) - 1;
#endif /* NOXFER */

struct keytab logtab[] = {
#ifdef CKLOGDIAL
    { "connections",  LOGM, CM_INV },
    { "cx",           LOGM, 0 },
#endif /* CKLOGDIAL */
#ifdef DEBUG
    { "debugging",    LOGD, 0 },
#endif /* DEBUG */
    { "packets",      LOGP, 0 },
#ifndef NOLOCAL
    { "session",      LOGS, 0 },
#endif /* NOLOCAL */
#ifdef TLOG
    { "transactions", LOGT, 0 },
#endif /* TLOG */
    { "", 0, 0 }
};
int nlog = (sizeof(logtab) / sizeof(struct keytab)) - 1;

struct keytab writab[] = {
#ifndef NOSPL
    { "append-file",     LOGW, CM_INV },
#endif /* NOSPL */
    { "debug-log",       LOGD, 0 },
    { "error",           LOGE, 0 },
#ifndef NOSPL
    { "file",            LOGW, 0 },
#endif /* NOSPL */
    { "packet-log",      LOGP, 0 },
    { "screen",          LOGX, 0 },
#ifndef NOLOCAL
    { "session-log",     LOGS, 0 },
#endif /* NOLOCAL */
    { "sys$output",      LOGX, CM_INV },
    { "t",               LOGT, CM_ABR|CM_INV }, /* Because of a typo in */
    { "tr",              LOGT, CM_ABR|CM_INV }, /* the book... */
    { "tra",             LOGT, CM_ABR|CM_INV },
    { "tran",            LOGT, CM_ABR|CM_INV },
    { "trans",           LOGT, CM_ABR|CM_INV },
    { "transa",          LOGT, CM_ABR|CM_INV },
    { "transac",         LOGT, CM_ABR|CM_INV },
    { "transact",        LOGT, CM_ABR|CM_INV },
    { "transacti",       LOGT, CM_ABR|CM_INV },
    { "transactio",      LOGT, CM_ABR|CM_INV },
    { "transaction",     LOGT, CM_ABR|CM_INV },
    { "transaction-log", LOGT, 0 },
    { "transactions",    LOGT, CM_INV }
};
int nwri = (sizeof(writab) / sizeof(struct keytab));

#ifdef COMMENT				/* INPUT switches not used yet... */
static struct keytab inswtab[] = {
#ifdef COMMENT
    { "/assign",       IN_ASG, CM_ARG },
#endif /* COMMENT */
    { "/autodownload", IN_ADL, CM_ARG },
    { "/case",         IN_CAS, CM_ARG },
    { "/echo",         IN_ECH, CM_ARG },
    { "/interrupts",   IN_NOI, CM_ARG },
    { "/silence",      IN_SIL, CM_ARG },
#ifdef COMMENT
    { "/pattern",      IN_PAT, CM_ARG },
#endif /* COMMENT */
    { "", 0, 0 }
};
static int ninswtab = (sizeof(inswtab) / sizeof(struct keytab)) - 1;
#endif /* COMMENT */

static struct keytab clrtab[] = {	/* Keywords for CLEAR command */
#ifndef NOSPL
    { "alarm",            CLR_ALR,         0 },
#ifdef CK_APC
    { "apc",              CLR_APC,         0 },
#endif /* CK_APC */
#ifdef PATTERNS
    { "binary-patterns",  CLR_BIN,         0 },
#endif /* PATTERNS */
    { "both",             CLR_DEV|CLR_INP, CM_INV },
#endif /* NOSPL */
#ifdef OS2
    { "command-screen",   CLR_CMD,         0 },
#endif /* OS2 */
#ifndef NOSPL
    { "device",           CLR_DEV,         CM_INV|CM_ABR },
    { "device-and-input", CLR_DEV|CLR_INP, 0 },
#endif /* NOSPL */
    { "device-buffer",    CLR_DEV,         0 },
#ifndef NODIAL
    { "dial-status",      CLR_DIA,	 0 },
#endif /* NODIAL */
#ifndef NOSPL
    { "input-buffer",     CLR_INP,         0 },
#endif /* NOSPL */
    { "keyboard-buffer",  CLR_KBD,         0 },
    { "send-list",        CLR_SFL,         0 },
#ifdef OS2
    { "scr",              CLR_SCL,         CM_INV|CM_ABR },
#endif /* OS2 */
    { "screen",           CLR_SCR,         0 },
#ifdef OS2
    { "scrollback",       CLR_SCL,         CM_INV },
    { "terminal-screen",  CLR_TRM,         0 },
#endif /* OS2 */
#ifdef PATTERNS
    { "text-patterns",    CLR_TXT,         0 },
#endif /* PATTERNS */
    { "", 0, 0 }
};
int nclear = (sizeof(clrtab) / sizeof(struct keytab)) - 1;

struct keytab clstab[] = {		/* Keywords for CLOSE command */
#ifndef NOSPL
    { "!read",           LOGR, CM_INV },
    { "!write",          LOGW, CM_INV },
#ifndef NOPUSH
#endif /* NOPUSH */
#endif /* NOSPL */
#ifndef NOSPL
    { "append-file",     LOGW, CM_INV },
#endif /* NOSPL */
#ifndef NOLOCAL
    { "connection",      9999, 0 },
#endif /* NOLOCAL */
#ifdef CKLOGDIAL
    { "cx-log",          LOGM, 0 },
#endif /* CKLOGDIAL */
#ifdef DEBUG
    { "debug-log",       LOGD, 0 },
#endif /* DEBUG */
    { "host",            9999, CM_INV }, /* Synonym for CLOSE CONNECTION */
    { "line",            9999, CM_INV }, /* Synonym for CLOSE CONNECTION */
    { "p",               LOGP, CM_INV|CM_ABR },
    { "packet-log",      LOGP, 0 },
    { "port",            9999, CM_INV }, /* Synonym for CLOSE CONNECTION */
#ifndef NOSPL
    { "read-file",       LOGR, 0 },
#endif /* NOSPL */
#ifndef NOLOCAL
    { "session-log",     LOGS, 0 },
#endif /* NOLOCAL */
#ifdef TLOG
    { "t",               LOGT, CM_ABR|CM_INV }, /* Because of a typo in */
    { "tr",              LOGT, CM_ABR|CM_INV }, /* the book... */
    { "tra",             LOGT, CM_ABR|CM_INV },
    { "tran",            LOGT, CM_ABR|CM_INV },
    { "trans",           LOGT, CM_ABR|CM_INV },
    { "transa",          LOGT, CM_ABR|CM_INV },
    { "transac",         LOGT, CM_ABR|CM_INV },
    { "transact",        LOGT, CM_ABR|CM_INV },
    { "transacti",       LOGT, CM_ABR|CM_INV },
    { "transactio",      LOGT, CM_ABR|CM_INV },
    { "transaction",     LOGT, CM_ABR|CM_INV },
    { "transaction-log", LOGT, 0 },
    { "transactions",    LOGT, CM_INV },
#endif /* TLOG */
#ifndef NOSPL
    { "write-file",      LOGW, 0 },
#endif /* NOSPL */
    { "", 0, 0 }
};
int ncls = (sizeof(clstab) / sizeof(struct keytab)) - 1;

/* SHOW command arguments */

#ifndef NOSHOW
struct keytab shotab[] = {
#ifndef NOSPL
    { "alarm",        SHALRM, 0 },
    { "arg",          SHARG, CM_INV|CM_ABR },
    { "arguments",    SHARG, 0 },
    { "args",         SHARG, CM_INV },
    { "arrays",       SHARR, 0 },
#endif /* NOSPL */

#ifndef NOCSETS
    { "associations", SHASSOC, 0 },
#endif /* NOCSETS */

#ifndef NOXFER
    { "attributes",   SHATT, 0 },
#endif /* NOXFER */

#ifdef CK_AUTHENTICATION
    { "authentication", SHOAUTH, CM_INV },
#endif /* CK_AUTHENTICATION */

#ifndef NOPUSH
#ifdef BROWSER
    { "browser",      SHBROWSE, CM_PSH|CM_LOC },
#endif /*  BROWSER */
#endif /* NOPUSH */
    { "cd",           SHCD, 0 },
    { "character-sets", SHCSE, 0 },
    { "cmd",          SHCMD, CM_INV },
#ifndef NOLOCAL
    { "com",          SHCOM, CM_INV|CM_ABR },
    { "comm",         SHCOM, CM_INV|CM_ABR },
    { "communications", SHCOM, 0 },
#endif /* NOLOCAL */
    { "command",      SHCMD, 0 },
    { "connection",   SHCONNX, 0 },
#ifdef CK_SPEED
    { "control-prefixing", SHCTL, 0 },
#endif /* CK_SPEED */
#ifdef CKLOGDIAL
    { "cx",           SHCONNX, CM_INV },
#endif /* CKLOGDIAL */
#ifndef NOSPL
    { "count",        SHCOU, 0 },
#endif /* NOSPL */
    { "d",            SHDIA, CM_INV|CM_ABR },
#ifdef VMS
    { "default",      SHDFLT, 0 },
#else
    { "default",      SHDFLT, CM_INV },
#endif /* VMS */
#ifndef NODIAL
    { "dial",         SHDIA, CM_LOC },
#endif /* NODIAL */
    { "double/ignore",SHDBL, 0 },
#ifndef NOPUSH
#ifndef NOFRILLS
    { "editor",       SHEDIT, CM_PSH },
#endif /*  NOFRILLS */
#endif /* NOPUSH */
#ifndef NOLOCAL
    { "escape",       SHESC, CM_LOC },
#endif /* NOLOCAL */
    { "exit",         SHEXI, 0 },
    { "extended-options", SHXOPT, CM_INV },
    { "features",     SHFEA, 0 },
    { "file",         SHFIL, 0 },
#ifndef NOLOCAL
    { "flow-control", SHOFLO, 0 },
#endif /* NOLOCAL */
#ifdef BROWSER
    { "ftp",          SHOFTP, CM_PSH|CM_LOC },
#else
#ifndef NOFTP
#ifndef SYSFTP
#ifdef TCPSOCKET
    { "ftp",          SHOFTP, 0 },	/* (built-in ftp) */
#endif /* TCPSOCKET */
#endif /* SYSFTP */
#endif /* NOFTP */
#endif /* BROWSER */
#ifndef NOSPL
    { "functions",    SHFUN, 0 },
    { "globals",      SHVAR, 0 },
#endif /* NOSPL */
#ifdef KUI
    { "gui",          SHOGUI, 0 },
#endif /* KUI */
#ifdef CK_RECALL
    { "history",      SHHISTORY, 0 },
#endif /* CK_RECALL */
    { "ignore/double",SHDBL, CM_INV },
    { "iksd",         SHOIKS, CM_INV },
#ifndef NOSPL
    { "input",        SHINP, 0 },
#endif /* NOSPL */
#ifndef NOSETKEY
    { "k",            SHKEY, CM_INV|CM_ABR },
    { "key",          SHKEY, 0 },
#ifndef NOKVERBS
    { "kverbs",       SHKVB, 0 },
#endif /* NOKVERBS */
#endif /* NOSETKEY */
#ifdef CK_LABELED
    { "labeled-file-info", SHLBL, 0 },
#endif /* CK_LABELED */
#ifndef NOCSETS
    { "languages",    SHLNG, 0 },
#endif /* NOCSETS */
    { "logs",         SHLOG, 0 },
#ifndef NOSPL
    { "macros",       SHMAC, 0 },
#endif /* NOSPL */
#ifndef NODIAL
    { "modem",        SHMOD, CM_LOC },
#else
    { "modem-signals",SHCOM, CM_INV|CM_LOC },
#endif /* NODIAL */
#ifndef NOLOCAL
#ifdef OS2MOUSE
    { "mouse",        SHMOU, CM_LOC },
#endif /* OS2MOUSE */
#endif /* NOLOCAL */
#ifdef NETCONN
    { "network",      SHNET, CM_LOC },
#else
    { "network",      SHNET, CM_INV|CM_LOC },
#endif /* NETCONN */
    { "options",      SHOPTS, 0 },
#ifndef NOSPL
    { "output",       SHOUTP, CM_INV },
#endif /* NOSPL */
#ifdef ANYX25
#ifndef IBMX25
    { "pad",          SHPAD,  CM_LOC },
#endif /* IBMX25 */
#endif /* ANYX25 */
    { "parameters",   SHPAR,  CM_INV },
#ifdef PATTERNS
    { "patterns",     SHOPAT, 0 },
#endif /* PATTERNS */
    { "printer",      SHPRT,  0 },
#ifdef CK_SPEED
    { "prefixing",    SHCTL,  CM_INV },
#endif /* CK_SPEED */
#ifndef NOXFER
    { "protocol",     SHPRO,  0 },
#endif /* NOXFER */
#ifndef NOSPL
    { "scripts",      SHSCR,  CM_LOC },
#endif /* NOSPL */
    { "send-list",    SHSFL,  0 },
#ifndef NOSERVER
    { "server",       SHSER,  0 },
#endif /* NOSERVER */
#ifndef NOSEXP
    { "sexpression",  SHSEXP, 0 },
#endif /* NOSEXP */
#ifdef ANYSSH
    { "ssh",          SHOSSH, 0 },
#endif /* ANYSSH */
    { "stack",        SHSTK,  0 },
    { "status",       SHSTA,  0 },
#ifdef STREAMING
    { "streaming",    SHOSTR, 0 },
#endif /* STREAMING */
#ifndef NOLOCAL
#ifdef OS2
    { "tabs",          SHTAB, CM_INV|CM_LOC },
#endif /* OS2 */
#ifdef CK_TAPI
    { "tapi",          SHTAPI, CM_LOC },
    { "tapi-comm",     SHTAPI_C, CM_INV|CM_LOC },
    { "tapi-location", SHTAPI_L, CM_INV|CM_LOC },
    { "tapi-modem",    SHTAPI_M, CM_INV|CM_LOC },
#endif /* CK_TAPI */
    { "tcp",           SHTCP,  CM_LOC },
#ifdef TNCODE
    { "tel",           SHTEL,  CM_INV|CM_ABR },
    { "telnet",        SHTEL,  0 },
    { "telopt",        SHTOPT, 0 },
#endif /* TNCODE */
    { "terminal",      SHTER,  CM_LOC },
#endif /* NOLOCAL */
#ifndef NOXMIT
    { "tr",            SHXMI, CM_INV|CM_ABR },
    { "tra",           SHXMI, CM_INV|CM_ABR },
    { "tran",          SHXMI, CM_INV|CM_ABR },
    { "trans",         SHXMI, CM_INV|CM_ABR },
#endif /* NOXMIT */
#ifndef NOXFER
    { "transfer",      SHOXFER, 0 },
#endif /* NOXFER */
#ifndef NOXMIT
    { "transmit",      SHXMI, 0 },
#endif /* NOXMIT */
#ifdef CK_TRIGGER
    { "trigger",       SHTRIG, CM_LOC },
#endif /* CK_TRIGGER */
#ifndef NOSETKEY
#ifndef NOKVERBS
#ifdef OS2
    { "udk",           SHUDK, CM_LOC },
#endif /* OS2 */
#endif /* NOKVERBS */
#endif /* NOSETKEY */
#ifndef NOSPL
    { "variables",     SHBUI, 0 },
#endif /* NOSPL */
#ifndef NOFRILLS
    { "versions",      SHVER, 0 },
#endif /* NOFRILLS */
#ifdef OS2
    { "vscrn",         SHVSCRN, CM_INV|CM_LOC },
#endif /* OS2 */
    { "xfer",          SHOXFER,  CM_INV },
#ifndef NOXMIT
    { "xmit",          SHXMI,    CM_INV },
#endif /* NOXMIT */
    { "", 0, 0 }
};
int nsho = (sizeof(shotab) / sizeof(struct keytab)) - 1;
#endif /* NOSHOW */

#ifdef ANYX25
#ifndef IBMX25
struct keytab padtab[] = {              /* PAD commands */
    { "clear",      XYPADL, 0 },
    { "interrupt",  XYPADI, 0 },
    { "reset",      XYPADR, 0 },
    { "status",     XYPADS, 0 }
};
int npadc = (sizeof(padtab) / sizeof(struct keytab));
#endif /* IBMX25 */
#endif /* ANYX25 */

#ifndef NOSERVER
static struct keytab kmstab[] = {
    { "both",    3, 0 },
    { "local",   1, 0 },
    { "remote",  2, 0 }
};

static struct keytab enatab[] = {	/* ENABLE commands */
    { "all",        EN_ALL,  0 },
#ifndef NOSPL
    { "as",         EN_ASG,  CM_INV|CM_ABR },
    { "asg",        EN_ASG,  CM_INV },
    { "assign",     EN_ASG,  0 },
#endif /* NOSPL */
#ifndef datageneral
    { "bye",        EN_BYE,  0 },
#endif /* datageneral */
    { "cd",         EN_CWD,  0 },
#ifdef ZCOPY
    { "copy",       EN_CPY,  0 },
#endif /* ZCOPY */
    { "cwd",        EN_CWD,  CM_INV },
    { "delete",     EN_DEL,  0 },
    { "directory",  EN_DIR,  0 },
    { "enable",     EN_ENA,  CM_INV },
    { "exit",       EN_XIT,  0 },
    { "finish",     EN_FIN,  0 },
    { "get",        EN_GET,  0 },
    { "host",       EN_HOS,  0 },
    { "mail",       EN_MAI,  0 },
    { "mkdir",      EN_MKD,  0 },
    { "print",      EN_PRI,  0 },
#ifndef NOSPL
    { "query",      EN_QUE,  0 },
#endif /* NOSPL */
    { "rename",     EN_REN,  0 },
    { "retrieve",   EN_RET,  CM_INV },
    { "rmdir",      EN_RMD,  0 },
    { "send",       EN_SEN,  0 },
    { "set",        EN_SET,  0 },
    { "space",      EN_SPA,  0 },
    { "type",       EN_TYP,  0 },
    { "who",        EN_WHO,  0 }
};
static int nena = (sizeof(enatab) / sizeof(struct keytab));
#endif /* NOSERVER */

struct keytab txtbin[] = {
    { "all",        2, 0 },
    { "binary",     1, 0 },
    { "text",       0, 0 }
};

#ifndef NOXFER
static struct keytab sndtab[] = {	/* SEND command options */
    { "/after",           SND_AFT, CM_ARG },
#ifndef NOSPL
    { "/array",           SND_ARR, CM_ARG },
#endif /* NOSPL */
    { "/as-name",         SND_ASN, CM_ARG },
    { "/b",               SND_BIN, CM_INV|CM_ABR },
    { "/before",          SND_BEF, CM_ARG },
    { "/binary",          SND_BIN, 0 },
#ifdef CALIBRATE
    { "/c",               SND_CMD, CM_INV|CM_ABR },
    { "/calibrate",       SND_CAL, CM_INV|CM_ARG },
#endif /* CALIBRATE */
    { "/command",         SND_CMD, CM_PSH },
    { "/delete",          SND_DEL, 0 },
#ifdef UNIXOROSK
    { "/dotfiles",        SND_DOT, 0 },
#endif /* UNIXOROSK */
    { "/except",          SND_EXC, CM_ARG },
#ifdef PIPESEND
    { "/filter",          SND_FLT, CM_ARG|CM_PSH },
#endif /* PIPESEND */
    { "/filenames",       SND_NAM, CM_ARG },
#ifdef CKSYMLINK
    { "/followlinks",	  SND_LNK, 0 },
#endif /* CKSYMLINK */
#ifdef VMS
    { "/image",           SND_IMG, 0 },
#else
    { "/image",           SND_BIN, CM_INV },
#endif /* VMS */
#ifdef CK_LABELED
    { "/labeled",         SND_LBL, 0 },
#endif /* CK_LABELED */
    { "/larger-than",     SND_LAR, CM_ARG },
    { "/listfile",        SND_FIL, CM_ARG },
#ifndef NOFRILLS
    { "/mail",            SND_MAI, CM_ARG },
#endif /* NOFRILLS */
#ifdef CK_TMPDIR
    { "/move-to",         SND_MOV, CM_ARG },
#endif /* CK_TMPDIR */
    { "/nobackupfiles",   SND_NOB, 0 },
#ifdef UNIXOROSK
    { "/nodotfiles",      SND_NOD, 0 },
#endif /* UNIXOROSK */
#ifdef CKSYMLINK
    { "/nofollowlinks",	  SND_NLK, 0 },
#endif /* CKSYMLINK */
    { "/not-after",       SND_NAF, CM_ARG },
    { "/not-before",      SND_NBE, CM_ARG },
    { "/pathnames",       SND_PTH, CM_ARG },
    { "/print",           SND_PRI, CM_ARG },
#ifdef CK_XYZ
    { "/protocol",        SND_PRO, CM_ARG },
#else
    { "/protocol",        SND_PRO, CM_ARG|CM_INV },
#endif /* CK_XYZ */
    { "/quiet",           SND_SHH, 0 },
    { "/recover",         SND_RES, 0 },
#ifdef RECURSIVE
/* Systems where we do recursion */
    { "/recursive",       SND_REC, 0 },
#else
#ifdef VMS
/* Systems that do recursion themselves without our assistance */
/* if we give them the right kind of wildcard */
    { "/recursive",       SND_REC, 0 },
#else
#ifdef datageneral
    { "/recursive",       SND_REC, 0 },
#else
    { "/recursive",       SND_REC, CM_INV },
#endif /* datageneral */
#endif /* VMS */
#endif /* RECURSIVE */
    { "/rename-to",       SND_REN, CM_ARG },
    { "/since",           SND_AFT, CM_INV|CM_ARG },
    { "/smaller-than",    SND_SMA, CM_ARG },
    { "/starting-at",     SND_STA, CM_ARG },
#ifndef NOFRILLS
    { "/su",              SND_ASN, CM_ARG|CM_INV|CM_ABR },
    { "/sub",             SND_ASN, CM_ARG|CM_INV|CM_ABR },
    { "/subject",         SND_ASN, CM_ARG },
#endif /* NOFRILLS */
#ifdef RECURSIVE
    { "/subdirectories",  SND_REC, CM_INV },
#endif /* RECURSIVE */
    { "/text",            SND_TXT, 0 },
    { "/transparent",     SND_XPA, 0 },
    { "/type",            SND_TYP, CM_ARG }
};
#define NSNDTAB sizeof(sndtab)/sizeof(struct keytab)
static int nsndtab = NSNDTAB;

#ifndef NOMSEND
static struct keytab msndtab[] = {	/* MSEND options */
    { "/after",           SND_AFT, CM_ARG },
    { "/before",          SND_BEF, CM_ARG },
    { "/binary",          SND_BIN, 0 },
    { "/delete",          SND_DEL, 0 },
    { "/except",          SND_EXC, CM_ARG },
    { "/filenames",       SND_NAM, CM_ARG },
#ifdef CKSYMLINK
    { "/followlinks",	  SND_LNK, 0 },
#endif /* CKSYMLINK */
#ifdef VMS
    { "/image",           SND_IMG, 0 },
#else
    { "/image",           SND_BIN, CM_INV },
#endif /* VMS */
#ifdef CK_LABELED
    { "/labeled",         SND_LBL, 0 },
#endif /* CK_LABELED */
    { "/larger-than",     SND_LAR, CM_ARG },
    { "/list",            SND_FIL, CM_ARG },
#ifndef NOFRILLS
    { "/mail",            SND_MAI, CM_ARG },
#endif /* NOFRILLS */
#ifdef CK_TMPDIR
    { "/move-to",         SND_MOV, CM_ARG },
#endif /* CK_TMPDIR */
#ifdef CKSYMLINK
    { "/nofollowlinks",	SND_NLK, 0 },
#endif /* CKSYMLINK */
    { "/not-after",       SND_NAF, CM_ARG },
    { "/not-before",      SND_NBE, CM_ARG },
    { "/pathnames",       SND_PTH, CM_ARG },
    { "/print",           SND_PRI, CM_ARG },
#ifdef CK_XYZ
    { "/protocol",        SND_PRO, CM_ARG },
#endif /* CK_XYZ */
    { "/quiet",           SND_SHH, 0 },
    { "/recover",         SND_RES, 0 },
    { "/rename-to",       SND_REN, CM_ARG },
    { "/since",           SND_AFT, CM_INV|CM_ARG },
    { "/smaller-than",    SND_SMA, CM_ARG },
    { "/starting-at",     SND_STA, CM_ARG },
#ifndef NOFRILLS
    { "/subject",         SND_ASN, CM_ARG },
#endif /* NOFRILLS */
    { "/text",            SND_TXT, 0 },
    { "/transparent",     SND_XPA, 0 },
    { "/type",            SND_TYP, CM_ARG }
};
#define NMSNDTAB sizeof(msndtab)/sizeof(struct keytab)
static int nmsndtab = NMSNDTAB;
#endif /* NOMSEND */
#endif /* NOXFER */

/* CONNECT command switches */

#define CONN_II  0	/* Idle interval */
#define CONN_IS  1	/* Idle string */
#define CONN_IL  2	/* Idle limit */
#define CONN_NV  3	/* Non-Verbose */
#define CONN_TL  4	/* Time limit */
#define CONN_TS  5	/* Trigger string */
#define CONN_AS  6	/* Asynchronous */
#define CONN_SY  7	/* Synchronous */
#define CONN_MAX 7	/* Number of CONNECT switches */

#ifndef NOLOCAL
static struct keytab conntab[] = {
#ifdef OS2
    { "/asynchronous",    CONN_AS, CM_INV },
#endif /* OS2 */
#ifdef XLIMITS
    { "/idle-interval",   CONN_II, CM_ARG },
    { "/idle-limit",      CONN_IL, CM_ARG },
    { "/idle-string",     CONN_IS, CM_ARG },
    { "/quietly",         CONN_NV, CM_INV },
#else
    { "/quietly",         CONN_NV, 0 },
#endif /* XLIMITS */
#ifdef OS2
    { "/synchronous",     CONN_SY, CM_INV },
#endif /* OS2 */
#ifdef XLIMITS
    { "/time-limit",      CONN_TL, CM_ARG },
#endif /* XLIMITS */
#ifdef CK_TRIGGER
    { "/trigger",         CONN_TS, CM_ARG },
#endif /* CK_TRIGGER */
    { "",0,0 }
};
#define NCONNTAB sizeof(conntab)/sizeof(struct keytab)
static int nconntab = NCONNTAB;
#endif /* NOLOCAL */

#ifndef NOXFER
static struct keytab stattab[] = {	/* STATISTICS command switches */
    { "/brief",   1, 0 },
    { "/verbose", 0, 0 }
};
#endif /* NOXFER */

#ifndef NOSPL
#ifdef COMMENT
struct mtab mactab[MAC_MAX] = {		/* Preinitialized macro table */
    { NULL, NULL, 0 }
};
#else
struct mtab *mactab;			/* Dynamically allocated macro table */
#endif /* COMMENT */
int nmac = 0;

struct keytab mackey[MAC_MAX];		/* Macro names as command keywords */
#endif /* NOSPL */

#ifndef NOSPL
#ifdef  OS2
struct keytab beeptab[] = {		/* Beep options */
    { "error", BP_FAIL, 0 },
    { "information", BP_NOTE, 0 },
    { "warning", BP_WARN, 0 }
};
int nbeeptab = sizeof(beeptab)/sizeof(struct keytab);

/* CLEAR COMMMAND-SCREEN options */

#define CLR_C_ALL 0
#define CLR_C_BOL 1
#define CLR_C_BOS 2
#define CLR_C_EOL 3
#define CLR_C_EOS 4
#define CLR_C_LIN 5
#define CLR_C_SCR 6

struct keytab clrcmdtab[] = {
    { "all",        CLR_C_ALL, 0 },
    { "bol",        CLR_C_BOL, 0 },
    { "bos",        CLR_C_BOS, 0 },
    { "eol",        CLR_C_EOL, 0 },
    { "eos",        CLR_C_EOS, 0 },
    { "line",       CLR_C_LIN, 0 },
    { "scrollback", CLR_C_SCR, 0 }
};
int nclrcmd = sizeof(clrcmdtab)/sizeof(struct keytab);
#endif /* OS2 */
#endif /* NOSPL */

#ifdef COMMENT
/* Not used at present */
static struct keytab pagetab[] = {
    { "/more",   1, CM_INV },
    { "/nopage", 0, 0 },
    { "/page",   1, 0 }
};
int npagetab = sizeof(pagetab)/sizeof(struct keytab);
#endif /* COMMENT */

#define TYP_NOP  0			/* /NOPAGE */
#define TYP_PAG  1			/* /PAGE */
#define TYP_HEA  2			/* /HEAD:n */
#define TYP_TAI  3			/* /TAIL:n */
#define TYP_PAT  4			/* /MATCH:pattern */
#define TYP_WID  5			/* /WIDTH:cols */
#define TYP_COU  6			/* /COUNT */
#define TYP_OUT  7			/* /OUTPUT:file */
#define TYP_PFX  8			/* /PREFIX:string */
#ifdef UNICODE
#define TYP_XIN  9			/* /TRANSLATE-FROM:charset */
#define TYP_XUT 10			/* /TRANSLATE-TO:charset */
#define TYP_XPA 11			/* /TRANSPARENT */
#endif /* UNICODE */
#ifdef KUI
#define TYP_GUI 12			/* /GUI:title */
#define TYP_HIG 13			/* /HEIGHT:rows */
#endif /* KUI */
#define TYP_NUM 14			/* /NUMBER */

static struct keytab typetab[] = {	/* TYPE command switches */
    { "/count",          TYP_COU, 0 },
#ifdef UNICODE
    { "/character-set",  TYP_XIN, CM_ARG },
#endif /* UNICODE */
#ifdef KUI
    { "/gui",            TYP_GUI, CM_ARG },
#endif /* KUI */
    { "/head",           TYP_HEA, CM_ARG },
#ifdef KUI
    { "/height",         TYP_HIG, CM_ARG },
#endif /* KUI */
    { "/match",          TYP_PAT, CM_ARG },
#ifdef CK_TTGWSIZ
    { "/more",           TYP_PAG, CM_INV },
    { "/nopage",         TYP_NOP, 0 },
    { "/number",         TYP_NUM, 0 },
    { "/output",         TYP_OUT, CM_ARG },
    { "/page",           TYP_PAG, 0 },
#endif /* CK_TTGWSIZ */
    { "/prefix",         TYP_PFX, CM_ARG },
    { "/tail",           TYP_TAI, CM_ARG },
#ifdef UNICODE
    { "/translate-to",   TYP_XUT, CM_ARG },
    { "/transparent",    TYP_XPA, 0 },
#endif /* UNICODE */
    { "/width",          TYP_WID, CM_ARG },
#ifdef UNICODE
    { "/xlate-to",       TYP_XUT, CM_INV|CM_ARG },
#endif /* UNICODE */
    { "", 0, 0 }
};
int ntypetab = sizeof(typetab)/sizeof(struct keytab) - 1;

int typ_page = -1;			/* TYPE /[NO]PAGE default */
int typ_wid  = -1;

#ifndef NOSPL
#define TRA_ALL 999			/* TRACE command */
#define TRA_ASG 0
#define TRA_CMD 1

int tra_asg = 0;
int tra_cmd = 0;

static struct keytab tracetab[] = {	/* TRACE options */
    { "all",            TRA_ALL, 0 },
    { "assignments",    TRA_ASG, 0 },
    { "command-level",  TRA_CMD, 0 }
};
static int ntracetab = sizeof(tracetab)/sizeof(struct keytab);
#endif /* NOSPL */

#ifndef NOSHOW
VOID
showtypopts() {
    printf(" TYPE ");
    if (typ_page > -1) {
	prtopt(&optlines,typ_page ? "/PAGE" : "/NOPAGE");
    } else
      prtopt(&optlines,"(no options set)");
    if (typ_wid > -1) {
	ckmakmsg(tmpbuf,TMPBUFSIZ,"/WIDTH:",ckitoa(typ_wid),NULL,NULL);
	prtopt(&optlines,tmpbuf);
    }
    prtopt(&optlines,"");
}
#endif /* NOSHOW */

#ifdef LOCUS
/* isauto == 1 if locus is being switched automatically */

VOID
setlocus(x, isauto) int x, isauto; {
    extern int quitting;
    if (x) x = 1;
    if (x && locus) return;
    if (!x && !locus) return;
    /* Get here if it actually needs to be changed */
#ifdef OS2
    if (isauto &&			/* Automatically switching */
	!quitting &&			/* not exiting */
	autolocus == 2) {		/* and AUTOLOCUS is set to ASK */
	char locmsg[300];
	ckmakmsg(locmsg,300,
		 "Switching Locus to ",
		 x ? "LOCAL" : "REMOTE",
		 " for file management commands\n"
                 "such as CD, DIRECTORY, DELETE, RENAME.  Type HELP SET\n"
                 "LOCUS at the K-95> prompt for further info.  Use the\n"
#ifdef KUI
                  "Actions menu or SET LOCUS command to disable automatic\n"
                  "Locus switching or to disable these queries.",
#else /* KUI */
                  "SET LOCUS command to disable automatic locus switching\n"
                  "or to disable these queries.",
#endif /* KUI */
                  NULL);
	if (uq_ok(locmsg,"OK to switch Locus?",3,NULL,1)) {
	    locus = x;
#ifdef KUI
	    KuiSetProperty(KUI_LOCUS,x,0);
#endif /* KUI */
	    return;
	}
    } else {
#endif /* OS2 */
        if (isauto && msgflg && !quitting)
          printf("Switching LOCUS for file-management commands to %s.\n",
		 x ? "LOCAL" : "REMOTE"
		 );
	locus = x;
#ifdef OS2
#ifdef KUI
	KuiSetProperty(KUI_LOCUS,x,0);
#endif /* KUI */
    }
#endif /* OS2 */
}

VOID
setautolocus(x) int x; {
    autolocus = x;
#ifdef KUI
    KuiSetProperty(KUI_AUTO_LOCUS,x,0);
#endif /* KUI */
}
#endif /* LOCUS */

int
settypopts() {				/* Set TYPE option defaults */
    int xp = -1;
    int c, getval;
    while (1) {
	if ((y = cmswi(typetab,ntypetab,"Switch","",xxstring)) < 0) {
	    if (y == -3)
	      break;
	    else
	      return(y);
	}
	c = cmgbrk();
	if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
	    printf("?This switch does not take an argument\n");
	    return(-9);
	}
	switch (y) {
	  case TYP_NOP: xp = 0; break;
	  case TYP_PAG: xp = 1; break;
	  case TYP_WID:
	    if (getval)
	      if ((x = cmnum("Column at which to truncate",
			     ckitoa(cmd_cols),10,&y,xxstring)) < 0)
		return(x);
	    typ_wid = y;
	    break;

          default:
	    printf("?Sorry, this option can not be set\n");
	    return(-9);
	}
    }
    if ((x = cmcfm()) < 0)		/* Get confirmation */
      return(x);
    if (xp > -1) typ_page = xp;		/* Confirmed, save defaults */
    return(success = 1);
}

/* Forward declarations of functions local to this module */

#ifdef UNIX
_PROTOTYP (int douchmod, ( void ) );
#endif /* UNIX */
#ifdef CKPURGE
_PROTOTYP (int dopurge,  ( void ) );
#endif /* CKPURGE */
#ifndef NOSPL
_PROTOTYP (int doundef,  ( int  ) );
_PROTOTYP (int doask,    ( int  ) );
_PROTOTYP (int dodef,    ( int  ) );
_PROTOTYP (int doelse,   ( void ) );
_PROTOTYP (int dofor,    ( void ) );
_PROTOTYP (int doincr,   ( int  ) );
#endif /* NOSPL  */
#ifndef NODIAL
_PROTOTYP (int dodial,   ( int  ) );
#endif /* NODIAL */
_PROTOTYP (int dodel,    ( void ) );
_PROTOTYP (int dopaus,   ( int  ) );
#ifndef NOPUSH
#ifdef TCPSOCKET
_PROTOTYP (int doping,   ( void ) );
_PROTOTYP (int doftp,    ( void ) );
#endif /* TCPSOCKET */
#endif /* NOPUSH */
#ifndef NORENAME
#ifndef NOFRILLS
_PROTOTYP (int dorenam,  ( void ) );
#endif /* NOFRILLS */
#endif /* NORENAME */
#ifdef ZCOPY
_PROTOTYP (int docopy,   ( void ) );
#endif /* ZCOPY */
#ifdef NT
_PROTOTYP (int dolink,   ( void ));
#endif /* NT */
#ifdef CK_REXX
_PROTOTYP (int dorexx,   ( void ) );
#endif /* CK_REXX */

#ifdef TNCODE
static struct keytab telcmd[] = {
    { "abort", TN_ABORT, CM_INV },	/* Emotionally toned - don't show */
    { "ao",    TN_AO,    0 },
    { "ayt",   TN_AYT,   0 },
    { "break", BREAK,    0 },
    { "cancel",TN_ABORT, 0 },
    { "dmark", TN_DM,    0 },
    { "do",    DO,       0 },
    { "dont",  DONT,     0 },
    { "ec",    TN_EC,    0 },
    { "el",    TN_EL,    0 },
    { "eof",   TN_EOF,   0 },
    { "eor",   TN_EOR,   0 },
#ifdef CK_KERBEROS
#ifdef KRB5
#define TN_FWD 1
    { "forward", TN_FWD, CM_INV },
#endif /* KRB5 */
#endif /* CK_KERBEROS */
    { "ga",    TN_GA,    0 },
    { "ip",    TN_IP,    0 },
    { "nop",   TN_NOP,   0 },
    { "sak",   TN_SAK,   CM_INV },
    { "sb",    SB,       0 },
    { "se",    SE,       0 },
    { "susp",  TN_SUSP,  0 },
    { "will",  WILL,     0 },
    { "wont",  WONT,     0 }
};
static int ntelcmd = (sizeof(telcmd) / sizeof(struct keytab));

static struct keytab tnopts[] = {
#ifdef CK_AUTHENTICATION
    { "auth",   TELOPT_AUTHENTICATION,   0 },
#else
    { "auth",   TELOPT_AUTHENTICATION,   CM_INV },
#endif /* CK_AUTHENTICATION */
    { "binary", TELOPT_BINARY, 0 },
#ifdef TN_COMPORT
    { "c",      TELOPT_COMPORT, CM_INV|CM_ABR},
    { "co",     TELOPT_COMPORT, CM_INV|CM_ABR},
    { "com",    TELOPT_COMPORT, CM_INV|CM_ABR},
    { "com-port-control", TELOPT_COMPORT, 0 },
    { "comport-control", TELOPT_COMPORT, CM_INV},
#else  /* TN_COMPORT */
    { "com-port-control", TELOPT_COMPORT, CM_INV },
    { "comport-control", TELOPT_COMPORT, CM_INV},
#endif /* TN_COMPORT */
    { "echo", TELOPT_ECHO, 0 },
#ifdef CK_ENCRYPTION
    { "encrypt", TELOPT_ENCRYPTION, 0 },
#else
    { "encrypt", TELOPT_ENCRYPTION, CM_INV },
#endif /* CK_ENCRYPTION */
#ifdef CK_FORWARD_X
    { "forward-x", TELOPT_FORWARD_X, 0 },
#else
    { "forward-x", TELOPT_FORWARD_X, CM_INV },
#endif /* CK_FORWARD_X */
#ifdef IKS_OPTION
    { "kermit", TELOPT_KERMIT, 0 },
#else
    { "kermit", TELOPT_KERMIT, CM_INV },
#endif /* IKS_OPTION */
    { "lflow",  TELOPT_LFLOW, CM_INV },
    { "logout", TELOPT_LOGOUT, CM_INV },
#ifdef CK_NAWS
    { "naws", TELOPT_NAWS, 0 },
#else
    { "naws", TELOPT_NAWS, CM_INV },
#endif /* CK_NAWS */
#ifdef CK_ENVIRONMENT
    { "new-environment", TELOPT_NEWENVIRON,  0 },
#else
    { "new-environment", TELOPT_NEWENVIRON,  CM_INV },
#endif /* CK_ENVIRONMENT */
    { "pragma-heartbeat",TELOPT_PRAGMA_HEARTBEAT,  CM_INV },
    { "pragma-logon",    TELOPT_PRAGMA_LOGON,  CM_INV },
    { "pragma-sspi",     TELOPT_SSPI_LOGON,  CM_INV },
    { "sak",   TELOPT_IBM_SAK, CM_INV },
#ifdef CK_SNDLOC
    { "send-location",   TELOPT_SNDLOC,  0 },
#else
    { "send-location",   TELOPT_SNDLOC,  CM_INV },
#endif /* CK_SNDLOC */
    { "sga", TELOPT_SGA, 0 },
#ifdef CK_SSL
    { "start-tls",       TELOPT_START_TLS,  0 },
#else
    { "start-tls",       TELOPT_START_TLS,  CM_INV },
#endif /* CK_SSL */
    { "ttype", TELOPT_TTYPE, 0 },
#ifdef CK_ENVIRONMENT
    { "xdisplay-location", TELOPT_XDISPLOC, 0 },
#else
    { "xdisplay-location", TELOPT_XDISPLOC, CM_INV },
#endif /* CK_ENVIRONMENT */
    { "", 0, 0 }
};
static int ntnopts = (sizeof(tnopts) / sizeof(struct keytab)) - 1;

static struct keytab tnsbopts[] = {
#ifdef CK_NAWS
    { "naws", TELOPT_NAWS, 0 },
#endif /* CK_NAWS */
    { "", 0, 0 }
};
static int ntnsbopts = (sizeof(tnsbopts) / sizeof(struct keytab)) - 1;
#endif /* TNCODE */

#ifdef TCPSOCKET
#ifndef NOPUSH
#ifdef SYSFTP
int
doftp() {				/* (External) FTP command */
    char *p, *f;			/* (See doxftp() for internal one) */
    int x;

    if (network)			/* If we have a current connection */
      ckstrncpy(line,ttname,LINBUFSIZ);	/* get the host name */
    else *line = '\0';			/* as default host */
    for (p = line; *p; p++)		/* Remove ":service" from end. */
      if (*p == ':') { *p = '\0'; break; }
    if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0)
      return(x);
    if (nopush) {
        printf("?Sorry, FTP command disabled\n");
        return(success = 0);
    }
/* Construct FTP command */
#ifdef VMS
#ifdef MULTINET				/* TGV MultiNet */
    ckmakmsg(line,LINBUFSIZ,"multinet ftp ",s,NULL,NULL);
#else
    ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL);
#endif /* MULTINET */
#else					/* Not VMS */
#ifdef OS2ORUNIX
#ifndef NOFTP
    f = ftpapp;
    if (!f) f = "";
    if (!f[0]) f = "ftp";
    ckmakmsg(line,LINBUFSIZ,f," ",s,NULL);
#ifdef OS2
    p = line + strlen(ftpapp);
    while (p != line) {
        if (*p == '/') *p = '\\';
        p--;
    }
#endif /* OS2 */
#else /* NOFTP */
    ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL);
#endif /* NOFTP */
#else /* OS2ORUNIX */
    ckmakmsg(line,LINBUFSIZ,"ftp ",s,NULL,NULL);
#endif /* OS2ORUNIX */
#endif /* VMS */
    conres();				/* Make console normal  */
#ifdef DEC_TCPIP
    printf("\n");			/* Prevent prompt-stomping */
#endif /* DEC_TCPIP */
    x = zshcmd(line);
    concb((char)escape);
    return(success = x);
}
#endif /* SYSFTP */

int
doping() {				/* PING command */
    char *p;				/* just runs ping program */
    int x;

    if (network)			/* If we have a current connection */
      ckstrncpy(line,ttname,LINBUFSIZ);	/* get the host name */
    else *line = '\0';			/* as default host to be pinged. */
    for (p = line; *p; p++)		/* Remove ":service" from end. */
      if (*p == ':') { *p = '\0'; break; }
    if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0)
      return(x);
    if (nopush) {
        printf("?Sorry, PING command disabled\n");
        return(success = 0);
    }

    /* Construct PING command */
#ifdef VMS
#ifdef MULTINET				/* TGV MultiNet */
    ckmakmsg(line,LINBUFSIZ,"multinet ping ",s," /num=1",NULL);
#else
    ckmakmsg(line,LINBUFSIZ,"ping ",s," 56 1",NULL); /* Other VMS TCP/IP's */
#endif /* MULTINET */
#else					/* Not VMS */
    ckmakmsg(line,LINBUFSIZ,"ping ",s,NULL,NULL);
#endif /* VMS */
    conres();				/* Make console normal  */
#ifdef DEC_TCPIP
    printf("\n");			/* Prevent prompt-stomping */
#endif /* DEC_TCPIP */
    x = zshcmd(line);
    concb((char)escape);
    return(success = x);
}
#endif /* NOPUSH */
#endif /* TCPSOCKET */

static VOID
doend(x) int x; {
#ifndef NOSPL
    /* Pop from all FOR/WHILE/XIF/SWITCH's */
    debug(F101,"doend maclvl 1","",maclvl);
    while ((maclvl > 0) &&
	   (m_arg[maclvl-1][0]) &&
	   (cmdstk[cmdlvl].src == CMD_MD) &&
	   (!strncmp(m_arg[maclvl-1][0],"_xif",4) ||
	    !strncmp(m_arg[maclvl-1][0],"_for",4) ||
	    !strncmp(m_arg[maclvl-1][0],"_whi",4) ||
	    !strncmp(m_arg[maclvl-1][0],"_swi",4))) {
	debug(F110,"END popping",m_arg[maclvl-1][0],0);
	dogta(XXPTA);			/* Put args back */
	popclvl();			/* Pop up two levels */
	popclvl();
	debug(F101,"doend maclvl 2","",maclvl);
    }
    if (maclvl > -1) {
	if (mrval[maclvl])		/* Free previous retval if any */
	  free(mrval[maclvl]);
	mrval[maclvl] = malloc(16);	/* Room for up to 15 digits */
	if (mrval[maclvl])		/* Record current retval */
	  ckmakmsg(mrval[maclvl],16,ckitoa(x),NULL,NULL,NULL);
    }
#endif /* NOSPL */
    popclvl();				/* Now pop out of macro or TAKE file */
#ifndef NOSPL
#ifdef DEBUG
    if (deblog) {
	debug(F101,"END maclvl 3","",maclvl);
	debug(F111,"END mrval[maclvl]",mrval[maclvl],maclvl);
	debug(F111,"END mrval[maclvl+1]",mrval[maclvl+1],maclvl+1);
    }
#endif /* DEBUG */
#endif /* NOSPL */
}

#ifdef CKROOT
int
dochroot() {
    if ((x = cmdir("Name of new root directory","",&s,xxstring)) < 0) {
	if (x == -3) {
	    printf("?Directory name required\n");
	    return(-9);
	}
	return(x);
    }
    ckstrncpy(line,s,LINBUFSIZ);
    s = line;
    if ((x = cmcfm()) < 0) return(x);
    s = brstrip(s);
    x = zsetroot(s);
    if (x < 0) {
	char * m = NULL;
	switch (x) {
	  case -1:
	  case -2: m = "Not a directory"; break;
	  case -3: m = "Internal error"; break;
	  case -4: m = "Access denied"; break;
	  case -5: m = "Off limits"; break;
	}
	if (m) printf("%s: \"%s\"\n", m, s);
	return(m ? -9 : -2);
    } else {
	nopush = 1;
	return(success = 1);
    }
}
#endif /* CKROOT */

#ifndef NOXFER
static char * asnbuf = NULL;		/* As-name buffer pointer */

char sndxnam[] = { "_array_x_" };	/* (with replaceable x!) */

/*
  The new SEND command, replacing BSEND, CSEND, PSEND, etc etc.
  Call with cx = top-level keyword value.  Returns:
    < 0  On parse error.
    0    On other type of failure (e.g. requested operation not allowed).
    1    On success with sstate set to 's' so protocol will begin.
*/

/*  D O X S E N D  --  Parse SEND and related commands with switches  */

int
doxsend(cx) int cx; {
    int c, i, n, wild, confirmed = 0;	/* Workers */
    int x, y;				/* of the world... */
    int getval = 0;			/* Whether to get switch value */
    extern char * snd_move;		/* Directory to move sent files to */
    extern char * snd_rename;		/* What to rename sent files to */
    extern char * filefile;		/* File containing filenames to send */
    extern int xfiletype;		/* Send only text (or binary) files */
    extern struct keytab pathtab[];	/* PATHNAMES option keywords */
    extern int npathtab;		/* How many of them */
    extern int recursive;		/* Recursive directory traversal */
    extern int rprintf;			/* REMOTE PRINT flag */
    extern int fdispla;			/* TRANSFER DISPLAY setting */
    extern int skipbup;			/* Skip backup files when sending */
    struct stringint {			/* Temporary array for switch values */
	char * sval;
	int ival;
    } pv[SND_MAX+1];
    struct FDB sf, sw, fl, cm;		/* FDBs for each parse function */
    int mlist = 0;			/* Flag for MSEND or MMOVE */
    char * m;				/* For making help messages */
    extern struct keytab protos[];	/* File transfer protocols */
    extern int xfrxla, g_xfrxla, nprotos;
    extern char sndbefore[], sndafter[], *sndexcept[]; /* Selection criteria */
    extern char sndnbefore[], sndnafter[];
    extern long sndsmaller, sndlarger, calibrate;
#ifndef NOSPL
    int range[2];			/* Array range */
    char ** ap = NULL;			/* Array pointer */
    int arrayx = -1;			/* Array index */
#endif /* NOSPL */

#ifdef NEWFTP
    if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) {
	if (cx == XXMAI) {
	    printf("?Sorry, No MAIL with FTP\n");
	    return(-9);
	}
	return(doftpput(cx,0));
    }
#endif /* NEWFTP */

    for (i = 0; i <= SND_MAX; i++) {	/* Initialize switch values */
	pv[i].sval = NULL;		/* to null pointers */
	pv[i].ival = -1;		/* and -1 int values */
    }
#ifndef NOSPL
    range[0] = -1;
    range[1] = -1;
    sndxin = -1;			/* Array index */
#endif /* NOSPL */
    sndarray = NULL;			/* Array pointer */

#ifdef UNIXOROSK
    g_matchdot = matchdot;		/* Match dot files */
#endif /* UNIXOROSK */
    g_recursive = recursive;		/* Recursive sending */
    recursive = 0;			/* Save global value, set local */
    debug(F101,"xsend entry fncnv","",fncnv);

    /* Preset switch values based on top-level command that called us */

    switch (cx) {
      case XXMSE:			/* MSEND */
	mlist = 1; break;
      case XXCSEN:			/* CSEND */
	pv[SND_CMD].ival = 1; break;
      case XXMMOVE:			/* MMOVE */
	mlist = 1;
      case XXMOVE:			/* MOVE */
	pv[SND_DEL].ival = 1; break;
      case XXRSEN:			/* RESEND */
	pv[SND_BIN].ival = 1;		/* Implies /BINARY */
	pv[SND_RES].ival = 1; break;
      case XXMAI:			/* MAIL */
	pv[SND_MAI].ival = 1; break;
    }

    /* Set up chained parse functions... */

    cmfdbi(&sw,				/* First FDB - command switches */
	   _CMKEY,			/* fcode */
	   "Filename, or switch",	/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
#ifdef NOMSEND
	   nsndtab,			/* addtl numeric data 1: tbl size */
#else
	   mlist ? nmsndtab : nsndtab,	/* addtl numeric data 1: tbl size */
#endif /* NOMSEND */
	   4,				/* addtl numeric data 2: 4 = cmswi */
	   xxstring,			/* Processing function */
#ifdef NOMSEND
	   sndtab,			/* Keyword table */
#else
	   mlist ? msndtab : sndtab,
#endif /* NOMSEND */
	   &sf				/* Pointer to next FDB */
	   );
    cmfdbi(&sf,				/* 2nd FDB - file to send */
	   _CMIFI,			/* fcode */
	   "File(s) to send",		/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
	   nolinks,			/* addtl numeric data 1 */
	   0,				/* addtl numeric data 2 */
	   xxstring,
	   NULL,
	   mlist ? &cm : &fl
	   );
    cmfdbi(&fl,				/* 3rd FDB - command to send from */
	   _CMFLD,			/* fcode */
	   "Command",			/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
	   0,				/* addtl numeric data 1 */
	   0,				/* addtl numeric data 2 */
	   xxstring,
	   NULL,
	   &cm
	   );
    cmfdbi(&cm,				/* 4th FDB - Confirmation */
	   _CMCFM,			/* fcode */
	   "",				/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
	   0,				/* addtl numeric data 1 */
	   0,				/* addtl numeric data 2 */
	   NULL,
	   NULL,
	   NULL
	   );

    while (1) {				/* Parse 0 or more switches */
	x = cmfdb(&sw);			/* Parse something */
	debug(F101,"xsend cmfdb","",x);
	if (x < 0)			/* Error */
	  goto xsendx;			/* or reparse needed */
	if (cmresult.fcode != _CMKEY)	/* Break out if not a switch */
	  break;
/*
  They gave a switch, but let's see how they terminated it.
  If they ended it with : or =, then we must parse a value.
  If they ended it with anything else, then we must NOT parse a value.
*/
	c = cmgbrk();			/* Get break character */
	getval = (c == ':' || c == '='); /* to see how they ended the switch */
	if (getval && !(cmresult.kflags & CM_ARG)) {
	    printf("?This switch does not take arguments\n");
	    x = -9;
	    goto xsendx;
	}
	if (!getval && (cmgkwflgs() & CM_ARG)) {
	    printf("?This switch requires an argument\n");
	    x = -9;
	    goto xsendx;
	}
	n = cmresult.nresult;		/* Numeric result = switch value */
	debug(F101,"xsend switch","",n);

	switch (n) {			/* Process the switch */
	  case SND_CMD:			/* These take no args */
	    if (nopush) {
		printf("?Sorry, system command access is disabled\n");
		x = -9;
		goto xsendx;
	    }
#ifdef PIPESEND
	    else if (sndfilter) {
		printf(
"?Sorry, no SEND /COMMAND or CSEND when SEND FILTER selected\n");
		x = -9;
		goto xsendx;
	    }
#endif /* PIPESEND */
	    sw.hlpmsg = "Command, or switch"; /* Change help message */
	    pv[n].ival = 1;		/* Just set the flag */
	    pv[SND_ARR].ival = 0;
	    break;

	  case SND_REC:			/* /RECURSIVE */
	    recursive = 2;		/* Set the real variable */
	    pv[SND_PTH].ival = PATH_REL; /* Give them relative pathnames */
	    pv[n].ival = 1;		/* Just set the flag */
	    break;

	  case SND_RES:			/* /RECOVER (resend) */
	    pv[SND_ARR].ival = 0;
	    pv[SND_BIN].ival = 1;	/* Implies /BINARY */
	  case SND_NOB:			/* /NOBACKUP */
	  case SND_DEL:			/* /DELETE */
	  case SND_SHH:			/* /QUIET */
	    pv[n].ival = 1;		/* Just set the flag */
	    break;

#ifdef UNIXOROSK
/* Like recursive, these are set immediately because they affect cmifi() */
	  case SND_DOT:			/* /DOTFILES */
	    matchdot = 1;
	    break;
	  case SND_NOD:			/* /NODOTFILES */
	    matchdot = 0;
	    break;
#endif /* UNIXOROSK */

	  /* File transfer modes - each undoes the others */

	  case SND_BIN:			/* Binary */
	  case SND_TXT:			/* Text */
	  case SND_IMG:			/* Image */
	  case SND_LBL:			/* Labeled */
	    pv[SND_BIN].ival = 0;
	    pv[SND_TXT].ival = 0;
	    pv[SND_IMG].ival = 0;
	    pv[SND_LBL].ival = 0;
	    pv[n].ival = 1;
	    break;

#ifdef CKSYMLINK
	  case SND_LNK:
	  case SND_NLK:
	    nolinks = (n == SND_NLK) ? 2 : 0;
	    cmfdbi(&sf,			/* Redo cmifi() */
		   _CMIFI,		/* fcode */
		   "File(s) to send",	/* hlpmsg */
		   "",			/* default */
		   "",			/* addtl string data */
		   nolinks,		/* addtl numeric data 1 */
		   0,			/* addtl numeric data 2 */
		   xxstring,
		   NULL,
		   mlist ? &cm : &fl
		   );
	    break;
#endif /* CKSYMLINK */

	  case SND_EXC:			/* Excludes */
	    if (!getval) break;
	    if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
		if (x == -3) {
		    printf("?Pattern required\n");
		    x = -9;
		}
		goto xsendx;
	    }
	    if (pv[n].sval) free(pv[n].sval);
	    y = strlen(s);
	    if (y > 256) {
		printf("?Pattern too long - 256 max\n");
		x = -9;
		goto xsendx;
	    }
	    pv[n].sval = malloc(y+1);
	    if (pv[n].sval) {
		strcpy(pv[n].sval,s);	/* safe */
		pv[n].ival = 1;
	    }
	    break;

	  case SND_MOV:			/* MOVE after */
	  case SND_REN:			/* RENAME after */
	    if (!getval) break;
	    if ((x = cmfld(n == SND_MOV ?
	   "device and/or directory for source file after sending" :
	   "new name for source file after sending",
			   "",
			   &s,
			   n == SND_MOV ? xxstring : NULL
			   )) < 0) {
		if (x == -3) {
		    printf("%s\n", n == SND_MOV ?
			   "?Destination required" :
			   "?New name required"
			   );
		    x = -9;
		}
		goto xsendx;
	    }
	    if (pv[n].sval) free(pv[n].sval);
	    s = brstrip(s);
	    y = strlen(s);
	    if (y > 0) {
		pv[n].sval = malloc(y+1);
		if (pv[n].sval) {
		    strcpy(pv[n].sval,s); /* safe */
		    pv[n].ival = 1;
		}
	    }
	    break;

	  case SND_SMA:			/* Smaller / larger than */
	  case SND_LAR:
	    if (!getval) break;
	    if ((x = cmnum("Size in bytes","0",10,&y,xxstring)) < 0)
	      goto xsendx;
	    pv[n].ival = y;
	    break;

	  case SND_AFT:			/* Send /AFTER:date-time */
	  case SND_BEF:			/* Send /BEFORE:date-time */
	  case SND_NAF:			/* Send /NOT-AFTER:date-time */
	  case SND_NBE:			/* Send /NOT-BEFORE:date-time */
	    if (!getval) break;
	    if ((x = cmdate("File date-time","",&s,0,xxstring)) < 0) {
		if (x == -3) {
		    printf("?Date-time required\n");
		    x = -9;
		}
		goto xsendx;
	    }
	    if (pv[n].sval) free(pv[n].sval);
	    pv[n].sval = malloc((int)strlen(s)+1);
	    if (pv[n].sval) {
		strcpy(pv[n].sval,s);	/* safe */
		pv[n].ival = 1;
	    }
	    break;

	  case SND_MAI:			/* Send as mail (= MAIL) */
#ifdef IKSD
	    if (inserver && !ENABLED(en_mai)) {
		printf("?Sorry, sending files as mail is disabled\n");
		return(-9);
	    }
#endif /* IKSD */
	    pv[n].ival = 1;
	    if (!getval) break;
	    if ((x = cmfld("e-mail address","",&s,xxstring)) < 0) {
		if (x == -3) {
		    printf("?address required\n");
		    x = -9;
		}
		goto xsendx;
	    }
	    s = brstrip(s);
	    if (pv[n].sval) free(pv[n].sval);
	    pv[n].sval = malloc((int)strlen(s)+1);
	    if (pv[n].sval)
	      strcpy(pv[n].sval,s);	/* safe */
	    break;

	  case SND_PRI:			/* Send to be printed (REMOTE PRINT) */
#ifdef IKSD
	    if (inserver && !ENABLED(en_mai)) {
		printf("?Sorry, sending files for printing is disabled\n");
		return(-9);
	    }
#endif /* IKSD */
	    pv[n].ival = 1;
	    if (!getval) break;
	    if ((x = cmfld("Print options","",&s,xxstring)) < 0)
	      if (x != -3) goto xsendx;
	    s = brstrip(s);
	    if (pv[n].sval) free(pv[n].sval);
	    pv[n].sval = malloc((int)strlen(s)+1);
	    if (pv[n].sval)
	      strcpy(pv[n].sval,s);	/* safe */
	    break;

	  case SND_ASN:			/* As-name */
	    debug(F101,"xsend /as-name getval","",getval);
	    if (!getval) break;
	    if ((x = cmfld("Name to send under","",&s,NULL)) < 0) {
		if (x == -3) {
		    printf("?name required\n");
		    x = -9;
		}
		goto xsendx;
	    }
	    s = brstrip(s);
	    if ((y = strlen(s)) > 0) {
		if (pv[n].sval) free(pv[n].sval);
		pv[n].sval = malloc(y+1);
		if (pv[n].sval) {
		    strcpy(pv[n].sval,s); /* safe */
		    pv[n].ival = 1;
		}
	    }
	    break;

	  case SND_STA:			/* Starting position (= PSEND) */
	    if (!getval) break;
	    if ((x = cmnum("0-based position","0",10,&y,xxstring)) < 0)
	      goto xsendx;
	    pv[n].ival = y;
	    break;

	  case SND_PRO:			/* Protocol to use */
	    if (!getval) break;
	    if ((x = cmkey(protos,nprotos,"File-transfer protocol","",
			   xxstring)) < 0) {
		if (x == -3) {
		    printf("?name of protocol required\n");
		    x = -9;
		}
		goto xsendx;
	    }
	    pv[n].ival = x;
	    break;

#ifdef PIPESEND
	  case SND_FLT:			/* Filter */
	    debug(F101,"xsend /filter getval","",getval);
	    if (!getval) break;
	    if ((x = cmfld("Filter program to send through","",&s,NULL)) < 0) {
		if (x == -3)
		  s = "";
		else
		  goto xsendx;
	    }
	    if (*s) s = brstrip(s);
	    y = strlen(s);
	    for (x = 0; x < y; x++) {	/* Make sure they included "\v(...)" */
		if (s[x] != '\\') continue;
		if (s[x+1] == 'v') break;
	    }
	    if (x == y) {
		printf(
		"?Filter must contain a replacement variable for filename.\n"
		       );
		x = -9;
		goto xsendx;
	    }
	    pv[n].ival = 1;
	    if (pv[n].sval) {
		free(pv[n].sval);
		pv[n].sval = NULL;
	    }
	    if ((y = strlen(s)) > 0) {
		if ((pv[n].sval = malloc(y+1)))
		  strcpy(pv[n].sval,s);	/* safe */
	    }
	    break;
#endif /* PIPESEND */

	  case SND_PTH:			/* Pathnames */
	    if (!getval) {
		pv[n].ival = PATH_REL;
		break;
	    }
	    if ((x = cmkey(pathtab,npathtab,"","absolute",xxstring)) < 0)
	      goto xsendx;
	    pv[n].ival = x;
	    break;

	  case SND_NAM:			/* Filenames */
	    if (!getval) break;
	    if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0)
	      goto xsendx;
	    debug(F101,"xsend /filenames","",x);
	    pv[n].ival = x;
	    break;

#ifdef CALIBRATE
          case SND_CAL:			/* /CALIBRATE */
	    if (getval) {
		if ((x = cmnum("number of Kbytes to send",
			   "1024",10,&y,xxstring)) < 0)
		  goto xsendx;
	    } else
	      y = 1024;
	    pv[n].ival = y;
	    pv[SND_ARR].ival = 0;
	    break;
#endif /* CALIBRATE */

	  case SND_FIL:			/* Name of file containing filnames */
	    if (!getval) break;
	    if ((x = cmifi("Name of file containing list of filenames",
			       "",&s,&y,xxstring)) < 0) {
		if (x == -3) {
		    printf("?Filename required\n");
		    x = -9;
		}
		goto xsendx;
	    } else if (y) {
		printf("?Wildcards not allowed\n");
		x = -9;
		goto xsendx;
	    }
	    if (pv[n].sval)
	      free(pv[n].sval);
	    if (s) if (*s) {
		if ((pv[n].sval = malloc((int)strlen(s)+1))) {
		    strcpy(pv[n].sval,s);
		    pv[n].ival = 1;
		    pv[SND_ARR].ival = 0;
		}
	    }
	    break;

#ifndef NOSPL
	  case SND_ARR:			/* SEND /ARRAY: */
	    if (!getval) break;
	    ap = NULL;
	    if ((x = cmfld("Array name (a single letter will do)",
			   "",
			   &s,
			   NULL
			   )) < 0) {
		if (x == -3)
		  break;
		else
		  return(x);
	    }
	    if ((x = arraybounds(s,&(range[0]),&(range[1]))) < 0) {
		printf("?Bad array: %s\n",s);
		return(-9);
	    }
	    if (!(ap = a_ptr[x])) {
		printf("?No such array: %s\n",s);
		return(-9);
	    }
	    pv[n].ival = 1;
	    pv[SND_CMD].ival = 0;	/* Undo any conflicting ones... */
	    pv[SND_RES].ival = 0;
	    pv[SND_CAL].ival = 0;
	    pv[SND_FIL].ival = 0;
	    arrayx = x;
	    break;
#endif /* NOSPL */

	  case SND_XPA:			/* /TRANSPARENT */
	    pv[n].ival = 1;
	    break;

	  case SND_TYP:			/* Only files of given type */
	    if (!getval) break;
	    if ((x = cmkey(txtbin,3,"","all",xxstring)) < 0)
	      goto xsendx;
	    pv[n].ival = (x == 2) ? -1 : x;
	    break;

	  default:
	    printf("?Unexpected switch value - %d\n",cmresult.nresult);
	    x = -9;
	    goto xsendx;
	}
    }
    debug(F101,"xsend cmresult fcode","",cmresult.fcode);

#ifdef COMMENT
    /* List switch parsing results in debug log */
    for (i = 0; i <= SND_MAX; i++) {
	ckmakmsg(line,LINBUFSIZ,"xsend switch ",ckitoa(i),NULL,NULL);
	debug(F111,line, pv[i].sval, pv[i].ival);
    }
#endif /* COMMENT */

/* Now we have all switches, plus maybe a filename or command, or nothing */

#ifdef PIPESEND
    if (protocol != PROTO_K && pv[SND_CMD].ival > 0) {
	printf("?Sorry, %s works only with Kermit protocol\n",
	       (cx == XXCSEN) ? "CSEND" : "SEND /COMMAND");
	x = -9;
	goto xsendx;
    }
    if (pv[SND_RES].ival > 0 ||	/* /RECOVER */
	pv[SND_STA].ival > 0) {	/* or /STARTING */
	if (sndfilter || pv[SND_FLT].ival > 0) {
	    printf("?Sorry, no /RECOVER or /START if SEND FILTER selected\n");
	    x = -9;
	    goto xsendx;
	}
    }
#endif /* PIPESEND */

    cmarg = "";
    cmarg2 = "";
    line[0] = NUL;
    s = line;
    wild = 0;

    switch (cmresult.fcode) {		/* How did we get out of switch loop */
      case _CMIFI:			/* Input filename */
	ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Name */
	if (pv[SND_ARR].ival > 0)
	  cmarg2 = line;
	else
	  wild = cmresult.nresult;	/* Wild flag */
	if (!recursive && !wild)
	  nolinks = 0;
	break;
      case _CMFLD:			/* Field */
	/* Only allowed with /COMMAND and /ARRAY */
	if (pv[SND_CMD].ival < 1 && pv[SND_ARR].ival < 1) {
#ifdef CKROOT
	    if (ckrooterr)
	      printf("?Off limits: %s\n",cmresult.sresult);
	    else
#endif /* CKROOT */
	      printf("?%s - \"%s\"\n",
		   iswild(cmresult.sresult) ?
		   "No files match" : "File not found",
		   cmresult.sresult
		   );
	    x = -9;
	    goto xsendx;
	}
	ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
	if (pv[SND_ARR].ival > 0)
	  cmarg2 = line;
	break;
      case _CMCFM:			/* Confirmation */
	/* s = ""; */
	confirmed = 1;
	break;
      default:
	printf("?Unexpected function code: %d\n",cmresult.fcode);
	x = -9;
	goto xsendx;
    }
    debug(F110,"xsend string",s,0);
    debug(F101,"xsend confirmed","",confirmed);

    /* Save and change protocol and transfer mode */
    /* Global values are restored in main parse loop */

    g_proto = protocol;			/* Save current global protocol */
    g_urpsiz = urpsiz;
    g_spsizf = spsizf;
    g_spsiz = spsiz;
    g_spsizr = spsizr;
    g_spmax = spmax;
    g_wslotr = wslotr;
    g_prefixing = prefixing;
    g_fncact = fncact;
    g_fncnv = fncnv;
    g_fnspath = fnspath;
    g_fnrpath = fnrpath;
    g_xfrxla = xfrxla;

    if (pv[SND_PRO].ival > -1) {	/* Change according to switch */
	protocol = pv[SND_PRO].ival;
        if (ptab[protocol].rpktlen > -1) /* copied from initproto() */
            urpsiz = ptab[protocol].rpktlen;
        if (ptab[protocol].spktflg > -1)
            spsizf = ptab[protocol].spktflg;
        if (ptab[protocol].spktlen > -1) {
            spsiz = ptab[protocol].spktlen;
            if (spsizf)
	      spsizr = spmax = spsiz;
        }
        if (ptab[protocol].winsize > -1)
            wslotr = ptab[protocol].winsize;
        if (ptab[protocol].prefix > -1)
            prefixing = ptab[protocol].prefix;
        if (ptab[protocol].fnca > -1)
            fncact  = ptab[protocol].fnca;
        if (ptab[protocol].fncn > -1)
            fncnv   = ptab[protocol].fncn;
        if (ptab[protocol].fnsp > -1)
            fnspath = ptab[protocol].fnsp;
        if (ptab[protocol].fnrp > -1)
            fnrpath = ptab[protocol].fnrp;
    }
    debug(F101,"xsend protocol","",protocol);

    if (pv[SND_NOB].ival > -1) {	/* /NOBACKUP (skip backup file) */
	g_skipbup = skipbup;
	skipbup = 1;
    }
    if (pv[SND_REC].ival > 0)		/* /RECURSIVE */
      recursive = 2;

    if (pv[SND_TYP].ival > -1) {	/* /TYPE */
	xfiletype = pv[SND_TYP].ival;
	if (xfiletype == 2)
	  xfiletype = -1;
    }
    g_binary = binary;			/* Save global transfer mode */
#ifdef PATTERNS
    g_patterns = patterns;		/* Save FILE PATTERNS setting */
#endif /* PATTERNS */
    if (pv[SND_BIN].ival > 0) {		/* Change according to switch */
	/* If they said /BINARY they mean /BINARY */
	patterns = 0;			/* So no pattern-based switching */
	g_xfermode = xfermode;		/* or automatic transfer mode */
	xfermode = XMODE_M;
	binary = XYFT_B;
	debug(F101,"doxsend /BINARY xfermode","",xfermode);
    } else if (pv[SND_TXT].ival > 0) {	/* Ditto for /TEXT */
	patterns = 0;
	g_xfermode = xfermode;
	xfermode = XMODE_M;
	binary = XYFT_T;
	debug(F101,"doxsend /TEXT xfermode","",xfermode);
    } else if (pv[SND_IMG].ival > 0) {
#ifdef VMS
	binary = XYFT_I;
#else
	binary = XYFT_B;
#endif /* VMS */
    }
#ifdef CK_LABELED
    else if (pv[SND_LBL].ival > 0) {
	binary = XYFT_L;
    }
#endif /* CK_LABELED */
    debug(F101,"xsend binary","",binary);

    if (pv[SND_XPA].ival > 0)		/* /TRANSPARENT */
      xfrxla = 0;			/* Don't translate character sets */

    /* Check for legal combinations of switches, filenames, etc */

#ifdef PIPESEND
    if (pv[SND_CMD].ival > 0) {	/* COMMAND - strip any braces */
	debug(F110,"SEND /COMMAND before stripping",s,0);
	s = brstrip(s);
	debug(F110,"SEND /COMMAND after stripping",s,0);
	if (!*s) {
	    printf("?Sorry, a command to send from is required\n");
	    x = -9;
	    goto xsendx;
	}
	cmarg = s;
    }
#endif /* PIPESEND */

/* Set up /MOVE and /RENAME */

    if (pv[SND_DEL].ival > 0 &&
	(pv[SND_MOV].ival > 0 || pv[SND_REN].ival > 0)) {
	printf("?Sorry, /DELETE conflicts with /MOVE or /RENAME\n");
	x = -9;
	goto xsendx;
    }
#ifdef CK_TMPDIR
    if (pv[SND_MOV].ival > 0) {
	int len;
	char * p = pv[SND_MOV].sval;
#ifdef CK_LOGIN
	if (isguest) {
	    printf("?Sorry, /MOVE-TO not available to guests\n");
	    x = -9;
	    goto xsendx;
	}
#endif /* CK_LOGIN */
	len = strlen(p);
	if (!isdir(p)) {		/* Check directory */
#ifdef CK_MKDIR
	    char * s = NULL;
	    s = (char *)malloc(len + 4);
	    if (s) {
		strcpy(s,p);		/* safe */
#ifdef datageneral
		if (s[len-1] != ':') { s[len++] = ':'; s[len] = NUL; }
#else
		if (s[len-1] != '/') { s[len++] = '/'; s[len] = NUL; }
#endif /* datageneral */
		s[len++] = 'X';
		s[len] = NUL;
		x = zmkdir(s);
		free(s);
		if (x < 0) {
		    printf("?Can't create \"%s\"\n",p);
		    x = -9;
		    goto xsendx;
		}
	    }
#else
	    printf("?Directory \"%s\" not found\n",p);
	    x = -9;
	    goto xsendx;
#endif /* CK_MKDIR */
	}
        zfnqfp(p,LINBUFSIZ,tmpbuf);
	makestr(&snd_move,tmpbuf);
    }
#endif /* CK_TMPDIR */

    if (pv[SND_REN].ival > 0) {		/* /RENAME */
	char * p = pv[SND_REN].sval;
#ifdef CK_LOGIN
	if (isguest) {
	    printf("?Sorry, /RENAME-TO not available to guests\n");
	    x = -9;
	    goto xsendx;
	}
#endif /* CK_LOGIN */
	if (!p) p = "";
	if (!*p) {
	    printf("?New name required for /RENAME\n");
	    x = -9;
	    goto xsendx;
	}
	p = brstrip(p);
#ifndef NOSPL
    /* If name given is wild, rename string must contain variables */
	if (wild) {
	    char * s = tmpbuf;
	    x = TMPBUFSIZ;
	    zzstring(p,&s,&x);
	    if (!strcmp(tmpbuf,p)) {
		printf(
    "?/RENAME for file group must contain variables such as \\v(filename)\n"
		       );
		x = -9;
		goto xsendx;
	    }
	}
#endif /* NOSPL */
	makestr(&snd_rename,p);
    }

/* Handle /RECOVER and /START */

#ifdef CK_RESEND
    if (pv[SND_RES].ival > 0 && binary != XYFT_B && !filepeek
#ifdef PATTERNS
	&& !patterns
#else
#ifdef VMS
/* VMS sets text/binary automatically later when it opens the file */
	&& 0
#endif /* VMS */
#endif /* PATTERNS */
	) {
	printf("?Sorry, /BINARY required\n");
	x = -9;
	goto xsendx;
    }
    if (pv[SND_STA].ival > 0) {		/* /START */
	if (wild) {
	    printf("?Sorry, wildcards not permitted with /START\n");
	    x = -9;
	    goto xsendx;
	}
	if (sizeof(int) < 4) {
	    printf("?Sorry, this command needs 32-bit integers\n");
	    x = -9;
	    goto xsendx;
	}
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("?Sorry, SEND /START works only with Kermit protocol\n");
	    x = -9;
	    goto xsendx;
	}
#endif /* CK_XYZ */
    }
#ifdef CK_XYZ
    if (pv[SND_RES].ival > 0) {
	if (protocol != PROTO_K && protocol != PROTO_Z) {
	    printf(
    "Sorry, /RECOVER is possible only with Kermit or ZMODEM protocol\n"
		   );
	    x = -9;
	    goto xsendx;
	}
    }
#endif /* CK_XYZ */
#endif /* CK_RESEND */

    if (protocol == PROTO_K) {
	if ((pv[SND_MAI].ival > 0 ||	/* MAIL */
	     pv[SND_PRI].ival > 0 ||	/* PRINT */
	     pv[SND_RES].ival > 0	/* RESEND */
	     ) &&
	    (!atdiso || !atcapr)) {	/* Disposition attribute off? */
	    printf("?Sorry, ATTRIBUTE DISPOSITION must be ON\n");
	    x = -9;
	    goto xsendx;
	}
    }

#ifdef CK_XYZ
    if (wild && (protocol == PROTO_X || protocol == PROTO_XC)) {
	printf(
"Sorry, you can only send one file at a time with XMODEM protocol\n"
	       );
	x = -9;
	goto xsendx;
    }
#endif /* CK_XYZ */

    if (!confirmed) {			/* CR not typed yet, get more fields */
	char *m;
	if (mlist) {			/* MSEND or MMOVE */
	    nfils = 0;			/* We already have the first one */
#ifndef NOMSEND
	    msfiles[nfils++] = line;	/* Store pointer */
	    lp = line + (int)strlen(line) + 1; /* Point past it */
	    debug(F111,"xsend msend",msfiles[nfils-1],nfils-1);
	    while (1) {			/* Get more filenames */
		char *p;
		if ((x = cmifi("Names of files to send, separated by spaces",
			       "", &s,&y,xxstring)) < 0) {
		    if (x != -3)
		      goto xsendx;
		    if ((x = cmcfm()) < 0)
		      goto xsendx;
		    break;
		}
		msfiles[nfils++] = lp;	/* Got one, count it, point to it, */
		p = lp;			/* remember pointer, */
		while ((*lp++ = *s++))	/* and copy it into buffer */
		  if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */
		      printf("?MSEND list too long\n");
		      line[0] = NUL;
		      x = -9;
		      goto xsendx;
		  }
		debug(F111,"xsend msend",msfiles[nfils-1],nfils-1);
		if (nfils == 1) fspec[0] = NUL; /* Take care of \v(filespec) */
#ifdef ZFNQFP
		zfnqfp(p,TMPBUFSIZ,tmpbuf);
		p = tmpbuf;
#endif /* ZFNQFP */
		if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) {
		    strcat(fspec,p);	/* safe */
		    strcat(fspec," ");	/* safe */
		} else
#ifdef COMMENT
		  printf("WARNING - \\v(filespec) buffer overflow\n");
#else
		  debug(F101,"doxsend filespec buffer overflow","",0);
#endif /* COMMENT */
	    }
#endif /* NOMSEND */
	} else {			/* Regular SEND */
	    char *p; int y;
	    nfils = -1;
	    if (pv[SND_MAI].ival > 0)
	      m = (pv[SND_MAI].sval) ?
		"e-mail address (optional)" :
		  "e-mail address (required)";
	    else if (pv[SND_PRI].ival > 0)
	      m = "printer options (optional)";
	    else if (wild)
	      m =
"\nOptional as-name template containing replacement variables \
like \\v(filename)";
	    else
	      m = "Optional name to send it with";
	    if ((x = cmtxt(m,"",&p,NULL)) < 0)
	      goto xsendx;
	    if (!p) p = "";
	    if (*p) {			/* If some text was given... */
		p = brstrip(p);		/* Replace /AS-NAME: value if any */
		if ((y = strlen(p)) > 0) {
                    if (pv[SND_MAI].ival > 0) {
                        makestr(&pv[SND_MAI].sval, p);
                    } else {
			if (pv[SND_ASN].sval) free(pv[SND_ASN].sval);
			pv[SND_ASN].sval = malloc(y+1);
			if (pv[SND_ASN].sval) {
			    strcpy(pv[SND_ASN].sval,p);	/* safe */
			    pv[SND_ASN].ival = 1;
			}
		    }
		}
	    }
	}
    }
    /* Set cmarg2 from as-name, however we got it. */

    if (pv[SND_ASN].ival > 0 && pv[SND_ASN].sval && !*cmarg2) {
	int x;
	x = strlen(line);
	ckstrncpy(line+x+2,pv[SND_ASN].sval,LINBUFSIZ-x-1);
	cmarg2 = line+x+2;
	debug(F110,"doxsend cmarg2",cmarg2,0);
    }

#ifndef NOFRILLS
    if ((pv[SND_MAI].ival > 0) && (pv[SND_PRI].ival > 0)) {
	printf("Sorry, /MAIL and /PRINT are conflicting options\n");
	x = -9;
	goto xsendx;
    }
    n = 0;				/* /MAIL or /PRINT? */
    if (pv[SND_MAI].ival > 0)
      n = SND_MAI;
    else if (pv[SND_PRI].ival > 0)
      n = SND_PRI;
    if (n) {				/* Yes... */
#ifdef DEBUG
	char * p;
	if (n == SND_MAI)
	  p = "/MAIL";
	else
	  p = "/PRINT";
	debug(F111,"xsend",p,n);
#endif /* DEBUG */
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("Sorry, %s available only with Kermit protocol\n",
		   (n == SND_MAI) ? "/MAIL" : "/PRINT"
		   );
	    x = -9;
	    goto xsendx;
	}
#endif /* CK_XYZ */
	debug(F101,"xsend print/mail wild","",wild);
	*optbuf = NUL;			/* Wipe out any old options */
	s = pv[n].sval;			/* mail address or print switch val */
	if (!s) s = "";
	debug(F110,"doxsend mail address or printer options",s,0);
	if (n == SND_MAI && !*s) {
	    printf("?E-mail address required\n");
	    x = -9;
	    goto xsendx;
	} else if ((int)strlen(s) > 94) { /* Ensure legal size */
	    printf("?%s too long\n",
		   (n == SND_MAI) ?
		   "E-mail address" :
		   "Print option string"
		   );
	    x = -9;
	    goto xsendx;
	}
	ckstrncpy(optbuf,s,OPTBUFLEN);	/* OK, copy to option buffer */
	cmarg = line;			/* File to send */
	if (n == SND_MAI) {
	    debug(F110,"xsend mailing",cmarg,0);
	    debug(F110,"xsend address:",optbuf,0);
	    rmailf = 1;
	} else {
	    debug(F110,"xsend printing",cmarg,0);
	    debug(F110,"xsend options",optbuf,0);
	    rprintf = 1;
	}
    }
#endif /* NOFRILLS */

#ifdef CALIBRATE
    if (pv[SND_CAL].ival > 0) {		/* Handle /CALIBRATE */
	if (confirmed) {
	    calibrate = pv[SND_CAL].ival * 1024L;
	    sndsrc = -9;
	    nfils = 1;
	    wild = 0;
#ifndef NOMSEND
	    addlist = 0;
#endif /* NOMSEND */
	    ckstrncpy(line,"CALIBRATION",LINBUFSIZ);
	    s = cmarg = line;
	    if (!cmarg2) cmarg2 = "";
	    debug(F110,"doxsend cmarg2 calibrate",cmarg2,0);
	} else if (line[0]) {
	    calibrate = 0L;
	    pv[SND_CAL].ival = 0L;
	}
    }
#endif /* CALIBRATE */

    if (pv[SND_FIL].ival > 0) {
	if (confirmed && !calibrate) {
	    if (zopeni(ZMFILE,pv[SND_FIL].sval) < 1) {
		debug(F110,"xsend can't open",pv[SND_FIL].sval,0);
		printf("?Failure to open %s\n",filefile);
		x = -9;
		goto xsendx;
	    }
	    makestr(&filefile,pv[SND_FIL].sval); /* Open, remember name */
	    debug(F110,"xsend opened",filefile,0);
	    wild = 1;
	}
    }

    /* SEND alone... */

#ifndef NOSPL
    if (confirmed && pv[SND_ARR].ival > 0) {
	if (!*cmarg2) {
	    sndxnam[7] = (char)((arrayx == 1) ? 64 : arrayx + ARRAYBASE);
	    cmarg2 = sndxnam;
	}
	cmarg = "";
	goto sendend;
    }
#endif /* NOSPL */

    if (confirmed && !line[0] && !filefile && !calibrate) {
#ifndef NOMSEND
	if (filehead) {			/* OK if we have a SEND-LIST */
	    nfils = filesinlist;
	    sndsrc = nfils;		/* Like MSEND */
	    addlist = 1;		/* But using a different list... */
	    filenext = filehead;
	    goto sendend;
	}
#endif /* NOMSEND */
	printf("?Filename required but not given\n");
	x = -9;
	goto xsendx;
    }

    /* Not send-list or array */

#ifndef NOMSEND
    addlist = 0;			/* Don't use SEND-LIST. */
    filenext = NULL;
#endif /* NOMSEND */

    if (mlist) {			/* MSEND or MMOVE */
#ifndef NOMSEND
	cmlist = msfiles;		/* List of files to send */
	sndsrc = nfils;
	cmarg2 = "";
	sendstart = 0L;
#endif /* NOMSEND */
#ifdef PIPESEND
	pipesend = 0;
#endif /* PIPESEND */
    } else if (filefile) {		/* File contains list of filenames */
	s = "";
	cmarg = "";
	cmarg2 = "";
	line[0] = NUL;
	nfils = 1;
	sndsrc = 1;

    } else if (!calibrate && pv[SND_ARR].ival < 1 && pv[SND_CMD].ival < 1) {

	nfils = sndsrc = -1;	/* Not MSEND, MMOVE, /LIST, or /ARRAY */
	if (				/* or /COMMAND */

#ifndef NOFRILLS
	    !rmailf && !rprintf		/* Not MAIL or PRINT */
#else
	    1
#endif /* NOFRILLS */
	    ) {
	    int y = 1;
	    if (!wild)
	      y = zchki(s);
	    if (y < 0) {
		printf("?Read access denied - \"%s\"\n", s);
		x = -9;
		goto xsendx;
	    }
	    if (s != line)		/* We might already have done this. */
	      ckstrncpy(line,s,LINBUFSIZ); /* Copy of string just parsed. */
	    else
	      debug(F110,"doxsend line=s",line,0);
	    cmarg = line;		/* File to send */
	}
	zfnqfp(cmarg,fspeclen,fspec);
    }
    if (!mlist) {			/* For all but MSEND... */
#ifdef PIPESEND
	if (pv[SND_CMD].ival > 0)	/* /COMMAND sets pipesend flag */
	  pipesend = 1;
	debug(F101,"xsend /COMMAND pipesend","",pipesend);
	if (pipesend && filefile) {
	    printf("?Invalid switch combination\n");
	    x = -9;
	    goto xsendx;
	}
#endif /* PIPESEND */

#ifndef NOSPL
    /* If as-name given and filespec is wild, as-name must contain variables */
	debug(F111,"doxsend cmarg2 wild",cmarg2,wild);
	if (wild && *cmarg2) {
	    char * s = tmpbuf;
	    x = TMPBUFSIZ;
	    zzstring(cmarg2,&s,&x);
	    if (!strcmp(tmpbuf,cmarg2)) {
		printf(
    "?As-name for file group must contain variables such as \\v(filename)\n"
		       );
		x = -9;
		goto xsendx;
	    }
	}
#endif /* NOSPL */

    /* Strip braces from as-name */
	debug(F110,"xsend cmarg2 before stripping",cmarg2,0);
	cmarg2 = brstrip(cmarg2);
	debug(F110,"xsend filename",cmarg,0);
	debug(F110,"xsend as-name",cmarg2,0);

    /* Copy as-name to a safe place */

	if (asnbuf) {
	    free(asnbuf);
	    asnbuf = NULL;
	}
	if ((y = strlen(cmarg2)) > 0) {
	    asnbuf = (char *) malloc(y + 1);
	    if (asnbuf) {
		strcpy(asnbuf,cmarg2);	/* safe */
		cmarg2 = asnbuf;
	    } else cmarg2 = "";
	}

#ifdef CK_RESEND
	debug(F111,"xsend pv[SND_STA].ival","",pv[SND_STA].ival);
	if (pv[SND_STA].ival > -1) {	/* /START position */
	    if (wild) {
		printf("?/STARTING-AT may not be used with multiple files.\n");
		x = -9;
		goto xsendx;
	    } else
	      sendstart = pv[SND_STA].ival;
	} else
	  sendstart = 0L;
	debug(F101,"xsend /STARTING","",sendstart);
#endif /* CK_RESEND */
    }

sendend:				/* Common successful exit */
    moving = 0;
    if (pv[SND_SHH].ival > 0) {		/* SEND /QUIET... */
	g_displa = fdispla;
	fdispla = 0;
	debug(F101,"xsend display","",fdispla);
    }

#ifndef NOSPL				/* SEND /ARRAY... */
    if (pv[SND_ARR].ival > 0) {
	if (!ap) { x = -2; goto xsendx; } /* (shouldn't happen) */
	if (range[0] == -1)		/* If low end of range not specified */
	  range[0] = 1;			/* default to 1 */
	if (range[1] == -1)		/* If high not specified */
	  range[1] = a_dim[arrayx];	/* default to size of array */
	if ((range[0] < 0) ||		/* Check range */
	    (range[0] > a_dim[arrayx]) ||
	    (range[1] < range[0]) ||
	    (range[1] > a_dim[arrayx])) {
	    printf("?Bad array range - [%d:%d]\n",range[0],range[1]);
	    x = -9;
	    goto xsendx;
	}
	sndarray = ap;			/* Array pointer */
	sndxin = arrayx;		/* Array index */
	sndxlo = range[0];		/* Array range */
	sndxhi = range[1];
	sndxnam[7] = (char)((sndxin == 1) ? 64 : sndxin + ARRAYBASE);

#ifdef COMMENT
	printf("SENDING FROM ARRAY: &%c[]...\n", /* debugging */
	       (sndxin == 1) ? 64 : sndxin + ARRAYBASE);
	printf("Lo=%d\nHi=%d\n", sndxlo, sndxhi);
	printf("cmarg=[%s]\ncmarg2=[%s]\n", cmarg, cmarg2);
	while ((x = agnbyte()) > -1) {
	    putchar((char)x);
	}
	return(1);
#endif /* COMMENT */
    }
#endif /* NOSPL */

    if (pv[SND_ARR].ival < 1) {		/* File selection & disposition... */

	if (pv[SND_DEL].ival > 0)	/* /DELETE was specified */
	  moving = 1;
	debug(F101,"xsend /DELETE","",moving);
	if (pv[SND_AFT].ival > 0)	/* Copy SEND criteria */
	  ckstrncpy(sndafter,pv[SND_AFT].sval,19);
	if (pv[SND_BEF].ival > 0)
	  ckstrncpy(sndbefore,pv[SND_BEF].sval,19);
	if (pv[SND_NAF].ival > 0)
	  ckstrncpy(sndnafter,pv[SND_NAF].sval,19);
	if (pv[SND_NBE].ival > 0)
	  ckstrncpy(sndnbefore,pv[SND_NBE].sval,19);
	if (pv[SND_EXC].ival > 0)
	  makelist(pv[SND_EXC].sval,sndexcept,NSNDEXCEPT);
	if (pv[SND_SMA].ival > -1)
	  sndsmaller = pv[SND_SMA].ival;
	if (pv[SND_LAR].ival > -1)
	  sndlarger = pv[SND_LAR].ival;
	if (pv[SND_NAM].ival > -1) {
	    g_fncnv = fncnv;		/* Save global value */
	    fncnv = pv[SND_NAM].ival;
	    debug(F101,"xsend fncnv","",fncnv);
	}
	if (pv[SND_PTH].ival > -1) {
	    g_spath = fnspath;		/* Save global values */
	    fnspath = pv[SND_PTH].ival;
#ifndef NZLTOR
	    if (fnspath != PATH_OFF) {
		g_fncnv = fncnv;	/* Bad bad... */
		fncnv = XYFN_C;
	    }
#endif /* NZLTOR */
	    debug(F101,"xsend fnspath","",fnspath);
	    debug(F101,"xsend fncnv","",fncnv);
	}
    }

#ifdef PIPESEND
    if (pv[SND_FLT].ival > 0) {
	makestr(&sndfilter,pv[SND_FLT].sval);
	debug(F110,"xsend /FILTER", sndfilter, 0);
    }
#endif /* PIPESEND */

#ifdef CK_APC
/* MOVE not allowed in APCs */
    if (moving &&
	(apcactive == APC_LOCAL || apcactive == APC_REMOTE)
	&& !(apcstatus & APC_UNCH))
      return(success = 0);
#endif /* CK_APC */
#ifdef IKS_OPTION
    if (
#ifdef CK_XYZ
        protocol == PROTO_K &&
#endif /* CK_XYZ */
        !iks_wait(KERMIT_REQ_START,1)) {
        printf("?A Kermit Server is not available to process this command.\n");
        printf("?Start a RECEIVE command to complement this command.\n");
    }
#endif /* IKS_OPTION */

#ifdef IKSD
#ifdef CK_LOGIN
    if (moving && inserver && isguest) {
        printf("?File deletion not allowed for guests.\n");
	return(-9);
    }
#endif /* CK_LOGIN */
#endif /* IKSD */

    sstate = 's';			/* Set start state to SEND */
    sndcmd = 1;
#ifdef CK_RESEND
    if (pv[SND_RES].ival > 0)		/* Send sendmode appropriately */
      sendmode = SM_RESEND;
    else if (pv[SND_STA].ival > 0)
      sendmode = SM_PSEND;
    else
#endif /* CK_RESEND */
    if (mlist)
      sendmode = SM_MSEND;
    else
      sendmode = SM_SEND;
#ifdef MAC
    what = W_SEND;
    scrcreate();
#endif /* MAC */
    if (local && pv[SND_SHH].ival != 0) { /* If in local mode, */
	displa = 1;			/* turn on file transfer display */
    }
    x = 0;

  xsendx:				/* Common exit, including failure */
    debug(F101,"doxsend sndsrc","",sndsrc);
    for (i = 0; i <= SND_MAX; i++) {	/* Free malloc'd memory */
	if (pv[i].sval)
	  free(pv[i].sval);
    }
    return(x);
}
#endif /* NOXFER */

#ifndef NOLOCAL
/*  D O X C O N N  --  CONNECT command parsing with switches */

#ifdef XLIMITS
#define XLIMORTRIGGER
#else
#ifdef CK_TRIGGER
#define XLIMORTRIGGER
#endif /* CK_TRIGGER */
#endif /*  XLIMITS */

#ifdef CKTIDLE
int tt_idlelimit = 0;			/* Terminal idle limit */
int tt_idleact = IDLE_RET;		/* Terminal idle action */
#endif /* CKTIDLE */

#ifdef OS2				/* K95 only: */
extern int
  tt_idlesnd_tmo;			/*   Idle interval */
int tt_timelimit = 0;			/*   Time limit, 0 = none */
extern char *				/* Parse results - strings: */
  tt_idlesnd_str;			/*   Idle string */
#endif /* OS2 */

#ifdef CK_TRIGGER
extern char *tt_trigger[];
extern CHAR *tt_trmatch[];
extern char *triggerval;
static char *g_tt_trigger[TRIGGERS];
#endif /* CK_TRIGGER */

#ifdef OS2
static int g_tt_idlesnd_tmo, g_tt_timelimit; /* For saving and restoring */
static int g_tt_idlelimit, g_tt_saved = 0;
static char * g_tt_idlesnd_str;		/* global settings */
#endif /* OS2 */

static struct stringint {		/* Temporary array for switch values */
    char * sval;
    int ival;
} pv[CONN_MAX+1];

VOID
resconn() {
    int i;

#ifdef OS2
    if ( g_tt_saved ) {
        tt_idlelimit   = g_tt_idlelimit;
        tt_idlesnd_tmo = g_tt_idlesnd_tmo;
        tt_timelimit   = g_tt_timelimit;
        tt_idlesnd_str = g_tt_idlesnd_str;
        g_tt_saved = 0;
    }
#endif /* OS2 */

#ifdef CK_TRIGGER
    for (i = 0; i < TRIGGERS; i++)
      tt_trigger[i] = g_tt_trigger[i];
#endif /* CK_TRIGGER */

    for (i = 0; i <= CONN_MAX; i++) {	/* Free malloc'd memory */
	if (pv[i].sval)
	  free(pv[i].sval);
        pv[i].sval = NULL;
    }
}

int
doxconn(cx) int cx; {
    int c, i, n;			/* Workers */
    int x, y;
    int getval = 0;			/* Whether to get switch value */
    int async = 0;                      /* Make an async connect */
    struct FDB sw, cm;			/* FDBs for each parse function */
    extern FILE * tfile[];
    extern char * macp[];

#ifdef OS2
    g_tt_idlesnd_tmo = tt_idlesnd_tmo;	/* Save global settings */
    g_tt_timelimit   = tt_timelimit;
    g_tt_idlelimit   = tt_idlelimit;
    g_tt_idlesnd_str = tt_idlesnd_str;
    g_tt_saved = 1;
#endif /* OS2 */

#ifdef CK_TRIGGER
    if (!tt_trigger[0]) {		/* First initialization */
	for (i = 1; i < TRIGGERS; i++)
	  tt_trigger[i] = NULL;
    }
    for (i = 0; i < TRIGGERS; i++)
      g_tt_trigger[i] = tt_trigger[i];
    if (triggerval) {
	free(triggerval);
	triggerval = NULL;
    }
#endif /* CK_TRIGGER */

    for (i = 0; i <= CONN_MAX; i++) {	/* Initialize switch values */
	pv[i].sval = NULL;		/* to null pointers */
	pv[i].ival = -1;		/* and -1 int values */
    }
    if (cx == XXCQ)			/* CQ == CONNECT /QUIETLY */
      pv[CONN_NV].ival = 1;

    /* Set up chained parse functions... */

    cmfdbi(&sw,				/* First FDB - command switches */
	   _CMKEY,			/* fcode */
	   "Switch",			/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
	   nconntab,			/* addtl numeric data 1: tbl size */
	   4,				/* addtl numeric data 2: 4 = cmswi */
	   xxstring,			/* Processing function */
	   conntab,			/* Keyword table */
	   &cm				/* Pointer to next FDB */
	   );
    cmfdbi(&cm,				/* 2nd FDB - Confirmation */
	   _CMCFM,			/* fcode */
	   "",				/* hlpmsg */
	   "",				/* default */
	   "",				/* addtl string data */
	   0,				/* addtl numeric data 1 */
	   0,				/* addtl numeric data 2 */
	   NULL,
	   NULL,
	   NULL
	   );

    while (1) {				/* Parse 0 or more switches */
	x = cmfdb(&sw);			/* Parse switch or confirmation */
	debug(F101,"doxconn cmfdb","",x);
	if (x < 0) {			/* Error */
	    if (x == -9 || x == -2)
	      printf("?No switches match - \"%s\"\n",atmbuf);
	    goto xconnx;		/* or reparse needed */
	}
	if (cmresult.fcode != _CMKEY)	/* Break out if not a switch */
	  break;
	c = cmgbrk();			/* Get break character */
	getval = (c == ':' || c == '='); /* to see how they ended the switch */
	if (getval && !(cmresult.kflags & CM_ARG)) {
	    printf("?This switch does not take arguments\n");
	    x = -9;
	    goto xconnx;
	}
	if (!getval && (cmgkwflgs() & CM_ARG)) {
	    printf("?This switch requires an argument\n");
	    return(-9);
	}
	n = cmresult.nresult;		/* Numeric result = switch value */
	debug(F101,"doxconn switch","",n);

	switch (n) {			/* Process the switch */
#ifdef OS2
	  case CONN_AS:			/* Asynchronous */
            pv[CONN_AS].ival = 1;
            pv[CONN_SY].ival = 0;
            break;
          case CONN_SY:                 /* Synchronous */
            pv[CONN_SY].ival = 1;
            pv[CONN_AS].ival = 0;
            break;
#endif /* OS2 */
	  case CONN_NV:			/* Non-verbal */
	    pv[n].ival = 1;
	    break;
#ifdef XLIMITS
	  case CONN_II:			/* Idle-interval */
	  case CONN_IL:			/* Idle-limit */
	  case CONN_TL:			/* Time-limit */
	    if (!getval) break;
	    if ((x = cmnum("Seconds","0",10,&y,xxstring)) < 0)
	      goto xconnx;
	    pv[n].ival = y;
	    break;
	  case CONN_IS:			/* Idle-string */
#endif /* XLIMITS */
#ifdef CK_TRIGGER
	  case CONN_TS:			/* Trigger-string */
#endif /* CK_TRIGGER */
#ifdef XLIMORTRIGGER
	    if (!getval) break;
	    if ((x = cmfld("String (enclose in braces if it contains spaces)",
			   "",&s,xxstring)) < 0) {
		if (x == -3) {
		    printf("?String required\n");
		    x = -9;
		}
		goto xconnx;
	    }
	    if (n != CONN_TS)
	      s = brstrip(s);
	    if ((y = strlen(s)) > 0) {
		if (pv[n].sval) free(pv[n].sval);
		pv[n].sval = malloc(y+1);
		if (pv[n].sval) {
		    strcpy(pv[n].sval,s); /* safe */
		    pv[n].ival = 1;
		}
	    }
	    break;
#endif /* XLIMORTRIGGER */
	  default:
	    printf("?Unexpected switch value - %d\n",cmresult.nresult);
	    x = -9;
	    goto xconnx;
	}
    }
    debug(F101,"doxconn cmresult.fcode","",cmresult.fcode);
    if (cmresult.fcode != _CMCFM) {
	printf("?Unexpected function code: %d\n",cmresult.fcode);
	x = -9;
	goto xconnx;
    }

    /* Command was confirmed so we can pre-pop command level. */
    /* This is so CONNECT module won't think we're executing a script */
    /* if CONNECT was the final command in the script. */

    if (cmdlvl > 0)
      prepop();

#ifdef OS2				/* Make results available globally */
    if (pv[CONN_IL].ival > -1)		/* Idle limit */
      tt_idlelimit = pv[CONN_IL].ival;
    if (pv[CONN_II].ival > -1)		/* Idle limit */
      tt_idlesnd_tmo = pv[CONN_II].ival;
    if (pv[CONN_IS].sval)		/* Idle string */
      if (tt_idlesnd_str = (char *)malloc((int)strlen(pv[CONN_IS].sval)+1))
	strcpy(tt_idlesnd_str,pv[CONN_IS].sval); /* safe */
    if (pv[CONN_TL].ival > -1)		/* Session limit */
      tt_timelimit = pv[CONN_TL].ival;
    async = (pv[CONN_AS].ival > 0 ||
             pv[CONN_SY].ival <= 0 && cmdlvl == 0) ? 1 : 0;
#endif /* OS2 */

#ifdef CK_TRIGGER
    if (pv[CONN_TS].sval)		/* Trigger strings */
      makelist(pv[CONN_TS].sval,tt_trigger,TRIGGERS);
    for (i = 0; i < TRIGGERS; i++)	/* Trigger match pointers */
      tt_trmatch[i] = NULL;
    if (triggerval) {			/* Reset trigger value */
	free(triggerval);
	triggerval = NULL;
    }
#endif /* CK_TRIGGER */

    x = doconect((pv[CONN_NV].ival > 0) ? 1 : 0, async);
    {
	int xx;
	debug(F101,"doxconn doconect returns","",x);
	if ((xx = ttchk()) < 0) dologend();
	debug(F101,"doxconn ttchk returns","",xx);
    }

#ifdef CK_TRIGGER
    debug(F111,"doxconn doconect triggerval",triggerval,x);
#endif /* CK_TRIGGER */

  xconnx:
    /* Back from CONNECT -- Restore global settings */

    if (!async)
      resconn();

    success = (x > 0) ? 1 : 0;
    return(x);
}
#endif /* NOLOCAL */

#ifdef ADDCMD
/* cx == XXADD or XXREMV */
/* fc == ADD_BIN or ADD_TXT */
static int
doadd(cx,fc) int cx, fc; {
#ifdef PATTERNS
    char * tmp[FTPATTERNS];
    char **p = NULL;
    int i, j, k, n = 0, x = 0, last;

#endif /* PATTERNS */
    if (cx != XXADD && cx != XXREMV) {
	printf("?Unexpected function code: %d\n",cx);
	return(-9);
    }
#ifdef PATTERNS
    while (n < FTPATTERNS) {		/* Collect new patterns */
	tmp[n] = NULL;
	if ((x = cmfld("Pattern","",&s,xxstring)) < 0)
	  break;
	ckstrncpy(line,s,LINBUFSIZ);
	s = brstrip(line);
	makestr(&(tmp[n++]),s);
    }
    if (x == -3)
      x = cmcfm();
    if (x < 0)
      goto xdoadd;
    p = (fc == ADD_BIN) ? binpatterns : txtpatterns; /* Which list */
    last = 0;
    for (i = 0; i < FTPATTERNS; i++) { /* Find last one in list */
	if (!p[i]) {
	    last = i;
	    break;
	}
    }
    if (cx == XXADD) {			/* Adding */
	if (last + n > FTPATTERNS) {	/* Check if too many */
	    printf("?Too many patterns - %d is the maximum\n", FTPATTERNS);
	    goto xdoadd;
	}
        for (i = 0; i < n; i++) {        /* Copy in the new ones. */
          for (j = 0, x = 0; x == 0 && j < last ; j++ )
            x = !ckstrcmp(tmp[i],p[j],-1,filecase); /* match */
          if (x == 0)
            makestr(&(p[last++]),tmp[i]);
        }
        makestr(&(p[last]),NULL);	/* Null-terminate the list */
        x = 1;
        goto xdoadd;                    /* Done */
    } else if (cx == XXREMV) {		/* Remove something(s) */
	int j, k;
	if (last == 0)			        /* List is empty */
	  goto xdoadd;			        /* Nothing to remove */
	for (i = 0; i < n; i++) {	        /* i = Patterns they typed */
	    for (j = 0; j < last; j++) {        /* j = Patterns in list */
		/* Change this to ckstrcmp()... */
		if (filecase)
                  x = !ckstrcmp(tmp[i],p[j],-1,filecase); /* match */
		else
		  x = ckstrcmp(tmp[i],p[j],-1,0); /* Case-independent match */
		if (x) {	    	        /* This one matches */
		    makestr(&(p[j]),NULL);      /* Free it */
		    for (k = j; k < last; k++)  /* Move the rest up */
		      p[k] = p[k+1];
		    p[k] = NULL;	        /* Erase last one */
		    if (!p[k])
		      break;
		}
	    }
	}
    }
  xdoadd:				/* Common exit */
    for (i = 0; i < n; i++)
      if (tmp[i])
	free(tmp[i]);
    return(x);
#endif /* PATTERNS */
}

/* ADD SEND-LIST */

static int
addsend(cx) int cx; {
#ifndef NOMSEND
    extern struct keytab fttab[];
    extern int nfttyp;
    struct filelist * flp;
    char * fmode = "";
    int xmode = 0;
    int xbinary = 0;
#endif /* NOMSEND */

#ifdef NOMSEND
    printf("?Sorry, ADD/REMOVE SEND-LIST not available.\n");
    return(-9);
#endif /* NOMSEND */
    if (cx == XXREMV) {
	printf("?Sorry, REMOVE SEND-LIST not implemented yet.\n");
	return(-9);
    }
#ifndef NOMSEND
#ifndef XYZ_INTERNAL
    if (protocol != PROTO_K) {
       printf("?Sorry, ADD SEND-LIST does not work with external protocols\n");
       return(-9);
    }
#endif /* XYZ_INTERNAL */

    x = cmifi("File specification to add","", &s,&y,xxstring);
    if (x < 0) {
	if (x == -3) {
	    printf("?A file specification is required\n");
	    return(-9);
	} else
	  return(x);
    }
    ckstrncpy(tmpbuf,s,TMPBUFSIZ);
    s = tmpbuf;
    if (filesinlist == 0)		/* Take care of \v(filespec) */
      fspec[0] = NUL;
    zfnqfp(s,LINBUFSIZ,line);
    s = line;
    if (((int)strlen(fspec) + (int)strlen(s) + 1) < fspeclen) {
	strcat(fspec,s);		/* safe */
	strcat(fspec," ");		/* safe */
    } else
      printf("WARNING - \\v(filespec) buffer overflow\n");


    xbinary = binary;
    if ((patterns || filepeek)		/* FILE PATTERNS or SCAN is ON */
#ifdef CK_LABELED
	&& binary != XYFT_L		/* And not if FILE TYPE LABELED */
#endif /* CK_LABELED */
#ifdef VMS
	&& binary != XYFT_I		/* or FILE TYPE IMAGE */
#endif /* VMS */
	) {
	int k, x;
	x = -1;
	k = scanfile(line,&x,nscanfile);
	if (k > 0) xbinary = (k == FT_BIN) ? XYFT_B : XYFT_T;
    }
    fmode = gfmode(xbinary,0);
    if ((x = cmkey(fttab,nfttyp,
		   "type of file transfer", fmode, xxstring)) < 0)
      return(x);
    xmode = x;

    cmarg2 = "";
    if ((x = cmfld(y ?
  "\nAs-name template containing replacement variables such as \\v(filename)" :
  "Name to send it with", "",&s,NULL)) < 0)
      if (x != -3)
	return(x);
#ifndef NOSPL
    if (y && *s) {
	char * p = tmpbuf;
	x = TMPBUFSIZ;
	zzstring(s,&p,&x);
	if (!strcmp(tmpbuf,s)) {
	    printf(
  "?As-name for file group must contain variables such as \\v(filename)\n"
		   );
	    return(-9);
	}
    }
#endif /* NOSPL */
    ckstrncpy(tmpbuf,s,TMPBUFSIZ);
    cmarg2 = tmpbuf;

    if ((x = cmcfm()) < 0)
      return(x);
    flp = (struct filelist *) malloc(sizeof(struct filelist));
    if (flp) {
	if (filetail)
	  filetail->fl_next = flp;
	filetail = flp;
	if (!filehead)
	  filehead = flp;
	x = (int) strlen(line);	/* Length of filename */
	s = (char *) malloc(x + 1);
	if (s) {
	    strcpy(s,line);		/* safe */
	    flp->fl_name = s;
	    flp->fl_mode = xmode;
	    x = (int) strlen(cmarg2);	/* Length of as-name */
	    if (x < 1) {
		flp->fl_alias = NULL;
	    } else {
		s = (char *) malloc(x + 1);
		if (s) {
		    strcpy(s,cmarg2);	/* safe */
		    flp->fl_alias = s;
		} else {
		    printf("Sorry, can't allocate space for as-name");
		    return(-9);
		}
	    }
	    flp->fl_next = NULL;
	    filesinlist++;		/* Count this node */
	    return(success = 1);	/* Finished adding this node */
	} else {
	    printf("Sorry, can't allocate space for name");
	    return(-9);
	}
    } else {
	printf("Sorry, can't allocate file list node");
	return(-9);
    }
#endif /* NOMSEND */
}
#endif /* ADDCMD */

#ifndef NOHTTP				/* HTTP ops... */
#ifdef TCPSOCKET
#define HTTP_GET 0			/* GET */
#define HTTP_PUT 1			/* PUT */
#define HTTP_POS 2			/* POST */
#define HTTP_IDX 3			/* INDEX */
#define HTTP_HED 4                      /* HEAD */
#define HTTP_DEL 5                      /* DELETE */
#define HTTP_CON 6                      /* CONNECT */
#define HTTP_OPN 7                      /* OPEN */
#define HTTP_CLS 8                      /* CLOSE */

static struct keytab httptab[] = {
    { "close",   HTTP_CLS, 0 },
    { "connect", HTTP_CON, 0 },
    { "delete",  HTTP_DEL, 0 },
    { "get",     HTTP_GET, 0 },
    { "head",    HTTP_HED, 0 },
    { "index",   HTTP_IDX, 0 },
    { "open",    HTTP_OPN, 0 },
    { "put",     HTTP_PUT, 0 },
    { "post",    HTTP_POS, 0 }
};
static int nhttptab = sizeof(httptab)/sizeof(struct keytab);

/* HTTP switches */
#define HT_SW_AG 0			/* /AGENT */
#define HT_SW_HD 1			/* /HEADER */
#define HT_SW_US 2			/* /USER */
#define HT_SW_PW 3			/* /PASSWORD */
#define HT_SW_AR 4                      /* /ARRAY */
#define HT_SW_TP 5                      /* /TOSCREEN */

static struct keytab httpswtab[] = {
    { "/agent",    HT_SW_AG, CM_ARG },
#ifndef NOSPL
    { "/array",    HT_SW_AR, CM_ARG },
#endif /* NOSPL */
    { "/header",   HT_SW_HD, CM_ARG },
    { "/password", HT_SW_PW, CM_ARG },
    { "/toscreen", HT_SW_TP, 0 },
    { "/user",     HT_SW_US, CM_ARG },
    { "", 0, 0 }
};
static int nhttpswtab = sizeof(httpswtab)/sizeof(struct keytab) - 1;

/* HTTP PUT/POST switches */
#define HT_PP_MT 0			/* /MIME-TYPE */

static struct keytab httpptab[] = {
    { "/mime-type", HT_PP_MT, CM_ARG },
    { "", 0, 0 }
};
static int nhttpptab = sizeof(httpptab)/sizeof(struct keytab) - 1;

#define HTTP_MAXHDR 8

static int
xdohttp(action, lfile, rf, dfile, agent, hdr, user, pass, mime, array, type)
    int action;
    char *lfile, *rf, *dfile, *agent, *hdr, *user, *pass, *mime, array;
    int type;
/* xdohttp */ {
    int i, rc = 0;
    char * hdrlist[HTTP_MAXHDR];
    char rfile[CKMAXPATH+1];
    extern int httpfd;

    /* Check for a valid state to execute the command */
    if (inserver) {
        printf("?The HTTP command may not be used from the IKS\r\n");
    } else if (httpfd == -1) {
        if (http_reopen() < 0)
	  printf("?No connection\n");
        else
	  rc = 1;
    } else {
	rc = 1;
    }

    /* If the command is not valid, exit with failure */
    if (rc == 0)
        return(success = 0);

    if (action != HTTP_CON && rf[0] != '/') {
        rfile[0] = '/';
        ckstrncpy(&rfile[1],rf,CKMAXPATH);
    } else {
        ckstrncpy(rfile,rf,CKMAXPATH);
    }
    for (i = 0; i < HTTP_MAXHDR; i++)	/* Initialize header list */
      hdrlist[i] = NULL;
    makelist(hdr,hdrlist,HTTP_MAXHDR);	/* Make header list */

#ifdef BETADEBUG
    for (i = 0; i < nhttptab; i++)	/* Find action keyword */
      if (httptab[i].kwval == action)
	break;
    if (i == nhttptab) {		/* Shouldn't happen... */
	printf("?Invalid action - %d\n",action);
	return(0);			/* Failure */
    }

    printf("HTTP action:  %s\n",httptab[i].kwd);
    printf(" Agent:       %s\n",agent ? agent : "(null)");

    if (hdrlist[1]) {
	printf(" Header list: 1. %s\n",hdrlist[0]);
	for (i = 1; i < HTTP_MAXHDR && hdrlist[i]; i++)
	  printf("%15d. %s\n",i+1,hdrlist[i]);
    } else
      printf(" Header:      %s\n",hdrlist[0] ? hdrlist[0] : "(null)");

    printf(" User:        %s\n",user ? user : "(null)");
#ifdef COMMENT
    printf(" Password:    %s\n",pass ? pass : "(null)");
#endif /* COMMENT */

#ifndef NOSPL
    if (array)
      printf(" Array:       \\%%%c[]\n", array);
    else
      printf(" Array:       (none)\n");
#endif /* NOSPL */

    if (action == HTTP_PUT || action == HTTP_POS)
      printf(" Mime-type:   %s\n",mime ? mime : "(null)");

    printf(" Local file:  %s\n",lfile ? lfile : "(null)");
    printf(" Remote file: %s\n",rfile ? rfile : "(null)");
    printf(" Destination file: %s\n",dfile ? dfile : "(null)");
#endif /* BETADEBUG */

    /* The http_xxxx() functions return 0 on success, -1 on failure */
    switch (action) {
      case HTTP_CON: {
	  extern int ttyfd;
	  rc = http_connect(httpfd,agent,hdrlist,user,pass,array,rfile);
	  break;
      }
      case HTTP_DEL:
        rc = http_delete(agent,hdrlist,user,pass,array,rfile);
        break;
      case HTTP_GET:
        rc = http_get(agent,hdrlist,user,pass,array,lfile,rfile,type);
        break;
      case HTTP_HED:
        rc = http_head(agent,hdrlist,user,pass,array,lfile,rfile,type);
        break;
      case HTTP_PUT:
        rc = http_put(agent,hdrlist,mime,user,pass,array,lfile,rfile,dfile,
		      type);
        break;
      case HTTP_POS:
        rc = http_post(agent,hdrlist,mime,user,pass,array,lfile,rfile,dfile,
		       type);
        break;
      case HTTP_IDX:
        rc = http_index(agent,hdrlist,user,pass,array,lfile,rfile,type);
        break;
      default:
        rc = -1;
    }
    return(rc == 0 ? 1 : 0);	        /* Success is set by caller */
}
#endif /* TCPSOCKET */
#endif /* NOHTTP */

#ifndef NOSPL				/* ARRAY ops... */
static struct keytab arraytab[] = {
    { "clear",     ARR_CLR, 0 },
    { "copy",      ARR_CPY, 0 },
    { "dcl",       ARR_DCL, CM_INV },
    { "declare",   ARR_DCL, 0 },
    { "destroy",   ARR_DST, CM_INV },
    { "equate",    ARR_EQU, CM_INV },
    { "link",      ARR_EQU, 0 },
    { "resize",    ARR_RSZ, 0 },
    { "set",       ARR_SET, 0 },
#ifndef NOSHOW
    { "show",      ARR_SHO, 0 },
#endif /* NOSHOW */
    { "sort",      ARR_SRT, 0 },
    { "undeclare", ARR_DST, 0 },
    { "", 0, 0 }
};
static int narraytab = sizeof(arraytab)/sizeof(struct keytab) - 1;

#ifdef CKLEARN
static struct keytab learnswi[] = {
    { "/close",    2, 0 },
    { "/off",      0, 0 },
    { "/on",       1, 0 }
};
#endif /* CKLEARN */

int
arrayitoa(x) int x; {			/* Array index to array letter */
    if (x == 1)
      return(64);
    else if (x < 0 || x > (122 - ARRAYBASE))
      return(-1);
    else
      return(x + ARRAYBASE);
}

int
arrayatoi(c) int c; {			/* Array letter to array index */
    if (c == 64)
      c = 96;
    if (c > 63 && c < 91)
      c += 32;
    if (c < ARRAYBASE || c > 122)
      return(-1);
    return(c - ARRAYBASE);
}

static int				/* Declare an array */
dodcl(cx) int cx; {
    int i, n, v, lo, hi, rc = 0;
    int isdynamic = 0;
    char tmpbuf[64];
    char ** p = NULL;
    char tmp[64];			/* Local temporary string buffer */
    if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
	if (y == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(y);
    }
    ckstrncpy(line,s,LINBUFSIZ);
    s = line;
    x = arraybounds(s,&lo,&hi);		/* Check syntax and get bounds */
    debug(F111,"dodcl arraybounds",s,x);
    if (x < 0) {			/* Error - Maybe it's a variable */
	char * p;			/* whose value is an array name */
	int n;
	p = tmpbuf;
	n = 63;
	p[0] = NUL;
	if (s[0] == CMDQ && s[1] == '&')
	  s++;
	if (zzstring(s,&p,&n) > -1) {
	    s = tmpbuf;
	    x = arraybounds(s,&lo,&hi);
	    debug(F111,"dodcl arraybounds 2",s,x);
	}
	if (x < 0) {
	    printf("?Bad array name - \"%s\"\n",s);
	    return(-9);
	}
    }
    debug(F101,"dodcl hi","",hi);
    debug(F101,"dodcl lo","",lo);
    debug(F101,"dodcl lo+1","",lo+1);

    if (lo == -1 && hi == -1) {		/* Have good array name and bounds */
	isdynamic = 1;
	n = CMDBL / 5;
    } else if (hi > -1) {
	printf("?Segment notation not allowed in array declarations\n");
	return(-9);
    } else if ((lo+1) < 0) {
	debug(F101,"dodcl underflow","",lo+1);
        printf("?Dimension underflow\n");
        return(-9);
    } else
      n = lo;
    x = arrayitoa(x);
    if (cx == XXUNDCL) {
	n = 0;
	v = 0;
	if ((y = cmcfm()) < 0)
	  return(y);
    } else {
	p = (char **)malloc(sizeof(char **)*(n+1));
	if (!p) {
	    printf("?Memory allocation error\n");
	    return(-9);
	}
	v = 0;				/* Highest initialized member */
	p[0] = NULL;			/* Element 0 */
	keepallchars = 1;
	while (n > 0 && v < n) {	/* Parse initializers */
	    p[v+1] = NULL;
	    ckmakxmsg(tmp,
		      64,
		      "Initial value for \\&",
		      ckctoa((char)x),
		      "[",
		      ckitoa(v+1),
		      "]",
		      NULL,NULL,NULL,NULL,NULL,NULL,NULL
		      );
	    if ((rc = cmfld((char *)tmp,"",&s,xxstring)) < 0) { /* Get field */
		if (rc == -3)		/* If answer is empty, we're done */
		  break;
		else			/* Parse error, free temp pointers */
		  goto dclx;
	    }
	    rc = 1;
	    if (v == 0 && !strcmp(s,"=")) /* Skip the = sign. */
	      continue;
	    s = brstrip(s);		/* Strip any braces */
	    makestr(&(p[++v]),s);
	}
	keepallchars = 0;
	if ((y = cmtxt("Carriage return to confirm","",&s,NULL)) < 0)
	  return(y);
	if (isdynamic)
	  n = v;
    }
    if (dclarray((char)x,n) < 0) {	/* Declare the array */
	printf("?Declare failed\n");
	goto dclx;
    }
    for (i = 1; i <= v; i++) {		/* Add any initial values */
	tmp[0] = '&';
	ckmakmsg(&tmp[1],63,ckctoa((char)x),"[",ckitoa(i),"]");
	if (addmac(tmp,p[i]) < 0) {
	    printf("Array initialization error: %s %s\n",tmp,p[i]);
	    rc = -9;
	    goto dclx;
	}
    }
  dclx:
    if (p) {
	for (i = 1; i <= v; i++)
	  if (p[i]) free(p[i]);
	free((char *)p);
    }
    debug(F101,"DCL rc","",rc);
    return(success = rc);
}

static int
rszarray() {
    int i, x, y, n, lo, hi, islink = -1;
    char c, * s, ** ap = NULL;
    if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
	if (x == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(x);
    }
    ckstrncpy(line,s,LINBUFSIZ);	/* Make safe copy of name */
    s = line;
    x = arraybounds(s,&lo,&hi);
    if (x < 0) {			/* Parse the name, get index */
	printf("?Bad array reference - \"%s\"\n", s);
	return(-9);
    }
    if (lo < 0 && hi < 0) {
	y = cmnum("New size","",10,&lo,xxstring);
	if (y < 0) {
	    if (y == -3)
	      printf("?New size required\n");
	    return(y);
	}
    }
    if ((y = cmcfm()) < 0)
      return(y);
    if (a_link[x] > -1) {		/* Link? */
	islink = x;			/* Yes follow it */
	x = a_link[x];			/* and remember */
    }
    if (!a_ptr[x]) {
	printf("?Array not declared - \"%s\"\n", s);
	return(-9);
    }
    if (lo < 0) {
	printf("?New size required\n");
	return(-9);
    }
    if (hi > -1) {
	printf("?Array segments not allowed for this operation\n");
	return(-9);
    }
    c = arrayitoa(x);			/* Get array letter */
    if (c == '@') {			/* Argument vector array off limits */
	printf("?Sorry, \\&@[] is read-only\n");
	return(-9);
    }
    if (lo == 0) {			/* If new size is 0... */
	dclarray(c,0);			/* Undeclare the array */
	return(success = 1);
    }
    n = a_dim[x];			/* Current size */
    ap = (char **) malloc((lo+1) * sizeof(char *)); /* New array */
    y = (n < lo) ? n : lo;
    for (i = 0; i <= y; i++)		/* Copy the part that fits */
      ap[i] = a_ptr[x][i];
    if (n < lo) {			/* If original array smaller */
	for (; i <= lo; i++)		/* initialize extra elements in */
	  ap[i] = NULL;			/* new array to NULL. */
    } else if (n > lo) {		/* If new array smaller */
	for (; i <= lo; i++)		/* deallocate leftover elements */
	  makestr(&(a_ptr[x][i]),NULL);	/* from original array. */
    }
    free((char *)a_ptr[x]);		/* Free original array list */
    a_ptr[x] = ap;			/* Replace with new one */
    a_dim[x] = lo;			/* Record the new dimension */
    if (islink > -1) {			/* Was this a link? */
	a_ptr[islink] = ap;		/* If so point to the resized array */
	a_dim[islink] = lo;
    } else {				/* If not are there links to here? */
	for (i = 0; i < (int) 'z' - ARRAYBASE; i++) { /* Any linked arrays? */
	    if (i != x && a_link[i] == x) {     /* Find and update them */
		a_ptr[i] = ap;
		a_dim[i] = lo;
	    }
	}
    }
    return(success = 1);
}

static int
copyarray() {
    int i, j, x1, lo1, hi1, x2, lo2, hi2, whole = 0;
    char c1, c2, * a1, * a2;
    if ((y = cmfld("Name of source array","",&s,NULL)) < 0)
      return(y);
    ckstrncpy(line,s,LINBUFSIZ);
    a1 = line;
    if ((x1 = arraybounds(a1,&lo1,&hi1)) < 0) {
	printf("?Bad array reference - \"%s\"\n", a1);
	return(-9);
    } else if (!a_ptr[x1]) {
	printf("?Array not declared - \"%s\"\n", a1);
	return(-9);
    }
    c1 = arrayitoa(x1);

    if ((y = cmfld("Name of destination array","",&s,NULL)) < 0)
      return(y);
    ckstrncpy(tmpbuf,s,TMPBUFSIZ);
    a2 = tmpbuf;
    if ((x2 = arraybounds(a2,&lo2,&hi2)) < 0) {
	printf("?Bad array reference - \"%s\"\n", a2);
	return(-9);
    }
    c2 = arrayitoa(x2);

    if ((x = cmcfm()) < 0)
      return(x);

    if (c2 == '@') {			/* Argument vector array off limits */
	printf("?Sorry, \\&@[] is read-only\n");
	return(-9);
    }
    if (lo1 < 0 && lo2 < 0 && hi1 < 0 && hi2 < 0) /* Special case for */
      whole = 1;			          /* whole array... */

    if (lo1 < 0) lo1 = whole ? 0 : 1;	/* Supply lower bound of source */
    if (hi1 < 0) hi1 = a_dim[x1];	/* Supply upper bound of source */
    if (lo2 < 0) lo2 = whole ? 0 : 1;	/* Lower bound of target */
    if (hi2 < 0) hi2 = lo2 + hi1 - lo1;	/* Upper bound of target */
    if (a_ptr[x2]) {			/* Target array is already declared? */
	if (hi2 > a_dim[x2])		/* If upper bound out of range */
	  hi2 = a_dim[x2];		/* shrink to fit */
    } else {				/* Otherwise... */
	x2 = dclarray(c2, hi2);		/* declare the target array */
    }
    for (i = lo1, j = lo2; i <= hi1 && j <= hi2; i++,j++) { /* Copy */
	makestr(&(a_ptr[x2][j]),a_ptr[x1][i]);
    }
    return(success = 1);
}

static int				/* Undeclare an array */
unarray() {
    int x, y, n, rc = 0;
    char c, * s;

    if ((y = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
	if (y == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(y);
    }
    ckstrncpy(line,s,LINBUFSIZ);	/* Make safe copy of name */
    s = line;
    if ((y = cmcfm()) < 0)
      return(y);
    if ((x = arraybounds(s,&y,&n)) < 0) { /* Parse the name, get index */
	printf("?Bad array reference - \"%s\"\n", s);
	return(-9);
    }
    if (y > 0 || n > 0) {
	printf("?Partial arrays can not be destroyed\n");
	return(-9);
    }
    c = arrayitoa(x);			/* Get array letter */
    if (a_ptr[x]) {			/* If array is declared */
	if (c == '@') {			/* Argument vector array off limits */
	    printf("?Sorry, \\&@[] is read-only\n");
	    return(-9);
	}
	rc = dclarray(c,0);		/* Undeclare the array */
    } else				/* It wasn't declared */
      rc = 1;
    if (rc > -1) {			/* Set return code and success */
	success = 1;
	rc = 1;
    } else {
	success = 0;
	printf("?Failed - destroy \"\\&%c[]\"\n", c);
	rc = -9;
    }
    return(rc);
}

static int
clrarray(cx) int cx; {
    int i, x, lo, hi;
    char c, * s, * val = NULL;

    if ((x = cmfld("Array name","",&s,NULL)) < 0) { /* Parse array name */
	if (x == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(x);
    }
    ckstrncpy(line,s,LINBUFSIZ);	/* Make safe copy of name */
    s = line;
    if (cx == ARR_SET) {		/* SET */
	if ((x = cmtxt("Value","",&val,xxstring)) < 0)
	  return(x);
	ckstrncpy(tmpbuf,val,TMPBUFSIZ); /* Value to set */
	val = tmpbuf;
	if (!*val) val = NULL;
    } else if ((x = cmcfm()) < 0)	/* CLEAR */
      return(x);

    if ((x = arraybounds(s,&lo,&hi)) < 0) { /* Parse the name */
	printf("?Bad array reference - \"%s\"\n", s);
	return(-9);
    }
    c = arrayitoa(x);			/* Get array letter */
    if (!a_ptr[x]) {			/* If array is declared */
	printf("?Array %s is not declared\n", s);
	return(-9);
    } else if (c == '@') {		/* Argument vector array off limits */
	printf("?Sorry, \\&@[] is read-only\n");
	return(-9);
    }
    if (lo < 0) lo = 0;
    if (hi < 0) hi = a_dim[x];
    for (i = lo; i <= hi; i++)		/* Clear/Set selected range */
      makestr(&(a_ptr[x][i]),val);

    return(success = 1);
}

extern char **aa_ptr[CMDSTKL][28];
extern int aa_dim[CMDSTKL][28];

static int				/* Create symbolic link to an array */
linkarray() {
    int i = 0, x, y, lo, hi, flag = 0;
    char c, * s, * p;

    if ((x = cmfld("Array name not currently in use","",&s,NULL)) < 0) {
	if (x == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(x);
    }
    ckstrncpy(line,s,LINBUFSIZ);	/* Make safe copy of link name */
    s = line;
    if ((x = cmfld("Name of existing array","",&p,xxstring)) < 0) {
	if (x == -3) {
	    printf("?Array name required\n");
	    return(-9);
	} else return(x);
    }
    ckstrncpy(tmpbuf,p,TMPBUFSIZ);	/* Make safe copy of array name */
    p = tmpbuf;
    if ((x = cmcfm()) < 0)
      return(x);

    if ((x = arraybounds(s,&lo,&hi)) < 0) { /* Parse the link name */
	printf("?Bad array reference - \"%s\"\n", s);
	return(-9);
    }
    if (a_ptr[x]) {			/* Must not already exist */
	c = arrayitoa(x);
	printf("?Array already exists: \\&%c[]\n", c);
	return(-9);
    }
    if (lo > -1 || hi > -1) {
	printf("?Sorry, whole arrays only: %s\n",s);
	return(-9);
    }
    if ((y = arraybounds(p,&lo,&hi)) < 0) { /* Parse the array name */
	printf("?Bad array reference - \"%s\"\n", s);
	return(-9);
    }
    if (lo > -1 || hi > -1) {
	printf("?Sorry, whole arrays only: %s\n",p);
	return(-9);
    }
    if (x == y) {
	for (i = cmdlvl; i >= 0; i--)
	  if (aa_ptr[i][x]) {
	      flag++;
	      break;
	  }
    }
    if (flag) {
	a_ptr[x] = aa_ptr[i][y];	/* Link to saved copy */
	a_dim[x] = aa_dim[i][y];
    } else {				/* Otherwise... */
	c = arrayitoa(y);		/* Check if it's declared */
	if (!a_ptr[y]) {
	    printf("?Array is not declared: \\&%c[]\n", c);
	    return(-9);
	}
	if (a_link[y] > -1) {		/* And if it's a link itself */
	    printf("?Links to links not allowed: \\&%c[]\n", c);
	    return(-9);
	}
	a_ptr[x] = a_ptr[y];		/* All OK, make the link */
	a_dim[x] = a_dim[y];
    }
    a_link[x] = y;
    return(success = 1);
}
#endif /* NOSPL */

#ifndef NOCSETS
static char * dcsetname = NULL;

/* Get Display Character-Set Name */

char *
getdcset() {
    char * s;
    int y;
#ifdef PCFONTS
    extern int tt_font, ntermfont;
    extern struct keytab term_font[];
#endif /* PCFONTS */

    s = "";
#ifdef OS2
    y = os2getcp();			/* Default is current code page */
    switch (y) {
      case 437: s = "cp437"; break;
      case 850: s = "cp850"; break;
      case 852: s = "cp852"; break;
      case 857: s = "cp857"; break;
      case 858: s = "cp858"; break;
      case 862: s = "cp862"; break;
      case 866: s = "cp866"; break;
      case 869: s = "cp869"; break;
      case 1250: s = "cp1250"; break;
      case 1251: s = "cp1251"; break;
      case 1252: s = "cp1252"; break;
      case 1253: s = "cp1253"; break;
      case 1254: s = "cp1254"; break;
      case 1255: s = "cp1255"; break;
      case 1256: s = "cp1256"; break;
      case 1257: s = "cp1257"; break;
      case 1258: s = "cp1258"; break;
    }
#ifdef PCFONTS
/*
   If the user has loaded a font with SET TERMINAL FONT then we want
   to change the default code page to the font that was loaded.
*/
    if (tt_font != TTF_ROM) {
	for (y = 0; y < ntermfont; y++ ) {
	    if (term_font[y].kwval == tt_font) {
		s = term_font[y].kwd;
		break;
	    }
	}
    }
#endif /* PCFONTS */
#else /* OS2 */
#ifdef COMMENT
    /* Hack not needed as of C-Kermit 7.1 */
    if (fcharset == FC_1LATIN) {
	s = "latin1-iso";		/* Hack to avoid reporting "cp1252" */
    } else {				/* Report current file character set */
#endif /* COMMENT */
	for (y = 0; y <= nfilc; y++)
	  if (fcstab[y].kwval == fcharset) {
	      s = fcstab[y].kwd;
	      break;
	  }
#ifdef COMMENT
    }
#endif /* COMMENT */
#endif /* OS2 */
    makestr(&dcsetname,s);		/* Return stable pointer */
    return((char *)dcsetname);
}
#endif /* NOCSETS */

#ifndef NOFRILLS
static int
doclear() {
    if ((x = cmkey(clrtab,nclear,"item to clear",
#ifdef NOSPL
		   "device-buffer"
#else
		   "device-and-input"
#endif /* NOSPL */
		   ,xxstring)) < 0) return(x);
#ifndef NOSPL
#ifdef OS2
    if (x == CLR_CMD || x == CLR_TRM) {
	if ((z = cmkey(clrcmdtab,nclrcmd,"how much screen to clear\n",
		       "all",xxstring)) < 0)
	  return(z);
    }
#endif /* OS2 */
#endif /* NOSPL */
    if ((y = cmcfm()) < 0)
      return(y);

    /* Clear device input buffer if requested */
    y = (x & CLR_DEV) ? ttflui() : 0;

    if (x & CLR_SCR)			/* CLEAR SCREEN */
      y = ck_cls();			/* (= SCREEN CLEAR = CLS) */

    if (x & CLR_KBD) {			/* CLEAR KEYBOARD */
	int n;
	n = conchk();
	y = 0;
	while (n-- > 0 && (y = coninc(0) > -1))
	  ;
	y = (y > -1) ? 0 : -1;
    }

#ifndef NOSPL
    /* Clear INPUT command buffer if requested */
    if (x & CLR_INP) {
	for (z = 0; z < inbufsize; z++)
	  inpbuf[z] = NUL;
	inpbp = inpbuf;
	y = 0;
    }
#ifdef CK_APC
    if (x & CLR_APC) {
	debug(F101,"Executing CLEAR APC","",apcactive);
	apcactive = 0;
	y = 0;
    }
#endif /* CK_APC */
    if (x & CLR_ALR) {
	setalarm(0L);
	y = 0;
    }
#endif /* NOSPL */

#ifdef PATTERNS
    if (x & (CLR_TXT|CLR_BIN)) {
	int i;
	for (i = 0; i < FTPATTERNS; i++) {
	    if (x & CLR_TXT)
	      makestr(&txtpatterns[i],NULL);
	    if (x & CLR_BIN)
	      makestr(&binpatterns[i],NULL);
	}
	y = 0;
    }
#endif /* PATTERNS */

#ifndef NODIAL
    if (x & CLR_DIA) {
	dialsta = DIA_UNK;
	y = 0;
    }
#endif /* NODIAL */

#ifndef NOMSEND
    if (x & CLR_SFL) {			/* CLEAR SEND-LIST */
	if (filehead) {
	    struct filelist * flp, * next;
	    flp = filehead;
	    while (flp) {
		if (flp->fl_name)
		  free(flp->fl_name);
		if (flp->fl_alias)
		  free(flp->fl_alias);
		next = flp->fl_next;
		free((char *)flp);
		flp = next;
	    }
	}
	filesinlist = 0;
	filehead = NULL;
	filetail = NULL;
	addlist = 0;
	y = 0;
    }
#endif /* NOMSEND */

#ifdef OS2
#ifndef NOLOCAL
    switch (x) {
      case CLR_SCL:
	clearscrollback(VTERM);
	break;
      case CLR_CMD:
	switch ( z ) {
	  case CLR_C_ALL:
	    clear();
	    break;
	  case CLR_C_BOS:
	    clrboscr_escape(VCMD,SP);
	    break;
	  case CLR_C_BOL:
	    clrbol_escape(VCMD,SP);
	    break;
	  case CLR_C_EOL:
	    clrtoeoln(VCMD,SP);
	    break;
	  case CLR_C_EOS:
	    clreoscr_escape(VCMD,SP);
	    break;
	  case CLR_C_LIN:
	    clrline_escape(VCMD,SP);
	    break;
	  case CLR_C_SCR:
	    clearscrollback(VCMD);
	    break;
	default:
	    printf("Not implemented yet, sorry.\n");
	    break;
	}
	break;

#ifndef NOTERM
      case CLR_TRM:
	 switch ( z ) {
	  case CLR_C_ALL:
	     if (VscrnGetBufferSize(VTERM) > 0 ) {
		 VscrnScroll(VTERM, UPWARD, 0,
			     VscrnGetHeight(VTERM)-(tt_status[VTERM]?2:1),
			     VscrnGetHeight(VTERM) -
			     (tt_status[VTERM]?1:0), TRUE, SP
			     );
		 cleartermscreen(VTERM);
	     }
	     break;
	  case CLR_C_BOS:
	    clrboscr_escape(VTERM,SP);
	    break;
	  case CLR_C_BOL:
	    clrbol_escape(VTERM,SP);
	    break;
	  case CLR_C_EOL:
	    clrtoeoln(VTERM,SP);
	    break;
	  case CLR_C_EOS:
	    clreoscr_escape(VTERM,SP);
	    break;
	  case CLR_C_LIN:
	    clrline_escape(VTERM,SP);
	    break;
	 case CLR_C_SCR:
	     clearscrollback(VTERM);
	     break;
	 default:
	     printf("Not implemented yet, sorry.\n");
	     break;
	}
	break;
#endif /* NOTERM */
    }
    y = 0;
#endif /* NOLOCAL */
#endif /* OS2 */
    return(success = (y == 0));
}
#endif /* NOFRILLS */

#ifndef NOSPL
static int
doeval(cx) int cx; {
    char *p;
    char vnambuf[VNAML], * vnp = NULL;	/* These must be on the stack */
    if (!oldeval) {
	if ((y = cmfld("Variable name","",&s,
		       ((cx == XX_EVAL) ? xxstring : NULL))) < 0) {
	    if (y == -3) {
		printf("?Variable name required\n");
		return(-9);
	    } else return(y);
	}
	ckstrncpy(vnambuf,s,VNAML);	/* Make a copy. */
	vnp = vnambuf;
	if (vnambuf[0] == CMDQ &&
	    (vnambuf[1] == '%' || vnambuf[1] == '&'))
	  vnp++;
	y = 0;
	if (*vnp == '%' || *vnp == '&') {
	    if ((y = parsevar(vnp,&x,&z)) < 0)
	      return(y);
	}
    }
    if ((x = cmtxt("Integer arithmetic expression","",&s,xxstring)) < 0)
      return(x);
    p = evala(s);
    if (!p) p = "";
    if (oldeval && *p)
      printf("%s\n", p);
    ckstrncpy(evalbuf,p,32);
    if (!oldeval)
      return(success = addmac(vnambuf,p));
    else
      return(success = *p ? 1 : 0);
}
#endif /* NOSPL */

#ifdef TNCODE
static int
dotelopt() {
    if ((x = cmkey(telcmd, ntelcmd, "TELNET command", "", xxstring)) < 0 )
      return(x);
    switch (x) {
      case WILL:
      case WONT:
      case DO:
      case DONT:
	if ((y = cmkey(tnopts,ntnopts,"TELNET option","",xxstring)) < 0)
	  return(y);
	if ((z = cmcfm()) < 0) return(z);

	switch (x) {
	  case WILL:
	    if (TELOPT_UNANSWERED_WILL(y))
	      return(success = 0);
	    break;
	  case WONT:
	    if (TELOPT_UNANSWERED_WONT(y))
	      return(success = 0);
	    break;
	  case DO:
	    if (TELOPT_UNANSWERED_DO(y))
	      return(success = 0);
	    break;
	  case DONT:
	    if (TELOPT_UNANSWERED_DONT(y))
	      return(success = 0);
	    break;
	}
	if (local) {
	    success = ((tn_sopt(x,y) > -1) ? 1 : 0);
	} else {
	    printf("ff%02x%02x\n",x,y);
	    success = 1;
	}
	if (success) {
	    switch (x) {
	      case WILL:
		TELOPT_UNANSWERED_WILL(y) = 1;
		break;
	      case WONT:
		if ( TELOPT_ME(y) )
		  TELOPT_UNANSWERED_WONT(y) = 1;
		break;
	      case DO:
		TELOPT_UNANSWERED_DO(y) = 1;
		break;
	      case DONT:
		if ( TELOPT_ME(y) )
		  TELOPT_UNANSWERED_DONT(y) = 1;
		break;
	    }
	    if (tn_wait("XXTELOP") < 0) {
		tn_push();
		success = 0;
	    }
	}
	return(success);
      case SB:
	if ((y=cmkey(tnsbopts,ntnsbopts,"TELNET option","",xxstring)) < 0)
	  return(y);
	switch (y) {
	  case TELOPT_NAWS:
	    /* Some compilers require switch() to have at least 1 case */
#ifdef CK_NAWS
	    TELOPT_SB(TELOPT_NAWS).naws.x = 0;
	    TELOPT_SB(TELOPT_NAWS).naws.y = 0;
	    if (local)
	      return(success = ((tn_snaws() > -1) ? 1 : 0));
	    else
	      return(success = 0);
#else
	    return(success = 0);
#endif /* CK_NAWS */
	}
        return(success = 0);

#ifdef CK_KERBEROS
#ifdef KRB5
      case TN_FWD:
        success = (kerberos5_forward() == AUTH_SUCCESS);
        return(success);
#endif /* KRB5 */
#endif /* CK_KERBEROS */

      default:
	if ((z = cmcfm()) < 0) return(z);
#ifndef NOLOCAL
	if (local) {
	    CHAR temp[3];
	    if (network && IS_TELNET()) { /* TELNET */
		temp[0] = (CHAR) IAC;
		temp[1] = x;
		temp[2] = NUL;
		success = (ttol((CHAR *)temp,2) > -1 ? 1 : 0);
		if (tn_deb || debses || deblog) {
		    /* TN_MSG_LEN is in ckctel.h */
		    ckmakmsg(tn_msg,256,"TELNET SENT ",TELCMD(x),NULL,NULL);
		    debug(F101,tn_msg,"",x);
		    if (debses || tn_deb) tn_debug(tn_msg);
		}
		return(success);
	    }
            return(success = 0);
	} else {
#endif /* NOLOCAL */
	    printf("ff%02x\n",x);
	    return(success = 1);
#ifndef NOLOCAL
	}
#endif /* NOLOCAL */
    }
}
#endif /* TNCODE */


#ifndef NOPUSH
#ifndef NOFRILLS
static int
doedit() {
#ifdef OS2
    char * p = NULL;
#endif /* OS2 */
    if (!editor[0]) {
	s = getenv("EDITOR");
	if (s) ckstrncpy(editor,s,CKMAXPATH);
	editor[CKMAXPATH] = NUL;
	if (!editor[0]) {
	    printf("?Editor not defined - use SET EDITOR to define\n");
	    return(-9);
	}
    }
    ckstrncpy(tmpbuf,editfile,TMPBUFSIZ);
/*
  cmiofi() lets us parse the name of an existing file, or the name of
  a nonexistent file to be created.
*/
    x = cmiofi("File to edit", (char *)tmpbuf, &s, &y, xxstring);
    if (x < 0) {
	if (x == -9) {
	    if (zchko(s) < 0) {
		printf("Can't create \"%s\"\n",s);
		return(x);
	    }
	} else if (x != -3)
	  return(x);
    }
    if (x == -3)
      tmpbuf[0] = NUL;
    else {
	ckstrncpy(tmpbuf,s,TMPBUFSIZ);
	if (iswild((char *)tmpbuf)) {
	    printf("?A single file please\n");
	    return(-9);
	}
    }
    if ((z = cmcfm()) < 0) return(z);
    if (nopush) {
	printf("?Sorry, editing not allowed\n");
	return(success = 0);
    }
    if (tmpbuf[0]) {
    /* Get full path in case we change directories between EDIT commands */
	zfnqfp(tmpbuf, CKMAXPATH, editfile);
	editfile[CKMAXPATH] = NUL;
#ifdef OS2
	p = editfile;			/* Flip the stupid slashes */
	while (*p) {
	    if (*p == '/') *p = '\\';
	    p++;
	}
#endif /* OS2 */
    } else
      editfile[0] = NUL;
    x = 0;
    if (editopts[0]) {
#ifdef OS2
	x = ckindex("%1",(char *)editopts,0,0,1);
	if (x > 0)
	  editopts[x] = 's';
	else
#endif /* OS2 */
	  x = ckindex("%s",(char *)editopts,0,0,1);
    }
    if (((int)strlen(editopts) + (int)strlen(editfile) + 1) < TMPBUFSIZ) {
	if (x)
	  sprintf(tmpbuf,editopts,editfile);
	else
	  sprintf(tmpbuf,"%s %s",editopts,editfile);
    }
    s = line;
    ckmakmsg(s,LINBUFSIZ,editor," ",tmpbuf,NULL);
#ifdef OS2
    p = s + strlen(editor);		/* And again with the slashes */
    while (p != s) {
	if (*p == '/') *p = '\\';
	p--;
    }
#endif /* OS2 */
    conres();
    x = zshcmd(s);
    concb((char)escape);
    return(x);
}
#endif /* NOFRILLS */
#endif /* NOPUSH */

#ifdef BROWSER
static int
dobrowse() {
#ifdef OS2
    char * p = NULL;
#endif /* OS2 */
    if (nopush) {
	printf("?Sorry, browsing not allowed\n");
	return(success = 0);
    }
#ifndef NT
    /* Windows lets the Shell Execute the URL if no Browser is defined */
    if (!browser[0]) {
	s = getenv("BROWSER");
	if (s) ckstrncpy(browser,s,CKMAXPATH);
	browser[CKMAXPATH] = NUL;
	if (!browser[0]) {
	    printf("?Browser not defined - use SET BROWSER to define\n");
	    return(-9);
	}
    }
#endif /* NT */
    ckstrncpy(tmpbuf,browsurl,TMPBUFSIZ);
    if ((x = cmtxt("URL",(char *)browsurl,&s,xxstring)) < 0)
      return(x);
    ckstrncpy(browsurl,s,4096);
    x = 0;
    if (browsopts[0]) {
#ifdef OS2
	x = ckindex("%1",(char *)browsopts,0,0,1);
	if (x > 0)
	  browsopts[x] = 's';
	else
#endif /* OS2 */
	  x = ckindex("%s",(char *)browsopts,0,0,1);
    }
    if (((int)strlen(browsopts) + (int)strlen(browsurl) + 1) < TMPBUFSIZ) {
	if (x)
	  sprintf(tmpbuf,browsopts,browsurl);
	else
	  sprintf(tmpbuf,"%s %s",browsopts,browsurl);
    }
#ifdef NT
    if (!browser[0])
      return(success = Win32ShellExecute(browsurl));
#endif /* NT */
    s = line;
    ckmakmsg(s,LINBUFSIZ,browser," ",tmpbuf,NULL);
#ifdef OS2
    p = line + strlen(browser);		/* Flip slashes */
    while (p != line) {
	if (*p == '/') *p = '\\';
	p--;
    }
#endif /* OS2 */
    conres();
    x = zshcmd(s);
    concb((char)escape);
    return(x);
}
#endif /* BROWSER */

#ifdef CK_RECALL
static int
doredo() {			/* Find a previous cmd and redo it */
    extern int on_recall, in_recall;
    int x;
    char * p;

    if ((x = cmtxt(
"pattern, or first few characters of a previous command",
		   "*",&s,xxstring)) < 0)
      return(x);
    ckstrncpy(line,s,LINBUFSIZ);
    x = strlen(s);
    s = line;
    if (*s == '{') {			/* Braces disable adding * to end */
	if (s[x-1] == '}') {
	    s[x-1] = NUL;
	    s++;
	    x--;
	}
    } else {				/* No braces, add * to end. */
	s[x] = '*';
	s[x+1] = NUL;
    }

    while (x > 0 && s[x] == '*' && s[x-1] == '*') s[x--] = NUL;

    if (!on_recall || !in_recall) {
	printf("?Sorry, command recall can't be used now.\n");
	return(-9);
    }
    if ((p = cmgetcmd(s))) {		/* Look for it history buffer */
	ckmakmsg(cmdbuf,CMDBL,p,"\r",NULL,NULL); /* Copy to command buffer */
	if (!quiet)			/* Echo it */
	  printf("%s\n",cmdbuf);
	cmaddnext();			/* Force re-add to history buffer */
	return(cmflgs = -1);		/* Force reparse */
    } else {
	printf("?Sorry - \"%s\" not found\n", s);
	return(-9);
    }
}
#endif /* CK_RECALL */

#ifndef NOXFER
#ifndef NOCSETS
static int
doassoc()  {				/* ASSOCIATE */
    extern struct keytab tcstab[];
    extern int ntcs;
    if ((x = cmkey(assoctab, nassoc, "", "", xxstring)) < 0 )
      return(x);

    switch (x) {			/* Associate what? */

      case ASSOC_TC:			/* Transfer character-set... */
	if ((x = cmkey(tcstab, ntcs,
		       "transfer character-set name","",xxstring)) < 0)
	  return(x);
	if ((y = cmkey(fcstab, nfilc,
		       "with file character-set","", xxstring)) < 0)
	  if (y != -3)
	    return(y);
	if ((z = cmcfm()) < 0)
	  return(z);
	axcset[x] = y;
	return(success = 1);

      case ASSOC_FC:			/* File character-set... */
	if ((x = cmkey(fcstab, nfilc,
		       "file character-set name","",xxstring)) < 0)
	  return(x);
	if ((y = cmkey(tcstab, ntcs,
		       "with transfer character-set","", xxstring)) < 0)
	  if (y != -3)
	    return(y);
	if ((z = cmcfm()) < 0)
	  return(z);
	afcset[x] = y;
	return(success = 1);

      default:
	return(-2);
    }
}
#endif /* NOCSETS */
#endif /* NOXFER */

#ifndef NOHELP
static int
domanual() {
#ifdef OS2
    if ((x = cmcfm()) < 0)
      return(x);
    if (nopush) {
	printf("?Sorry, access to system commands is disabled.\n");
	return(-9);
    }
    y = mxlook(mactab,"manual",nmac);
    if (y > -1) {
	z = maclvl;			/* Save the current maclvl */
	dodo(y,NULL,cmdstk[cmdlvl].ccflgs); /* Run the macro */
	while (maclvl > z) {
	    debug(F101,"XXMAN loop maclvl 1","",maclvl);
	    sstate = (CHAR) parser(1);
	    debug(F101,"XXMAN loop maclvl 2","",maclvl);
	    if (sstate) proto();
	}
	debug(F101,"XXMAN loop exit maclvl","",maclvl);
	return(success);
    }
    return(success = 0);
#else
    if ((x = cmtxt(
#ifdef UNIX
		   "Carriage return to confirm the command, or manual topic",
#else
		   "Carriage return to confirm the command, or help topic",
#endif /* UNIX */
		   "kermit",
		   &s,
		   xxstring
		   )
	 ) < 0)
      return(x);
#endif /* OS2 */

#ifdef UNIX
    ckmakmsg(tmpbuf,TMPBUFSIZ,"man ",s,NULL,NULL);
#else
    ckmakmsg(tmpbuf,TMPBUFSIZ,"help ",s,NULL,NULL);
#endif /* UNIX */
    debug(F110,"MANUAL",tmpbuf,0);
    if (nopush) {
	printf("?Sorry, access to system commands is disabled.\n");
	return(-9);
    } else {
	conres();			/* Restore the console */
	success = zshcmd(tmpbuf);
	concb((char)escape);		/* Restore CBREAK mode */
	return(success);
    }
}
#endif /* NOHELP */

#ifndef NOHTTP
#ifdef TCPSOCKET
static struct keytab sslswtab[] = {
    { "/ssl", 1, 0 },
    { "/tls", 1, 0 }
};

#ifndef NOURL
struct urldata http_url = {NULL,NULL,NULL,NULL,NULL,NULL,NULL};
#endif /* NOURL */

static int
dohttp() {				/* HTTP */
    struct FDB sw, kw, fi;
    int n, getval, allinone = 0;
    char c, * p;
    char rdns[128];

    char * http_agent = NULL;		/* Parse results */
    char * http_hdr   = NULL;
    char * http_user  = NULL;
    char * http_pass  = NULL;
    char * http_mime  = NULL;
    char * http_lfile = NULL;
    char * http_rfile = NULL;
    char * http_dfile = NULL;
    char   http_array = NUL;
    int    http_action = -1;

    char * http_host = NULL;
    char * http_srv  = NULL;
    int    http_ssl  = 0;

    static char * http_d_agent = NULL;
    static char * http_d_user = NULL;
    static char * http_d_pass = NULL;

    static int    http_d_type = 0;
    int           http_type = http_d_type;

#ifdef OS2
    p = "Kermit 95";			/* Default user agent */
#else
    p = "C-Kermit";
#endif /* OS2 */
    makestr(&http_agent,p);
    makestr(&http_mime,"text/HTML");	/* MIME type default */
    rdns[0] = '\0';

    cmfdbi(&sw,				/* 1st FDB - general switches */
       _CMKEY,				/* fcode */
       "OPEN, CLOSE, GET, HEAD, PUT, INDEX, or POST,\n or switch", /* hlpmsg */
       "",				/* default */
       "",				/* addtl string data */
       nhttpswtab,			/* addtl numeric data 1: tbl size */
       4,				/* addtl numeric data 2: 4 = cmswi */
       xxstring,			/* Processing function */
       httpswtab,			/* Keyword table */
       &kw				/* Pointer to next FDB */
       );
    cmfdbi(&kw,				/* 2nd FDB - commands */
       _CMKEY,				/* fcode */
       "Command",			/* hlpmsg */
       "",				/* default */
       "",				/* addtl string data */
       nhttptab,			/* addtl numeric data 1: tbl size */
       0,				/* addtl numeric data 2: 0 = keyword */
       xxstring,			/* Processing function */
       httptab,				/* Keyword table */
       NULL				/* Pointer to next FDB */
       );

    while (1) {
	x = cmfdb(&sw);			/* Parse something */
	if (x < 0)			/* Error */
	  goto xhttp;
	n = cmresult.nresult;
	if (cmresult.fdbaddr == &kw)	/* Command - exit this loop */
	  break;
	c = cmgbrk();			/* Switch... */
	getval = (c == ':' || c == '=');
	x = -9;
	if (getval && !(cmgkwflgs() & CM_ARG)) {
	    printf("?This switch does not take an argument\n");
	    goto xhttp;
	}
	switch (cmresult.nresult) {	/* Handle each switch */
          case HT_SW_TP:                /* /TOSCREEN */
            http_type = 1;
            break;
	  case HT_SW_AG:		/* /AGENT */
	    if (getval) {
		if ((x = cmfld("User agent",p,&s,xxstring)) < 0)
		  goto xhttp;
	    } else {
		s = p;
	    }
	    makestr(&http_agent,s);
	    break;
	  case HT_SW_HD:		/* /HEADER */
	    s = NULL;
	    if (getval) {
		if ((x = cmfld("Header line","",&s,xxstring)) < 0) {
		    if (x == -3)
		      s = NULL;
		    else
		      goto xhttp;
		}
	    }
	    makestr(&http_hdr,s);
	    break;
	  case HT_SW_US:		/* /USER */
	    s = NULL;
	    if (getval) {
		if ((x = cmfld("User ID","",&s,xxstring)) < 0) {
                  if (x == -3)
                    s = "";
                  else
		    goto xhttp;
                }
	    }
	    makestr(&http_user,s);
	    break;
	  case HT_SW_PW:		/* /PASSWORD */
	    debok = 0;
	    s = NULL;
	    if (getval) {
		if ((x = cmfld("Password","",&s,xxstring)) < 0)
		  goto xhttp;
	    }
	    makestr(&http_pass,s);
	    break;
#ifndef NOSPL
	  case HT_SW_AR: {		/* /ARRAY: */
	      char * s2, array = NUL;
	      if (!getval) {
		  printf("?This switch requires an argument\n");
		  x = -9;
		  goto xhttp;
	      }
	      if ((x = cmfld("Array name (a single letter will do)",
			     "",
			     &s,
			     NULL
			     )) < 0) {
		  if (x == -3) {
		      printf("?Array name required\n");
		      x = -9;
		      goto xhttp;
		  } else
		    goto xhttp;
	      }
	      if (!*s) {
		  printf("?Array name required\n");
		  x = -9;
		  goto xhttp;
	      }
	      s2 = s;
	      if (*s == CMDQ) s++;
	      if (*s == '&') s++;
	      if (!isalpha(*s)) {
		  printf("?Bad array name - \"%s\"\n",s2);
		  x = -9;
		  goto xhttp;
	      }
	      array = *s++;
	      if (isupper(array))
		array = tolower(array);
	      if (*s && (*s != '[' || *(s+1) != ']')) {
		  printf("?Bad array name - \"%s\"\n",s2);
		  http_array = NUL;
		  x = -9;
		  goto xhttp;
	      }
	      http_array = array;
	      break;
	  }
#endif /* NOSPL */
	  default:
	    x = -2;
	    goto xhttp;
	}
    }
    http_action = n;			/* Save the action */
    if (http_action == HTTP_PUT || http_action == HTTP_POS) {
	cmfdbi(&sw,			/* 1st FDB - switch */
	       _CMKEY,			/* fcode */
	       "Local filename\n Or switch", /* help */
	       "",			/* default */
	       "",			/* addtl string data */
	       nhttpptab,		/* keyword table size */
	       4,			/* addtl numeric data 2: 4 = cmswi */
	       xxstring,		/* Processing function */
	       httpptab,		/* Keyword table */
	       &fi			/* Pointer to next FDB */
	       );
	cmfdbi(&fi,			/* 2nd FDB - filename */
	       _CMIFI,			/* fcode */
	       "Local filename",	/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );
	while (1) {
	    x = cmfdb(&sw);
	    if (x < 0)
	      goto xhttp;		/* Free any malloc'd temp strings */
	    n = cmresult.nresult;
	    if (cmresult.fcode != _CMKEY)
	      break;
	    c = cmgbrk();		/* Switch... */
	    getval = (c == ':' || c == '=');
	    if (getval && !(cmgkwflgs() & CM_ARG)) {
		printf("?This switch does not take an argument\n");
		x = -9;
		goto xhttp;
	    }
	    switch (n) {
	      case HT_PP_MT:
		s = "text/HTML";
		if (getval) {
		    if ((x = cmfld("MIME type",
				   "text/HTML",&s,xxstring)) < 0)
		      goto xhttp;
		}
		makestr(&http_mime,s);
		break;
	      default:
		x = -2;
		goto xhttp;
	    }
	}
	makestr(&http_lfile,cmresult.sresult);
	n = ckindex("/",http_lfile,-1,1,0);
	if (n)
	  p = &http_lfile[n];
	else
	  p = http_lfile;
	if ((x = cmfld("URL or remote filename",p,&s,xxstring)) < 0) {
          if (x == -3) {
            printf("?%s what?\n",(http_action == HTTP_PUT) ? "Put" : "Post");
            x = -9;
          }
          goto xhttp;
        }
	if (!*s) s = NULL;
	makestr(&http_rfile,s);

	if ((x = cmtxt("Response filename","",&s,xxstring)) < 0) {
          if (x != -3)
            goto xhttp;
        }
        if (*s)
          makestr(&http_dfile,s);
    }
    switch (http_action) {
      case HTTP_DEL:			/* DELETE */
	if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) {
          if (x == -3) {
            printf("?Delete what?\n");
            x = -9;
          }
          goto xhttp;
        }
	makestr(&http_rfile,s);
	break;
      case HTTP_CON:			/* CONNECT */
        if ((x = cmfld("Remote host[:port]","",&s,xxstring)) < 0) {
          if (x == -3) {
            printf("?Remote host[:port] is required\n");
            x = -9;
          }
          goto xhttp;
        }
	makestr(&http_rfile,s);
	break;
      case HTTP_HED: {			/* HEAD */
	  char buf[CKMAXPATH+1];
	  if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) {
	      if (x == -3) {
		  printf("?Head of what?\n");
		  x = -9;
	      }
	      goto xhttp;
	  }
	  makestr(&http_rfile,s);

	  if (http_array || http_type) { /* Default result filename */
	      p = "";			 /* None if /ARRAY or /TOSCREEN */
	  } else {
	      n = ckindex("/",http_rfile,-1,1,0); /* Otherwise strip path */
	      if (n)		                  /* and add ".head" */
		p = &http_rfile[n];
	      else
		p = http_rfile;
	      ckmakmsg(buf,CKMAXPATH,p,".head",NULL,NULL);
	      p = buf;
	  }
	  if ((x = cmofi("Local filename",p,&s,xxstring)) < 0) {
	      if (x != -3)
		goto xhttp;
	  }
	  makestr(&http_lfile,s);
	  break;
      }
      case HTTP_GET:			/* GET */
      case HTTP_IDX: {			/* INDEX */
	  char * lfile = "";
	  if ((x = cmfld("URL or remote source file","",&s,xxstring)) < 0) {
	      if (x == -3) {
		  printf("?Get what?\n");
		  x = -9;
	      }
	      goto xhttp;
	  }
	  makestr(&http_rfile,s);
	  if (http_action == HTTP_GET && !http_type)
	    zstrip(http_rfile,&lfile);
	  if ((x = cmofi("Local filename",lfile,&s,xxstring)) < 0)
	    if (x != -3)
	      goto xhttp;
	  makestr(&http_lfile,s);
	  break;
      }
      case HTTP_OPN: {
	  int sslswitch = 0;
#ifdef CK_SSL
	  struct FDB sw, fl;
	  cmfdbi(&sw,
		 _CMKEY,		/* fcode */
		 "IP host name or address, or switch", /* hlpmsg */
		 "",			/* default */
		 "",			/* addtl string data */
		 2,			/* addtl numeric data 1: tbl size */
		 4,			/* addtl numeric data 2: 4 = cmswi */
		 xxstring,		/* Processing function */
		 sslswtab,		/* Keyword table */
		 &fl			/* Pointer to next FDB */
		 );
	  cmfdbi(&fl,			/* 2nd FDB - host */
		 _CMFLD,		/* fcode */
		 "",			/* hlpmsg */
		 "",			/* default */
		 "",			/* addtl string data */
		 0,			/* addtl numeric data 1 */
		 0,			/* addtl numeric data 2 */
		 xxstring,
		 NULL,
		 NULL
		 );
	  x = cmfdb(&sw);		/* Parse switch or host */
	  if (x < 0)			/* Error */
	    goto xhttp;
	  if (cmresult.fcode == _CMFLD) { /* Host */
	      s = cmresult.sresult;	  /* Set up expected pointer */
	      goto havehost;              /* Go parse rest of command */
	  }
	  sslswitch = 1;		/* /SSL or /TLS switch - set flag */
#endif /* CK_SSL */

	  /* Parse host */

	  if ((x = cmfld("URL, hostname, or ip-address","",&s,xxstring)) < 0) {
	      if (x == -3) {
		  printf("?Open what?\n");
		  x = -9;
	      }
	      goto xhttp;
	  }

	havehost:			/* Come here with s -> host */
#ifdef CK_URL
	  x = urlparse(s,&http_url);	/* Was a URL given? */
	  if (x < 1) {			/* Not a URL */
#endif /* CK_URL */
	      makestr(&http_host,s);
	      if ((x =
		   cmfld("Service name or port number",
			 sslswitch ? "https" : "http",&s,xxstring)) < 0)
		goto xhttp;
	      else
		makestr(&http_srv,s);
#ifdef CK_URL
	  } else if (ckstrcmp(http_url.svc,"http",-1,0) && /* Non-HTTP URL */
		     ckstrcmp(http_url.svc,"https",-1,0)) {
	      printf("?Non-HTTP URL\n");
	      x = -9;
	      goto xhttp;
	  } else {			/* Have HTTP URL */
	      makestr(&http_srv, http_url.svc);
	      makestr(&http_user,http_url.usr);
	      makestr(&http_pass,http_url.psw);
	      makestr(&http_host,http_url.hos);
	      if (http_url.por)
		makestr(&http_srv,http_url.por);
	      makestr(&http_rfile,http_url.pth);
	  }
	  if (http_rfile) {		/* Open, GET, and Close */
	      printf("?Directory/file path not allowed in HTTP OPEN URL\n");
	      x = -9;
	      goto xhttp;
	  }
	  if (!ckstrcmp("https",http_srv,-1,0) || sslswitch ||
	      !ckstrcmp("443",http_srv,-1,0))
	    http_ssl = 1;
#endif /* CK_URL */
	  break;
      }
      case HTTP_CLS:
        break;
    }
    if ((x = cmcfm()) < 0)
      goto xhttp;

    if (http_action == HTTP_OPN) {
        x = (http_open(http_host,http_srv,http_ssl,rdns,128,http_agent) == 0);
        if (x) {
            if (!quiet) {
              if (rdns[0])
                printf("Connected to %s [%s]\r\n",http_host,rdns);
              else
                printf("Connected to %s\r\n",http_host);
            }
            if (http_agent) {
                if (http_d_agent)
		  free(http_d_agent);
                http_d_agent = http_agent;
                http_agent = NULL;
            }
            if (http_user) {
                if (http_d_user)
		  free(http_d_user);
                http_d_user = http_user;
                http_user = NULL;
            }
            if (http_pass) {
                if (http_d_pass) {
                    memset(http_d_pass,0,strlen(http_d_pass));
                    free(http_d_pass);
                }
                http_d_pass = http_pass;
                http_pass = NULL;
            }
            http_d_type = http_type;
        } else {
            if (!quiet)
	      printf("?HTTP Connection failed.\r\n");
        }
    } else if (http_action == HTTP_CLS) {
        if (http_d_agent) {
            free(http_d_agent);
            http_d_agent = NULL;
        }
        if (http_d_user) {
            free(http_d_user);
            http_d_user = NULL;
        }
        if (http_d_pass) {
            memset(http_d_pass,0,strlen(http_d_pass));
            free(http_d_pass);
            http_d_pass = NULL;
        }
        http_d_type = 0;
        x = (http_close() == 0);
    }
    if ((http_action != HTTP_CLS) &&
	(http_action != HTTP_CON) && http_rfile) { /* Remote file is URL? */

	/* All-in-one actions when a URL is given... */

#ifdef CK_URL
	if (urlparse(http_rfile,&http_url) > 0) { /* Have URL? */
	    if (ckstrcmp(http_url.svc,"http",-1,0) && /* It's an HTTP URL? */
		ckstrcmp(http_url.svc,"https",-1,0)) {
		printf("?Non-HTTP URL\n");
		x = -9;
		goto xhttp;
	    } else {			/* Yes, collect the pieces */
		makestr(&http_srv, http_url.svc);
		makestr(&http_user,http_url.usr);
		makestr(&http_pass,http_url.psw);
		makestr(&http_host,http_url.hos);
		if (http_url.por)
		  makestr(&http_srv,http_url.por);
		makestr(&http_rfile,http_url.pth);
	    }
	    if (!http_rfile) {		/* Still have a path? */
                makestr(&http_rfile,"/");
	    }
	    if (!ckstrcmp("https",http_srv,-1,0) || /* Check for SSL/TLS */
		!ckstrcmp("443",http_srv,-1,0))
	      http_ssl = 1;
	    if (http_isconnected())	/* Close any open HTTP connection */
	      http_close();
	    if (http_pass == NULL && http_d_pass != NULL)
	      makestr(&http_pass,http_d_pass);
	    x = (http_open(http_host,
			   http_srv,http_ssl,rdns,128,http_d_agent) == 0);
	    if (x < 0) {
		x = 0;
		goto xhttp;
	    }
	    allinone = 1;
	}
#endif /* CK_URL */
        if (http_pass == NULL && http_d_pass != NULL)
	  makestr(&http_pass,http_d_pass);

	if (http_action == HTTP_OPN && allinone) {
	    http_action = HTTP_GET;
	}
        x = xdohttp(http_action,
                    http_lfile,
		    http_rfile,
                    http_dfile,
		    http_agent ? http_agent : http_d_agent,
		    http_hdr,
		    http_user  ? http_user  : http_d_user,
		    http_pass  ? http_pass  : http_d_pass,
		    http_mime,
		    http_array,
		    http_type
		    );
	if (allinone)
	  x = (http_close() == 0);
    }

  xhttp:
    if (http_agent) free(http_agent);
    if (http_hdr)   free(http_hdr);
    if (http_user)  free(http_user);
    if (http_pass) {
        memset(http_pass,0,strlen(http_pass));
        free(http_pass);
    }
    if (http_mime)  free(http_mime);
    if (http_lfile) free(http_lfile);
    if (http_rfile) free(http_rfile);
    if (http_dfile) free(http_dfile);
    if (http_host)  free(http_host);
    if (http_srv)   free(http_srv);

    if (x > -1)
      success = x;
    return(x);
}
#endif /* TCPSOCKET */
#endif /* NOHTTP */


#ifndef NOSPL
static int
dotrace() {
    int on = 1;
    struct FDB sw, kw;
    cmfdbi(&sw,				/* 1st FDB - switch */
	   _CMKEY,			/* fcode */
	   "Trace object;\n Or switch", /* help */
	   "",				/* default */
	   "",				/* addtl string data */
	   2,				/* keyword table size */
	   4,				/* addtl numeric data 2: 4 = cmswi */
	   xxstring,			/* Processing function */
	   onoffsw,			/* Keyword table */
	   &kw				/* Pointer to next FDB */
	   );
    cmfdbi(&kw,				/* 2nd FDB - Trace object */
	   _CMKEY,			/* fcode */
	   "Trace object",		/* help */
	   "all",			/* default */
	   "",				/* addtl string data */
	   ntracetab,			/* keyword table size */
	   0,				/* addtl numeric data 2: 0 = keyword */
	   xxstring,			/* Processing function */
	   tracetab,			/* Keyword table */
	   NULL				/* Pointer to next FDB */
	   );
    if ((x = cmfdb(&sw)) < 0)
      return(x);
    if (cmresult.fdbaddr == &sw) {
	on = cmresult.nresult;
	if ((x = cmkey(tracetab, ntracetab,"","all",xxstring)) < 0)
	  return(x);
    } else {
	x = cmresult.nresult;
    }
    if ((y = cmcfm()) < 0)
      return(y);

    switch (x) {
      case TRA_ASG:
	tra_asg = on;
	break;
      case TRA_CMD:
	tra_cmd = on;
	break;
      case TRA_ALL:
	tra_asg = on;
	tra_cmd = on;
	break;
      default:
	return(-2);
    }
    printf("TRACE %s\n", on ? "ON" : "OFF");
    return(success = 1);
}
#endif /* NOSPL */


static int
doprompt() {
    extern int xcmdsrc;
    if ((x = cmtxt("Optional message","",&s,xxstring)) < 0)
      return(x);
#ifdef NOSPL
    printf("?Sorry, PROMPT requires script programming language\n");
    return(-9);
#else
    debug(F101,"Prompt cmdlvl","",cmdlvl);
    cmdlvl++;
    if (cmdlvl > CMDSTKL) {
	printf("?Command stack overflow: %d\n",cmdlvl);
	cmdlvl--;
	return(-9);
    }
    xcmdsrc = CMD_KB;
    cmdstk[cmdlvl].src = CMD_KB;	/* Say we're at the prompt */
    cmdstk[cmdlvl].lvl = 0;
    cmdstk[cmdlvl].ccflgs = cmdstk[cmdlvl-1].ccflgs;
    if (tra_cmd)
      printf("[%d] +P: \"(prompt)\"\n",cmdlvl);
    concb((char)escape);
    if (!quiet)
      printf(
"(Recursive command prompt: Resume script with CONTINUE, STOP to stop...)\n"
            );
    if (*s) {				/* If prompt given */
	makestr(&(prstring[cmdlvl-1]),cmgetp()); /* Save current prompt */
	cmsetp(s);			/* Set new one */
    }
    return(success = 1);
#endif /* NOSPL */
}

#ifdef CKLEARN
VOID
learncmd(s) char *s; {			/* Record commands in learned script */
    char buf[64];
    int i, k;
    if (learnfp && learning) {		/* Only if open and on */
	k = ckstrncpy(buf,s,64);
	for (i = 0; i < k; i++) {	/* Get top-level command keyword */
	    if (buf[i] <= SP) {
		buf[i] = NUL;
		break;
	    }
	}
	k = lookup(cmdtab,buf,ncmd,NULL); /* Look it up */
	if (k == XXCON || k == XXLEARN)	  /* Don't record CONNECT or LEARN */
	  return;
	if (k == XXTEL) {
	    fputs("SET HOST /NETWORK:TCP",learnfp);
	    fputs(&s[i],learnfp);
	    fputs(" TELNET /TELNET",learnfp);
	    fputs("\nIF FAIL STOP 1 Connection failed\n",learnfp);
	} else {
	    fputs(s,learnfp);
	    fputs("\n",learnfp);
	}
    }
}
#endif /* CKLEARN */


/*  D O C M D  --  Do a command  */

/*
 Returns:
   -2: user typed an illegal command
   -1: reparse needed
    0: parse was successful (even tho command may have failed).
*/
#ifdef DEBUG
int cmdstats[256] = { -1, -1 };
#endif /* DEBUG */

int
docmd(cx) int cx; {
    extern int nolocal, cmkwflgs;

    debug(F101,"docmd entry, cx","",cx);
    activecmd = cx;
    doconx = ((activecmd == XXCON)  || (activecmd == XXTEL) ||
	      (activecmd == XXRLOG) || (activecmd == XXPIPE) ||
              (activecmd == XXIKSD) || (activecmd == XXPTY));
/*
  Originally all commands were handled with a big switch() statement,
  but eventually this started blowing up compilers.  Now we have a series
  of separate if statements and small switches, with the commands that are
  most commonly executed in scipts and loops coming first, to speed up
  compute-bound scripts.
  */

#ifdef DEBUG
    if (cmdstats[0] == -1) {		/* Count commands */
	int i;				/* for tuning... */
	for (i = 0; i < 256; i++)
	  cmdstats[i] = 0;
    }
#endif /* DEBUG */

    switch (cx) {
      case -4:				/* EOF */
#ifdef OSK
	if (msgflg)  printf("\n");
#else
	if (msgflg)  printf("\r\n");
#endif /* OSK */
	  doexit(GOOD_EXIT,xitsta);
      case -3:				/* Null command */
	return(0);
      case -9:				/* Like -2, but errmsg already done */
      case -1:				/* Reparse needed */
	return(cx);
      case -6:				/* Special */
      case -2:				/* Error, maybe */

#ifndef NOSPL
/*
  Maybe they typed a macro name.  Let's look it up and see.
*/
	if (cx == -6)			/* If they typed CR */
	  ckstrncat(cmdbuf,"\015",CMDBL); /*  add it back to command buffer. */
	if (ifcmd[cmdlvl] == 2)		/* Watch out for IF commands. */
	  ifcmd[cmdlvl]--;
	repars = 1;			/* Force reparse */
	cmres();
	cx = XXDO;			/* Try DO command */
#else
	return(cx);
#endif /* NOSPL */
      default:
	if (cx < 0)
	  return(cx);
	break;
    }
#ifdef DEBUG
    if (cx < 256)
      cmdstats[cx]++;
#endif /* DEBUG */

    if ((cmkwflgs & CM_PSH)
#ifndef NOPUSH
	&& nopush
#endif /* NOPUSH */
	) {
	printf("?Access to system disabled\n");
	return(-9);
    }
    if ((cmkwflgs & CM_LOC)
#ifndef NOLOCAL
	&& nolocal
#endif /* NOLOCAL */
	) {
	printf("?Connections disabled\n");
	return(-9);
    }

#ifndef NOSPL
    /* Used in FOR loops */

    if (cx == XX_INCR || cx == XXINC  || /* _INCREMENT, INCREMENT */
	cx == XX_DECR || cx == XXDEC)	 /* _DECREMENT, DECREMENT */
      return(doincr(cx));

    /* Define (or change the definition of) a macro or variable */

    if (cx == XXUNDEF || cx == XXUNDFX) {
#ifdef IKSD
	if (inserver && !ENABLED(en_asg)) {
	    printf("?Sorry, DEFINE/ASSIGN disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	return(doundef(cx));		/* [_]UNDEFINE */
    }
    if (cx == XXDEF || cx == XXASS ||
	cx == XXDFX || cx == XXASX) {
#ifdef IKSD
	if (inserver && !ENABLED(en_asg)) {
	    printf("?Sorry, DEFINE/ASSIGN disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	if (atmbuf[0] == '.' && !atmbuf[1]) /* "." entered as keyword */
	  xxdot = 1;			/* i.e. with space after it... */
	return(dodef(cx));		/* DEFINE, ASSIGN, etc... */
    }

    /* IF, WHILE, and friends  */

    if (cx == XXIF || cx == XXIFX || cx == XXWHI || cx == XXASSER) {
	return(doif(cx));
    }
    if (cx == XXSWIT) {			/* SWITCH */
	return(doswitch());
    }

    /* GOTO, FORWARD, and _FORWARD (used internally by FOR, WHILE, etc) */

    if (cx == XXGOTO || cx == XXFWD || cx == XXXFWD) { /* GOTO or FORWARD */
	/* Note, here we don't set SUCCESS/FAILURE flag */
#ifdef COMMENT
	if ((y = cmfld("label","",&s,xxstring)) < 0) {
	    if (y == -3) {
		if (cx != XXXFWD) {
		    printf("?Label name required\n");
		    return(-9);
		}
	    } else
	      return(y);
	}
	ckstrncpy(lblbuf,s,LBLSIZ);
	if ((x = cmcfm()) < 0) return(x);
#else
	if ((y = cmtxt("label","",&s,xxstring)) < 0) {
	    if (y == -3) {
		if (cx != XXXFWD) {
		    printf("?GOTO: Label name required: \"%s\" \"%s\"\n",
			   atmbuf,
			   cmdbuf);
		    return(-9);
		}
	    } else
	      return(y);
	}
	ckstrncpy(lblbuf,brstrip(s),LBLSIZ);
#endif /* COMMENT */
	s = lblbuf;
	debug(F111,"GOTO target",s,cx);
	return(dogoto(s,cx));
    }
    if (cx == XXDO || cx == XXMACRO) {	/* DO (a macro) */
	char mnamebuf[16];		/* (buffer for controlled temp name) */
	struct FDB kw, fl;
	int mx;				/* Macro index (on stack!) */

	debug(F101,"XXMACRO 0",line,cx);
	if (cx == XXDO) {
	    if (nmac == 0) {
		printf("\n?No macros defined\n");
		return(-9);
	    }
	    for (y = 0; y < nmac; y++) { /* copy the macro table into a */
		mackey[y].kwd = mactab[y].kwd; /* regular keyword table */
		mackey[y].kwval = y;	/* with value = pointer to macro tbl */
		mackey[y].flgs = mactab[y].flgs;
	    }
	    cmfdbi(&kw,			/* First FDB - macro name */
		   _CMKEY,		/* fcode */
		   "Macro",		/* hlpmsg */
		   "",			/* default */
		   "",			/* addtl string data */
		   nmac,		/* addtl numeric data 1: tbl size */
		   0,			/* addtl numeric data 2: 0 = cmkey */
		   xxstring,		/* Processing function */
		   mackey,		/* Keyword table */
		   &fl			/* Pointer to next FDB */
		   );
	    cmfdbi(&fl,			/* 2nd FDB - for "{" */
		   _CMFLD,		/* fcode */
		   "",			/* hlpmsg */
		   "",
		   "",			/* addtl string data */
		   0,			/* addtl numeric data 1 */
		   0,			/* addtl numeric data 2 */
		   xxstring,
		   NULL,
		   NULL
		   );
	    x = cmfdb(&kw);		/* Parse something */
	    if (x < 0) {		/* Error */
		if (x == -3) {
		    printf("?Macro name required\n");
		    return(-9);
		} else
		  return(x);
	    }
	    if (cmresult.fcode == _CMKEY) {
		extern int mtchanged;
		char * macroname = NULL;

	    /* In case args include an \fexec() that changes the macro table */

		mx = x;			/* Save macro index on stack */
		mtchanged = 0;		/* Mark state of macro table */
		makestr(&macroname,mactab[mx].kwd); /* Save name */

		if ((y = cmtxt("optional arguments","",&s,xxstring)) < 0)
		  return(y);		/* Get macro args */

		if (mtchanged) {	/* Macro table changed? */
		    mx = mlook(mactab,macroname,nmac); /* Look up name again */
		}
		if (macroname)
		  free(macroname);

		return(dodo(mx,s,cmdstk[cmdlvl].ccflgs) < 1 ?
		       (success = 0) : 1);
	    }
	    ckstrncpy(line,cmresult.sresult,LINBUFSIZ);	/* _CMFLD */
	    if (atmbuf[0] == '{') {
		if ((y = cmcfm()) < 0)
		  return(y);
	    }
	} else {			/* XXMACRO ("immediate macro") */
	    int k = 0;
	    line[k++] = '{';
	    line[k++] = SP;
	    line[k] = NUL;
	    debug(F111,"XXMACRO A",line,k);
	    /* Defer evaluation of variables until the commands are exec'd */
	    if ((y = cmtxt("Braced list of commands","",&s,NULL)) < 0)
	      return(y);
	    k = ckstrncpy(line+k,s,LINBUFSIZ-k);
	    debug(F111,"XXMACRO B",line,k);
	}
	x = strlen(line);
	if ((line[0] == '{' && line[x-1] != '}') || line[0] == '}')
	  return(-2);
	if (line[0] != '{' && line[x-1] != '}') {
	    /* Unknown command.  If ON_UNKNOWN_COMMAND macro is defined, */
	    /* parse args and then execute it, but only if it is not */
	    /* already active. */
	    int k = -1;
	    if (!unkmacro) {
		k = mxlook(mactab,"on_unknown_command",nmac);
	    }
	    if (k > -1) {
		ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ);
		z = maclvl;		/* Save the current maclvl */
		if ((y = cmtxt("text","",&s,xxstring)) < 0)
		  return(y);
		ckstrncat(tmpbuf," ",TMPBUFSIZ);
		ckstrncat(tmpbuf,s,TMPBUFSIZ);
		unkmacro = 1;
		debug(F110,"ON_UNKNOWN_COMMAND",s,0);
		dodo(k,tmpbuf,cmdstk[cmdlvl].ccflgs); /* Run the macro */
		while (maclvl > z) {
		    sstate = (CHAR) parser(1);
		    if (sstate) proto();
		}
		debug(F101,"UNKMAC loop exit maclvl","",maclvl);
		unkmacro = 0;
		return(success);
	    }
            if (x > 0)
	      printf("?Not a command or macro name: \"%s\"\n",line);
            else
	      printf("?Not a command or macro name.\n");
	    return(-9);
	}
	s = brstrip(line);
	sprintf(mnamebuf," ..tmp:%03d",cmdlvl);	/* safe (16) */
	x = addmac(mnamebuf,s);
	return(dodo(x,NULL,cmdstk[cmdlvl].ccflgs) < 1 ? (success = 0) : 1);
    }

    if (cx == XXLBL) {			/* LABEL */
	if ((x = cmfld("label","",&s,xxstring)) < 0) {
	    if (x == -3) {
#ifdef COMMENT
		printf("?LABEL: Label name required: \"%s\"\n", cmdbuf);
		return(-9);
#else
		s = "";
#endif /* COMMENT */
	    } else return(x);

	}
	debug(F111,"LABEL",s,x);
	if ((x = cmcfm()) < 0) return(x);
	return(0);
    }

    if (cx == XXEVAL || cx == XX_EVAL) /* _EVALUATE,  EVALUATE  */
      return(doeval(cx));

#ifndef NOSEXP
    if (cx == XXSEXP) {			/* Lisp-like S-Expression */
	struct stringarray * q;
	char /* *p, *r, */ *tmp, *m;
	int i, k, n, quote = 0, contd = 0, size = 0, len = 0;
	extern int sexprc, sexppv;

	tmp = tmpbuf;			/* Buffer to collect SEXP */
	tmpbuf[0] = NUL;		/* Clear it */
	size = TMPBUFSIZ;		/* Capacity of buffer */
	sexprc = -1;			/* Assume bad input */
	n = 0;				/* Paren balance counter */

	while (1) {			/* Allow SEXP on multiple lines */
	    m = contd ?
	      "Continuation of S-Expression" :
		"S-Expression (\"help sexp\" for details)";
	    x = cmtxt(m,"",&s,xxstring);
	    if (x < 0)
	      return(x);
	    if (!*s)			/* Needed for (=) and (:) */
	      s = atmbuf;
	    k = ckmakmsg(tmp, size, contd ? " " : "(", s, NULL, NULL);
	    if (k < 1) {
		printf("?SEXP too long - %d max\n",TMPBUFSIZ);
		return(-9);
	    }
	    debug(F111,contd ? "sexp contd" : "sexp",s,k);

	    for (i = len; i < len+k; i++) { /* Check balance  */
		if (!quote && tmpbuf[i] == CMDQ) {
		    quote = 1;
		    continue;
		}
		if (quote) {
		    quote = 0;
		    continue;
		}
		if (tmpbuf[i] == '(')
		  n++;
		else if (tmpbuf[i] == ')')
		  n--;
	    }
	    if (n == 0) {		/* Break when balanced */
		break;
	    }
	    if (n < 0) {		/* Too many right parens */
		printf("?Unbalanced S-Expression: \"%s\"\n",tmpbuf);
		return(-9);
	    }
	    contd++;			/* Need more right parens */
	    cmini(ckxech);		/* so keep parsing */
	    tmp += k;			/* adjust buffer pointer */
	    size -= k;			/* and capacity */
	    len += k;			/* and length so far */
	}
	s = tmpbuf;
	makestr(&lastsexp,s);
	q = cksplit(1,SEXPMAX,s,NULL,NULL,8,0,0); /* Precheck for > 1 SEXP */
	debug(F101,"sexp split","",q->a_size);

	if (q->a_size == 1) {		/* We should get exactly one back */
	    char * result, * dosexp();
	    sexprc = 0;			/* Reset out-of-band return code */
	    result = dosexp(s);		/* Get result */
	    debug(F111,"sexp result",result,sexprc);
	    if (sexprc == 0) {		/* Success */
		/* Echo the result if desired */
		if ((!xcmdsrc && sexpecho != SET_OFF) || sexpecho == SET_ON)
		  printf(" %s\n",result ? result : "");
		makestr(&sexpval,result);
		success = sexppv > -1 ? sexppv : 1;
		return(success);
	    }
	}
	if (sexprc < 0)
	  printf("?Invalid S-Expression: \"%s\"\n",lastsexp);
	return(-9);
    }
#endif /* NOSEXP */

#endif /* NOSPL */

    if (cx == XXECH || cx == XXXECH || cx == XXVOID
#ifndef NOSPL
	|| cx == XXAPC
#endif /* NOSPL */
	) {				/* ECHO or APC */
	if ((x = cmtxt((cx == XXECH || cx == XXXECH) ?
		       "Text to be echoed" :
		       ((cx == XXVOID) ? "Text" :
			"Application Program Command text"),
		       "",
		       &s,
		       xxstring
		       )
	     ) < 0)
	  return(x);
	if (!s) s = "";
#ifdef COMMENT
/* This is to preserver the pre-8.0 behavior but it's too confusing */
	x = strlen(s);
	x = (x > 1) ? ((s[0] == '"' && s[x-1] == '"') ? 1 : 0) : 0;
#endif /* COMMENT */
	s = brstrip(s);			/* Strip braces and doublequotes */
	if (cx == XXECH) {		/* ECHO */
#ifndef NOSPL
	    if (!fndiags || fnsuccess) {
#endif /* NOSPL */
#ifdef COMMENT
		/* The "if (x)" business preserves previous behavior */
		/* by putting back the doublequotes if they were included. */
		if (x)
		  printf("\"%s\"\n",s);
		else
#endif /* COMMENT */
		  printf("%s\n",s);
#ifndef NOSPL
	    }
#endif /* NOSPL */
	} else if (cx == XXXECH) {	/* XECHO */
	    if (x)
	      printf("\"%s\"",s);
	    else
	      printf("%s",s);
#ifdef UNIX
	    fflush(stdout);
#endif /* UNIX */
	} else if (cx == XXAPC) {	/* APC */
#ifdef CK_APC
	    if (apcactive == APC_LOCAL ||
		(apcactive == APC_REMOTE && !(apcstatus & APC_UNCH)))
	      return(success = 0);
#endif /* CK_APC */
	    if (!local) {
		printf("%c_%s%c\\",ESC,s,ESC);
#ifdef UNIX
		fflush(stdout);
#endif /* UNIX */

	    } else {			/* Local mode - have connection */
#ifndef NOSPL
		if (ckmakxmsg(tmpbuf,	/* Form APC string in buffer */
			      TMPBUFSIZ,
			      ckctoa((char)ESC),
			      ckctoa('_'),
			      s,
			      ckctoa((char)ESC),
			      ckctoa('\\'),
			      NULL,NULL,NULL,NULL,NULL,NULL,NULL
			      ) > 0)
		  return(success = dooutput(tmpbuf, XXOUT));
		printf("?Too long\n");
		return(-9);
#else
		printf("%c_%s%c\\",ESC,s,ESC);
#endif /* NOSPL */
	    }
	}
	return(success = 1);
    }

#ifndef NOSPL
/* Copy macro args from/to two levels up, used internally by _floop et al. */
    if (cx == XXGTA || cx == XXPTA) {	/* _GETARGS, _PUTARGS */
	int x;
	debug(F101,"docmd XXGTA","",XXGTA);
	debug(F101,"docmd cx","",cx);
	debug(F101,"docmd XXGTA maclvl","",maclvl);
	x = dogta(cx);
	debug(F101,"docmd dogta returns","",x);
	debug(F101,"docmd dogta maclvl","",maclvl);
	return(x);
    }
#endif /* NOSPL */

#ifndef NOSPL
#ifdef CKCHANNELIO
    if (cx == XXFILE)
      return(dofile(cx));
    else if (cx == XXF_RE || cx == XXF_WR || cx == XXF_OP ||
	     cx == XXF_CL || cx == XXF_SE || cx == XXF_RW ||
	     cx == XXF_FL || cx == XXF_LI || cx == XXF_ST || cx == XXF_CO)
      return(dofile(cx));
#endif /* CKCHANNELIO */

/* ASK, ASKQ, READ */
    if (cx == XXASK  || cx == XXASKQ || cx == XXREA ||
	cx == XXRDBL || cx == XXGETC || cx == XXGETK) {
	return(doask(cx));
    }
#endif /* NOSPL */

#ifndef NOFRILLS
    if (cx == XXBUG) {			/* BUG */
	if ((x = cmcfm()) < 0) return(x);
	return(dobug());
    }
#endif /* NOFRILLS */

#ifndef NOXFER
    if (cx == XXBYE) {			/* BYE */
	extern int ftp_cmdlin;
	if ((x = cmcfm()) < 0) return(x);

#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen())) {
	    extern int stayflg, ftp_fai;
	    success = ftpbye();
	    if (ftp_cmdlin && !stayflg && !local)
	      doexit(ftp_fai ? BAD_EXIT : GOOD_EXIT,-1);
	    else
	      return(success);
	}
#endif /* NEWFTP */

	if (!local) {
	    printf("?No connection - use EXIT to quit.\n");
	    return(-9);
	}

#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("?Sorry, BYE only works with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */

#ifdef IKS_OPTION
        if (
#ifdef CK_XYZ
            protocol == PROTO_K &&
#endif /* CK_XYZ */
            !iks_wait(KERMIT_REQ_START,1)) {
	    printf(
	     "?A Kermit Server is not available to process this command\n");
	    return(-9);			/* Correct the return code */
        }
#endif /* IKS_OPTION */

	bye_active = 1;
	sstate = setgen('L',"","","");
	if (local) ttflui();		/* If local, flush tty input buffer */
	return(0);
    }
#endif /* NOXFER */

    if (cx == XXBEEP) {			/* BEEP */
        int x;
#ifdef OS2
	int y;
        if ((y = cmkey(beeptab, nbeeptab, "which kind of beep", "information",
		       xxstring)) < 0 )
	  return (y);
    	if ((x = cmcfm()) < 0) return(x);
        bleep((short)y);		/* y is one of the BP_ values */
#else  /* OS2 */
    	if ((x = cmcfm()) < 0) return(x);
#ifndef NOSPL
        bleep(BP_NOTE);
#else
	putchar('\07');
#endif /* NOSPL */
#endif /* OS2 */
        return(0);
    }

#ifndef NOFRILLS
    if (cx == XXCLE)			/* CLEAR */
      return(success = doclear());
#endif /* NOFRILLS */

    if (cx == XXCOM) {			/* COMMENT */
	if ((x = cmtxt("Text of comment line","",&s,NULL)) < 0)
	  return(x);
	/* Don't change SUCCESS flag for this one */
	return(0);
    }

#ifndef NOLOCAL
    if (cx == XXCON || cx == XXCQ)	/* CONNECT or CONNECT /QUIETLY */
      return(doxconn(cx));
#endif /* NOLOCAL */

#ifndef NOFRILLS
#ifdef ZCOPY
    if (cx == XXCPY) {			/* COPY a file */
#ifdef IKSD
	if (inserver && !ENABLED(en_cpy)) {
	    printf("?Sorry, COPY is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef CK_APC
	if (apcactive == APC_LOCAL ||
	    (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH))
	    )
	  return(success = 0);
#endif /* CK_APC */
	return(docopy());
    }
#endif /* ZCOPY */
#ifdef NT
    if ( cx == XXLINK ) {
#ifdef IKSD
        if (inserver && !ENABLED(en_cpy)) {
            printf("?Sorry, LINK (COPY) is disabled\n");
            return(-9);
        }
#endif /* IKSD */
#ifdef CK_APC
        if (apcactive == APC_LOCAL ||
            (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH))
            )
          return(success = 0);
#endif /* CK_APC */
        return(dolink());
    }
#endif /* NT */
#endif /* NOFRILLS */

    /* CD and friends */
    if (cx == XXCWD  || cx == XXCDUP || cx == XXBACK ||
	cx == XXLCWD || cx == XXLCDU || cx == XXKCD) {
#ifdef LOCUS
	if (!locus) {
	    if (cx == XXCWD) {
#ifdef NOXFER
                return(-2);
#else
                return(dormt(XZCWD));
#endif /* NOXFER */
	    } else if (cx == XXCDUP) {
#ifdef NOXFER
                return(-2);
#else
                return(dormt(XZCDU));
#endif /* NOXFER */
            }
	}
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && !ENABLED(en_cwd)) {
	    printf("?Sorry, changing directories is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	return(success = docd(cx));
    }

    if (cx == XXCHK)			/* CHECK */
      return(success = dochk());

    if (cx == XXCLO) {			/* CLOSE */
	x = cmkey(clstab,ncls,"\"CONNECTION\", or log or file to close",
		  "connection",xxstring);
	if (x == -3) {
	    printf("?You must say which file or log\n");
	    return(-9);
	}
	if (x < 0) return(x);
	if ((y = cmcfm()) < 0) return(y);
#ifndef NOLOCAL
	if (x == 9999) {		/* CLOSE CONNECTION */
	    x = clsconnx(0);
	    switch (x) {
	      case 0:
		if (msgflg) printf("?Connection was not open\n");
	      case -1:
		return(0);
	      case 1:
		whyclosed = WC_CLOS;
		return(1);
	    }
	    return(0);
	}
#endif /* NOLOCAL */
	y = doclslog(x);
	success = (y == 1);
	return(success);
    }

#ifndef NOSPL
    if (cx == XXDCL || cx == XXUNDCL) {	/* DECLARE an array */
	return(dodcl(cx));
    }
#endif /* NOSPL */

#ifndef NODIAL
    if (cx == XXRED  || cx == XXDIAL || cx == XXPDIA ||
	cx == XXANSW || cx == XXLOOK) { /* DIAL, REDIAL etc */
#ifdef VMS
	extern int batch;
#else
#ifdef UNIXOROSK
	extern int backgrd;
#endif /* UNIXOROSK */
#endif /* VMS */
	x = dodial(cx);
	debug(F101,"dodial returns","",x);
	if ((cx == XXDIAL || cx == XXRED || cx == XXANSW) &&
	    (x > 0) &&			/* If DIAL or REDIAL succeeded */
	    (dialsta != DIA_PART) &&	/* and it wasn't partial */
	    (dialcon > 0)) {
	    if ((dialcon == 1 ||	/* And DIAL CONNECT is ON, */
		((dialcon == 2) &&	/* or DIAL CONNECT is AUTO */
		 !xcmdsrc		/* and we're at top level... */
#ifdef VMS
		 && !batch		/* Not if running from batch */
#else
#ifdef UNIXOROSK
		 && !backgrd		/* Not if running in background */
#endif /* UNIXOROSK */
#endif /* VMS */
		 ))) /* Or AUTO */
	      x = doconect(dialcq,	/* Then also CONNECT */
                           cmdlvl == 0 ? 1 : 0
			   );
	    if (ttchk() < 0)
	      dologend();
	}
	return(success = x);
    }
#endif /* NODIAL */

#ifndef NOPUSH
#ifdef CK_REXX
    if (cx == XXREXX) {			/* REXX */
        extern int nopush;
        if ( nopush )
          return(success=0);
        return(dorexx());
    }
#endif /* CK_REXX */
#endif /* NOPUSH */

#ifndef NOFRILLS
    if (cx == XXDEL || cx == XXLDEL) {	/* DELETE */
#ifdef LOCUS
	if (!locus && cx != XXLDEL) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZDEL));
#endif /* NOXFER */
        }
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && (!ENABLED(en_del)
#ifdef CK_LOGIN
			 || isguest
#endif /* CK_LOGIN */
			 )) {
	    printf("?Sorry, DELETE is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
	return(dodel());
    }
#endif /* NOFRILLS */

    if (cx == XXDIR || cx == XXLS || cx == XXLDIR) { /* DIRECTORY or LS */
#ifdef LOCUS
	if (!locus && cx != XXLDIR) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZDIR));
#endif /* NOXFER */
        }
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && !ENABLED(en_dir)) {
	    printf("?Sorry, DIRECTORY is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	return(dodir(cx));
    }

#ifndef NOSPL
    if (cx == XXELS)			/* ELSE */
      return(doelse());
#endif /* NOSPL */

#ifndef NOSERVER
#ifndef NOFRILLS
    if (cx == XXENA || cx == XXDIS) {	/* ENABLE, DISABLE */
	s = (cx == XXENA) ?
	  "Server function to enable" :
	    "Server function to disable";

	if ((x = cmkey(enatab,nena,s,"",xxstring)) < 0) {
	    if (x == -3) {
		printf("?Name of server function required\n");
		return(-9);
	    } else return(x);
	}
	if ((y = cmkey(kmstab,3,"mode","both",xxstring)) < 0) {
	    if (y == -3) {
		printf("?Please specify remote, local, or both\n");
		return(-9);
	    } else return(y);
	}
	if (cx == XXDIS)		/* Disabling, not enabling */
	  y = 3 - y;
	if ((z = cmcfm()) < 0) return(z);
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
#ifdef IKSD
        /* This may seem like it duplicates the work in doenable()  */
        /* but this code returns failure whereas doenable() returns */
        /* success.                                                 */
        if (inserver &&
#ifdef IKSDCONF
            iksdcf &&
#endif /* IKSDCONF */
            (x == EN_HOS || x == EN_PRI || x == EN_MAI || x == EN_WHO ||
              isguest))
            return(success = 0);
#endif /* IKSD */
	return(doenable(y,x));
    }
#endif /* NOFRILLS */
#endif /* NOSERVER */

#ifndef NOSPL
    if (cx == XXRET) {			/* RETURN */
	if ((x = cmtxt("Optional return value","",&s,NULL)) < 0)
	  return(x);
	s = brstrip(s);			/* Strip braces */
	if (cmdlvl == 0)		/* At top level, nothing happens... */
	  return(success = 1);
	switch (cmdstk[cmdlvl].src) {	/* Action depends on command source */
	  case CMD_TF:			/* Command file */
	    popclvl();			/* Pop command level */
	    return(success = 1);	/* always succeeds */
	  case CMD_MD:			/* Macro */
	  case CMD_KB:			/* Prompt */
	    return(doreturn(s));	/* Trailing text is return value. */
	  default:			/* Shouldn't happen */
	    return(-2);
	}
    }
#endif /* NOSPL */

#ifndef NOSPL
    if (cx == XXOPE)			/* OPEN */
      return(doopen());
#endif /* NOSPL */

#ifndef NOSPL
    if (cx == XXOUT || cx == XXLNOUT) {	/* OUTPUT or LINEOUT */
	if ((x = cmtxt("Text to be output","",&s,NULL)) < 0)
	  return(x);
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
	debug(F110,"OUTPUT 1",s,0);
	s = brstrip(s);			/* Strip enclosing braces, */
	debug(F110,"OUTPUT 2",s,0);
/*
  I don't think I could ever fully explain this in a million years...
  We have read the user's string without calling the variable-expander
  function.  Now, before we call it, we have to double backslashes that
  appear before \N, \B, \L, and \ itself, so the expander function will
  reduce them back to single backslashes, so when we call dooutput()...
  But it's more complicated than that.
*/
	if (cmdgquo()) {		/* Only if COMMAND QUOTING ON ... */
	    for (x = 0, y = 0; s[x]; x++, y++) {
		if (s[x] == CMDQ) {
		    char c = s[x+1];
		    if (c == 'n' || c == 'N' ||
			c == 'b' || c == 'B' ||
			c == 'l' || c == 'L' ||
			c == CMDQ)
		      line[y++] = CMDQ;
		}
		line[y] = s[x];
	    }
	    line[y++] = '\0';		/* Now expand variables, etc. */
	    debug(F110,"OUTPUT 3",line,0);
	    s = line+y+1;
	    x = LINBUFSIZ - (int) strlen(line) - 1;
	    debug(F101,"OUTPUT size","",x);
	    if (zzstring(line,&s,&x) < 0)
	      return(success = 0);
	    s = line+y+1;
	    debug(F110,"OUTPUT 4",s,0);
	}
	success = dooutput(s,cx);
	return(success);
    }
#endif /* NOSPL */

#ifdef ANYX25
#ifndef IBMX25
    if (cx == XXPAD) {			/* PAD commands */
	x = cmkey(padtab,npadc,"PAD command","",xxstring);
	if (x == -3) {
	    printf("?You must specify a PAD command to execute\n");
	    return(-9);
	}
	if (x < 0) return(x);

	switch (x) {
	  case XYPADL:
	    if (x25stat() < 0)
	      printf("Sorry, you must 'set network' & 'set host' first\r\n");
	    else {
		x25clear();
		initpad();
	    }
	    break;
	  case XYPADS:
	    if (x25stat() < 0)
	      printf("Not connected\r\n");
	    else {
		extern int linkid, lcn;
		conol("Connected thru ");
		conol(ttname);
		printf(", Link id %d, Logical channel number %d\r\n",
		       linkid,lcn);
	    }
	    break;
	  case XYPADR:
	    if (x25stat() < 0)
	      printf("Sorry, you must 'set network' & 'set host' first\r\n");
	    else
	      x25reset(0,0);
	    break;
	  case XYPADI:
	    if (x25stat() < 0)
	      printf("Sorry, you must 'set network' & 'set host' first\r\n");
	    else
	      x25intr(0);
	}
	return(0);
    }
#endif /* IBMX25 */
#endif /* ANYX25 */

#ifndef NOSPL
    if (cx == XXPAU || cx == XXWAI || cx == XXMSL) /* PAUSE, WAIT, etc */
      return(dopaus(cx));
#endif /* NOSPL */

#ifndef NOFRILLS
    if (cx == XXPRI) {
#ifdef IKSD
#ifdef CK_LOGIN
	if (inserver && (isguest || !ENABLED(en_pri))) {
	    printf("?Sorry, printing is disabled\n");
	    return(-9);
	}
#endif /* CK_LOGIN */
#endif /* IKSD */
	if ((x = cmifi("File to print","",&s,&y,xxstring)) < 0) {
	    if (x == -3) {
		printf("?A file specification is required\n");
		return(-9);
	    } else return(x);
	}
	if (y != 0) {
	    printf("?Wildcards not allowed\n");
	    return(-9);
	}
	ckstrncpy(line,s,LINBUFSIZ);
	s = "";
#ifndef NT
	if ((x = cmtxt("Local print command options, or carriage return","",&s,
		       xxstring)) < 0)
	  return(x);
#endif /* NT */
	if ((x = cmcfm()) < 0)
	  return(x);
	return(success = (zprint(s,line) == 0) ? 1 : 0);
    }
#endif /* NOFRILLS */

#ifdef TCPSOCKET
#ifndef NOPUSH
    if (cx == XXPNG) 			/* PING an IP host */
      return(doping());
#endif /* NOPUSH */

#ifndef NOFTP
    if (cx == XXFTP)			/* FTP */
#ifdef SYSFTP
#ifndef NOPUSH
      return(doftp());			/* Just runs system's ftp program */
#else
      return(-2);
#endif /* NOPUSH */
#else
    return(doxftp());
#endif /* SYSFTP */
#endif /* NOFTP */
#endif /* TCPSOCKET */

    if (cx == XXPWD || cx == XXLPWD) {	/* PWD */
#ifdef OS2
	char *pwp;
#endif /* OS2 */
	if ((x = cmcfm()) < 0)
	  return(x);
#ifdef LOCUS
	if (!locus && cx != XXLPWD) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZPWD));
#endif /* NOXFER */
        }
#endif /* LOCUS */

#ifndef MAC
#ifndef OS2
#ifdef UNIX
	printf("%s\n",zgtdir());
#else
	xsystem(PWDCMD);
#endif /* UNIX */
	return(success = 1);		/* Blind faith */
#else  /* OS2 */
	if (pwp = zgtdir()) {
	    if (*pwp) {
#ifdef NT
		line[0] = NUL;
		ckGetLongPathName(pwp,line,LINBUFSIZ);
		line[LINBUFSIZ-1] = NUL;
		tmpbuf[0] = NUL;
		GetShortPathName(pwp,tmpbuf,TMPBUFSIZ);
		tmpbuf[TMPBUFSIZ-1] = NUL;
		pwp = line;
		if (!strcmp(line,tmpbuf)) {
#endif /* NT */
		    printf("%s\n",pwp);
#ifdef NT
		} else {
		    printf("  Long name:  %s\n",line);
		    printf("  Short name: %s\n",tmpbuf);
		}            
#endif /* NT */
	    }
	    return(success = ((int)strlen(pwp) > 0));
	} else return(success = 0);
#endif /* OS2 */
#else  /* MAC */
	if (pwp = zgtdir()) {
	    printf("%s\n",pwp);
	    return(success = ((int)strlen(pwp) > 0));
	} else return(success = 0);
#endif /* MAC */
    }

    if (cx == XXQUI || cx == XXEXI) {	/* EXIT, QUIT */
	extern int quitting;

	if ((y = cmnum("exit status code",ckitoa(xitsta),10,&x,xxstring)) < 0)
	  return(y);
	if ((y = cmtxt("Optional EXIT message","",&s,xxstring)) < 0)
	  return(y);
	s = brstrip(s);
	ckstrncpy(line,s,LINBUFSIZ);

	if (!hupok(0))			/* Check if connection still open */
	  return(success = 0);

	if (line[0])			/* Print EXIT message if given */
	  printf("%s\n",(char *)line);

	quitting = 1;			/* Flag that we are quitting. */

#ifdef VMS
	doexit(GOOD_EXIT,x);
#else
#ifdef OSK
/* Returning any codes here makes the OS-9 shell print an error message. */
	doexit(GOOD_EXIT,-1);
#else
#ifdef datageneral
        doexit(GOOD_EXIT,x);
#else
	doexit(x,-1);
#endif /* datageneral */
#endif /* OSK */
#endif /* VMS */
    }

#ifndef NOXFER
#ifndef NOFRILLS
    if (cx == XXERR) {			/* ERROR */
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("Sorry, E-PACKET only works with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */
	if ((x = cmcfm()) < 0) return(x);
	ttflui();
	epktflg = 1;
	sstate = 'a';
	return(0);
    }
#endif /* NOFRILLS */

    if (cx == XXFIN) {			/* FINISH */
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(ftpbye());
#endif /* NEWFTP */
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("Sorry, FINISH only works with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */
	if ((x = cmcfm()) < 0) return(x);

#ifdef IKS_OPTION
        if (
#ifdef CK_XYZ
            protocol == PROTO_K &&
#endif /* CK_XYZ */
            !iks_wait(KERMIT_REQ_START,1)) {
	    printf(
              "?A Kermit Server is not available to process this command\n");
	    return(-9);			/* Correct the return code */
        }
#endif /* IKS_OPTION */

	sstate = setgen('F',"","","");
	if (local) ttflui();		/* If local, flush tty input buffer */
	return(0);
    }
#endif /* NOXFER */

#ifndef NOSPL
    if (cx == XXFOR)			/* FOR loop */
      return(dofor());
#endif /* NOSPL */

#ifndef NOXFER
    /* GET MGET REGET RETRIEVE etc */
    if (cx == XXGET || cx == XXMGET || cx == XXREGET || cx == XXRETR) {
#ifdef IKSD
	if (inserver && !ENABLED(en_sen)) {
	    printf("?Sorry, reception of files is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	return(doxget(cx));
    }
#endif /* NOXFER */

#ifndef NOSPL
#ifndef NOFRILLS
    if (cx == XXGOK) {			/* GETOK */
	return(success = doask(cx));
    }
#endif /* NOFRILLS */
#endif /* NOSPL */

    if (cx == XXHLP) {			/* HELP */
#ifdef NOHELP
	return(dohlp(XXHLP));
#else
	x = cmkey2(cmdtab,ncmd,"\nCommand or topic","help",toktab,xxstring,3);
	debug(F101,"HELP command x","",x);
	if (x == -5) {
	    y = chktok(toktab);
	    debug(F101,"HELP cmkey token","",y);
	    /* ungword(); */
	    switch (y) {
#ifndef NOPUSH
	      case '!': x = XXSHE; break;
#endif /* NOPUSH */
	      case '#': x = XXCOM; break;
	      case ';': x = XXCOM; break;
#ifndef NOSPL
              case '.': x = XXDEF; break;
	      case ':': x = XXLBL; break;
#ifndef NOSEXP
	      case '(': x = XXSEXP; break;
#endif /* NOSEXP */
#endif /* NOSPL */
	      case '&': x = XXECH; break;
	      default:
		printf("\n?Invalid - %s\n",cmdbuf);
		x = -2;
	    }
	}
	makestr(&hlptok,atmbuf);
	debug(F111,"HELP token",hlptok,x);
	return(dohlp(x));
#endif /* NOHELP */
    }

#ifndef NOHELP
    if (cx == XXINT)			/* INTRO */
      return(hmsga(introtxt));
    if (cx == XXNEW) {			/* NEWS */
	int x;
	extern char * k_info_dir;
	x = hmsga(newstxt);
	return(x);
    }

#ifdef OS2ONLY
    if (cx == XXUPD) {			/* View UPDATE file */
        extern char exedir[];
        char * pTopic;
        char updstr[2048];
        if ((x = cmtxt("topic name","",&pTopic,xxstring)) < 0)
            return x;
#ifdef COMMENT
	sprintf(updstr,
		"start view %s\\docs\\k2.inf+%s\\docs\\using_ck.inf+\
%s\\docs\\dialing.inf+%s\\docs\\modems.inf %s",
		exedir,exedir,exedir,exedir,pTopic
		);
#else
	if (ckmakxmsg(updstr,
		     2048,
		     "start view ",
		     exedir,
		     "\\docs\\k2.inf+",
		     exedir,
		     "\\docs\\using_ck.inf+",
		     exedir,
		     "\\docs\\dialing.inf+",
		     exedir,
		     "\\docs\\modems.inf ",
		     pTopic,
		     NULL,
		     NULL
		     ) > 0)
#endif /* COMMENT */
	  system(updstr);
        return(success = 1);
    }
#endif /* OS2ONLY */
#endif /* NOHELP */

#ifndef NOLOCAL
    if (cx == XXHAN) {			/* HANGUP */
	if ((x = cmcfm()) < 0) return(x);
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && !local && ftpisopen()))
	  return(success = ftpbye());
#endif /* NEWFTP */
#ifndef NODIAL
	if ((x = mdmhup()) < 1) {
	    debug(F101,"HANGUP mdmup","",x);
#endif /* NODIAL */
	    x = tthang();
	    debug(F101,"HANGUP tthang","",x);
	    x = (x > -1);
#ifndef NODIAL
	}
	dialsta = DIA_UNK;
#endif /* NODIAL */
	whyclosed = WC_CLOS;
	ttchk();			/* In case of CLOSE-ON-DISCONNECT */
	dologend();
#ifdef OS2
	if (x)
	  DialerSend(OPT_KERMIT_HANGUP, 0);
#endif /* OS2 */
	if (x) haveline = 0;
	return(success = x);
    }
#endif /* NOLOCAL */

#ifndef NOSPL
    /* INPUT, REINPUT, and MINPUT */

    if (cx == XXINP || cx == XXREI || cx == XXMINP) {
	long zz;
	extern int ispattern, isjoin;

	struct FDB sw, nu, fl;
	int fc, havetime = 0;
	char * m;

	if (cx == XXREI) {
	    m = "Timeout in seconds (ignored)";
	} else {
	    m = "Seconds to wait for input,\n or time of day hh:mm:ss, \
 or switch";
	}
	innomatch = 0;			/* Initialize switch value(s) */

	cmfdbi(&sw,			/* First FDB - command switches */
	       _CMKEY,			/* fcode */
	       m,			/* helpmsg */
	       ckitoa(indef),		/* default */
	       "",			/* addtl string data */
	       ninputsw,		/* addtl numeric data 1: tbl size */
	       4,			/* addtl numeric data 2: 4 = cmswi */
	       xxstring,		/* Processing function */
	       inputsw,			/* Keyword table */
	       &nu			/* Pointer to next FDB */
	       );
	cmfdbi(&nu,
	       _CMNUM,			/* Number */
	       m,			/* Help message */
	       ckitoa(indef),		/* default */
	       "",			/* N/A */
	       10,			/* Radix = 10 */
	       0,			/* N/A */
	       xxstring,		/* Processing function */
	       NULL,			/* N/A */
	       &fl			/* Next */
	       );
	cmfdbi(&fl,			/* Time of day hh:mm:ss */
	       _CMFLD,			/* fcode */
	       "",			/* hlpmsg */
	       "",
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );
	fc = (cx == XXREI) ? cmfdb(&nu) : cmfdb(&sw); /* Parse something */

	while (!havetime) {
	    if (fc < 0) {		/* Error */
		if (fc == -3) {
		    printf("?Syntax error in INPUT-class command\n");
		    return(-9);
		} else
		  return(fc);
	    }
	    switch (cmresult.fcode) {
	      case _CMKEY:		/* Switch */
		if (cmresult.nresult == INPSW_NOM) /* /NOMATCH */
		  innomatch = 1;
		m = "Seconds to wait for input,\n or time of day hh:mm:ss";
		cmfdbi(&nu,_CMNUM,m,"","",10,0,xxstring,NULL,&fl);
		cmfdbi(&fl,_CMFLD,"","","",0,0,xxstring,NULL,NULL);
		fc = cmfdb(&nu);	/* Parse something */
		continue;

	      case _CMNUM:		/* Seconds to time out */
		x = cmresult.nresult;
#ifdef CKFLOAT
		if (inscale != 1.0)	/* Scale */
		  x *= inscale;		
#endif	/* CKFLOAT */
		havetime++;
		break;

	      case _CMFLD:
		zz = tod2sec(atmbuf);	/* Convert to secs since midnight */
		if (zz < 0L) {
		    printf("?Number, expression, or time of day required\n");
		    return(-9);
		} else {
		    char now[32];	/* Current time */
		    char *p;
		    long tnow;
		    p = now;
		    ztime(&p);
		    tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
		    if (zz < tnow)	/* User's time before now */
		      zz += 86400L;	/* So make it tomorrow */
		    zz -= tnow;		/* Seconds from now. */
		    if (zz > -1L) {
			x = zz;
			if (zz != (long) x) {
			    printf(
"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n"
);
			    return(-9);
			}
		    }
		    havetime++;
		}
		break;
	      default:		
		printf("?Internal error\n");
		return(-9);
	    }
	}
	/* Now parse the search text */

#ifdef CK_MINPUT
	for (y = 0; y < MINPMAX; y++) {	/* Initialize strings */
	    mp[y] = 0;			/* Assume it's not a pattern */
	    if (ms[y]) {
		free(ms[y]);		/* Free old strings, if any */
		ms[y] = NULL;
	    }
	}
	if (cx == XXMINP) {		/* MINPUT */
	    int i, k = 0, n = 0;
	    struct stringarray * q;
	    keepallchars = 1;
	    while (k < MINPMAX) {
		if ((y = cmfld("String or pattern","",&s,xxstring)) < 0) {
		    if (y == -3) {
			if ((y = cmcfm()) < 0)
			  return(y);
			break;
		    } else {
			return(y);
		    }
		}
		debug(F111,"MINPUT field",s,k);
		if (isjoin) {
		    if ((q = cksplit(1,0,s," ",(char *)c1chars,3,0,0))) {
			char ** ap = q->a_head;
			n = q->a_size;
			debug(F101,"minput cksplit size","",n);
			for (i = 1; i <= n && k < MINPMAX; i++) {
			    if (!ap[i]) /* Add non-empty elements */
			      continue;
			    if (!*(ap[i]))
			      continue;
			    makestr(&(ms[k]),ap[i]);
			    debug(F111,"MINPUT JOIN",ms[k],k);
			    k++;
			}
		    }
		} else {
		    if (s) if (*s) {
			makestr(&(ms[k]),brstrip(s));
			if (ispattern) mp[k] = 1;
			debug(F111,"MINPUT",ms[k],ispattern);
			k++;
		    }
		}
	    }
	    keepallchars = 0;
	} else {
#endif /* CK_MINPUT */

	    /* INPUT or REINPUT */

	    if ((y = cmtxt("Material to be input","",&s,xxstring)) < 0)
	      return(y);
	    mp[0] = ispattern ? 1 : 0;
	    makestr(&(ms[0]),brstrip(s));
	    ms[1] = NULL;

#ifdef CK_MINPUT
	}
#endif /* CK_MINPUT */

#ifdef COMMENT
	printf("/NOMATCH=%d\n",innomatch);
	printf("Timeout=%d\n",x);
	return(1);
#endif	/* COMMENT */

	if (cx == XXINP || cx == XXMINP) { /* Not REINPUT... */
	    i_active = 1;
	    /* Go try to input the search string */
	    success = doinput(x,ms,mp,innomatch);
	    i_active = 0;
	} else {			/* REINPUT */
	    success = doreinp(x,ms[0],ispattern);
	}
	if (intime[cmdlvl] && !success) { /* TIMEOUT-ACTION = QUIT? */
	    popclvl();			/* If so, pop command level. */
	    if (pflag && cmdlvl == 0) {
		if (cx == XXINP)  printf("?INPUT timed out\n");
		if (cx == XXMINP) printf("?MINPUT timed out\n");
		if (cx == XXREI)  printf("?REINPUT failed\n");
	    }
	}
	return(success);		/* Return do(re)input's return code */
    }

#endif /* NOSPL */

    if (cx == XXLOG) {			/* LOG */
	x = cmkey(logtab,nlog,"What to log","",xxstring);
	if (x == -3) {
	    printf("?Type of log required\n");
	    return(-9);
	}
	if (x < 0) return(x);
	x = dolog(x);
	if (x < 0)
	  return(x);
	else
	  return(success = x);
    }

    if (cx == XXLOGIN) {		/* (REMOTE) LOGIN */
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(success = doftpusr());
#endif /* NEWFTP */
#ifdef IKSD
	if (inserver) {
	    printf("?Already logged in\n");
	    return(-9);
	} else
#endif /* IKSD */
	{
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZLGI));
#endif /* NOXFER */
	}
    }
    if (cx == XXLOGOUT) {		/* (REMOTE) LOGOUT */
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(success = doftpres());
#endif /* NEWFTP */

#ifdef IKSD
        if (inserver) {
	    if ((x = cmcfm()) < 0)
	      return(x);
	    doexit(GOOD_EXIT,xitsta);
	} else
#endif /* IKSD */
	if (!local || (network && ttchk() < 0)) {
	    printf("?No connection.\n");
	    return(-9);
	} else {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZLGO));
#endif /* NOXFER */
	}
    }

#ifndef NOSCRIPT
    if (cx == XXLOGI) {			/* UUCP-style script */
	if ((x = cmtxt("expect-send expect-send ...","",&s,xxstring)) < 0)
	  return(x);
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
#ifdef VMS
	conres();			/* For Ctrl-C to work... */
#endif /* VMS */
	return(success = dologin(s));	/* Return 1=completed, 0=failed */
    }
#endif /* NOSCRIPT */

#ifndef NOXFER
#ifdef PIPESEND
    if (cx == XXCREC) {			/* CRECEIVE */
	if (protocol != PROTO_K) {
	    printf("?Sorry, CRECEIVE works only with Kermit protocol\n");
	    return(-9);
	} else
	  return(doxget(cx));
    }
    if (cx == XXCGET) {			/* CGET */
	return(doxget(cx));
    }
#endif /* PIPESEND */

    if (cx == XXREC)			/* RECEIVE */
      return(doxget(cx));
#endif /* NOXFER */

#ifndef NOXFER
    if (cx == XXREM) {			/* REMOTE */
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(doftprmt(0,0));
#endif /* NEWFTP */
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("Sorry, REMOTE commands only work with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */
	x = cmkey(remcmd,nrmt,"Remote Kermit server command","",xxstring);
	if (x == -3) {
	    printf("?You must specify a command for the remote server\n");
	    return(-9);
	}
	return(dormt(x));
    }
#endif /* NOXFER */

#ifndef NORENAME
#ifndef NOFRILLS
    if (cx == XXREN || cx == XXLREN) {	/* RENAME */
#ifdef LOCUS
	if (!locus && cx != XXLREN) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZREN));
#endif /* NOXFER */
        }
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && (!ENABLED(en_ren)
#ifdef CK_LOGIN
			 || isguest
#endif /* CK_LOGIN */
			 )) {
	    printf("?Sorry, renaming of files is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
	return(dorenam());
    }
#endif /* NOFRILLS */
#endif /* NORENAME */

    if (cx == XXEIGHT) {		/* EIGHTBIT */
	extern int parity, cmask, cmdmsk;
	if ((x = cmcfm()) < 0)
	  return(x);
	parity = 0;
	cmask = 0xff;
	cmdmsk = 0xff;
	return(success = 1);
    }

#ifndef NOXFER
/* SEND, CSEND, MOVE, MAIL, and RESEND use the new common code */

    if (cx == XXSEN			/* SEND */
#ifdef PIPESEND
	|| cx == XXCSEN			/* CSEND */
#endif /* PIPESEND */
	|| cx == XXMOVE			/* MOVE */
	|| cx == XXMAI			/* MAIL */
#ifdef CK_RESEND
	|| cx == XXRSEN			/* RESEND */
#endif /* CK_RESEND */
	) {
#ifdef IKSD
	if (inserver && !ENABLED(en_get)) {
	    printf("?Sorry, sending files is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	return(doxsend(cx));
    }

/* PSEND, ADD, and REMOVE use special parsing */

#ifdef ADDCMD
    /* ADD and REMOVE */
    if (cx == XXADD || cx == XXREMV) {
	char * m;
	m = (cx == XXADD) ? "Add to which list?" : "Remove from which list?";
	x = cmkey(addtab,naddtab,m,"",xxstring);
	if (x < 0)
	  return(x);
#ifndef NOMSEND
	if (x == ADD_SND)
	  return(addsend(cx));
	else
#endif /* NOMSEND */
	  return(doadd(cx,x));
    }
#endif /* ADDCMD */

#ifdef CK_RESEND
    if (cx == XXPSEN) {			/* PSEND */
	int seekto = 0;

	cmarg = cmarg2 = "";
	x = cmifi("File to partially send", "", &s, &y, xxstring);
	if (x < 0) {
	    if (x == -3) {
		printf("?A file specification is required\n");
		return(-9);
	    } else return(x);
	}
	nfils = -1;			/* Files come from internal list. */
#ifndef NOMSEND
        addlist = 0;			/* Don't use SEND-LIST. */
        filenext = NULL;
#endif /* NOMSEND */
	ckstrncpy(line,s,LINBUFSIZ);	/* Save copy of string just parsed. */
	debug(F110,"PSEND line",line,0);
	if (y != 0) {
	    printf("?Sorry, wildcards not permitted in this command\n");
	    return(-9);
	}
	if (sizeof(int) < 4) {
	    printf("?Sorry, this command needs 32-bit integers\n");
	    return(-9);
	}
	x = cmnum("starting position (byte number)",
		  "",10,&seekto,xxstring);
	if (x < 0)
	  return(x);
	zfnqfp(s,fspeclen,fspec);	/* Get full path */
	if ((x = cmtxt("Name to send it with","",&s,NULL)) < 0)
	  return(x);
	ckstrncpy(tmpbuf,s,TMPBUFSIZ);

#ifdef IKSD
	if (inserver && !ENABLED(en_get)) {
	    printf("?Sorry, sending files is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef PIPESEND
	if (sndfilter) {
	    printf("?Sorry, no PSEND while SEND FILTER selected\n");
	    return(-9);
	}
#endif /* PIPESEND */
#ifdef CK_XYZ
	if ((protocol == PROTO_X || protocol == PROTO_XC)) {
	    printf("Sorry, PSEND works only with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */

	cmarg2 = brstrip(tmpbuf);	/* Strip braces */
	cmarg = line;			/* File to send */
	debug(F110,"PSEND filename",cmarg,0);
	debug(F110,"PSEND as-name",cmarg2,0);
	sendstart = seekto;
	sstate = 's';			/* Set start state to SEND */
#ifndef NOMSEND
	addlist = 0;
	filenext = NULL;
#endif /* NOMSEND */
	sendmode = SM_PSEND;
#ifdef MAC
	what = W_SEND;
	scrcreate();
#endif /* MAC */
	if (local) {			/* If in local mode, */
	    displa = 1;			/* enable file transfer display */
	}
	return(0);
    }
#endif /* CK_RESEND */
#endif /* NOXFER */

#ifndef NOXFER
#ifndef NOMSEND
    if (cx == XXMSE || cx == XXMMOVE) {
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(doftpput(cx,0));
#endif /* NEWFTP */
#ifdef CK_XYZ
	if (protocol == PROTO_X || protocol == PROTO_XC) {
	    printf(
"Sorry, you can only send one file at a time with XMODEM protocol\n"
		   );
	    return(-9);
	}
#endif /* CK_XYZ */
        return(doxsend(cx));
    }

#ifdef COMMENT				/* (moved to doxsend) */
    if (cx == XXMSE || cx == XXMMOVE) {	/* MSEND and MMOVE commands */
	nfils = 0;			/* Like getting a list of */
	lp = line;			/* files on the command line */
	addlist = 0;			/* Do not use SEND-LIST */
	filenext = NULL;		/* Ditto ! */

	while (1) {
	    char *p;
	    if ((x = cmifi("Names of files to send, separated by spaces","",
			   &s,&y,xxstring)) < 0) {
		if (x == -3) {
		    if (nfils <= 0) {
			printf("?A file specification is required\n");
			return(-9);
		    } else break;
		}
		return(x);
	    }
	    msfiles[nfils++] = lp;	/* Got one, count it, point to it, */
	    p = lp;			/* remember pointer, */
	    while (*lp++ = *s++)	/* and copy it into buffer */
	      if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */
		  printf("?MSEND list too long\n");
		  line[0] = NUL;
		  return(-9);
	      }
	    debug(F111,"msfiles",msfiles[nfils-1],nfils-1);
	    if (nfils == 1) *fspec = NUL; /* Take care of \v(filespec) */
#ifdef ZFNQFP
	    zfnqfp(p,TMPBUFSIZ,tmpbuf);
	    p = tmpbuf;
#endif /* ZFNQFP */
	    if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) {
		strcat(fspec,p);	/* safe */
		strcat(fspec," ");	/* safe */
	    } else printf("WARNING - \\v(filespec) buffer overflow\n");
	}
	cmlist = msfiles;		/* Point cmlist to pointer array */
	cmarg2 = "";			/* No internal expansion list (yet) */
	sndsrc = nfils;			/* Filenames come from cmlist */
	sendmode = SM_MSEND;		/* Remember this kind of SENDing */
	sstate = 's';			/* Set start state for SEND */
	if (cx == XXMMOVE)		/* If MMOVE'ing, */
	  moving = 1;			/*  set this flag. */
#ifdef MAC
	what = W_SEND;
	scrcreate();
#endif /* MAC */
	if (local) {			/* If in local mode, */
	    displa = 1;			/* turn on file transfer display */
	    ttflui();			/* and flush tty input buffer. */
	}
	return(0);
    }
#endif /* COMMENT */
#endif /* NOMSEND */
#endif /* NOXFER */

#ifndef NOSERVER
    if (cx == XXSER) {			/* SERVER */
#ifdef CK_XYZ
	if (protocol != PROTO_K) {
	    printf("Sorry, SERVER only works with Kermit protocol\n");
	    return(-9);
	}
#endif /* CK_XYZ */
#ifdef COMMENT
/*
  Parse for time limit, but since we don't use it yet,
  the parsing is commented out.
*/
	x_ifnum = 1;			/* Turn off internal complaints */
	y = cmnum("optional time limit, seconds, or time of day as hh:mm:ss",
		  "0", 10, &x, xxstring
		  );
	x_ifnum = 0;
	if (y < 0) {
	    if (y == -2) {		/* Invalid number or expression */
		zz = tod2sec(atmbuf);	/* Convert to secs since midnight */
		if (zz < 0L) {
		    printf("?Number, expression, or time of day required\n");
		    return(-9);
		} else {
		    char now[32];	/* Current time */
		    char *p;
		    long tnow;
		    p = now;
		    ztime(&p);
		    tnow = atol(p+11) * 3600L + atol(p+14) * 60L + atol(p+17);
		    if (zz < tnow)	/* User's time before now */
		      zz += 86400L;	/* So make it tomorrow */
		    zz -= tnow;		/* Seconds from now. */
		}
	    } else
	      return(y);
	}
	if (zz > -1L) {
	    x = zz;
	    if (zz != (long) x) {
		printf(
"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n"
		       );
		return(-9);
	    }
	}
	if (x < 0)
	  x = 0;
#endif /* COMMENT */

	if ((x = cmcfm()) < 0) return(x);
	sstate = 'x';
#ifdef MAC
	what = W_RECV;
	scrcreate();
#endif /* MAC */
	if (local) displa = 1;
#ifdef AMIGA
	reqoff();			/* No DOS requestors while server */
#endif /* AMIGA */
	return(0);
    }
#endif /* NOSERVER */

    if (cx == XXSAVE) {			/* SAVE command */
	x = cmkey(savtab,nsav,"option","keymap",xxstring);
	if (x == -3) {
	    printf("?You must specify an option to save\n");
	    return(-9);
	}
	if (x < 0) return(x);
	/* have to set success separately for each item in doprm()... */
	/* actually not really, could have just had doprm return 0 or 1 */
	/* and set success here... */
	y = dosave(x);
	if (y == -3) {
	    printf("?More fields required\n");
	    return(-9);
	} else return(y);
    }

    if (cx == XXSET) {			/* SET command */
	x = cmkey(prmtab,nprm,"Parameter","",xxstring);
	if (x == -3) {
	    printf("?You must specify a parameter to set\n");
	    return(-9);
	}
	if (x < 0) return(x);
	/* have to set success separately for each item in doprm()... */
	/* actually not really, could have just had doprm return 0 or 1 */
	/* and set success here... */
	y = doprm(x,0);
	if (y == -3) {
	    printf("?More fields required\n");
	    return(-9);
	} else return(y);
    }

#ifndef NOPUSH
    if (cx == XXSHE			/* SHELL (system) command */
	|| cx == XXEXEC			/* exec() */
	) {
	int rx = 0;
	char * p = NULL;
	int i /* ,n */ ;
#ifdef UNIXOROSK
	char * args[256];
#endif /* UNIXOROSK */

#ifdef IKSD
	if (inserver && (nopush || !ENABLED(en_hos))) {
	    printf("?Sorry, host command access is disabled\n");
	    return(-9);
	}
#endif /* IKSD */

#ifdef CKEXEC
	if (cx == XXEXEC) {		/* EXEC (overlay ourselves) */
	    struct FDB sw, fl;
	    cmfdbi(&sw,			/* First FDB - command switches */
		   _CMKEY,		/* fcode */
		   "Command to overlay C-Kermit\n or switch", /* hlpmsg */
		   "",			/* default */
		   "",			/* addtl string data */
		   1,			/* addtl numeric data 1: tbl size */
		   4,			/* addtl numeric data 2: 4 = cmswi */
		   xxstring,		/* Processing function */
		   redirsw,		/* Keyword table */
		   &fl			/* Pointer to next FDB */
		   );
	    cmfdbi(&fl,			/* 2nd FDB - command to exec */
		   _CMFLD,		/* fcode */
		   "Command to overlay C-Kermit", /* hlpmsg */
		   "",			/* default */
		   "",			/* addtl string data */
		   0,			/* addtl numeric data 1 */
		   0,			/* addtl numeric data 2 */
		   xxstring,
		   NULL,
		   NULL			/* No more after this */
		   );
	    while (1) {
		x = cmfdb(&sw);		/* Parse something */
		debug(F101,"exec cmfdb","",x);
		if (x < 0)
		  return(x);
		/* Generalize this if we add more switches */
		if (cmresult.fcode == _CMKEY) {
		    rx = 1;
		    continue;
		}
		if (cmresult.fcode == _CMFLD)
		  break;
		return(-2);
	    }
	    ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ);
	    if (!tmpbuf[0]) {
		printf("?Command required\n");
		return(-9);
	    }
	    p = brstrip(tmpbuf);
	    args[0] = NULL;		/* Set argv[0] to it */
	    makestr(&args[0],p);
	    for (i = 1; i < 255; i++) {	/* Get arguments for command */
		if ((x = cmfld("Argument","",&s,xxstring)) < 0) {
		    if (x == -3) {
			if ((x = cmcfm()) < 0)
			  return(x);
			break;
		    } else
		      return(x);
		}
		args[i] = NULL;
		s = brstrip(s);
		makestr(&args[i],s);
	    }
	    args[i] = NULL;
	} else {
#endif /* CKEXEC */
	    if ((x = cmtxt("System command to execute","",&s,xxstring)) < 0)
	      return(x);
#ifdef CKEXEC
	}
#endif /* CKEXEC */
        if (nopush)
          return(success = 0);
#ifdef CK_APC
	if (apcactive == APC_REMOTE && !(apcstatus & APC_UNCH))
	  return(success = 0);
#endif /* CK_APC */
	conres();			/* Make console normal  */
#ifdef OS2
	if (!(s && *s)) {
	    os2push();
            return(success = 1);
	} else
#endif /* OS2 */
	  if (cx == XXSHE) {
	      x = zshcmd(s);
	      debug(F101,"RUN zshcmd code","",x);
	      concb((char)escape);
	      return(success = x);
#ifdef CKEXEC
	  } else {
#ifdef DEBUG
	      if (deblog) {
		  debug(F111,"EXEC cmd",p,0);
		  for (i = 0; i < 256 && args[i]; i++)
		    debug(F111,"EXEC arg",args[i],i);
	      }
#endif /* DEBUG */
	      if (p) {
		  z_exec(p,args,rx);	/* Overlay ourself */
		  debug(F100,"EXEC fails","",0);
		  concb((char)escape);	/* In case it returns */
	      }
	      return(success = 0);
#endif /* CKEXEC */
	  }
    }

#ifdef CK_REDIR
    if (cx == XXFUN) {			/* REDIRECT */
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
	ckmakmsg(tmpbuf,
		 TMPBUFSIZ,
		 "Local command to run,\n",
		 "with its standard input/output redirected to ",
		 local ? ttname : "the communications connection",
		 "\n"
		 );
	if ((x = cmtxt(tmpbuf,"",&s,xxstring)) < 0)
	  return(x);
        if (nopush) {
            printf("?REDIRECT disabled\n");
            return(success=0);
        }
	if (!local) {
	    printf("?SET LINE or SET HOST required first\n");
	    return(-9);
	}
	if (!*s) {
	    printf("?REDIRECT requires a command to redirect\n");
	    return(-9);
	}
	return(success = ttruncmd(s));
    }
#endif /* CK_REDIR */
#endif /* NOPUSH */

#ifndef NOSHOW
    if (cx == XXSHO) {			/* SHOW */
	x = cmkey(shotab,nsho,"","parameters",xxstring);
	if (x < 0) return(x);
	return(doshow(x));
    }
#endif /* NOSHOW */

#ifndef MAC
    if (cx == XXSPA) {			/* SPACE */
#ifdef IKSD
	if (inserver && !ENABLED(en_spa)) {
	    printf("?Sorry, SPACE command disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef datageneral
	/* AOS/VS can take an argument after its "space" command. */
	if ((x = cmtxt("Confirm, or local directory name","",&s,xxstring)) < 0)
	  return(x);
	if (nopush) {
	    printf("?Sorry, SPACE command disabled\n");
	    return(-9);
	} else if (*s == NUL) {
	    xsystem(SPACMD);
	} else {
	    ckmakmsg(line,LINBUFSIZ,"space ",s,NULL,NULL);
	    xsystem(line);
	}
#else
#ifdef OS2
	if ((x = cmtxt("Press Enter for current disk,\n\
 or specify a disk letter like A:","",&s,xxstring)) < 0)
	  return(x);
	if (*s == NUL) {		/* Current disk */
            unsigned long space = zdskspace(0);
            if (space > 0 && space < 1024)
              printf(" Free space: unknown\n");
            else
	      printf(" Free space: %ldK\n", space/1024L);
	} else {
	    int drive = toupper(*s);
            unsigned long space = zdskspace(drive - 'A' + 1);
            if (space > 0 && space < 1024)
              printf(" Drive %c: unknown free\n");
            else
              printf(" Drive %c: %ldK free\n", drive,space / 1024L);
	}
#else
#ifdef UNIXOROSK
	x = cmdir("Confirm for current disk,\n\
 or specify a disk device or directory","",&s,xxstring);
	if (x == -3)
	  s = "";
	else if (x < 0)
	  return(x);
        ckstrncpy(tmpbuf,s,TMPBUFSIZ);
        s = tmpbuf;
	if ((x = cmcfm()) < 0) return(x);
	if (nopush) {
	    printf("?Sorry, SPACE command disabled\n");
	    return(-9);
	}
	if (!*s) {			/* Current disk */
	    xsystem(SPACMD);
	} else {			/* Specified disk */
	    ckmakmsg(line,LINBUFSIZ,SPACM2," ",s,NULL);
	    xsystem(line);
	}
#else
	if ((x = cmcfm()) < 0) return(x);
	if (nopush) {
	    printf("?Sorry, SPACE command disabled\n");
	    return(-9);
	}
	xsystem(SPACMD);
#endif /* UNIXOROSK */
#endif /* OS2 */
#endif /* datageneral */
	return(success = 1);		/* Pretend it worked */
    }
#endif /* MAC */

#ifndef NOXFER
    if (cx == XXSTA) {			/* STATISTICS */
	if ((x = cmkey(stattab,2,"Carriage return, or option",
		       "/brief",xxstring)) < 0)
	  return(x);
	if ((y = cmcfm()) < 0) return(y);
	return(success = dostat(x));
    }
#endif /* NOXFER */

    if (cx == XXSTO || cx == XXEND) {	/* STOP, END, or POP */
	if ((y = cmnum("exit status code","0",10,&x,xxstring)) < 0)
	  return(y);
	if ((y = cmtxt("Message to print","",&s,xxstring)) < 0)
	  return(y);
	s = brstrip(s);
	if (*s) printf("%s\n",s);
	if (cx == XXSTO) {
	    dostop();
	} else {
	    doend(x);
	}
	return(success = (x == 0));
    }
    if (cx == XXSUS) {			/* SUSPEND */
	if ((y = cmcfm()) < 0) return(y);
#ifdef NOJC
	printf("Sorry, this version of Kermit cannot be suspended\n");
#else
#ifdef IKSD
	if (inserver) {
	    printf("?Sorry, IKSD can not be suspended\n");
	    return(-9);
	} else
#endif /* IKSD */
	  if (nopush) {
	    printf("?Sorry, access to system is disabled\n");
	    return(-9);
	}
	stptrap(0);
#endif /* NOJC */
	return(0);
    }

    if (cx == XXTAK) {			/* TAKE */
	char * scriptenv = NULL;	
#ifdef OS2
        char * GetAppData(int);
	extern char startupdir[],exedir[],inidir[];
	char * keymapenv = NULL;
        char * appdata0 = NULL, *appdata1 = NULL;
	int xx;
#define TAKEPATHLEN 4096
#else /* OS2 */
#define TAKEPATHLEN 1024
#endif /* OS2 */
	char takepath[TAKEPATHLEN];

	if (tlevel >= MAXTAKE-1) {
	    printf("?Take files nested too deeply\n");
	    return(-9);
	}
#ifdef OS2
#ifdef NT
	scriptenv = getenv("K95SCRIPTS");
	keymapenv = getenv("K95KEYMAPS");
        makestr(&appdata0,(char *)GetAppData(0));
        makestr(&appdata1,(char *)GetAppData(1));
#else /* NT */
	scriptenv = getenv("K2SCRIPTS");
	keymapenv = getenv("K2KEYMAPS");
#endif /* NT */
#endif /* OS2 */

	if (!scriptenv)			/* Let this work for Unix etc too */
	  scriptenv = getenv("CK_SCRIPTS"); /* Use this if defined */
#ifndef OS2
	if (!scriptenv)			/* Otherwise use home directory */
	  scriptenv = homepath();
#endif /* OS2 */
	if (!scriptenv)
	  scriptenv = "";
	ckstrncpy(takepath,scriptenv,TAKEPATHLEN);
	debug(F110,"TAKE initial takepath",takepath,0);

#ifdef OS2
	if (!keymapenv)
	  keymapenv = getenv("CK_KEYMAPS");
	if (!keymapenv)
	  keymapenv = "";

	ckstrncat(takepath,
		  (scriptenv && scriptenv[strlen(scriptenv)-1]==';')?"":";",
		  TAKEPATHLEN
		  );
	ckstrncat(takepath,keymapenv?keymapenv:"",TAKEPATHLEN);
	ckstrncat(takepath,
		  (keymapenv && keymapenv[strlen(keymapenv)-1]==';')?"":";",
		  TAKEPATHLEN
		  );
	ckstrncat(takepath,startupdir,TAKEPATHLEN);
	ckstrncat(takepath,";",TAKEPATHLEN);
	ckstrncat(takepath,startupdir,TAKEPATHLEN);
	ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,startupdir,TAKEPATHLEN);
	ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN);

	ckstrncat(takepath,appdata1,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/;",TAKEPATHLEN);
	ckstrncat(takepath,appdata1,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,appdata1,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/KEYMAPS/;",TAKEPATHLEN);

	ckstrncat(takepath,appdata0,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/;",TAKEPATHLEN);
	ckstrncat(takepath,appdata0,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,appdata0,TAKEPATHLEN);
	ckstrncat(takepath,"Kermit 95/KEYMAPS/;",TAKEPATHLEN);

	ckstrncat(takepath,inidir,TAKEPATHLEN);
	ckstrncat(takepath,";",TAKEPATHLEN);
	ckstrncat(takepath,inidir,TAKEPATHLEN);
	ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,inidir,TAKEPATHLEN);
	ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN);

	ckstrncat(takepath,zhome(),TAKEPATHLEN);
	ckstrncat(takepath,";",TAKEPATHLEN);
	ckstrncat(takepath,zhome(),TAKEPATHLEN);
	ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,zhome(),TAKEPATHLEN);
	ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN);

	ckstrncat(takepath,exedir,TAKEPATHLEN);
	ckstrncat(takepath,";",TAKEPATHLEN);
	ckstrncat(takepath,exedir,TAKEPATHLEN);
	ckstrncat(takepath,"SCRIPTS/;",TAKEPATHLEN);
	ckstrncat(takepath,exedir,TAKEPATHLEN);
	ckstrncat(takepath,"KEYMAPS/;",TAKEPATHLEN);
#endif /* OS2 */
	debug(F110,"TAKE final takepath",takepath,0);

	if ((y = cmifip("Commands from file",
			"",&s,&x,0,takepath,xxstring)) < 0) {
	    if (y == -3) {
		printf("?A file name is required\n");
		return(-9);
	    } else
	      return(y);
	}
	if (x != 0) {
	    printf("?Wildcards not allowed in command file name\n");
	    return(-9);
	}
	ckstrncpy(line,s,LINBUFSIZ);
	debug(F110,"TAKE file",s,0);
	if (isdir(s)) {
	    printf("?Can't execute a directory - \"%s\"\n", s);
	    return(-9);
	}
#ifndef NOTAKEARGS
	{
	    char * p;
	    x = strlen(line);
	    debug(F111,"TAKE args",line,x);
	    p = line + x + 1;
	    if ((y = cmtxt("Optional arguments","",&s,xxstring)) < 0)
	      return(y);
	    if (*s) {			/* Args given? */
		ckstrncpy(p,s,LINBUFSIZ-x-1);
#ifdef ZFNQFP
		zfnqfp(line,TMPBUFSIZ,tmpbuf);
		s = tmpbuf;
#else
		s = line;
#endif /* ZFNQFP */
		debug(F110,"TAKE filename",s,0);
		x = strlen(s);
		debug(F101,"TAKE new len",s,x);

#ifdef COMMENT
/*
  This was added in C-Kermit 7.0 to allow args to be passed from the TAKE
  command to the command file.  But it overwrites the current argument vector,
  which is at best surprising, and at worst unsafe.
*/
		addmac("%0",s);		/* Define %0 = name of file */
		varnam[0] = '%';
		varnam[2] = '\0';
		debug(F110,"take arg 0",s,0);
		debug(F110,"take args",p,0);
		for (y = 1; y < 10; y++) { /* Clear current args %1..%9 */
		    varnam[1] = (char) (y + '0');
		    delmac(varnam,0);
		}
		xwords(p,MAXARGLIST,NULL,0); /* Assign new args */
		debug(F110,"take args",p,0);
#else
/*
  This method is used in 8.0.  If the TAKE command includes arguments, we
  insert an intermediate temporary macro between the current level; we pass
  the arguments to the macro and then the macro TAKEs the command file.
  If the user Ctrl-C's out of the TAKE file, some temporary macro definitions
  and other small malloc'd bits might be left behind.
*/
		{
		    char * q = NULL;
		    char * r = NULL;
		    int k, m;
		    m = maclvl;
		    q = (char *)malloc(x+24);
		    if (q) {
			r = (char *)malloc(x+24);
			if (r) {
			    sprintf(q,"_file[%s](%d)",s,cmdlvl); /* safe */
			    sprintf(r,"take %s",s); /* safe */
			    k = addmac(q,r);
			    if (k > -1) {
				dodo(k,p,0);
				while (maclvl > m) {
				    sstate = (CHAR) parser(1);
				    if (sstate) proto();
				}
			    }
			    k = delmac(q,0);
			    free(q);
			    free(r);
			    return(success);
			}
		    }
		}
		return(success = 0);
#endif /* COMMENT */
	    }
	}
#else
	if ((y = cmcfm()) < 0) return(y);
#endif /* NOTAKEARGS */
	return(success = dotake(line));
    }

#ifndef NOLOCAL
#ifdef OS2
    if (cx == XXVIEW) {			/* VIEW Only Terminal mode */
	viewonly = TRUE;
	success = doconect(0, 0);
	viewonly = FALSE;
	return success;
    }
#endif /* OS2 */

#ifdef NETCONN
    if (cx == XXTEL || cx == XXIKSD) {	/* TELNET */
	int x,z;
#ifdef OS2
    if (!tcp_avail) {
        printf("?Sorry, either TCP/IP is not available on this system or\n\
necessary DLLs did not load.  Use SHOW NETWORK to check network status.\n");
        success = 0;
        return(-9);
    } else
#endif /* OS2 */
      {
	  x = nettype;			/* Save net type in case of failure */
	  z = ttnproto;			/* Save protocol in case of failure */
	  nettype = NET_TCPB;
	  ttnproto = (cx == XXTEL) ? NP_TELNET : NP_KERMIT;
	  if ((y = setlin(XYHOST,0,1)) <= 0) {
              nettype = x;		/* Failed, restore net type. */
              ttnproto = z;		/* and protocol */
              success = 0;
	  }
	  didsetlin++;
        }
	return(y);
    }

#ifndef PTYORPIPE
#ifdef NETCMD
#define PTYORPIPE
#else
#ifdef NETPTY
#define PTYORPIPE
#endif /* NETPTY */
#endif /* NETCMD */
#endif /* PTYORPIPE */

#ifdef PTYORPIPE
    if (cx == XXPIPE || cx == XXPTY) {	/* PIPE or PTY */
	int x;
	extern int netsave;
	x = nettype;			/* Save net type in case of failure */
	nettype = (cx == XXPIPE) ? NET_CMD : NET_PTY;
	if ((y = setlin(XYHOST,0,1)) < 0) {
	    nettype = x;		/* Failed, restore net type. */
	    ttnproto = z;		/* and protocol */
	    success = 0;
	}
	didsetlin++;
	netsave = x;
	return(y);
    }
#endif /* PTYORPIPE */

#ifdef ANYSSH
    if (cx == XXSSH) {			/* SSH (Secure Shell) */
	extern int netsave;
#ifdef SSHBUILTIN
	int k, x, havehost = 0, trips = 0;
        int    tmpver = -1, tmpxfw = -1;
#ifndef SSHTEST
        extern int sl_ssh_xfw, sl_ssh_xfw_saved;
        extern int sl_ssh_ver, sl_ssh_ver_saved;
#endif /* SSHTEST */
        extern int mdmtyp, mdmsav, cxtype, sl_uid_saved;
        extern char * slmsg;
	extern char uidbuf[], sl_uidbuf[];
        extern char pwbuf[], * g_pswd;
        extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal;
	struct FDB sw, kw, fl;

        if (ssh_tmpstr)
	  memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
        makestr(&ssh_tmpstr,NULL);
        makestr(&ssh_tmpuid,NULL);
        makestr(&ssh_tmpcmd,NULL);
        makestr(&ssh_tmpport,NULL);

	cmfdbi(&kw,			/* 1st FDB - commands */
	       _CMKEY,			/* fcode */
	       "host [ port ],\n or action",	/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       nsshcmd,			/* addtl numeric data 1: tbl size */
	       0,			/* addtl numeric data 2: 0 = keyword */
	       xxstring,		/* Processing function */
	       sshkwtab,		/* Keyword table */
	       &fl			/* Pointer to next FDB */
	       );
	cmfdbi(&fl,			/* Host */
	       _CMFLD,			/* fcode */
	       "",			/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );

	x = cmfdb(&kw);
	if (x == -3) {
	    printf("?ssh what?\n");
	    return(-9);
	}
	if (x < 0)
	  return(x);
	havehost = 0;
	if (cmresult.fcode == _CMFLD) {
	    havehost = 1;
	    ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */
	    cmresult.nresult = XSSH_OPN;
	}
	switch (cmresult.nresult) {	/* SSH keyword */
	  case XSSH_OPN:		/* SSH OPEN */
	    if (!havehost) {
		if ((x = cmfld("Host","",&s,xxstring)) < 0)
		  return(x);
		ckstrncpy(line,s,LINBUFSIZ);
	    }
	    /* Parse [ port ] [ switches ] */
	    cmfdbi(&kw,			/* Switches */
		   _CMKEY,
		   "Port number or service name,\nor switch",
		   "",
		   "",
		   nsshopnsw,
		   4,
		   xxstring,
		   sshopnsw,
		   &fl
		   );
	    cmfdbi(&fl,			/* Port number or service name */
		   _CMFLD,
		   "",
		   "",
		   "",
		   0,
		   0,
		   xxstring,
		   NULL,
		   NULL
		   );
	    trips = 0;			/* Explained below */
	    while (1) {			/* Parse port and switches */
		x = cmfdb(&kw);		/* Get a field */
		if (x == -3)		/* User typed CR so quit from loop */
		  break;
		if (x < 0)		/* Other parse error, pass it back */
		  return(x);
		switch (cmresult.fcode) { /* Field or Keyword? */
                  case _CMFLD:		  /* Field */
                    makestr(&ssh_tmpport,cmresult.sresult);
		    break;
		  case _CMKEY:		/* Keyword */
		    switch (cmresult.nresult) {	/* Which one? */
		      case SSHSW_USR:	        /* /USER: */
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			if ((y = cmfld("Username","",&s,xxstring)) < 0)
			  return(y);
			s = brstrip(s);
			makestr(&ssh_tmpuid,s);
			break;
                      case SSHSW_PWD:
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			debok = 0;
			if ((x = cmfld("Password","",&s,xxstring)) < 0) {
			    if (x == -3) {
				makestr(&ssh_tmpstr,"");
			    } else {
				return(x);
			    }
			} else {
			    s = brstrip(s);
			    if ((x = (int)strlen(s)) > PWBUFL) {
				makestr(&slmsg,"Internal error");
				printf("?Sorry, too long - max = %d\n",PWBUFL);
				return(-9);
			    }
			    makestr(&ssh_tmpstr,s);
			}
			break;

		      case SSHSW_VER:
			if ((x = cmnum("Number","",10,&z,xxstring)) < 0)
			  return(x);
			if (z < 1 || z > 2) {
			    printf("?Out of range: %d\n",z);
			    return(-9);
			}
                        tmpver = z;
			break;
		      case SSHSW_CMD:
		      case SSHSW_SUB:
			if ((x = cmfld("Text","",&s,xxstring)) < 0)
			  return(x);
                        makestr(&ssh_tmpcmd,s);
			ssh_cas = (cmresult.nresult == SSHSW_SUB);
			break;
		      case SSHSW_X11:
			if ((x = cmkey(onoff,2,"","on",xxstring)) < 0)
			  return(x);
                        tmpxfw = x;
			break;
		      default:
		        return(-2);
		    }
		}
		if (trips++ == 0) {	/* After first time through */
		    cmfdbi(&kw,		/* only parse switches, not port. */
			   _CMKEY,
			   "Switch",
			   "",
			   "",
			   nsshopnsw,
			   4,
			   xxstring,
			   sshopnsw,
			   NULL
			   );
		}
	    }
	    if ((x = cmcfm()) < 0)	/* Get confirmation */
	      return(x);
            if (clskconnx(1) < 0) {	/* Close current Kermit connection */
              if ( ssh_tmpstr ) {
                  memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
                  makestr(&ssh_tmpstr,NULL);
              }
              return(success = 0);
            }
	    makestr(&ssh_hst,line);	/* Stash everything */
	    if (ssh_tmpuid) {
                if (!sl_uid_saved) {
                    ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN);
                    sl_uid_saved = 1;
                }
		ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN);
		makestr(&ssh_tmpuid,NULL);
	    }
            if (ssh_tmpport) {
                makestr(&ssh_prt,ssh_tmpport);
                makestr(&ssh_tmpport,NULL);
            } else
                makestr(&ssh_prt,NULL);

            if (ssh_tmpcmd) {
                makestr(&ssh_cmd,brstrip(ssh_tmpcmd));
                makestr(&ssh_tmpcmd,NULL);
            } else
                makestr(&ssh_cmd,NULL);

            if (tmpver > -1) {
#ifndef SSHTEST
                if (!sl_ssh_ver_saved) {
                    sl_ssh_ver = ssh_ver;
                    sl_ssh_ver_saved = 1;
                }
#endif /* SSHTEST */
                ssh_ver = tmpver;
            }
            if (tmpxfw > -1) {
#ifndef SSHTEST
                if (!sl_ssh_xfw_saved) {
                    sl_ssh_xfw = ssh_xfw;
                    sl_ssh_xfw_saved = 1;
                }
#endif /* SSHTEST */
                ssh_xfw = tmpxfw;
            }
	    if (ssh_tmpstr) {
		if (ssh_tmpstr[0]) {
		    ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1);
		    pwflg = 1;
		    pwcrypt = 0;
		} else
		  pwflg = 0;
		makestr(&ssh_tmpstr,NULL);
	    }
	    nettype = NET_SSH;
	    if (mdmsav < 0)
	      mdmsav = mdmtyp;
	    mdmtyp = -nettype;
	    x = 1;

#ifndef NOSPL
            makestr(&g_pswd,pwbuf);             /* Save global pwbuf */
            g_pflg = pwflg;                     /* and flag */
            g_pcpt = pwcrypt;
#endif /* NOSPL */

	    /* Line parameter to ttopen() is ignored */
	    k = ttopen(line,&x,mdmtyp, 0);
	    if (k < 0) {
		printf("?Unable to connect to %s\n",ssh_hst);
		mdmtyp = mdmsav;
                slrestor();
		return(success = 0);
	    }
	    duplex = 0;             /* Remote echo */
	    ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */
	    debug(F110,"ssh ttname",ttname,0);
	    makestr(&slmsg,NULL);	/* No SET LINE error message */
	    cxtype = CXT_SSH;
#ifndef NODIAL
	    dialsta = DIA_UNK;
#endif /* NODIAL */
	    success = 1;		/* SET LINE succeeded */
	    network = 1;		/* Network connection (not serial) */
	    local = 1;			/* Local mode (not remote) */
	    if ((reliable != SET_OFF || !setreliable))
	      reliable = SET_ON;	/* Transport is reliable end to end */
#ifdef OS2
            DialerSend(OPT_KERMIT_CONNECT, 0);
#endif /* OS2 */
	    setflow();			/* Set appropriate flow control */

	    haveline = 1;
#ifdef CKLOGDIAL
#ifdef NETCONN
	    dolognet();
#endif /* NETCONN */
#endif /* CKLOGDIAL */

#ifndef NOSPL
	    if (local) {
		if (nmac) {		/* Any macros defined? */
		    int k;		/* Yes */
		    k = mlook(mactab,"on_open",nmac); /* Look this up */
		    if (k >= 0) {	              /* If found, */
			if (dodo(k,ssh_hst,0) > -1)   /* set it up, */
			  parser(1);		      /* and execute it */
		    }
		}
	    }
#endif /* NOSPL */
#ifdef LOCUS		
	    if (autolocus)
		setlocus(1,1);
#endif /* LOCUS */

	/* Command was confirmed so we can pre-pop command level. */
	/* This is so CONNECT module won't think we're executing a */
	/* script if CONNECT was the final command in the script. */
	    if (cmdlvl > 0)
	      prepop();
	    success = doconect(0,cmdlvl == 0 ? 1 : 0);
	    if (ttchk() < 0)
	      dologend();
	    return(success);

	  case XSSH_CLR:
	    if ((y = cmkey(sshclr,nsshclr,"","", xxstring)) < 0) {
	        if (y == -3) {
		    printf("?clear what?\n");
		    return(-9);
		}
	        return(y);
	    }
	    if ((x = cmcfm()) < 0)
	      return(x);
	    switch (y) {
	      case SSHC_LPF:
                ssh_pf_lcl_n = 0;
		break;
	      case SSHC_RPF:
		ssh_pf_rmt_n = 0;
		break;
	      default:
		return(-2);
	    }
            return(success = 1);	/* or whatever */

	  case XSSH_AGT: {		/* SSH AGENT */
	      int doeach = 0;
	      if ((y = cmkey(sshagent,nsshagent,"","",xxstring)) < 0)
		return(y);
	      switch (y) {
		case SSHA_ADD:		/* SSH AGENT ADD ... */
		  if ((x = cmifi("Identity file","",&s,&y,xxstring)) < 0) {
#ifndef SSHTEST
		      if (x == -3)	/* No name given */
			doeach = 1;	/* so do them all */
		      else
#endif /* SSHTEST */
			return(x);
		  }
		  ckstrncpy(line,s,LINBUFSIZ);
		  if ((x = cmcfm()) < 0)
		    return(x);
#ifdef SSHTEST
		  x = 0;
#else
		  if (doeach) {
                      int i;
                      x = 0;
                      for (i = 0; i < ssh_idf_n; i++)
			x += ssh_agent_add_file(ssh_idf[i]);
		  } else
		    x = ssh_agent_add_file(line);
#endif /* SSHTEST */
		  return(success = (x == 0));

		case SSHA_DEL: {	/* SSH AGENT DELETE ... */
		    int doall = 0;
		    if ((x = cmifi("Identity file","",&s,&y,xxstring)) < 0) {
#ifndef SSHTEST
			if (x == -3)	/* No name given */
			  doall = 1;	/* so do them all */
			else
#endif /* SSHTEST */
			  return(x);
		    }
		    ckstrncpy(line,s,LINBUFSIZ);
		    if ((x = cmcfm()) < 0)
		      return(x);
#ifdef SSHTEST
		    x = 0;
#else
		    if (doall)
		      x = ssh_agent_delete_all();
		    else
		      x = ssh_agent_delete_file(line);
#endif /* SSHTEST */
		    return(success = (x == 0));
		}
		case SSHA_LST: {
		    int fingerprint = 0;
		    if ((y = cmswi(sshagtsw,nsshagtsw,"","",xxstring)) < 0) {
			if (y != -3)
			  return(y);
		    } else if (cmgbrk() > SP) {
			printf("?This switch does not take an argument\n");
			return(-9);
		    } else if (y == SSHASW_FP) {
			fingerprint = 1;
		    }
		    if ((x = cmcfm()) < 0)
		      return(x);
#ifdef SSHTEST
		    return(success = 1);
#else
		    return(success =
			   (ssh_agent_list_identities(fingerprint) == 0));
#endif /* SSHTEST */
		}
		default:
		  return(-2);
	      }
	  }
	  case XSSH_ADD: {		/* SSH ADD */
	      /* ssh add { local, remote } port host port */
	      int cx, i, j, k;
	      char * h;
	      if ((cx = cmkey(addfwd,naddfwd,"","", xxstring)) < 0)
		return(cx);
	      if ((x = cmnum((cx == SSHF_LCL) ?
			     "Local port number" : "Remote port number",
			     "",10,&j,xxstring)) < 0)
		return(x);
	      if ((x = cmfld("Host","",&s,xxstring)) < 0)
		return(x);
	      makestr(&h,s);
	      if ((x = cmnum("Port","",10,&k,xxstring)) < 0)
		return(x);
	      if ((x = cmcfm()) < 0)
		return(x);

	      switch(cx) {
		case SSHF_LCL:
		   if (ssh_pf_lcl_n == 32) {
		       printf(
"?Maximum number of local port forwardings already specified\n"
			     );
		       free(h);
		       return(success = 0);
		  }
		  ssh_pf_lcl[ssh_pf_lcl_n].p1 = j;
		  makestr(&(ssh_pf_lcl[ssh_pf_lcl_n].host),h);
		  makestr(&h,NULL);
		  ssh_pf_lcl[ssh_pf_lcl_n].p2 = k;
		  ssh_pf_lcl_n++;
		  break;
		case SSHF_RMT:
		  if (ssh_pf_rmt_n == 32) {
		      printf(
"?Maximum number of remote port forwardings already specified\n"
			    );
		      free(h);
		      return(success = 0);
		  }
		  ssh_pf_rmt[ssh_pf_rmt_n].p1 = j;
		  makestr(&(ssh_pf_rmt[ssh_pf_rmt_n].host),h);
		  makestr(&h,NULL);
		  ssh_pf_rmt[ssh_pf_rmt_n].p2 = k;
		  ssh_pf_rmt_n++;
	      }
	      return(success = 1);
	  }
	  /* Not supporting arbitrary forwarding yet */
	  case XSSH_FLP:		/* SSH FORWARD-LOCAL-PORT */
	  case XSSH_FRP: {		/* SSH FORWARD-REMOTE-PORT */
	      int li_port = 0;
	      int to_port = 0;
	      char * fw_host = NULL;
	      int n;
              if ((x = cmnum(cmresult.nresult == XSSH_FLP ?
                              "local-port":"remote-port",
                              "",10,&li_port,xxstring)) < 0)
                  return(x);
              if (li_port < 1 || li_port > 65535) {
                  printf("?Out range - min: 1, max: 65535\n");
                  return(-9);
              }
	      if ((x = cmfld("host",ssh_hst?ssh_hst:"",&s,xxstring)) < 0)
		return(x);
              n = ckstrncpy(tmpbuf,s,TMPBUFSIZ);
              fw_host = tmpbuf;
              if ((x = cmnum("host-port",ckuitoa(li_port),10,
                              &to_port,xxstring)) < 0)
                  return(x);
              if (to_port < 1 || to_port > 65535) {
                  printf("?Out range - min: 1, max: 65535\n");
                  return(-9);
              }
	      if ((x = cmcfm()) < 0)
		return(x);
	      switch (cmresult.nresult) {
                case XSSH_FLP:	/* SSH FORWARD-LOCAL-PORT */
#ifndef SSHTEST
                  ssh_fwd_local_port(li_port,fw_host,to_port);
#endif /* SSHTEST */
		  return(success = 1);
		case XSSH_FRP:	/* SSH FORWARD-REMOTE-PORT */
#ifndef SSHTEST
                  ssh_fwd_remote_port(li_port,fw_host,to_port);
#endif /* SSHTEST */
		  return(success = 1);
	      }
	      return(success = 1);
	  }
	case XSSH_V2:		/* SSH V2 */
	  if ((cx = cmkey(ssh2tab,nssh2tab,"","", xxstring)) < 0)
	    return(cx);
	  switch (cx) {
	    case XSSH2_RKE:
	      if ((x = cmcfm()) < 0)
		return(x);
#ifndef SSHTEST
	      ssh_v2_rekey();
#endif /* SSHTEST */
	      return(success = 1);
	    default:
	      return(-2);
	  }
	case XSSH_KEY:
	  if ((cx = cmkey(sshkey,nsshkey,"","", xxstring)) < 0)
	    return(cx);
	  switch (cx) {
	    case SSHK_PASS: {	/* Change passphrase */
	      char * oldp = NULL, * newp = NULL;
	      struct FDB df, sw;
	      cmfdbi(&sw,
		     _CMKEY,		/* fcode */
		     "Filename, or switch", /* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     2,			/* addtl numeric data 1: tbl size */
		     4,			/* addtl numeric data 2: 4 = cmswi */
		     xxstring,		/* Processing function */
		     sshkpsw,		/* Keyword table */
		     &df		/* Pointer to next FDB */
		     );
	      cmfdbi(&df,		/* 2nd FDB - file for display */
		     _CMIFI,		/* output file */
		     "",		/* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     0,			/* addtl numeric data 1 */
		     0,			/* addtl numeric data 2 */
		     xxstring,
		     NULL,
		     NULL
		     );
	      line[0] = NUL;

	      while (1) {
		  x = cmfdb(&sw);
		  if (x == -3) break;
		  if (x < 0)
		    return(x);
		  if (cmresult.fcode != _CMKEY)
		    break;
		  if (!cmgbrk()) {
		      printf("?This switch requires an argument\n");
		      return(-9);
		  }
		  if ((y = cmfld("Passphrase","",&s,xxstring)) < 0)
		    return(y);
		  switch (cmresult.nresult) {
		    case 1:		/* Old */
		      makestr(&oldp,s);
		      break;
		    case 2:		/* New */
		      makestr(&newp,s);
		  }
	      }
	      if (cmresult.fcode == _CMIFI) { /* Filename */
		  ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
		  if (zfnqfp(line,TMPBUFSIZ,tmpbuf))
		    ckstrncpy(line,tmpbuf,LINBUFSIZ);
	      }
	      if ((x = cmcfm()) < 0) return(x);

#ifndef SSHTEST
	      x = sshkey_change_passphrase(line[0] ? line : NULL,
					     oldp, newp);
#endif /* SSHTEST */
	      makestr(&oldp,NULL);
	      makestr(&newp,NULL);
	      success = (x == 0);
	      return(success);
	    }
	    case SSHK_CREA: {	/* SSH KEY CREATE /switches... */
	      int bits = 1024, keytype = SSHKT_2R;
	      char * pass = NULL, * comment = NULL;
	      struct FDB df, sw;

              /*
               * char * sshkey_default_file(int keytype) 
               * will provide the default filename for a given keytype
               * is it possible to have the default value for the 2nd
               * FDB set and changed when a /TYPE switch is provided?
               * Would this allow for tab completion of the filename?
               */
	      cmfdbi(&sw,
		     _CMKEY,		/* fcode */
		     "Filename, or switch", /* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     nsshkcrea,		/* addtl numeric data 1: tbl size */
		     4,			/* addtl numeric data 2: 4 = cmswi */
		     xxstring,		/* Processing function */
		     sshkcrea,		/* Keyword table */
		     &df		/* Pointer to next FDB */
		     );
	      cmfdbi(&df,		/* 2nd FDB - file for display */
		     _CMOFI,		/* output file */
		     "",		/* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     0,			/* addtl numeric data 1 */
		     0,			/* addtl numeric data 2 */
		     xxstring,
		     NULL,
		     NULL
		     );
	      line[0] = NUL;

	      while (1) {
		  x = cmfdb(&sw);
		  if (x == -3) break;
		  if (x < 0)
		    return(x);
		  if (cmresult.fcode != _CMKEY)
		    break;
		  if (!cmgbrk()) {
		      printf("?This switch requires an argument\n");
		      return(-9);
		  }
		  switch (cmresult.nresult) {
		    case SSHKC_BI:	/* /BITS:n */
		      if ((y = cmnum("","1024",10,&z,xxstring)) < 0)
			return(y);
		      if (z < 512 || z > 4096) {
			  printf("?Out range - min: 512, max: 4096\n");
			  return(-9);
		      }
		      bits = z;
		      break;
		    case SSHKC_PP:	/* /PASSPHRASE:blah */
		      if ((y = cmfld("Passphrase","",&s,xxstring)) < 0)
			return(y);
		      makestr(&pass,s);
		      break;
		    case SSHKC_TY:	/* /TYPE:keyword */
		      if ((y = cmkey(sshkcty,nsshkcty,"",
				     "v2-rsa",xxstring)) < 0)
			return(y);
		      keytype = y;
		      break;
		    case SSHKC_1R:	/* /COMMENT */
		      if ((y = cmfld("Text","",&s,xxstring)) < 0)
			return(y);
		      makestr(&comment,s);
		      break;
		  }
	      }
	      if (cmresult.fcode == _CMOFI) { /* Filename */
                  if (cmresult.sresult) {
                      ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
                      if (zfnqfp(line,TMPBUFSIZ,tmpbuf))
                          ckstrncpy(line,tmpbuf,LINBUFSIZ);
		  }
	      }
	      if ((y = cmcfm()) < 0) /* Confirm */
		return(y);
#ifndef SSHTEST
	      x = sshkey_create(line[0] ? line : NULL,
				bits, pass, keytype, comment);
	      if (pass)
		memset(pass,0,strlen(pass));
#endif /* SSHTEST */
	      makestr(&pass,NULL);
	      makestr(&comment,NULL);
	      return(success = (x == 0));
	    }
	    case SSHK_DISP: {	/* SSH KEY DISPLAY /switches... */
	      char c;
	      int infmt = 0, outfmt = 0;
	      struct FDB df, sw;
	      cmfdbi(&sw,
		     _CMKEY,		/* fcode */
		     "Filename, or switch", /* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     nsshdswi,		/* addtl numeric data 1: tbl size */
		     4,			/* addtl numeric data 2: 4 = cmswi */
		     xxstring,		/* Processing function */
		     sshdswi,		/* Keyword table */
		     &df		/* Pointer to next FDB */
		     );
	      cmfdbi(&df,		/* 2nd FDB - file for display */
		     _CMIFI,		/* fcode */
		     "",		/* hlpmsg */
		     "",		/* default */
		     "",		/* addtl string data */
		     0,			/* addtl numeric data 1 */
		     0,			/* addtl numeric data 2 */
		     xxstring,
		     NULL,
		     NULL
		     );
	      line[0] = NUL;

	      while (1) {
		  x = cmfdb(&sw);
		  if (x == -3) break;
		  if (x < 0)
		    return(x);
		  if (cmresult.fcode != _CMKEY)
		    break;
		  if (!cmgbrk()) {
		      printf("?This switch requires an argument\n");
		      return(-9);
		  }
		  switch (cmresult.nresult) {
#ifdef COMMENT
		    case SSHKD_IN:	/* /IN-FORMAT: */
		      if ((y = cmkey(sshdifmt,nsshdifmt,
				     "","",xxstring)) < 0)
			return(y);
		      infmt = y;
		      break;
#endif /* COMMENT */
		    case SSHKD_OUT:	/* /FORMAT: */
		      if ((y = cmkey(sshdofmt,nsshdofmt,
				     "","",xxstring)) < 0)
			return(y);
		      outfmt = y;
		      break;
		  }
	      }
	      if (cmresult.fcode == _CMIFI) { /* Filename */
		  ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
		  if (zfnqfp(line,TMPBUFSIZ,tmpbuf))
		    ckstrncpy(line,tmpbuf,LINBUFSIZ);
	      }
#ifdef COMMENT
	      if (!line[0]) {
		  printf("?Key filename required\n");
		  return(-9);
	      }
#endif /* COMMENT */
	      if ((y = cmcfm()) < 0) /* Confirm */
		return(y);
#ifndef SSHTEST
	      switch (outfmt) {
		case SKDF_OSSH:
                  /* 2nd param is optional passphrase */
		  x = sshkey_display_public(line[0] ? line : NULL, NULL);
		  break;
		case SKDF_SSHC:
                  /* 2nd param is optional passphrase */
		  x = sshkey_display_public_as_ssh2(line[0] ? line : NULL,
						    NULL);
		  break;
		case SKDF_IETF:
		  x = sshkey_display_fingerprint(line[0] ? line : NULL, 1);
		  break;
		case SKDF_FING:
		  x = sshkey_display_fingerprint(line[0] ? line : NULL, 0);
		  break;
	      }
#endif /* SSHTEST */
	      return(success = (x == 0));
	    }
	    case SSHK_V1:		/* SSH KEY V1 SET-COMMENT */
	      if ((x = cmkey(sshkv1,1,"","set-comment", xxstring)) < 0)
		return(x);
	      if (x != 1) return(-2);
	      if ((x = cmifi("Key file name","",&s,&y,xxstring)) < 0) {
		  if (x == -3) {
		      printf("?Name of key file required\n");
		      return(-9);
		  }
	      }
	      ckstrncpy(line,s,LINBUFSIZ);
	      if ((x = cmtxt("Comment text","",&s,xxstring)) < 0)
		return(x);
#ifndef SSHTEST
	      x = sshkey_v1_change_comment(line,  /* filename */
					   s,     /* new comment */
					   NULL   /* passphrase */
					   );
#endif /* SSHTEST */
	      success = (x == 0);
	      return(success);
	  }
	  default:
	    return(-2);
	}
#else  /* SSHBUILTIN */
#ifdef SSHCMD
	x = nettype;
	if ((y = setlin(XXSSH,0,1)) < 0) {
	    if (errno)
	      printf("?%s\n",ck_errstr());
            else
#ifdef COMMENT
	    /* This isn't right either because it catches command editing */
	      printf("?Sorry, pseudoterminal open failed\n");
            if (hints)
	      printf("Hint: Try \"ssh -t %s\"\n",line);
#else
	      return(y);
#endif /* COMMENT */
	    nettype = x;		/* Failed, restore net type. */
	    ttnproto = z;		/* and protocol */
	    success = 0;
	}
	didsetlin++;
	netsave = x;
	return(y);
#endif /* SSHCMD */
#endif /* SSHBUILTIN */
    }
#endif /* ANYSSH */

#ifdef SSHBUILTIN
    if (cx == XXSKRM) {			/* SKERMIT (Secure Shell Kermit) */
	extern int netsave;
	int k, x, havehost = 0, trips = 0;
        int    tmpver = -1, tmpxfw = -1;
#ifndef SSHTEST
        extern int sl_ssh_xfw, sl_ssh_xfw_saved;
        extern int sl_ssh_ver, sl_ssh_ver_saved;
#endif /* SSHTEST */
        extern int mdmtyp, mdmsav, cxtype, sl_uid_saved;
        extern char * slmsg;
	extern char uidbuf[], sl_uidbuf[];
        extern char pwbuf[], * g_pswd;
        extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal;
	struct FDB sw, kw, fl;

        if (ssh_tmpstr)
	  memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
        makestr(&ssh_tmpstr,NULL);
        makestr(&ssh_tmpuid,NULL);
        makestr(&ssh_tmpcmd,NULL);
        makestr(&ssh_tmpport,NULL);

	cmfdbi(&kw,			/* 1st FDB - commands */
	       _CMKEY,			/* fcode */
	       "host [ port ],\n or action", /* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       nsshkermit,		/* addtl numeric data 1: tbl size */
	       0,			/* addtl numeric data 2: 0 = keyword */
	       xxstring,		/* Processing function */
	       sshkermit,		/* Keyword table */
	       &fl			/* Pointer to next FDB */
	       );
	cmfdbi(&fl,			/* Host */
	       _CMFLD,			/* fcode */
	       "",			/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );

	x = cmfdb(&kw);
	if (x == -3) {
	    printf("?skermit what?\n");
	    return(-9);
	}
	if (x < 0)
	  return(x);
	havehost = 0;
	if (cmresult.fcode == _CMFLD) {
	    havehost = 1;
	    ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */
	    cmresult.nresult = SKRM_OPN;
	}
	switch (cmresult.nresult) {	/* SSH keyword */
	  case SKRM_OPN:		/* SSH OPEN */
	    if (!havehost) {
		if ((x = cmfld("Host","",&s,xxstring)) < 0)
		  return(x);
		ckstrncpy(line,s,LINBUFSIZ);
	    }
	    /* Parse [ port ] [ switches ] */
	    cmfdbi(&kw,			/* Switches */
		   _CMKEY,
		   "Port number or service name,\nor switch",
		   "",
		   "",
		   nsshkrmopnsw,
		   4,
		   xxstring,
		   sshkrmopnsw,
		   &fl
		   );
	    cmfdbi(&fl,			/* Port number or service name */
		   _CMFLD,
		   "",
		   "",
		   "",
		   0,
		   0,
		   xxstring,
		   NULL,
		   NULL
		   );
	    trips = 0;			/* Explained below */
	    while (1) {			/* Parse port and switches */
		x = cmfdb(&kw);		/* Get a field */
		if (x == -3)		/* User typed CR so quit from loop */
		  break;
		if (x < 0)		/* Other parse error, pass it back */
		  return(x);
		switch (cmresult.fcode) { /* Field or Keyword? */
                  case _CMFLD:		  /* Field */
                    makestr(&ssh_tmpport,cmresult.sresult);
		    break;
		  case _CMKEY:		/* Keyword */
		    switch (cmresult.nresult) {	/* Which one? */
		      case SSHSW_USR:	        /* /USER: */
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			if ((y = cmfld("Username","",&s,xxstring)) < 0)
			  return(y);
			s = brstrip(s);
			makestr(&ssh_tmpuid,s);
			break;
                      case SSHSW_PWD:
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			debok = 0;
			if ((x = cmfld("Password","",&s,xxstring)) < 0) {
			    if (x == -3) {
				makestr(&ssh_tmpstr,"");
			    } else {
				return(x);
			    }
			} else {
			    s = brstrip(s);
			    if ((x = (int)strlen(s)) > PWBUFL) {
				makestr(&slmsg,"Internal error");
				printf("?Sorry, too long - max = %d\n",PWBUFL);
				return(-9);
			    }
			    makestr(&ssh_tmpstr,s);
			}
			break;

                    case SSHSW_VER:
			if ((x = cmnum("Number","",10,&z,xxstring)) < 0)
			  return(x);
			if (z < 1 || z > 2) {
			    printf("?Out of range: %d\n",z);
			    return(-9);
			}
                        tmpver = z;
			break;
                    default:
                        return(-2);
		    }
                  }
		if (trips++ == 0) {	/* After first time through */
		    cmfdbi(&kw,		/* only parse switches, not port. */
			   _CMKEY,
			   "Switch",
			   "",
			   "",
			   nsshkrmopnsw,
			   4,
			   xxstring,
			   sshkrmopnsw,
			   NULL
			   );
		}
	    }
	    if ((x = cmcfm()) < 0)	/* Get confirmation */
	      return(x);
              if (clskconnx(1) < 0) {	/* Close current Kermit connection */
                  if ( ssh_tmpstr ) {
                      memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
                      makestr(&ssh_tmpstr,NULL);
                  }
                  return(success = 0);
              }
              makestr(&ssh_hst,line);	/* Stash everything */
              if (ssh_tmpuid) {
                  if (!sl_uid_saved) {
                      ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN);
                      sl_uid_saved = 1;
                  }
                  ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN);
                  makestr(&ssh_tmpuid,NULL);
              }
              if (ssh_tmpport) {
                  makestr(&ssh_prt,ssh_tmpport);
                  makestr(&ssh_tmpport,NULL);
              } else
                  makestr(&ssh_prt,NULL);

              /* Set the Subsystem to Kermit */
              ssh_cas = 1;
              makestr(&ssh_cmd,"kermit");

              if (tmpver > -1) {
#ifndef SSHTEST
                  if (!sl_ssh_ver_saved) {
                      sl_ssh_ver = ssh_ver;
                      sl_ssh_ver_saved = 1;
                  }
#endif /* SSHTEST */
                  ssh_ver = tmpver;
              }
              /* Disable X11 Forwarding */
#ifndef SSHTEST
              if (!sl_ssh_xfw_saved) {
                  sl_ssh_xfw = ssh_xfw;
                  sl_ssh_xfw_saved = 1;
              }
#endif /* SSHTEST */
              ssh_xfw = 0;

              if (ssh_tmpstr) {
                  if (ssh_tmpstr[0]) {
                      ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1);
                      pwflg = 1;
                      pwcrypt = 0;
                  } else
                      pwflg = 0;
                  makestr(&ssh_tmpstr,NULL);
              }
              nettype = NET_SSH;
              if (mdmsav < 0)
                  mdmsav = mdmtyp;
              mdmtyp = -nettype;
              x = 1;

#ifndef NOSPL
            makestr(&g_pswd,pwbuf);	/* Save global pwbuf */
            g_pflg = pwflg;		/* and flag */
            g_pcpt = pwcrypt;
#endif /* NOSPL */

	    /* Line parameter to ttopen() is ignored */
	    k = ttopen(line,&x,mdmtyp, 0);
	    if (k < 0) {
		printf("?Unable to connect to %s\n",ssh_hst);
		mdmtyp = mdmsav;
                slrestor();
		return(success = 0);
	    }
	    duplex = 0;             /* Remote echo */
	    ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */
	    debug(F110,"ssh ttname",ttname,0);
	    makestr(&slmsg,NULL);	/* No SET LINE error message */
	    cxtype = CXT_SSH;
#ifndef NODIAL
	    dialsta = DIA_UNK;
#endif /* NODIAL */
	    success = 1;		/* SET LINE succeeded */
	    network = 1;		/* Network connection (not serial) */
	    local = 1;			/* Local mode (not remote) */
	    if ((reliable != SET_OFF || !setreliable))
	      reliable = SET_ON;	/* Transport is reliable end to end */
#ifdef OS2
            DialerSend(OPT_KERMIT_CONNECT, 0);
#endif /* OS2 */
	    setflow();			/* Set appropriate flow control */

	    haveline = 1;
#ifdef CKLOGDIAL
#ifdef NETCONN
	    dolognet();
#endif /* NETCONN */
#endif /* CKLOGDIAL */

#ifndef NOSPL
	    if (local) {
		if (nmac) {		/* Any macros defined? */
		    int k;		/* Yes */
		    k = mlook(mactab,"on_open",nmac); /* Look this up */
		    if (k >= 0) {	              /* If found, */
			if (dodo(k,ssh_hst,0) > -1)   /* set it up, */
			  parser(1);		      /* and execute it */
		    }
		}
	    }
#endif /* NOSPL */
#ifdef LOCUS		
	    if (autolocus)
		setlocus(1,1);
#endif /* LOCUS */

	/* Command was confirmed so we can pre-pop command level. */
	/* This is so CONNECT module won't think we're executing a */
	/* script if CONNECT was the final command in the script. */
	    if (cmdlvl > 0)
	      prepop();
	    return(success = 1);

	  default:
	    return(-2);
	}
    }
#endif /* SSHBUILTIN */

#ifdef SFTP_BUILTIN
    if (cx == XXSFTP) {			/* SFTP (Secure Shell File Transfer) */
	extern int netsave;
	int k, x, havehost = 0, trips = 0;
        int    tmpver = -1, tmpxfw = -1;
#ifndef SSHTEST
        extern int sl_ssh_xfw, sl_ssh_xfw_saved;
        extern int sl_ssh_ver, sl_ssh_ver_saved;
#endif /* SSHTEST */
        extern int mdmtyp, mdmsav, cxtype, sl_uid_saved;
        extern char * slmsg;
	extern char uidbuf[], sl_uidbuf[];
        extern char pwbuf[], * g_pswd;
        extern int pwflg, pwcrypt, g_pflg, g_pcpt, nolocal;
	struct FDB sw, kw, fl;

        if (ssh_tmpstr)
	  memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
        makestr(&ssh_tmpstr,NULL);
        makestr(&ssh_tmpuid,NULL);
        makestr(&ssh_tmpcmd,NULL);
        makestr(&ssh_tmpport,NULL);

	cmfdbi(&kw,			/* 1st FDB - commands */
	       _CMKEY,			/* fcode */
	       "host [ port ],\n or action", /* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       nsftpkwtab,		/* addtl numeric data 1: tbl size */
	       0,			/* addtl numeric data 2: 0 = keyword */
	       xxstring,		/* Processing function */
	       sftpkwtab,		/* Keyword table */
	       &fl			/* Pointer to next FDB */
	       );
	cmfdbi(&fl,			/* Host */
	       _CMFLD,			/* fcode */
	       "",			/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );

	x = cmfdb(&kw);
	if (x == -3) {
	    printf("?sftp what?\n");
	    return(-9);
	}
	if (x < 0)
	  return(x);
	havehost = 0;
	if (cmresult.fcode == _CMFLD) {
	    havehost = 1;
	    ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Hostname */
	    cmresult.nresult = SFTP_OPN;
	}
	switch (cmresult.nresult) {	/* SFTP keyword */
	  case SFTP_OPN:		/* SFTP OPEN */
	    if (!havehost) {
		if ((x = cmfld("Host","",&s,xxstring)) < 0)
		  return(x);
		ckstrncpy(line,s,LINBUFSIZ);
	    }
	    /* Parse [ port ] [ switches ] */
	    cmfdbi(&kw,			/* Switches */
		   _CMKEY,
		   "Port number or service name,\nor switch",
		   "",
		   "",
		   nsshkrmopnsw,
		   4,
		   xxstring,
		   sshkrmopnsw,
		   &fl
		   );
	    cmfdbi(&fl,			/* Port number or service name */
		   _CMFLD,
		   "",
		   "",
		   "",
		   0,
		   0,
		   xxstring,
		   NULL,
		   NULL
		   );
	    trips = 0;			/* Explained below */
	    while (1) {			/* Parse port and switches */
		x = cmfdb(&kw);		/* Get a field */
		if (x == -3)		/* User typed CR so quit from loop */
		  break;
		if (x < 0)		/* Other parse error, pass it back */
		  return(x);
		switch (cmresult.fcode) { /* Field or Keyword? */
                  case _CMFLD:		  /* Field */
                    makestr(&ssh_tmpport,cmresult.sresult);
		    break;
		  case _CMKEY:		/* Keyword */
		    switch (cmresult.nresult) {	/* Which one? */
		      case SSHSW_USR:	        /* /USER: */
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			if ((y = cmfld("Username","",&s,xxstring)) < 0)
			  return(y);
			s = brstrip(s);
			makestr(&ssh_tmpuid,s);
			break;
                      case SSHSW_PWD:
			if (!cmgbrk()) {
			    printf("?This switch requires an argument\n");
			    return(-9);
			}
			debok = 0;
			if ((x = cmfld("Password","",&s,xxstring)) < 0) {
			    if (x == -3) {
				makestr(&ssh_tmpstr,"");
			    } else {
				return(x);
			    }
			} else {
			    s = brstrip(s);
			    if ((x = (int)strlen(s)) > PWBUFL) {
				makestr(&slmsg,"Internal error");
				printf("?Sorry, too long - max = %d\n",PWBUFL);
				return(-9);
			    }
			    makestr(&ssh_tmpstr,s);
			}
			break;

                    case SSHSW_VER:
			if ((x = cmnum("Number","",10,&z,xxstring)) < 0)
			  return(x);
			if (z < 1 || z > 2) {
			    printf("?Out of range: %d\n",z);
			    return(-9);
			}
                        tmpver = z;
			break;
                    default:
                        return(-2);
		    }
		}
		if (trips++ == 0) {	/* After first time through */
		    cmfdbi(&kw,		/* only parse switches, not port. */
			   _CMKEY,
			   "Switch",
			   "",
			   "",
			   nsshkrmopnsw,
			   4,
			   xxstring,
			   sshkrmopnsw,
			   NULL
			   );
		}
	    }
	    if ((x = cmcfm()) < 0)	/* Get confirmation */
	      return(x);
              if (clskconnx(1) < 0) {	/* Close current Kermit connection */
                  if ( ssh_tmpstr ) {
                      memset(ssh_tmpstr,0,strlen(ssh_tmpstr));
                      makestr(&ssh_tmpstr,NULL);
                  }
                  return(success = 0);
              }
              makestr(&ssh_hst,line);	/* Stash everything */
              if (ssh_tmpuid) {
                  if (!sl_uid_saved) {
                      ckstrncpy(sl_uidbuf,uidbuf,UIDBUFLEN);
                      sl_uid_saved = 1;
                  }
                  ckstrncpy(uidbuf,ssh_tmpuid,UIDBUFLEN);
                  makestr(&ssh_tmpuid,NULL);
              }
              if (ssh_tmpport) {
                  makestr(&ssh_prt,ssh_tmpport);
                  makestr(&ssh_tmpport,NULL);
              } else
                  makestr(&ssh_prt,NULL);

              /* Set the Subsystem to Kermit */
              ssh_cas = 1;
              makestr(&ssh_cmd,"sftp");

              if (tmpver > -1) {
#ifndef SSHTEST
                  if (!sl_ssh_ver_saved) {
                      sl_ssh_ver = ssh_ver;
                      sl_ssh_ver_saved = 1;
                  }
#endif /* SSHTEST */
                  ssh_ver = tmpver;
              }
              /* Disable X11 Forwarding */
#ifndef SSHTEST
              if (!sl_ssh_xfw_saved) {
                  sl_ssh_xfw = ssh_xfw;
                  sl_ssh_xfw_saved = 1;
              }
#endif /* SSHTEST */
              ssh_xfw = 0;

              if (ssh_tmpstr) {
                  if (ssh_tmpstr[0]) {
                      ckstrncpy(pwbuf,ssh_tmpstr,PWBUFL+1);
                      pwflg = 1;
                      pwcrypt = 0;
                  } else
                      pwflg = 0;
                  makestr(&ssh_tmpstr,NULL);
              }
              nettype = NET_SSH;
              if (mdmsav < 0)
                  mdmsav = mdmtyp;
              mdmtyp = -nettype;
              x = 1;

#ifndef NOSPL
            makestr(&g_pswd,pwbuf);             /* Save global pwbuf */
            g_pflg = pwflg;                     /* and flag */
            g_pcpt = pwcrypt;
#endif /* NOSPL */

	    /* Line parameter to ttopen() is ignored */
	    k = ttopen(line,&x,mdmtyp, 0);
	    if (k < 0) {
		printf("?Unable to connect to %s\n",ssh_hst);
		mdmtyp = mdmsav;
                slrestor();
		return(success = 0);
	    }
	    duplex = 0;             /* Remote echo */
	    ckstrncpy(ttname,line,TTNAMLEN); /* Record the command */
	    debug(F110,"ssh ttname",ttname,0);
	    makestr(&slmsg,NULL);	/* No SET LINE error message */
	    cxtype = CXT_SSH;
#ifndef NODIAL
	    dialsta = DIA_UNK;
#endif /* NODIAL */
	    success = 1;		/* SET LINE succeeded */
	    network = 1;		/* Network connection (not serial) */
	    local = 1;			/* Local mode (not remote) */
	    if ((reliable != SET_OFF || !setreliable))
	      reliable = SET_ON;	/* Transport is reliable end to end */
#ifdef OS2
            DialerSend(OPT_KERMIT_CONNECT, 0);
#endif /* OS2 */
	    setflow();			/* Set appropriate flow control */

	    haveline = 1;
#ifdef CKLOGDIAL
#ifdef NETCONN
	    dolognet();
#endif /* NETCONN */
#endif /* CKLOGDIAL */

#ifndef NOSPL
	    if (local) {
		if (nmac) {		/* Any macros defined? */
		    int k;		/* Yes */
		    k = mlook(mactab,"on_open",nmac); /* Look this up */
		    if (k >= 0) {	              /* If found, */
			if (dodo(k,ssh_hst,0) > -1)   /* set it up, */
			  parser(1);		      /* and execute it */
		    }
		}
	    }
#endif /* NOSPL */
#ifdef LOCUS		
	    if (autolocus)
		setlocus(1,1);
#endif /* LOCUS */

	/* Command was confirmed so we can pre-pop command level. */
	/* This is so CONNECT module won't think we're executing a */
	/* script if CONNECT was the final command in the script. */
	    if (cmdlvl > 0)
	      prepop();

            success = sftp_do_init();
	    return(success = 1);

	  case SFTP_CD:
	  case SFTP_CHGRP:
	  case SFTP_CHMOD:
	  case SFTP_CHOWN:
	  case SFTP_RM:
	  case SFTP_DIR:
	  case SFTP_GET:
	  case SFTP_MKDIR:
	  case SFTP_PUT:
	  case SFTP_PWD:
	  case SFTP_REN:
	  case SFTP_RMDIR:
	  case SFTP_LINK:
	  case SFTP_VER:
	    if ((y = cmtxt("command parameters","",&s,xxstring)) < 0) 
	      return(y);
	    if (ssh_tchk() < 0 || !ssh_cas || strcmp(ssh_cmd,"sftp")) {
		printf("?Not connected to SFTP Service\n");
		return(success = 0);
	    }
	    success = sftp_do_cmd(cmresult.nresult,s);
	    return(success);
	  default:
	    return(-2);
	}
    }
#endif /* SFTP_BUILTIN */

    if (cx == XXRLOG) {			/* RLOGIN */
#ifdef RLOGCODE
	int x,z;
#ifdef OS2
	if (!tcp_avail) {
	    printf("?Sorry, either TCP/IP is not available on this system or\n\
necessary DLLs did not load.  Use SHOW NETWORK to check network status.\n"
		   );
	    success = 0;
	    return(-9);
	} else {
#endif /* OS2 */
	    x = nettype;		/* Save net type in case of failure */
	    z = ttnproto;		/* Save protocol in case of failure */
	    nettype = NET_TCPB;
	    ttnproto = NP_RLOGIN;
	    if ((y = setlin(XYHOST,0,1)) <= 0) {
		nettype = x;		/* Failed, restore net type. */
		ttnproto = z;		/* and protocol */
		success = 0;
	    }
	    didsetlin++;
#ifdef OS2
	}
#endif /* OS2 */
	return(y);
#else
	printf("?Sorry, RLOGIN is not configured in this copy of C-Kermit.\n");
	return(-9);
#endif /* RLOGCODE */
    }
#endif /* NETCONN */
#endif /* NOLOCAL */

#ifndef NOXMIT
    if (cx == XXTRA) {			/* TRANSMIT */
	extern int xfrxla;
	int i, n, xpipe = 0, xbinary = 0, xxlate = 1, xxnowait = 0, getval;
	int xxecho = 0;
	int scan = 1;
	char c;
	struct FDB sf, sw, tx;		/* FDBs for parse functions */
#ifndef NOCSETS
	extern int tcs_transp;		/* Term charset is transparent */
#else
	int tcs_transp = 1;
#endif /* NOCSETS */

#ifdef COMMENT
	xbinary = binary;		/* Default text/binary mode */
#else
	xbinary = 0;			/* Default is text */
#endif /* COMMENT */
	xxecho = xmitx;

	cmfdbi(&sw,			/* First FDB - command switches */
	       _CMKEY,			/* fcode */
	       "Filename, or switch",	/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       nxmitsw,			/* addtl numeric data 1: tbl size */
	       4,			/* addtl numeric data 2: 4 = cmswi */
	       xxstring,		/* Processing function */
	       xmitsw,			/* Keyword table */
	       &sf			/* Pointer to next FDB */
	       );
	cmfdbi(&sf,			/* 2nd FDB - file to send */
	       _CMIFI,			/* fcode */
	       "File to transmit",	/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
#ifdef PIPESEND
	       &tx
#else
	       NULL
#endif /* PIPESEND */
	       );
#ifdef PIPESEND
        cmfdbi(&tx,
	       _CMTXT,			/* fcode */
	       "Command",		/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );
#endif /* PIPESEND */

	while (1) {
	    x = cmfdb(&sw);
	    if (x < 0)
	      return(x);
	    if (cmresult.fcode != _CMKEY)
	      break;
	    c = cmgbrk();		/* Have switch, get break character */
	    if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
		printf("?This switch does not take an argument\n");
		return(-9);
	    }
	    if (!getval && (cmgkwflgs() & CM_ARG)) {
		printf("?This switch requires an argument\n");
		return(-9);
	    }
	    n = cmresult.nresult;	/* Numeric result = switch ID */
	    switch (n) {		/* Process the switch */
#ifdef PIPESEND
	      case XMI_CMD:		/* Transmit from a command */
		if (nopush) {
		    printf("?Sorry, system command access is disabled\n");
		    return(-9);
		}
		sw.hlpmsg = "Command, or switch"; /* Change help message */
		xpipe = 1;		/* (No way to undo this one) */
		break;
#endif /* PIPESEND */

	      case XMI_BIN:		/* Binary */
		xbinary = 1;
		xxlate = 0;		/* Don't translate charsets */
		scan = 0;
		break;

	      case XMI_TXT:		/* Text */
		xbinary = 0;
		xxlate = !tcs_transp;	/* Translate if TERM CHAR not TRANSP */
		scan = 0;
		break;

	      case XMI_TRA:		/* Transparent text */
		xbinary = 0;
		xxlate = 0;		/* But don't translate charsets */
		scan = 0;
		break;

#ifdef COMMENT
	      case XMI_VRB:		/* /VERBOSE */
	      case XMI_QUI:		/* /QUIET */
		break;			/* (not implemented yet) */
#endif /* COMMENT */

	      case XMI_NOW:		/* /NOWAIT */
		xxnowait = 1;
		break;

	      case XMI_NOE:		/* /NOWAIT */
		xxecho = 0;
		break;

	      default:
		return(-2);
	    }

	}
	if (cmresult.fcode != _CMIFI && cmresult.fcode != _CMTXT)
	  return(-2);
	ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Filename */
	if (zfnqfp(line,TMPBUFSIZ,tmpbuf))
	  ckstrncpy(line,tmpbuf,LINBUFSIZ);
	s = line;
	if ((y = cmcfm()) < 0)		/* Confirm */
	  return(y);
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
	if (cmresult.nresult != 0) {
	    printf("?Only a single file may be transmitted\n");
	    return(-9);
	}
#ifdef PIPESEND
	if (xpipe) {
	    s = brstrip(s);
	    if (!*s) {
		printf("?Sorry, a command to send from is required\n");
		return(-9);
	    }
	    pipesend = 1;
	}
#endif /* PIPESEND */

	if (scan && (filepeek
#ifndef NOXFER
		     || patterns
#endif /* NOXFER */
		     )) {		/* If user didn't specify type */
	    int k, x;			      /* scan the file to see */
	    x = -1;
	    k = scanfile(s,&x,nscanfile);
	    if (k > 0) xbinary = (k == FT_BIN) ? XYFT_B : XYFT_T;
	}
	if (!xfrxla) xxlate = 0;
	success = transmit(s,
			   (char) (xxnowait ? '\0' : (char)xmitp),
			   xxlate,
			   xbinary,
			   xxecho
			   );
	return(success);
    }
#endif /* NOXMIT */

#ifndef NOFRILLS
    if (cx == XXTYP  || cx == XXCAT || cx == XXMORE ||
	cx == XXHEAD || cx == XXTAIL) {
	int paging = 0, havename = 0, head = 0, width = 0;
	int height = 0, count = 0;
	char pfxbuf[64], * prefix = NULL;
	char outfile[CKMAXPATH+1];
	struct FDB sf, sw;
	char * pat = NULL;
	int incs = 0, outcs = 0, cset = -1, number = 0;
#ifdef UNICODE
        char * tocs = "";
	extern int fileorder;
#ifdef OS2
#ifdef NT
	char guibuf[128], * gui_title = NULL;
	int  gui = 0;
#endif /* NT */
#ifndef NOCSETS
	extern int tcsr, tcsl;
#endif /* NOCSETS */
#endif /* OS2 */
#endif /* UNICODE */

	outfile[0] = NUL;

	if (cx == XXMORE)
	  paging = 1;
	else if (cx == XXCAT)
	  paging = 0;
	else
	  paging = (typ_page < 0) ? xaskmore : typ_page;
	if (paging < 0)
	  paging = saveask;

	if (cx == XXHEAD) {
	    head = 10;
	    cx = XXTYP;
	} else if (cx == XXTAIL) {
	    head = -10;
	    cx = XXTYP;
	}

#ifdef IKSD
	if (inserver && !ENABLED(en_typ)) {
	    printf("?Sorry, TYPE command disabled\n");
	    return(-9);
	}
#endif /* IKSD */

	cmfdbi(&sw,			/* 2nd FDB - optional /PAGE switch */
	       _CMKEY,			/* fcode */
	       "Filename or switch",	/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       ntypetab,		/* addtl numeric data 1: tbl size */
	       4,			/* addtl numeric data 2: 4 = cmswi */
	       xxstring,		/* Processing function */
	       typetab,			/* Keyword table */
	       &sf			/* Pointer to next FDB */
	       );
	cmfdbi(&sf,			/* 1st FDB - file to type */
	       _CMIFI,			/* fcode */
	       "",			/* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       0,			/* addtl numeric data 1 */
	       0,			/* addtl numeric data 2 */
	       xxstring,
	       NULL,
	       NULL
	       );

	while (!havename) {
	    x = cmfdb(&sw);		/* Parse something */
	    debug(F101,"type cmfdb","",x);
	    debug(F101,"type cmresult.fcode","",cmresult.fcode);
	    debug(F101,"type cmresult.nresult","",cmresult.nresult);
	    if (x < 0) {			/* Error */
		if (x == -3) {
		    x = -9;
		    printf("?Filename required\n");
		}
		return(x);
	    } else if (cmresult.fcode == _CMKEY) {
		char c; int getval;
		c = cmgbrk();
		getval = (c == ':' || c == '=');
		if (getval && !(cmgkwflgs() & CM_ARG)) {
		    printf("?This switch does not take an argument\n");
		    return(-9);
		}
#ifdef COMMENT
		if (!getval && (cmgkwflgs() & CM_ARG)) {
		    printf("?This switch requires an argument\n");
		    /* Not if it has a default! */
		    return(-9);
		}
#endif /* COMMENT */
		switch (cmresult.nresult) {
#ifdef CK_TTGWSIZ
		  case TYP_PAG:
		    paging = 1;
		    break;

		  case TYP_NOP:
		    paging = 0;
		    break;
#endif /* CK_TTGWSIZ */

		  case TYP_COU:
		    paging = 0;
		    count = 1;
		    break;

		  case TYP_HEA:
		  case TYP_TAI:
		    y = 10;
		    if (getval)
		      if ((x = cmnum("Number of lines",
				     "10",10,&y,xxstring)) < 0)
			return(x);
		    head = (cmresult.nresult == TYP_TAI) ? -y : y;
		    break;

		  case TYP_WID:
		    y = typ_wid > -1 ? typ_wid : cmd_cols;
		    if (getval)
		      if ((x = cmnum("Column at which to truncate",
				     ckitoa(y),10,&y,xxstring)) < 0)
			return(x);
		    width = y;
		    break;

#ifdef KUI
		  case TYP_HIG:
		    if (getval)
		      if ((x = cmnum("Height of GUI dialog",
				     ckitoa(y),10,&y,xxstring)) < 0)
			return(x);
		    height = y;
		    break;
#endif /* KUI */

		  case TYP_PAT:
		    if (!getval && (cmgkwflgs() & CM_ARG)) {
			printf("?This switch requires an argument\n");
			return(-9);
		    }
		    if ((x = cmfld("pattern","",&s,xxstring)) < 0)
		      return(x);
		    ckstrncpy(tmpbuf,s,TMPBUFSIZ);
		    pat = tmpbuf;
		    break;

		  case TYP_PFX:
		    if (!getval && (cmgkwflgs() & CM_ARG)) {
			printf("?This switch requires an argument\n");
			return(-9);
		    }
		    if ((x = cmfld("prefix for each line","",&s,xxstring)) < 0)
		      return(x);
		    if ((int)strlen(s) > 63) {
			printf("?Too long - 63 max\n");
			return(-9);
		    }
		    ckstrncpy(pfxbuf,s,64);
		    prefix = brstrip(pfxbuf);
		    number = 0;
		    break;

#ifdef KUI
		  case TYP_GUI:
		    if (!getval && (cmgkwflgs() & CM_ARG)) {
			printf("?This switch requires an argument\n");
			return(-9);
		    }
		    if ((x = cmfld("Dialog box title","",&s,xxstring)) < 0) {
			if (x != -3)
			  return(x);
		    } else {
			if ((int)strlen(s) > 127) {
			    printf("?Too long - 127 max\n");
			    return(-9);
			}
			ckstrncpy(guibuf,s,128);
			gui_title = brstrip(guibuf);
		    }
		    gui = 1;
		    break;
#endif /* KUI */

		  case TYP_NUM:		/* /NUMBER */
		    number = 1;
		    prefix = NULL;
		    break;

#ifdef UNICODE
		  case TYP_XPA:		/* /TRANSPARENT */
		    incs = 0;
		    cset = 0;
		    outcs = -1;
		    break;

		  case TYP_XIN:		/* /CHARACTER-SET: */
		    if (!getval && (cmgkwflgs() & CM_ARG)) {
			printf("?This switch requires an argument\n");
			return(-9);
		    }
		    if ((incs = cmkey(fcstab,nfilc,
				      "character-set name","",xxstring)) < 0) {
			if (incs == -3)	/* Note: No default */
			  incs = -2;
			return(incs);
		    }
		    cset = incs;
		    break;

		  case TYP_XUT:		/* /TRANSLATE-TO: */
		    if (!getval && (cmgkwflgs() & CM_ARG)) {
			printf("?This switch requires an argument\n");
			return(-9);
		    }
#ifdef OS2
		    if (!inserver && !k95stdout) {
			tocs = "ucs2";
		    } else {
#ifdef CKOUNI
			tocs = rlookup(txrtab,ntxrtab,tcsl);
#else /* CKOUNI */
			extern struct keytab ttcstab[];
			extern int ntxrtab;
			tocs = rlookup(ttcstab,ntermc,tocs);
			if (!tocs)
			  tocs = getdcset();
#endif /* CKOUNI */
                    }
#else /* OS2 */
		    tocs = getdcset();
#endif /* OS2 */
		    if ((outcs = cmkey(fcstab,nfilc,
				       "character-set",tocs,xxstring)) < 0)
		      return(outcs);
		    break;
#endif /* UNICODE */
		  case TYP_OUT:
		    if ((x = cmofi("File for result lines","",
				   &s,xxstring)) < 0)
		      return(x);
		    ckstrncpy(outfile,s,CKMAXPATH);
		    break;
		}
	    } else if (cmresult.fcode == _CMIFI)
	      havename = 1;
	    else
	      return(-2);
	}
	if (havename) {
	    ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
	    y = cmresult.nresult;
	} else {
	    if ((x = cmifi("Filename","",&s,&y,xxstring)) < 0) {
		if (x == -3) {
		    printf("?Name of an existing file required\n");
		    return(-9);
		} else return(x);
	    }
	    ckstrncpy(line,s,LINBUFSIZ);
	}
	if (y != 0) {
	    printf("?A single file please\n");
	    return(-9);
	}
#ifdef KUI
	if ( outfile[0] && gui ) {
	    printf("?/GUI and /OUTPUT are incompatible\n");
	    return(-9);
	}
#endif /* KUI */

	if ((y = cmcfm()) < 0)		/* Confirm the command */
	  return(y);

#ifdef UNICODE
	fileorder = -1;
	if (cset < 0 && filepeek) {	/* If no charset switches given */
	    int k, x = -1;
	    k = scanfile(line,&x,nscanfile); /* Call file analyzer */
	    debug(F111,"type scanfile",line,k);
	    debug(F101,"type scanfile flag","",x);
	    switch(k) {
	      case FT_UTF8:		/* which can detect UTF-8... */
		cset = 0;
		incs = FC_UTF8;
		break;
	      case FT_UCS2:		/* and UCS-2... */
		cset = 0;
		incs = FC_UCS2;
		fileorder = x;		/* even if there is no BOM. */
		debug(F101,"type fileorder","",fileorder);
		break;
	    }
	}
#ifdef OS2
        if (cset < 0) {			/* If input charset still not known */
#ifdef CKOUNI
            tocs = rlookup(txrtab,ntxrtab,tcsl);
#else /* CKOUNI */
            extern struct keytab ttcstab[];
            extern int ntxrtab;
            tocs = rlookup(ttcstab,ntermc,incs);
            if (!tocs)
	      tocs = getdcset();
#endif /* CKOUNI */
            incs = lookup(fcstab,tocs,nfilc,&x);
        }
#endif /* OS2 */

        if (outcs == 0 && incs != 0) {	/* Supply default target charset */
	    int x = 0;			/* if switch not given. */
	    tocs = getdcset();
	    outcs = lookup(fcstab,tocs,nfilc,&x);
	}
#else  /* !UNICODE */
	if (cset < 0) incs = outcs = 0;
#endif /* UNICODE */

	if (outfile[0] && paging)	/* This combination makes no sense */
	  paging = 0;			/* so turn off paging */

#ifdef KUI
	/* No paging when dialog is used */
	if ( gui && paging )
	  paging = 0;

	if ( !gui && height ) {
	    printf("?The /HEIGHT switch is not supported without /GUI\n");
	    return(-9);
	}
#endif /* KUI */

	if (count) paging = -1;
	debug(F111,"type",line,paging);
#ifdef KUI
	if ( gui ) {
	    s = (char *)1;    /* ok, its an ugly hack */
	    if (gui_text_popup_create(gui_title ?
				      gui_title : line, height,width) < 0) {
		printf("?/GUI not supported on this system\n");
		gui = 0;
		return(-9);
	    }
	    width = 0;
	} else
#endif /* KUI */
	  s = outfile;
	success =
	  dotype(line,paging,0,head,pat,width,prefix,incs,outcs,s,number);
	return(success);
    }
#endif /* NOFRILLS */

#ifndef NOCSETS
    if (cx == XXXLA) {			/* TRANSLATE file's charset */
	_PROTOTYP (int doxlate, ( void ) );
	return(doxlate());
    }
#endif /* NOCSETS */

    if (cx == XXVER) {			/* VERSION */
	int n = 0;
	extern char * ck_patch, * ck_s_test;
#ifdef COMMENT
	extern int hmtopline;
#endif /* COMMENT */
	if ((y = cmcfm()) < 0)
          return(y);

	printf("\n%s, for%s\n Numeric: %ld",versio,ckxsys,vernum);
	printf("\n\n");
        printf("Authors:\n");
	printf(" Frank da Cruz, Columbia University\n");
        printf(" Jeffrey Eric Altman, Secure Endpoints, Inc. %s\n",
	       "<jaltman@secure-endpoints.com>"
	       );
	printf(" Contributions from many others.\n");
	n = 7;
	if (*ck_s_test) {
	    printf("\nTHIS IS A TEST VERSION, NOT FOR PRODUCTION USE.\n");
	    n += 2;
	}
	if (*ck_patch) {
	    printf(" Patches: %s\n", ck_patch);
	    n++;
	}
	printf(" Type COPYRIGHT for copyright and license.\n\n");
#ifdef OS2
	shoreg();
#else
#ifdef COMMENT
	hmtopline = n+1;
	hmsga(copyright);
	hmtopline = 0;
#endif /* COMMENT */
#endif /* OS2 */
	return(success = 1);
    }

    if (cx == XXCPR) {			/* COPYRIGHT or LICENSE */
	if ((y = cmcfm()) < 0)
          return(y);
#ifdef OS2
	if (inserver) {			/* Free WIKSD */
	    extern char * wiksdcpr[];
	    hmsga(wiksdcpr);
	} else
#endif /* OS2 */
	  hmsga(copyright);
	return(success = 1);
    }

#ifndef MAC				/* Only for multiuser systems */
#ifndef OS2
#ifndef NOFRILLS
    if (cx == XXWHO) {			/* WHO */
	char *wc;
#ifdef IKSD
	if (inserver && !ENABLED(en_who)) {
	    printf("?Sorry, WHO command disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef datageneral
	if ((z = cmcfm()) < 0) return(z);
	if (nopush) {
	    printf("?Sorry, who not allowed\n");
	    return(success = 0);
	}
        xsystem(WHOCMD);
#else
	if ((y = cmtxt("user name","",&s,xxstring)) < 0) return(y);
        if (nopush) {
	    printf("?Sorry, WHO command disabled\n");
	    return(success = 0);
	}
	if (!(wc = getenv("CK_WHO"))) wc = WHOCMD;
	if (wc)
	  if ((int) strlen(wc) > 0) {
	      ckmakmsg(line,LINBUFSIZ,wc," ",s,NULL);
	      xsystem(line);
	  }
#endif /* datageneral */
	return(success = 1);
    }
#endif /* NOFRILLS */
#endif /* OS2 */
#endif /* MAC */

#ifndef NOFRILLS
    if (cx == XXWRI || cx == XXWRL || cx == XXWRBL) { /* WRITE */
	int x,y;			/* On stack in case of \fexec() */
	if ((x = cmkey(writab,nwri,"to file or log","",xxstring)) < 0) {
	    if (x == -3) printf("?Write to what?\n");
	    return(x);
	}
	if ((y = cmtxt("text","",&s,xxstring)) < 0) return(y);
	s = brstrip(s);
	switch (x) {
	  case LOGD: y = ZDFILE; break;
	  case LOGP: y = ZPFILE; break;
#ifndef NOLOCAL
	  case LOGS: y = ZSFILE; break;
#endif /* NOLOCAL */
	  case LOGT: y = ZTFILE; break;
#ifndef NOSPL
	  case LOGW: y = ZWFILE; break;
#endif /* NOSPL */
	  case LOGX:			/* SCREEN (stdout) */
	  case LOGE:			/* ERROR  (stderr) */
	    if (x == LOGE) {
		debug(F110,
		      (cx == XXWRL) ? "WRITELN ERROR" : "WRITE ERROR", s,0);
		fprintf(stderr,"%s%s",s,(cx == XXWRL) ? "\n" : "");
	    } else {
		debug(F110,
		      (cx == XXWRL) ? "WRITELN SCREEN" : "WRITE SCREEN", s,0);
		printf("%s%s",s,(cx == XXWRL) ? "\n" : "");
	    }
	    return(success = 1);
	  default: return(-2);
	}
	if (chkfn(y) > 0) {
	    x = (cx == XXWRI) ? zsout(y,s) : zsoutl(y,s);
	    if (x < 0) printf("?Write error\n");
	} else {
	    x = -1;
	    printf("?File or log not open\n");
	}
	return(success = (x == 0) ? 1 : 0);
    }
#endif /* NOFRILLS */

#ifndef NOXFER
    if (cx == XXASC || cx == XXBIN) {
	if ((x = cmcfm()) < 0) return(x);
#ifdef NEWFTP
	if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
	  return(success = doftptyp((cx == XXASC) ? 0 : 1));
#endif /* NEWFTP */
	binary = (cx == XXASC) ? XYFT_T : XYFT_B;
	return(success = 1);
    }
#endif /* NOXFER */

    if (cx == XXCLS) {
	if ((x = cmcfm()) < 0) return(x);
	y = ck_cls();
	return(success = (y > -1) ? 1 : 0);
    }

#ifdef CK_MKDIR
    if (cx == XXMKDIR || cx == XXLMKD) {
	char *p;
#ifdef LOCUS
	if (!locus && cx != XXLMKD) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZMKD));
#endif /* NOXFER */
        }
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && !ENABLED(en_mkd)) {
	    printf("?Sorry, directory creation is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	if ((x = cmfld("Name for new directory","",&s,xxstring)) < 0) {
	    if (x != -3) {
		return(x);
	    } else {
		printf("?Directory name required\n");
		return(-9);
	    }
	}
	ckstrncpy(line,s,LINBUFSIZ);
	s = line;
	if ((x = cmcfm()) < 0) return(x);
	s = brstrip(s);
	bgchk();			/* Set msgflg */
	x = ckmkdir(0,s,&p,msgflg,0);
#ifdef COMMENT
	if (msgflg && x == 0)
	  printf("?Directory already exists\n");
#endif /* COMMENT */
	return(success = (x < 0) ? 0 : 1);
    }
    if (cx == XXRMDIR || cx == XXLRMD) { /* RMDIR */
	char *p;
#ifdef LOCUS
	if (!locus && cx != XXLRMD) {
#ifdef NOXFER
	    return(-2);
#else
	    return(dormt(XZRMD));
#endif /* NOXFER */
        }
#endif /* LOCUS */
#ifdef IKSD
	if (inserver && !ENABLED(en_rmd)) {
	    printf("?Sorry, directory removal is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
	if ((x = cmdir("Name of directory to be removed","",&s,xxstring)) < 0)
	  return(x);
	ckstrncpy(line,s,LINBUFSIZ);
	s = line;
	if ((x = cmcfm()) < 0) return(x);
	s = brstrip(s);
	x = ckmkdir(1,s,&p,msgflg,0);
	return(success = (x < 0) ? 0 : 1);
    }
#endif /* CK_MKDIR */

#ifdef TNCODE
    if (cx == XXTELOP)
      return(dotelopt());
#endif /* TNCODE */

#ifndef NOPUSH
    if (cx == XXNPSH) {
	if ((z = cmcfm()) < 0) return(z);
        nopush = 1;
#ifndef NOSERVER
        en_hos = 0;
#endif /* NOSERVER */
#ifdef PIPESEND
	usepipes = 0;
#endif /* PIPESEND */
        return(success = 1);
    }
#endif /* NOPUSH */

#ifdef OS2
    if (cx == XXNSCR) {
	if ((z = cmcfm()) < 0) return(z);
        tt_scroll = 0;
        return(success = 1);
    }
#endif /* OS2 */

#ifndef NOSPL
    if (cx == XXLOCAL)			/* LOCAL variable declarations */
      return(success = dolocal());
#endif /* NOSPL */

    if (cx == XXKERMI) {		/* The KERMIT command */
	char * list[65];
	extern char **xargv;
	extern int xargc;
	int i;
	if ((y = cmtxt("kermit command-line arguments, -h for help",
		       "",&s,xxstring)) < 0)
	  return(y);
	ckstrncpy(line,"kermit ",LINBUFSIZ);
	ckstrncat(line,s,LINBUFSIZ-8);
	xwords(line,64,list,0);
	for (i = 1; i < 64; i++) {
	    if (!list[i])
	      break;
	}
	i--;
	xargc = i;
	xargv = list;
	xargv++;
	sstate = cmdlin();
	if (sstate) {
	    extern int justone;
	    debug(F000,"KERMIT sstate","",sstate);
	    justone = 1;		/* Force return to command mode */
	    proto();			/* after protocol */
	    return(success);
	} else {
	    debug(F101,"KERMIT sstate","",sstate);
	    return(success = 1);	/* Not exactly right, but... */
	}
    }
    if (cx == XXDATE) {			/* DATE command */
	extern char cmdatebuf[], * cmdatemsg;

#ifndef COMMENT
	char * dp;
	if ((y = cmtxt("date and/or time, or carriage return for current",
		       "",&s,xxstring)) < 0)
	  return(y);
	s = brstrip(s);
	dp = cmcvtdate(s,1);
	if (!dp) {
	    printf("?%s\n",cmdatemsg ? cmdatemsg : "Date conversion error");
	    success = 0;
	} else {
	    printf("%s\n",dp);
	    success = 1;
	}
#else
	/* This works fine but messes up my "dates" torture-test script */

	if ((x = cmdate("Date and/or time, or carriage return for current",
			"",&s,0,xxstring)) < 0) {
	    return(x);
	} else {
	    printf("%s\n",cmdatebuf);
	    success = 1;
	}
#endif /* COMMENT */
	return(success);
    }
#ifndef NOPUSH
#ifndef NOFRILLS
    if (cx == XXEDIT)
      return(doedit());
#endif /* NOFRILLS */
#endif /* NOPUSH */

#ifdef BROWSER				/* Defined only ifndef NOPUSH */
    if (cx == XXBROWS)
      return(dobrowse());
#endif /* BROWSER */

#ifdef CK_TAPI
    if (cx == XXTAPI) {			/* Microsoft TAPI */
	return (success = dotapi());
    }
#endif /* CK_TAPI */

#ifndef NOXFER
    if (cx == XXWHERE) {
	extern char * rfspec, * sfspec, * srfspec, * rrfspec;
	if ((x = cmcfm()) < 0) return(x);
	printf("\nFile most recently...\n\n");
	printf("  Sent:       %s\n",   sfspec ? sfspec : "(none)");
	if (sfspec && srfspec) {
	    printf("  Stored as:  %s\n",   srfspec);
	    printf("\n");
	}
	printf("  Received:   %s\n",   rrfspec ? rrfspec : "(none)");
	if (rfspec && rrfspec)
	printf("  Stored as:  %s\n",   rfspec);
	printf(
"\nIf the full path is not shown, then the file is probably in your current\n"
	       );
	printf(
"directory or your download directory (if any - SHOW FILE to find out).\n\n"
	       );
	return(success = 1);
    }
#endif /* NOXFER */

#ifdef CK_RECALL
    if (cx == XXREDO)
      return(doredo());
#endif /* CK_RECALL */

#ifdef CKROOT
    if (cx == XXCHRT)			/* Change Kermit's root directory */
      return(dochroot());
#endif /* CKROOT */

#ifdef CK_KERBEROS
    if (cx == XXAUTH) {			/* KERBEROS */
	x = cp_auth();			/* Parse it */
#ifdef IKSD
        if (inserver) {
            printf("?Command disabled in IKSD.\r\n");
            return(success = 0);
        }
#endif /* IKSD */
	if (x < 0)			/* Pass parse errors back */
	  return(x);
	return(success = doauth(cx));
    }
#endif /* CK_KERBEROS */

#ifndef NOLOCAL
    if (cx == XXTERM) {
	return(settrmtyp());
    }
#endif /* NOLOCAL */

    if (cx == XXSTATUS) {
	if ((x = cmcfm()) < 0) return(x);
	printf( " %s\n", success ? "SUCCESS" : "FAILURE" );
	return(0);			/* Don't change it */
    }

    if (cx == XXFAIL) {
	if ((x = cmcfm()) < 0) return(x);
	return(success = 0);
    }

    if (cx == XXSUCC) {
	if ((x = cmcfm()) < 0) return(x);
	return(success = 1);
    }

    if (cx == XXNLCL) {
	extern int nolocal;
	if ((x = cmcfm()) < 0) return(x);
	nolocal = 1;
	return(success = 1);
    }

#ifndef NOXFER
    if (cx == XXRASG)			/* Shortcuts for REMOTE commands */
      return(dormt(XZASG));
    if (cx == XXRCWD)
      return(dormt(XZCWD));
    if (cx == XXRCPY)
      return(dormt(XZCPY));
    if (cx == XXRDEL)
      return(dormt(XZDEL));
    if (cx == XXRDIR)
      return(dormt(XZDIR));
    if (cx == XXRXIT)
      return(dormt(XZXIT));
    if (cx == XXRHLP)
      return(dormt(XZHLP));
    if (cx == XXRHOS)
      return(dormt(XZHOS));
    if (cx == XXRKER)
      return(dormt(XZKER));
    if (cx == XXRPWD)
      return(dormt(XZPWD));
    if (cx == XXRQUE)
      return(dormt(XZQUE));
    if (cx == XXRREN)
      return(dormt(XZREN));
    if (cx == XXRMKD)
      return(dormt(XZMKD));
    if (cx == XXRRMD)
      return(dormt(XZRMD));
    if (cx == XXRSET)
      return(dormt(XZSET));
    if (cx == XXRSPA)
      return(dormt(XZSPA));
    if (cx == XXRTYP)
      return(dormt(XZTYP));
    if (cx == XXRWHO)
      return(dormt(XZWHO));
    if (cx == XXRCDUP)
      return(dormt(XZCDU));
    if (cx == XXRPRI)
      return(dormt(XZPRI));
#endif /* NOXFER */

    if (cx == XXRESET) {		/* RESET */
	if ((x = cmcfm()) < 0)
	  return(x);
	doclean(0);			/* Close all files */
	return(success = 1);
    }

#ifndef NOXFER
#ifndef NOCSETS
    if (cx == XXASSOC)			/* ASSOCIATE */
      return(doassoc());
#endif /* NOCSETS */
#endif /* NOXFER */

#ifndef NOSPL
    if (cx == XXSHIFT) {		/* SHIFT */
	if ((y = cmnum("Number of arguments to shift","1",10,&x,xxstring)) < 0)
	  return(y);
	if ((z = cmcfm()) < 0)
	  return(z);
	return(success = doshift(x));
    }
#endif /* NOSPL */

#ifndef NOHELP
    if (cx == XXMAN)
      return(domanual());
#endif /* NOHELP */

#ifndef NOSPL
    if (cx == XXSORT)			/* SORT an array */
      return(dosort());
#endif /* NOSPL */

    if (cx == XXPURGE) {
#ifdef IKSD
	if (inserver && (!ENABLED(en_del)
#ifdef CK_LOGIN
                          || isguest
#endif /* CK_LOGIN */
			 )) {
	    printf("?Sorry, DELETE is disabled\n");
	    return(-9);
	}
#endif /* IKSD */
#ifdef CK_APC
	if ((apcactive == APC_LOCAL) ||
	    ((apcactive == APC_REMOTE) && (!(apcstatus & APC_UNCH))))
	  return(success = 0);
#endif /* CK_APC */
#ifdef CKPURGE
        return(dopurge());
#else
#ifdef VMS
	if ((x = cmtxt("optional switches followed by filespec",
		       "",&s,xxstring)) < 0)
	  return(x);
	if (nopush) {
	    printf("?Sorry, DCL access is disabled\n");
	    return(-9);
	}
	ckstrncpy(line,s,LINBUFSIZ);
	s = line;
	x = mlook(mactab,"purge",nmac);
	return(success = dodo(x,s,cmdstk[cmdlvl].ccflgs));
#else
	return(-2);
#endif /* VMS */
#endif /* CKPURGE */
    }

#ifndef NOSPL
    if (cx == XXFAST) {
	if ((x = cmcfm()) < 0) return(x);
	x = mlook(mactab,"fast",nmac);
	return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
    }
    if (cx == XXCAU) {
	if ((x = cmcfm()) < 0) return(x);
	x = mlook(mactab,"cautious",nmac);
	return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
    }
    if (cx == XXROB) {
	if ((x = cmcfm()) < 0) return(x);
	x = mlook(mactab,"robust",nmac);
	return(success = dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
    }
#endif /* NOSPL */

    if (cx == XXSCRN) {			/* SCREEN */
	int row, col;
	if ((x = cmkey(scntab, nscntab,"screen action","", xxstring)) < 0)
	  return(x);
	switch (x) {			/* MOVE-TO (cursor position) */
	  case SCN_MOV:
	    if ((y = cmnum("Row (1-based)","",10,&z,xxstring)) < 0)
	      return(y);
	    row = z;
	    y = cmnum("Column (1-based)","1",10,&z,xxstring);
	    if (y < 0)
	      return(y);
	    col = z;
	    if ((y = cmcfm()) < 0)
	      return(y);
	    if (row < 0 || col < 0) {
		printf("?Row and Column must be 1 or greater\n");
		return(-9);
	    }
	    if (cmd_rows > 0 && row > cmd_rows)
	      row = cmd_rows;
	    if (cmd_cols > 0 && col > cmd_cols)
	      col = cmd_cols;
	    y = ck_curpos(row,col);
	    return(success = (y > -1) ? 1 : 0);

	  case SCN_CLR:			/* CLEAR */
	    if ((y = cmcfm()) < 0)
	      return(y);
	    debug(F100,"screen calling ck_cls()","",0);
	    y = ck_cls();
	    return(success = (y > -1) ? 1 : 0);

	  case SCN_CLE:			/* CLEOL */
	    if ((y = cmcfm()) < 0)
	      return(y);
	    y = ck_cleol();
	    return(success = (y > -1) ? 1 : 0);
	}
    }

#ifndef NOHTTP
#ifdef TCPSOCKET
    if (cx == XXHTTP)
      return(dohttp());
#endif /* TCPSOCKET */
#endif /* NOHTTP */

#ifndef NOSPL
    if (cx == XXARRAY) {		/* ARRAY */
#ifndef NOSHOW
	extern int showarray();
#endif /* NOSHOW */
	if ((x = cmkey(arraytab, narraytab,"Array operation","",xxstring)) < 0)
	  return(x);
	switch (x) {
	  case ARR_DCL:
	    return(dodcl(XXDCL));
	  case ARR_SRT:
	    return(dosort());
#ifndef NOSHOW
	  case ARR_SHO:
	    return(showarray());
#endif /* NOSHOW */
	  case ARR_CPY:
	    return(copyarray());
	  case ARR_SET:
	  case ARR_CLR:
	    return(clrarray(x));
	  case ARR_DST:
	    return(unarray());
	  case ARR_RSZ:
	    return(rszarray());
	  case ARR_EQU:
	    return(linkarray());

	  default:
	    printf("?Sorry, not implemented yet - \"%s\"\n",cmdbuf);
	    return(-9);
	}
    }
    if (cx == XXTRACE)
      return(dotrace());
#endif /* NOSPL */

#ifdef CK_PERMS
#ifdef UNIX
    if (cx == XXCHMOD)
      return(douchmod());		/* Do Unix chmod */
#endif /* UNIX */
#endif /* CK_PERMS */

    if (cx == XXPROMP)
      return(doprompt());

    if (cx == XXGREP)
      return(dogrep());

    if (cx == XXDEBUG) {		/* DEBUG */
#ifndef DEBUG
	int dummy = 0;
	return(seton(&dummy));
#else
	return(seton(&deblog));
#endif /* DEBUG */
    }

#ifdef CKLEARN
    if (cx == XXLEARN) {		/* LEARN */
	struct FDB of, sw, cm;
	int closing = 0, off = 0, on = 0, confirmed = 0;
	char c;

	cmfdbi(&sw,			/* 2nd FDB - optional /PAGE switch */
	       _CMKEY,			/* fcode */
	       "Script file name, or switch", /* hlpmsg */
	       "",			/* default */
	       "",			/* addtl string data */
	       3,			/* addtl numeric data 1: tbl size */
	       4,			/* addtl numeric data 2: 4 = cmswi */
	       xxstring,		/* Processing function */
	       learnswi,		/* Keyword table */
	       &of			/* Pointer to next FDB */
	       );
	cmfdbi(&of,_CMOFI,"","","",0,0,xxstring,NULL,&cm);
	cmfdbi(&cm,_CMCFM,"","","",0,0,NULL,NULL,NULL);
	line[0] = NUL;

	while (!confirmed) {
	    x = cmfdb(&sw);		/* Parse something */
	    if (x < 0)
	      return(x);
	    switch (cmresult.fcode) {	/* What was it? */
	      case _CMOFI:		/* Output file name */
		ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
		break;
	      case _CMKEY:		/* Switch */
		c = cmgbrk();
		if ((c == ':' || c == '=') && !(cmgkwflgs() & CM_ARG)) {
		    printf("?This switch does not take an argument\n");
		    return(-9);
		}
		switch (cmresult.nresult) {
		  case 2:		/* /CLOSE */
		    closing = 1;	/* Fall thru on purpose */
		  case 0:		/* /OFF */
		    off = 1;
		    on = 0;
		    break;
		  case 1:		/* /ON */
		    on = 1;
		    off = 0;
		    break;
		}
		break;
	      case _CMCFM:		/* Confirmation */
		confirmed++;
		break;
	    }
	}
	if (closing) {
	    if (learnfp) {
		fclose(learnfp);
		learnfp = NULL;
	    }
	    makestr(&learnfile,NULL);
	}
	if (line[0]) {
	    if (!on && !off)
	      on = 1;
	    if (learnfp) {
		fclose(learnfp);
		learnfp = NULL;
	    }
	    makestr(&learnfile,line);
	    if (learnfile) {
		char * modes = "w";
		learnfp = fopen(learnfile,modes);
		if (!learnfp) {
		    debug(F110,"LEARN file open error",learnfile,0);
		    perror(learnfile);
		    return(-9);
		} else {
#ifdef ZFNQFP
		    if (zfnqfp(learnfile,TMPBUFSIZ,tmpbuf))
		      makestr(&learnfile,tmpbuf);
#endif /* ZFNQFP */
		    debug(F110,"LEARN file open ok",learnfile,0);
		    if (!quiet) {
			printf("Recording to %s...\n\n",learnfile);
			printf(
" WARNING: If you type your password during script recording, it will appear\n\
 in the file.  Be sure to edit it or take other appropriate precautions.\n\n"
			       );
		    }
		    fputs(  "; Scriptfile: ",learnfp);
		    fputs(learnfile,learnfp);
		    fputs("\n; Directory:  ",learnfp);
		    fputs(zgtdir(),learnfp);
		    fputs("\n; Recorded:   ",learnfp);
		    fputs(ckdate(),learnfp);
		    fputs("\n",learnfp);
		}
	    }
	}
	if (on) {
	    learning = 1;
	} else if (off) {
	    learning = 0;
	}
	debug(F101,"LEARN learning","",learning);
	return(success = 1);
    }
#endif /* CKLEARN */

#ifdef NEWFTP
    if (cx == XXUSER || cx == XXACCT) {
	if (!ftpisopen()) {
	    printf("?FTP connection is not open\n");
	    return(-9);
	}
	return(success = (cx == XXUSER) ? doftpusr() : doftpacct());
    }
    if (cx == XXSITE || cx == XXPASV) {
	if (!ftpisopen()) {
	    printf("?FTP connection is not open\n");
	    return(-9);
	}
	return(success = (cx == XXSITE) ? doftpsite() : dosetftppsv());
    }
#endif /* NEWFTP */

    if (cx == XXORIE) {			/* ORIENTATION */
	extern char * myname;
	int i, y, n = 0;
        char * s, *p, vbuf[32];
	char * vars[16];       char * legend[16];

	if ((y = cmcfm()) < 0)
	  return(y);

	printf("\nProgram name:\n  %s\n\n",myname);
	n += 4;

#ifdef NT
	vars[0] = "home";      legend[0] = "Your home directory";
	vars[1] = "directory"; legend[1] = "K95's current directory";
	vars[2] = "exedir";    legend[2] = "K95 Program directory";
	vars[3] = "inidir";    legend[3] = "K95 Initialization file directory";
	vars[4] = "startup";   legend[4] = "Current directory when started";
	
        vars[5] = "common";
        legend[5] = "K95 data for all users and K95SITE.INI file";
	
        vars[6] = "personal";  legend[6] = "Your personal data directory tree";
        vars[7] = "desktop";   legend[7] = "Your deskop directory tree";
	
        vars[8] = "appdata";
        legend[8] = "Your personal K95 data tree and K95CUSTOM.INI file";
	
        vars[9] = "download";  legend[9] = "Your K95 download directory";
        vars[10] = "tmpdir";   legend[10] = "Your TEMP directory";
	vars[11] = NULL;       legend[11] = NULL;

	for (i = 0; i < 16 && vars[i]; i++) {
	    printf("%s:\n",legend[i]);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	    ckmakmsg(vbuf,32,"\\v(",vars[i],")",NULL);
	    printf("  Variable:   %s\n",vbuf);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	    y = TMPBUFSIZ;
	    s = tmpbuf;
	    zzstring(vbuf,&s,&y);
	    line[0] = NUL;
	    ckGetLongPathName(tmpbuf,line,LINBUFSIZ);
	    printf("  Long name:  %s\n",line);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	    line[0] = NUL;
	    GetShortPathName(tmpbuf,line,LINBUFSIZ);
	    printf("  Short name: %s\n",line);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
            printf("\n");
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	}
#else  /* NT */

	vars[0] = "home";      legend[0] = "Your home directory";
	vars[1] = "directory"; legend[1] = "Kermit's current directory";
	vars[2] = "exedir";    legend[2] = "Kermit's program directory";
	vars[3] = "inidir";    legend[3] = "Initialization file directory";
	vars[4] = "startup";   legend[4] = "Current directory when started";
	vars[5] = "download";  legend[5] = "Kermit download directory";
	vars[6] = NULL;	       legend[6] = NULL;

	for (i = 0; i < 16 && vars[i]; i++) {
	    printf("%s:\n",legend[i]);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	    ckmakmsg(vbuf,32,"\\v(",vars[i],")",NULL);
	    printf("  Variable: %s\n",vbuf);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	    y = TMPBUFSIZ;
	    s = tmpbuf;
	    zzstring(vbuf,&s,&y);
            printf("  Value:    %s\n",tmpbuf);
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
            printf("\n");
	    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
	}
#endif /* NT */
	return(success = 1);
    }

#ifdef NT
    if (cx == XXDIALER) {
        StartDialer();
        return(success = 1);
    }
#endif /* NT */

    if (cx == XXCONT) {			/* CONTINUE */
	if ((x = cmcfm()) < 0)
	  return(x);
	if (!xcmdsrc) {			/* At prompt: continue script */
	    if (cmdlvl > 0)
	      popclvl();		/* Pop command level */
	    return(success = 1);	/* always succeeds */
#ifndef NOSPL
	} else {			/* In script: whatever... */
	    x = mlook(mactab,"continue",nmac);
	    /* Don't set success */
	    return(dodo(x,NULL,cmdstk[cmdlvl].ccflgs));
#endif /* NOSPL */
	}
    }
    if (cx == XXNOTAV) {		/* Command in table not available */
	ckstrncpy(tmpbuf,atmbuf,TMPBUFSIZ);
	if ((x = cmtxt("Rest of command","",&s,NULL)) < 0)
	  return(x);
	printf("Sorry, \"%s\" not configured in this version of Kermit.\n",
	       tmpbuf
	       );
	return(success = 0);
    }
    return(-2);				/* None of the above */

} /* end of docmd() */

#endif /* NOICP */
