Merge branch 'patches/030_fix-if-else' into patches/040_pam-password-prompting
[ckermit.git] / .pc / 030_fix-if-else.patch / ckuus6.c
diff --git a/.pc/030_fix-if-else.patch/ckuus6.c b/.pc/030_fix-if-else.patch/ckuus6.c
deleted file mode 100644 (file)
index 5dcd828..0000000
+++ /dev/null
@@ -1,10878 +0,0 @@
-#include "ckcsym.h"
-#ifndef NOICP
-
-/*  C K U U S 6 --  "User Interface" for Unix Kermit (Part 6)  */
-
-/*
-  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.
-*/
-
-/* Includes */
-
-#include "ckcdeb.h"
-#include "ckcasc.h"
-#include "ckcker.h"
-#include "ckuusr.h"
-#include "ckcxla.h"
-#include "ckcnet.h"                     /* Network symbols */
-#include <signal.h>
-
-#ifdef VMS
-#ifndef TCPSOCKET
-#include <errno.h>
-#endif /* TCPSOCKET */
-#endif /* VMS */
-
-#ifdef datageneral
-#define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd)
-#endif /* datageneral */
-
-#ifdef QNX6
-#define readblock kreadblock
-#endif /* QNX6 */
-
-/* External Kermit Variables, see ckmain.c for description. */
-
-extern xx_strp xxstring;
-
-extern int local, xitsta, binary, parity, escape, flow, cmd_rows, turn,
-  turnch, duplex, ckxech, seslog, dfloc, cnflg, tlevel, pflag, msgflg, mdmtyp,
-  zincnt, quiet, repars, techo, network, nzxopts, what, filepeek, recursive;
-
-extern int xaskmore, tt_rows, tt_cols, cmd_cols, g_matchdot, diractive,
-  xcmdsrc, nscanfile, reliable, nolinks;
-
-#ifdef VMSORUNIX
-extern int zgfs_dir, zgfs_link;
-#endif /* VMSORUNIX */
-
-#ifdef CK_IFRO
-  extern int remonly;
-#endif /* CK_IFRO */
-
-#ifdef OS2
-extern int StartedFromDialer ;
-extern int vmode;
-extern int k95stdout;
-#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 "ckntap.h"
-#endif /* NT */
-#include "ckocon.h"
-#endif /* OS2 */
-
-extern long vernum, speed;
-extern char *versio, *protv, *ckxv, *ckzv, *fnsv, *connv, *dftty, *cmdv;
-extern char *dialv, *loginv, *for_def[], *whil_def[], *xif_def[], *sw_def[];
-extern char *foz_def[];
-extern char *ckxsys, *ckzsys;
-#ifndef OS2
-extern char *DIRCMD;
-#ifndef UNIX
-extern char *DELCMD;
-#endif /* UNIX */
-#endif /* OS2 */
-extern char ttname[], filnam[];
-extern CHAR sstate, feol;
-extern char *zinptr;
-
-#ifdef UNIX
-extern char ** mtchs;                   /* zxpand() file list */
-#endif /* UNIX */
-
-#ifndef NOXFER
-extern int oopts, omode, oname, opath;  /* O-Packet options */
-
-extern int stdinf, sndsrc, size, rpsiz, urpsiz, fncnv, fnrpath, displa,
-  stdouf, isguest, pktlog, nfils, keep, maxrps, fblksiz, frecl, frecfm,
-  atcapr, atdiso, spsizf, spsiz, spsizr, spmax, wslotr, prefixing,
-  fncact, fnspath, nprotos, g_proto, g_urpsiz, g_spsizf,
-  g_spsiz, g_spsizr, g_spmax, g_wslotr, g_prefixing, g_fncact, g_fncnv,
-  g_fnspath, g_fnrpath, xfrxla, g_xfrxla;
-
-extern char *cmarg, *cmarg2;
-
-#ifndef NOMSEND                         /* Multiple SEND */
-extern char *msfiles[];
-#endif /* NOMSEND */
-extern char fspec[];                    /* Most recent filespec */
-extern int fspeclen;
-
-#ifdef CK_TMPDIR
-extern int f_tmpdir;                    /* Directory changed temporarily */
-extern char savdir[];                   /* For saving current directory */
-#endif /* CK_TMPDIR */
-
-extern struct keytab protos[];          /* File transfer protocols */
-extern struct ck_p ptab[NPROTOS];
-#endif /* NOXFER */
-
-#ifdef DCMDBUF                          /* Declarations from cmd package */
-extern char *cmdbuf, *atmbuf;           /* Command buffers */
-#else
-extern char cmdbuf[], atmbuf[];         /* Command buffers */
-#endif /* DCMDBUF */
-
-extern int nopush;
-
-#ifndef NOSPL
-int askflag = 0;                        /* ASK-class command active */
-extern char **a_ptr[];
-extern int a_dim[];
-extern char **m_xarg[];
-extern int n_xarg[];
-extern struct mtab *mactab;
-extern int nmac;
-extern long ck_alarm;
-extern char alrm_date[], alrm_time[];
-extern int x_ifnum;
-#endif /* NOSPL */
-
-extern int inserver;                    /* I am IKSD */
-extern int backgrd;                     /* Kermit executing in background */
-extern char psave[];                    /* For saving & restoring prompt */
-extern char *tp;                        /* Temporary buffer */
-
-int readblock = 4096;                   /* READ buffer size */
-CHAR * readbuf = NULL;                  /* Pointer to read buffer */
-int readsize = 0;                       /* Number of chars actually read */
-int getcmd = 0;                         /* GET-class command was given */
-
-extern int zchkod, zchkid;
-
-struct keytab deltab[] = {              /* DELETE Command Options */
-    { "/all",           DEL_ALL,  CM_INV },
-    { "/after",         DEL_AFT,  CM_ARG },
-    { "/ask",           DEL_ASK,  0 },
-    { "/before",        DEL_BEF,  CM_ARG },
-    { "/directories",   DEL_DIR,  0 },
-    { "/dotfiles",      DEL_DOT,  0 },
-    { "/except",        DEL_EXC,  CM_ARG },
-    { "/heading",       DEL_HDG,  0 },
-    { "/l",             DEL_LIS,  CM_INV|CM_ABR },
-    { "/larger-than",   DEL_LAR,  CM_ARG },
-    { "/list",          DEL_LIS,  0 },
-    { "/log",           DEL_LIS,  CM_INV },
-    { "/noask",         DEL_NAS,  0 },
-    { "/nodotfiles",    DEL_NOD,  0 },
-    { "/noheading",     DEL_NOH,  0 },
-    { "/nol",           DEL_NOL,  CM_INV|CM_ABR },
-    { "/nolist",        DEL_NOL,  0 },
-    { "/nolog",         DEL_NOL,  CM_INV },
-    { "/nopage",        DEL_NOP,  0 },
-    { "/not-after",     DEL_NAF,  CM_ARG },
-    { "/not-before",    DEL_NBF,  CM_ARG },
-    { "/not-since",     DEL_NAF,  CM_INV|CM_ARG },
-    { "/page",          DEL_PAG,  0 },
-    { "/quiet",         DEL_QUI,  CM_INV },
-    { "/recursive",     DEL_REC,  0 },
-    { "/simulate",      DEL_SIM,  0 },
-    { "/since",         DEL_AFT,  CM_ARG|CM_INV },
-    { "/smaller-than",  DEL_SMA,  CM_ARG },
-    { "/summary",       DEL_SUM,  0 },
-    { "/tree",          DEL_ALL,  0 },
-    { "/type",          DEL_TYP,  CM_ARG },
-    { "/verbose",       DEL_VRB,  CM_INV }
-};
-int ndeltab = sizeof(deltab)/sizeof(struct keytab);
-
-/* /QUIET-/VERBOSE (/LIST-/NOLIST) (/LOG-/NOLOG) table */
-
-struct keytab qvswtab[] = {
-    { "/l",           DEL_LIS,  CM_INV|CM_ABR },
-    { "/list",        DEL_LIS,  0 },
-    { "/log",         DEL_LIS,  CM_INV },
-    { "/nol",         DEL_NOL,  CM_INV|CM_ABR },
-    { "/nolist",      DEL_NOL,  0 },
-    { "/nolog",       DEL_NOL,  CM_INV },
-    { "/quiet",       DEL_QUI,  CM_INV },
-    { "/verbose",     DEL_VRB,  CM_INV }
-};
-int nqvswtab = sizeof(qvswtab)/sizeof(struct keytab);
-
-struct keytab copytab[] = {
-    { "/append",      998,      0 },
-#ifndef NOSPL
-    { "/fromb64",     997,      0 },
-#endif /* NOSPL */
-    { "/l",           DEL_LIS,  CM_INV|CM_ABR },
-    { "/list",        DEL_LIS,  0 },
-    { "/log",         DEL_LIS,  CM_INV },
-    { "/nol",         DEL_NOL,  CM_INV|CM_ABR },
-    { "/nolist",      DEL_NOL,  0 },
-    { "/nolog",       DEL_NOL,  CM_INV },
-    { "/quiet",       DEL_QUI,  CM_INV },
-    { "/swap-bytes",  999,      0 },
-#ifndef NOSPL
-    { "/tob64",       996,      0 },
-#endif /* NOSPL */
-    { "/verbose",     DEL_VRB,  CM_INV }
-};
-int ncopytab = sizeof(copytab)/sizeof(struct keytab);
-
-#ifndef NOXFER
-static struct keytab gettab[] = {       /* GET options */
-    { "/as-name",         SND_ASN, CM_ARG },
-    { "/binary",          SND_BIN, 0 },
-#ifdef CALIBRATE
-    { "/calibrate",       SND_CAL, CM_INV },
-#endif /* CALIBRATE */
-#ifdef PIPESEND
-    { "/command",         SND_CMD, CM_PSH },
-#endif /* PIPESEND */
-    { "/delete",          SND_DEL, 0 },
-    { "/except",          SND_EXC, CM_ARG },
-    { "/filenames",       SND_NAM, CM_ARG },
-#ifdef PIPESEND
-    { "/filter",          SND_FLT, CM_ARG|CM_PSH },
-#endif /* PIPESEND */
-#ifdef VMS
-    { "/image",           SND_IMG, 0 },
-    { "/labeled",         SND_LBL, 0 },
-#else
-    { "/image",           SND_BIN, CM_INV },
-#endif /* VMS */
-#ifdef CK_TMPDIR
-    { "/move-to",         SND_MOV, CM_ARG },
-#endif /* CK_TMPDIR */
-    { "/pathnames",       SND_PTH, CM_ARG },
-    { "/pipes",           SND_PIP, CM_ARG|CM_PSH },
-    { "/quiet",           SND_SHH, 0 },
-#ifdef CK_RESEND
-    { "/recover",         SND_RES, 0 },
-#endif /* CK_RESEND */
-    { "/recursive",       SND_REC, 0 },
-    { "/rename-to",       SND_REN, CM_ARG },
-#ifdef COMMENT
-    { "/smaller-than",    SND_SMA, CM_ARG },
-#endif /* COMMENT */
-    { "/subdirectories",  SND_REC, CM_INV },
-    { "/text",            SND_TXT, 0 },
-    { "/transparent",     SND_XPA, 0 }
-};
-#define NGETTAB sizeof(gettab)/sizeof(struct keytab)
-static int ngettab = NGETTAB;
-
-static struct keytab rcvtab[] = {       /* RECEIVE options */
-    { "/as-name",         SND_ASN, CM_ARG },
-    { "/binary",          SND_BIN, 0 },
-#ifdef CALIBRATE
-    { "/calibrate",       SND_CAL, CM_INV },
-#endif /* CALIBRATE */
-#ifdef PIPESEND
-    { "/command",         SND_CMD, CM_PSH },
-#endif /* PIPESEND */
-    { "/except",          SND_EXC, CM_ARG },
-    { "/filenames",       SND_NAM, CM_ARG },
-#ifdef PIPESEND
-    { "/filter",          SND_FLT, CM_ARG|CM_PSH },
-#endif /* PIPESEND */
-#ifdef VMS
-    { "/image",           SND_IMG, 0 },
-    { "/labeled",         SND_LBL, 0 },
-#else
-    { "/image",           SND_BIN, CM_INV },
-#endif /* VMS */
-#ifdef CK_TMPDIR
-    { "/move-to",         SND_MOV, CM_ARG },
-#endif /* CK_TMPDIR */
-    { "/pathnames",       SND_PTH, CM_ARG },
-    { "/pipes",           SND_PIP, CM_ARG|CM_PSH },
-#ifdef CK_XYZ
-    { "/protocol",        SND_PRO, CM_ARG },
-#else
-    { "/protocol",        SND_PRO, CM_ARG|CM_INV },
-#endif /* CK_XYZ */
-    { "/quiet",           SND_SHH, 0 },
-    { "/recursive",       SND_REC, 0 },
-    { "/rename-to",       SND_REN, CM_ARG },
-    { "/text",            SND_TXT, 0 },
-    { "/transparent",     SND_XPA, 0 }
-};
-#define NRCVTAB sizeof(rcvtab)/sizeof(struct keytab)
-static int nrcvtab = NRCVTAB;
-#endif /* NOXFER */
-
-/* WAIT table */
-
-#define WAIT_FIL 997
-#define WAIT_MDM 998
-
-struct keytab waittab[] = {
-    { "cd",            BM_DCD,   CM_INV }, /* (Carrier Detect) */
-    { "cts",           BM_CTS,   CM_INV }, /* (Clear To Send)  */
-    { "dsr",           BM_DSR,   CM_INV }, /* (Data Set Ready) */
-    { "file",          WAIT_FIL, 0 },      /* New category selector keywords */
-    { "modem-signals", WAIT_MDM, 0 },      /* ... */
-    { "ri",            BM_RNG,   CM_INV }  /* (Ring Indicator) */
-};
-int nwaittab = (sizeof(waittab) / sizeof(struct keytab));
-
-/* Modem signal table */
-
-struct keytab mstab[] = {
-    { "cd",    BM_DCD, 0 },             /* Carrier Detect */
-    { "cts",   BM_CTS, 0 },             /* Clear To Send  */
-    { "dsr",   BM_DSR, 0 },             /* Data Set Ready */
-    { "ri",    BM_RNG, 0 }              /* Ring Indicator */
-};
-int nms = (sizeof(mstab) / sizeof(struct keytab));
-
-#define WF_MOD 1
-#define WF_DEL 2
-#define WF_CRE 3
-
-struct keytab wfswi[] = {               /* WAIT FILE switches */
-    { "creation",     WF_CRE, 0 },      /* Wait for file to be created */
-    { "deletion",     WF_DEL, 0 },      /* Wait for file to be deleted */
-    { "modification", WF_MOD, 0 }       /* Wait for file to be modified */
-};
-int nwfswi = (sizeof(wfswi) / sizeof(struct keytab));
-
-#ifndef NOSPL
-struct keytab asgtab[] = {              /* Assignment operators for "." */
-    { "::=", 2, 0 },                    /* ASSIGN and EVALUATE */
-    { ":=",  1, 0 },                    /* ASSIGN */
-    { "=",   0, 0 }                     /* DEFINE */
-};
-int nasgtab = (sizeof(asgtab) / sizeof(struct keytab));
-
-struct keytab opntab[] = {
-#ifndef NOPUSH
-    { "!read",  OPN_PI_R, CM_INV },
-    { "!write", OPN_PI_W, CM_INV },
-#endif /* NOPUSH */
-    { "append", OPN_FI_A, 0 },
-    { "host",   OPN_NET,  0 },
-#ifdef OS2
-    { "line",   OPN_SER,  CM_INV },
-    { "port",   OPN_SER,  0 },
-#else
-    { "line",   OPN_SER,  0 },
-    { "port",   OPN_SER,  CM_INV },
-#endif /* OS2 */
-    { "read",   OPN_FI_R, 0 },
-    { "write",  OPN_FI_W, 0 }
-};
-int nopn = (sizeof(opntab) / sizeof(struct keytab));
-
-/* IF conditions */
-
-#define  XXIFCO 0       /* IF COUNT */
-#define  XXIFER 1       /* IF ERRORLEVEL */
-#define  XXIFEX 2       /* IF EXIST */
-#define  XXIFFA 3       /* IF FAILURE */
-#define  XXIFSU 4       /* IF SUCCESS */
-#define  XXIFNO 5       /* IF NOT */
-#define  XXIFDE 6       /* IF DEFINED */
-#define  XXIFEQ 7       /* IF EQUAL (strings) */
-#define  XXIFAE 8       /* IF = (numbers) */
-#define  XXIFLT 9       /* IF < (numbers) */
-#define  XXIFGT 10      /* IF > (numbers) */
-#define  XXIFLL 11      /* IF Lexically Less Than (strings) */
-#define  XXIFLG 12      /* IF Lexically Greater Than (strings) */
-#define  XXIFEO 13      /* IF EOF (READ file) */
-#define  XXIFBG 14      /* IF BACKGROUND */
-#define  XXIFNU 15      /* IF NUMERIC */
-#define  XXIFFG 16      /* IF FOREGROUND */
-#define  XXIFDI 17      /* IF DIRECTORY */
-#define  XXIFNE 18      /* IF NEWER */
-#define  XXIFRO 19      /* IF REMOTE-ONLY */
-#define  XXIFAL 20      /* IF ALARM */
-#define  XXIFSD 21      /* IF STARTED-FROM-DIALER */
-#define  XXIFTR 22      /* IF TRUE */
-#define  XXIFNT 23      /* IF FALSE */
-#define  XXIFTM 24      /* IF TERMINAL-MACRO */
-#define  XXIFEM 25      /* IF EMULATION */
-#define  XXIFOP 26      /* IF OPEN */
-#define  XXIFLE 27      /* IF <= */
-#define  XXIFGE 28      /* IF >= */
-#define  XXIFIP 29      /* IF INPATH */
-#define  XXIFTA 30      /* IF TAPI */
-#define  XXIFMA 31      /* IF MATCH */
-#define  XXIFFL 32      /* IF FLAG */
-#define  XXIFAB 33      /* IF ABSOLUTE */
-#define  XXIFAV 34      /* IF AVAILABLE */
-#define  XXIFAT 35      /* IF ASKTIMEOUT */
-#define  XXIFRD 36      /* IF READABLE */
-#define  XXIFWR 37      /* IF WRITEABLE */
-#define  XXIFAN 38      /* IF ... AND ... */
-#define  XXIFOR 39      /* IF ... OR ... */
-#define  XXIFLP 40      /* IF left parenthesis */
-#define  XXIFRP 41      /* IF right parenthesis */
-#define  XXIFNQ 42      /* IF != (== "NOT =") */
-#define  XXIFQU 43      /* IF QUIET */
-#define  XXIFCK 44      /* IF C-KERMIT */
-#define  XXIFK9 45      /* IF K-95 */
-#define  XXIFMS 46      /* IF MS-KERMIT */
-#define  XXIFWI 47      /* IF WILD */
-#define  XXIFLO 48      /* IF LOCAL */
-#define  XXIFCM 49      /* IF COMMAND */
-#define  XXIFFP 50      /* IF FLOAT */
-#define  XXIFIK 51      /* IF IKS */
-#define  XXIFKB 52      /* IF KBHIT */
-#define  XXIFKG 53      /* IF KERBANG */
-#define  XXIFVE 54      /* IF VERSION */
-#define  XXIFDC 55      /* IF DECLARED */
-#define  XXIFGU 56      /* IF GUI */
-
-struct keytab iftab[] = {               /* IF commands */
-    { "!",          XXIFNO, 0 },
-    { "!=",         XXIFNQ, 0 },
-    { "&&",         XXIFAN, 0 },
-    { "(",          XXIFLP, 0 },
-    { ")",          XXIFRP, 0 },
-    { "<",          XXIFLT, 0 },
-    { "<=",         XXIFLE, 0 },
-    { "=",          XXIFAE, 0 },
-    { "==",         XXIFAE, CM_INV },
-    { ">",          XXIFGT, 0 },
-    { ">=",         XXIFGE, 0 },
-    { "absolute",   XXIFAB, 0 },
-    { "alarm",      XXIFAL, 0 },
-    { "and",        XXIFAN, 0 },
-    { "asktimeout", XXIFAT, 0 },
-    { "available",  XXIFAV, 0 },
-    { "background", XXIFBG, 0 },
-    { "c-kermit",   XXIFCK, 0 },
-    { "command",    XXIFCM, 0 },
-    { "count",      XXIFCO, 0 },
-    { "dcl",        XXIFDC, CM_INV },
-    { "declared",   XXIFDC, 0 },
-    { "defined",    XXIFDE, 0 },
-#ifdef CK_TMPDIR
-    { "directory",  XXIFDI, 0 },
-#endif /* CK_TMPDIR */
-    { "emulation",  XXIFEM, 0 },
-#ifdef COMMENT
-    { "eof",        XXIFEO, 0 },
-#endif /* COMMENT */
-    { "equal",      XXIFEQ, 0 },
-    { "error",      XXIFFA, CM_INV },
-    { "exist",      XXIFEX, 0 },
-    { "failure",    XXIFFA, 0 },
-    { "false",      XXIFNT, 0 },
-    { "flag",       XXIFFL, 0 },
-#ifdef CKFLOAT
-    { "float",      XXIFFP, 0 },
-#endif /* CKFLOAT */
-    { "foreground", XXIFFG, 0 },
-#ifdef OS2
-    { "gui",        XXIFGU, 0 },
-#else
-    { "gui",        XXIFGU, CM_INV },
-#endif /* OS2 */
-#ifdef IKSD
-    { "iksd",       XXIFIK, 0 },
-#else
-    { "iksd",       XXIFIK, CM_INV },
-#endif /* IKSD */
-    { "integer",    XXIFNU, CM_INV },
-    { "k-95",       XXIFK9, 0 },
-    { "kbhit",      XXIFKB, 0 },
-#ifdef UNIX
-    { "kerbang",    XXIFKG, 0 },
-#else
-    { "kerbang",    XXIFKG, CM_INV },
-#endif /* UNIX */
-    { "lgt",        XXIFLG, 0 },
-    { "llt",        XXIFLL, 0 },
-    { "local",      XXIFLO, 0 },
-    { "match",      XXIFMA, 0 },
-    { "ms-kermit",  XXIFMS, CM_INV },
-#ifdef ZFCDAT
-    { "newer",      XXIFNE, 0 },
-#endif /* ZFCDAT */
-    { "not",        XXIFNO, 0 },
-    { "numeric",    XXIFNU, 0 },
-    { "ok",         XXIFSU, CM_INV },
-    { "open",       XXIFOP, 0 },
-    { "or",         XXIFOR, 0 },
-    { "quiet",      XXIFQU, 0 },
-    { "readable",   XXIFRD, 0 },
-    { "remote-only",XXIFRO, 0 },
-    { "started-from-dialer",XXIFSD, CM_INV },
-    { "success",    XXIFSU, 0 },
-    { "tapi",       XXIFTA, 0 },
-#ifdef OS2
-    { "terminal-macro", XXIFTM, 0 },
-#else
-    { "terminal-macro", XXIFTM, CM_INV },
-#endif /* OS2 */
-    { "true",       XXIFTR, 0 },
-    { "version",    XXIFVE, 0 },
-    { "wild",       XXIFWI, 0 },
-    { "writeable",  XXIFWR, 0 },
-    { "||",         XXIFOR, 0 },
-    { "", 0, 0 }
-};
-int nif = (sizeof(iftab) / sizeof(struct keytab)) - 1;
-
-struct keytab iotab[] = {               /* Keywords for IF OPEN */
-    { "!read-file",      ZRFILE, CM_INV },
-    { "!write-file",     ZWFILE, CM_INV },
-    { "append-file",     ZWFILE, CM_INV },
-    { "connection",      8888,   0 },
-#ifdef CKLOGDIAL
-    { "cx-log",          7777,   0 },
-#endif /* CKLOGDIAL */
-    { "debug-log",       ZDFILE, 0 },
-    { "error",           9999,   0 },
-    { "packet-log",      ZPFILE, 0 },
-    { "read-file",       ZRFILE, 0 },
-    { "screen",          ZSTDIO, 0 },
-    { "session-log",     ZSFILE, 0 },
-    { "transaction-log", ZTFILE, 0 },
-    { "write-file",      ZWFILE, 0 }
-};
-int niot = (sizeof(iotab) / sizeof(struct keytab));
-#endif /* NOSPL */
-
-/* Variables and prototypes */
-
-#ifdef NETCONN
-extern int nnetdir;                     /* How many network directories */
-#endif /* NETCONN */
-#ifdef CK_SECURITY
-_PROTOTYP(int ck_krb4_is_installed,(void));
-_PROTOTYP(int ck_krb5_is_installed,(void));
-_PROTOTYP(int ck_ntlm_is_installed,(void));
-_PROTOTYP(int ck_srp_is_installed,(void));
-_PROTOTYP(int ck_ssleay_is_installed,(void));
-_PROTOTYP(int ck_ssh_is_installed,(void));
-_PROTOTYP(int ck_crypt_is_installed,(void));
-#else
-#define ck_krb4_is_installed() (0)
-#define ck_krb5_is_installed() (0)
-#define ck_ntlm_is_installed() (0)
-#define ck_srp_is_installed() (0)
-#define ck_ssleay_is_installed() (0)
-#define ck_ssh_is_installed() (0)
-#define ck_crypt_is_installed() (0)
-#endif /* CK_SECURITY */
-
-#define AV_KRB4   1
-#define AV_KRB5   2
-#define AV_NTLM   3
-#define AV_SRP    4
-#define AV_SSL    5
-#define AV_CRYPTO 6
-#define AV_SSH    7
-
-struct keytab availtab[] = {             /* Available authentication types */
-    { "crypto",     AV_CRYPTO, CM_INV }, /* and encryption */
-    { "encryption", AV_CRYPTO, 0 },
-    { "k4",         AV_KRB4,   CM_INV },
-    { "k5",         AV_KRB5,   CM_INV },
-    { "kerberos4",  AV_KRB4,   0 },
-    { "kerberos5",  AV_KRB5,   0 },
-    { "krb4",       AV_KRB4,   CM_INV },
-    { "krb5",       AV_KRB5,   CM_INV },
-    { "ntlm",       AV_NTLM,   0 },
-    { "srp",        AV_SRP,    0 },
-    { "ssh",        AV_SSH,    0 },
-    { "ssl",        AV_SSL,    0 },
-    { "tls",        AV_SSL,    0 },
-    { "",           0,         0 }
-};
-int availtabn = sizeof(availtab)/sizeof(struct keytab)-1;
-
-#ifndef NODIAL
-_PROTOTYP(static int ddcvt, (char *, FILE *, int) );
-_PROTOTYP(static int dncvt, (int, int, int, int) );
-_PROTOTYP(char * getdname, (void) );
-
-static int partial  = 0;                /* For partial dial */
-static char *dscopy = NULL;
-int dialtype = -1;
-
-char *dialnum = (char *)0;              /* Remember DIAL number for REDIAL */
-int dirline = 0;                        /* Dial directory line number */
-extern char * dialdir[];                /* Dial directory file names */
-extern int dialdpy;                     /* DIAL DISPLAY on/off */
-extern int ndialdir;                    /* How many dial directories */
-extern int ntollfree;                   /* Toll-free call info */
-extern int ndialpxx;                    /* List of PBX exchanges */
-extern char *dialtfc[];
-char * matchpxx = NULL;                 /* PBX exchange that matched */
-extern int nlocalac;                    /* Local area-code list */
-extern char * diallcac[];
-extern int tttapi;
-#ifdef CK_TAPI
-extern int tapiconv;                    /* TAPI Conversions */
-extern int tapipass;                    /* TAPI Passthrough */
-#endif /* CK_TAPI */
-extern int dialatmo;
-extern char * dialnpr, * dialsfx;
-extern char * dialixp, * dialixs, * dialmac;
-extern char * dialldp, * diallds, * dialtfp;
-extern char * dialpxi, * dialpxo, * diallac;
-extern char * diallcp, * diallcs, * diallcc;
-extern char * dialpxx[];
-
-extern int dialcnf;                     /* DIAL CONFIRMATION */
-int dialfld = 0;                        /* DIAL FORCE-LONG-DISTANCE */
-int dialsrt = 1;                        /* DIAL SORT ON */
-int dialrstr = 6;                       /* DIAL RESTRICTION */
-int dialtest = 0;                       /* DIAL TEST */
-int dialcount = 0;                      /* \v(dialcount) */
-
-extern int dialsta;                     /* Dial status */
-int dialrtr = -1,                       /* Dial retries */
-    dialint = 10;                       /* Dial retry interval */
-extern long dialcapas;                  /* Modem capabilities */
-extern int dialcvt;                     /* DIAL CONVERT-DIRECTORY */
-#endif /* NODIAL */
-
-#ifndef NOSPL
-#define IFCONDLEN 256
-int ifc,                                /* IF case */
-    not = 0,                            /* Flag for IF NOT */
-    ifargs = 0;                         /* Count of IF condition words */
-char ifcond[IFCONDLEN];                 /* IF condition text */
-char *ifcp;                             /* Pointer to IF condition text */
-#ifdef DCMDBUF
-extern int
- *ifcmd,  *count,  *iftest, *intime,
- *inpcas, *takerr, *merror, *xquiet;
-#else
-extern int ifcmd[];                     /* Last command was IF */
-extern int iftest[];                    /* Last IF was true */
-extern int count[];                     /* For IF COUNT, one for each cmdlvl */
-extern int intime[];                    /* Ditto for other stackables... */
-extern int inpcas[];
-extern int takerr[];
-extern int merror[];
-extern int xquiet[];
-#endif /* DCMDBUF */
-#else
-extern int takerr[];
-#endif /* NOSPL */
-
-#ifdef DCMDBUF
-extern char *line;                      /* Character buffer for anything */
-extern char *tmpbuf;
-#else
-extern char line[], tmpbuf[];
-#endif /* DCMDBUF */
-extern char *lp;                        /* Pointer to line buffer */
-
-int cwdf = 0;                           /* CWD has been done */
-
-/* Flags for ENABLE/DISABLE */
-extern int en_cwd, en_cpy, en_del, en_dir, en_fin,
-   en_get, en_hos, en_ren, en_sen, en_set, en_spa, en_typ, en_who, en_bye,
-   en_asg, en_que, en_ret, en_mai, en_pri, en_mkd, en_rmd, en_xit, en_ena;
-
-extern FILE *tfile[];                   /* File pointers for TAKE command */
-extern char *tfnam[];                   /* Names of TAKE files */
-extern int tfline[];                    /* TAKE-file line number */
-
-extern int success;                     /* Command success/failure flag */
-extern int cmdlvl;                      /* Current position in command stack */
-
-#ifndef NOSPL
-extern int maclvl;                      /* Macro to execute */
-extern char *macx[];                    /* Index of current macro */
-extern char *mrval[];                   /* Macro return value */
-extern char *macp[];                    /* Pointer to macro */
-extern int macargc[];                   /* ARGC from macro invocation */
-
-#ifdef COMMENT
-extern char *m_line[];
-#endif /* COMMENT */
-
-extern char *m_arg[MACLEVEL][NARGS];    /* Stack of macro arguments */
-extern char *g_var[];                   /* Global variables %a, %b, etc */
-
-#ifdef DCMDBUF
-extern struct cmdptr *cmdstk;           /* The command stack itself */
-#else
-extern struct cmdptr cmdstk[];          /* The command stack itself */
-#endif /* DCMDBUF */
-#endif /* NOSPL */
-
-#define xsystem(s) zsyscmd(s)
-
-static int x, y, z = 0;
-static char *s, *p;
-
-#ifdef OS2
-_PROTOTYP( int os2settitle, (char *, int) );
-#endif /* OS2 */
-
-extern struct keytab yesno[], onoff[], fntab[];
-extern int nyesno, nfntab;
-
-#ifndef NOSPL
-
-/* Do the ASK, ASKQ, GETOK, and READ commands */
-
-int asktimedout = 0;
-
-#define ASK_PUP 1
-#define ASK_TMO 2
-#define ASK_GUI 3
-#define ASK_QUI 4
-#define ASK_DEF 5
-
-static struct keytab asktab[] = {
-    {  "/default", ASK_DEF, CM_ARG },
-    {  "/gui",     ASK_GUI,      
-#ifdef KUI
-           0
-#else /* KUI */
-           CM_INV
-#endif /* KUI */
-    },
-    { "/popup",    ASK_PUP,   
-#ifdef OS2
-           0
-#else /* OS2 */
-           CM_INV
-#endif /* OS2 */
-    },
-    { "/quiet",    ASK_QUI, 0 },
-    { "/timeout",  ASK_TMO, CM_ARG },
-    { "", 0, 0 }
-};
-static int nasktab = sizeof(asktab)/sizeof(struct keytab)-1;
-
-int
-doask(cx) int cx; {
-    extern int cmflgs, asktimer, timelimit;
-#ifdef CK_RECALL
-    extern int on_recall;
-#endif /* CK_RECALL */
-    int popupflg = 0;
-    int guiflg = 0;
-    int nomsg = 0;
-    int mytimer = 0;
-#ifdef CK_APC
-    extern int apcactive, apcstatus;
-#endif /* CK_APC */
-
-    char dfbuf[1024];                  /* Buffer for default answer */
-    char * dfanswer = NULL;            /* Pointer to it */
-
-    char vnambuf[VNAML+1];              /* Buffer for variable names */
-    char *vnp = NULL;                   /* Pointer to same */
-    
-    dfbuf[0] = NUL;
-    vnambuf[0] = NUL;
-
-#ifdef CK_APC
-    if ( apcactive != APC_INACTIVE && (apcstatus & APC_NOINP) ) {
-        return(success = 0);
-    }
-#endif /* CK_APC */
-
-    mytimer = asktimer;                 /* Inherit global ASK timer */
-
-    if (cx == XXASK || cx == XXASKQ) {
-        struct FDB sw, fl;
-        int getval;
-        char c;
-        if (cx == XXASKQ)               /* Don't log ASKQ response */
-          debok = 0;
-        cmfdbi(&sw,                     /* First FDB - command switches */
-               _CMKEY,                  /* fcode */
-               "Variable name or switch",
-               "",                      /* default */
-               "",                      /* addtl string data */
-               nasktab,                 /* addtl numeric data 1: tbl size */
-               4,                       /* addtl numeric data 2: 4 = cmswi */
-               xxstring,                /* Processing function */
-               asktab,                  /* Keyword table */
-               &fl                      /* Pointer to next FDB */
-               );
-        cmfdbi(&fl,                     /* Anything that doesn't match */
-               _CMFLD,                  /* 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 */
-            if (x < 0)
-              return(x);
-            if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
-              break;
-            c = cmgbrk();
-            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);
-            }
-            switch (cmresult.nresult) {
-             case ASK_QUI:
-               nomsg = 1;
-               break;
-              case ASK_PUP:
-                popupflg = 1;
-                break;
-             case ASK_GUI:
-               guiflg = 1;
-               break;
-              case ASK_TMO: {
-                  if ((y = cmnum("seconds","1",10,&x,xxstring)) < 0)
-                    return(y);
-                  if (x < 0)
-                    x = 0;
-                  mytimer = x;
-                  break;
-              }
-              case ASK_DEF: {
-                  if ((y = cmfld("Text to supply if reply is empty",
-                                "",&s,xxstring)) < 0)
-                    return(y);
-                 ckstrncpy(dfbuf,s,1024);
-                 dfanswer = dfbuf;
-                  break;
-              }
-              default: return(-2);
-            }
-        }
-        /* Have variable name, make copy. */
-        ckstrncpy(vnambuf,cmresult.sresult,VNAML);
-        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);
-        }
-    } else if (cx != XXGOK && cx != XXRDBL) { /* Get variable name */
-        if ((y = cmfld("Variable name","",&s,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 (cx == XXREA || cx == XXRDBL) {  /* READ or READBLOCK command */
-        if ((y = cmcfm()) < 0)          /* Get confirmation */
-          return(y);
-        if (chkfn(ZRFILE) < 1) {        /* File open? */
-            printf("?Read file not open\n");
-            return(success = 0);
-        }
-        if (!(s = (char *)readbuf)) {           /* Where to read into. */
-            printf("?Oops, no READ buffer!\n");
-            return(success = 0);
-        }
-        y = zsinl(ZRFILE, s, readblock); /* Read a line. */
-        debug(F111,"read zsinl",s,y);
-        if (y < 0) {                    /* On EOF or other error, */
-            zclose(ZRFILE);             /* close the file, */
-            delmac(vnp,0);              /* delete the variable, */
-            return(success = 0);        /* and return failure. */
-        } else {                        /* Read was OK. */
-            readsize = (int) strlen(s);
-            success = (addmac(vnp,s) < 0 ? 0 : 1); /* Define variable */
-            debug(F111,"read addmac",vnp,success);
-            return(success);            /* Return success. */
-        }
-    }
-
-    /* ASK, ASKQ, GETOK, or GETC */
-
-    if (cx == XXGOK) {                 /* GETOK can take switches */
-        struct FDB sw, fl;
-        int getval;
-        char c;
-        cmfdbi(&sw,                     /* First FDB - command switches */
-               _CMKEY,                  /* fcode */
-               "Variable name or question prompt",
-               "",                      /* default */
-               "",                      /* addtl string data */
-               nasktab,                 /* addtl numeric data 1: tbl size */
-               4,                       /* addtl numeric data 2: 4 = cmswi */
-               xxstring,                /* Processing function */
-               asktab,                  /* Keyword table */
-               &fl                      /* Pointer to next FDB */
-               );
-        cmfdbi(&fl,                     /* Anything that doesn't match */
-               _CMTXT,                  /* 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 */
-            if (x < 0)
-              return(x);
-            if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
-              break;
-            c = cmgbrk();
-            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);
-            }
-            switch (cmresult.nresult) {
-              case ASK_PUP:
-                popupflg = 1;
-                break;
-             case ASK_GUI:
-               guiflg = 1;
-               break;
-              case ASK_TMO: {
-                  if ((y = cmnum("seconds","1",10,&x,xxstring)) < 0)
-                    return(y);
-                  if (x < 0)
-                    x = 0;
-                  mytimer = x;
-                  break;
-              }
-              case ASK_DEF: {
-                  if ((y = cmfld("Text to supply if reply is empty",
-                                "",&s,xxstring)) < 0)
-                    return(y);
-                 ckstrncpy(dfbuf,s,1024);
-                 dfanswer = dfbuf;
-                  break;
-              }
-             case ASK_QUI:
-               nomsg = 1;
-               break;
-              default: return(-2);
-            }
-       }
-       p = cmresult.sresult;
-    } else
-      if ((y = cmtxt(
-"Prompt,\n\
- enclose in { braces } or \" quotes \" to preserve leading and trailing\n\
- spaces, precede question mark with backslash (\\).",
-                   "",&p,xxstring)) < 0)
-        return(y);
-
-    if (!p) p = "";
-#ifndef NOLOCAL
-#ifdef OS2
-    if (popupflg) {                     /* Popup requested */
-        int len = -1;
-        ckstrncpy(tmpbuf,brstrip(p),TMPBUFSIZ);
-        p = tmpbuf;
-        if (cx == XXASK || cx == XXASKQ) {
-            if (cx == XXASK)
-              len = popup_readtext(vmode,NULL,p,line,LINBUFSIZ,mytimer);
-            else
-              len = popup_readpass(vmode,NULL,p,line,LINBUFSIZ,mytimer);
-            asktimedout = ( len < 0 && mytimer );
-        } else if (cx == XXGOK) {
-           printf("?Sorry, GETOK /POPUP not implemented yet\n");
-           timelimit = 0;
-           return(-9);
-       }
-        if (len >= 0) {
-           y = addmac(vnp,(char *)line); /* Add it to the macro table. */
-        } else if ( asktimedout && dfanswer ) {
-            y = addmac(vnp,dfanswer);      /* Add it to the macro table. */
-            asktimedout = 0;
-            len = 0;
-        }
-        timelimit = 0;
-        return(success = ((len >= 0) && (y >= 0)) && !asktimedout);
-    }
-#ifdef KUI
-    if (guiflg) {                       /* GUI requested */
-        int rc, n;
-       char * s1;
-       s1 = tmpbuf;
-       n = TMPBUFSIZ-1;
-       zzstring(brstrip(p),&s1,&n);
-        p = tmpbuf;
-        if (cx == XXASK || cx == XXASKQ) {
-            rc = gui_txt_dialog(NULL,p,(cx == XXASK),
-                                line,LINBUFSIZ,dfanswer,mytimer);
-            asktimedout = (rc == -1 && mytimer);
-            if (rc == 1) {
-                y = addmac(vnp,(char *)line); /* Add it to the macro table. */
-            } else if ( asktimedout && dfanswer ) {
-                y = addmac(vnp,dfanswer); /* Add default to macro table. */
-                asktimedout = 0;
-                rc = 1;
-            }
-           timelimit = 0;
-           return(success = (rc == 1 && (y >= 0)) && !asktimedout);
-       } else if (cx == XXGOK) {
-           int x;
-           x = lookup(yesno,dfanswer,nyesno,NULL);
-           if (x != 1) x = 2;
-           rc = uq_ok(NULL, p, 3, NULL, x);
-           return(success = (rc == 1));
-       }
-    }
-#endif /* KUI */
-#endif /* OS2 */
-#endif /* NOLOCAL */
-
-    concb((char)escape);                /* Enter CBREAK mode */
-    cmsavp(psave,PROMPTL);              /* Save old prompt */
-    cmsetp(brstrip(p));                 /* Make new prompt */
-reprompt:
-    if (cx == XXASKQ) {                 /* For ASKQ, */
-        cmini(0);                       /* no-echo mode. */
-    } else {                            /* For others, regular echoing. */
-        cmini(ckxech);
-    }
-    askflag = 1;
-    x = -1;                             /* This means to reparse. */
-    cmflgs = 0;
-    if (pflag)
-      prompt(xxstring);                 /* Issue prompt. */
-
-    asktimedout = 0;                    /* Handle timed responses. */
-    timelimit = mytimer;
-reparse:
-    cmres();
-    if (cx == XXGOK) {                  /* GETOK */
-#ifdef CK_RECALL
-        on_recall = 0;
-#endif /* CK_RECALL */
-        askflag = 0;
-       /* GETOK uses keyword table */
-        x = cmkey(yesno,nyesno,"",dfanswer,xxstring);
-        if (x < 0) {                    /* Parse error */
-            if (x == -10) {
-               char * ds;
-               ds = dfanswer ? dfanswer : "No";
-               if (!nomsg)
-                 printf("?Timed out, assuming \"%s\"",ds);
-               printf("\n");
-                asktimedout = 1;
-               x = lookup(yesno,ds,nyesno,NULL);
-               if (x != 1) x = 0;
-                goto gokdone;
-            } else if (x == -3) {       /* No answer? */
-                printf("Please respond Yes or No\n"); /* Make them answer */
-                cmini(ckxech);
-                goto reprompt;
-            } else if (x == -1) {
-                goto reparse;
-            } else
-              goto reprompt;
-        }
-        if (cmcfm() < 0)                /* Get confirmation */
-          goto reparse;
-  gokdone:
-        askflag = 0;
-        cmsetp(psave);                  /* Restore prompt */
-#ifdef VMS
-        if (cmdlvl > 0)                 /* In VMS and not at top level, */
-          conres();                     /*  restore console again. */
-#endif /* VMS */
-        timelimit = 0;
-        return(x);                      /* Return success or failure */
-    } else if (cx == XXGETC             /* GETC */
-#ifdef OS2
-               || cx == XXGETK          /* or GETKEYCODE */
-#endif /* OS2 */
-               ) {                      /* GETC */
-        char tmp[16];
-        conbin((char)escape);           /* Put keyboard in raw mode */
-#ifndef NOSETKEY
-#ifdef OS2
-        if (cx == XXGETK) {             /* GETKEYCODE */
-            extern int os2gks;
-            int t;
-            t = os2gks;                 /* Turn off kverb recognition */
-            os2gks = 0;
-            x = congks(timelimit);      /* Read a key event, blocking */
-            os2gks = t;                 /* Put back kverb recognition */
-        } else                          /* GETC */
-#endif /* OS2 */
-#endif /* NOSETKEY */
-        {
-            debug(F101,"GETC conchk","",conchk());
-            x = coninc(timelimit);      /* Just read one character */
-            debug(F101,"GETC coninc","",x);
-        }
-        concb((char)escape);            /* Put keyboard back in cbreak mode */
-        if (x > -1) {
-            if (xcmdsrc == 0)
-              printf("\r\n");
-#ifdef OS2
-            if (cx == XXGETK) {         /* GETKEYCODE */
-                sprintf(tmp,"%d",x);    /* SAFE */
-            } else {
-#endif /* OS2 */
-                tmp[0] = (char) (x & 0xff);
-                tmp[1] = NUL;
-#ifdef OS2
-            }
-#endif /* OS2 */
-            y = addmac(vnp,tmp);        /* Add it to the macro table. */
-            debug(F111,"getc/getk addmac",vnp,y);
-        } else y = -1;
-        cmsetp(psave);                  /* Restore old prompt. */
-        if (x < -1) {
-            asktimedout = 1;
-            if (!quiet && !nomsg)
-              printf("?Timed out");
-           printf("\n");
-        }
-        timelimit = 0;
-        return(success = ((y < 0 ? 0 : 1) && (asktimedout == 0)));
-    } else {                            /* ASK or ASKQ */
-#ifdef CK_RECALL
-        on_recall = 0;
-#endif /* CK_RECALL */
-        y = cmdgquo();                  /* Get current quoting */
-        cmdsquo(0);                     /* Turn off quoting */
-        while (x == -1) {               /* Prompt till they answer */
-            x = cmtxt("Please respond.",dfanswer,&s,NULL);
-            debug(F111,"ASK cmtxt",s,x);
-            cmres();
-        }
-        cmdsquo(y);                     /* Restore previous quoting */
-        if (cx == XXASKQ)               /* ASKQ must echo CRLF here */
-          printf("\r\n");
-       if (x == -10 && dfanswer) {     /* Don't fail on timeout if */
-           s = dfanswer;               /* a default was specified */
-           asktimedout = 0;            /* and don't fail */
-           x = 0;
-       }
-        if (x < 0) {                    /* If cmtxt parse error, */
-            cmsetp(psave);              /* restore original prompt */
-#ifdef VMS
-            if (cmdlvl > 0)             /* In VMS and not at top level, */
-              conres();                 /*  restore console again. */
-#endif /* VMS */
-            if (x == -10) {            /* Timed out with no response */
-               if (!nomsg)
-                 printf("?Timed out");
-               printf("\n");
-                asktimedout = 1;
-               if (dfanswer)           /* Supply default answer if any */
-                 s = dfanswer;
-                success = x = 0;       /* (was "x = -9;") */
-            }
-            timelimit = 0;
-            return(x);                  /* and return cmtxt's error code. */
-        }
-        if (!s || *s == NUL) {         /* If user typed a bare CR, */
-            cmsetp(psave);              /* Restore old prompt, */
-            delmac(vnp,0);              /* delete variable if it exists, */
-#ifdef VMS
-            if (cmdlvl > 0)             /* In VMS and not at top level, */
-              conres();                 /*  restore console again. */
-#endif /* VMS */
-            timelimit = 0;
-            return(success = 1);        /* and return. */
-        }
-        y = addmac(vnp,s);              /* Add it to the macro table. */
-        debug(F111,"ask addmac",vnp,y);
-        cmsetp(psave);                  /* Restore old prompt. */
-#ifdef VMS
-        if (cmdlvl > 0)                 /* In VMS and not at top level, */
-          conres();                     /*  restore console again. */
-#endif /* VMS */
-        timelimit = 0;
-        return(success = (y < 0 ? 0 : 1) && (asktimedout == 0));
-    }
-}
-#endif /* NOSPL */
-
-#ifndef NOSPL
-int
-doincr(cx) int cx; {                    /* INCREMENT, DECREMENT */
-    char vnambuf[VNAML+1];              /* Buffer for variable names */
-    int eval = 0;
-    eval = (cx == XX_DECR || cx == XX_INCR);
-
-    if ((y = cmfld("Variable name","",&s, eval ? xxstring : NULL)) < 0) {
-        if (y == -3) {
-            printf("?Variable name required\n");
-            return(-9);
-        } else return(y);
-    }
-    ckstrncpy(vnambuf,s,VNAML);
-    if ((y = cmnum("by amount","1",10,&x,xxstring)) < 0)
-      return(y);
-    if ((y = cmcfm()) < 0)
-      return(y);
-
-    z = (cx == XX_INCR || cx == XXINC) ? 1 : 0; /* Increment or decrement? */
-
-    if (incvar(vnambuf,x,z) < 0) {
-        printf("?Variable %s not defined or not numeric\n",vnambuf);
-        return(success = 0);
-    }
-    return(success = 1);
-}
-
-/* Used by doundef() */
-static int
-xxundef(s,verbose,simulate) char * s; int verbose, simulate; {
-    int rc = 0;
-    if (!s) return(0);
-    if (*s == CMDQ && *(s+1) == '%') {
-        char c = *(s+2), * p = NULL;
-        if (c >= '0' && c <= '9') {
-            if (maclvl < 0)
-              p = g_var[c];
-            else
-              p = m_arg[maclvl][c - '0'];
-        } else {
-            if (isupper(c)) c += ('a'-'A');
-            if (c >= 'a' && c <= 'z')
-              p = g_var[c];
-        }
-        if (!p) return(-1);
-    }
-    if (verbose)
-      printf(" %s ",s);
-    if (simulate) {
-        printf("(SELECTED)\n");
-    } else if ((x = delmac(s,1)) > -1) { /* Full name required */
-        rc = 1;
-        if (verbose) printf("(OK)\n");
-    } else if (verbose)
-      printf("(FAILED)\n");
-    return(rc);
-}
-
-/* Do the (_)DEFINE, (_)ASSIGN, and UNDEFINE commands */
-
-#define UND_MAT 1
-#define UND_VRB 2
-#define UND_EXC 3
-#define UND_SIM 3
-
-static struct keytab undefswi[] = {
-    { "/list",     UND_VRB, 0 },
-#ifdef COMMENT
-    { "/except",   UND_EXC, CM_ARG },
-#endif /* COMMENT */
-    { "/matching", UND_MAT, 0 },
-    { "/simulate", UND_SIM, 0 },
-    { "/verbose",  UND_VRB, CM_INV }
-};
-static int nundefswi = sizeof(undefswi) / sizeof(struct keytab);
-
-#define UNDEFMAX 64
-static char ** undeflist = NULL;
-int
-doundef(cx) int cx; {                   /* UNDEF, _UNDEF */
-    int i, j, n, rc = 0, arraymsg = 0;
-    int domatch = 0, verbose = 0, errors = 0, simulate = 0, flag = 0;
-    char *vnp, vnbuf[4];
-#ifdef COMMENT
-    char *except = NULL;
-#endif /* COMMENT */
-    struct FDB sw, fl;
-    int getval;
-    char c;
-
-    if (!undeflist) {                   /* Allocate list if necessary */
-        undeflist = (char **)malloc(UNDEFMAX * sizeof(char *));
-        if (!undeflist) {
-            printf("?Memory allocation failure\n");
-            return(-9);
-        }
-        for (i = 0; i < UNDEFMAX; i++)
-          undeflist[i] = NULL;
-    }
-    cmfdbi(&sw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           "Variable name or switch",
-           "",                          /* default */
-           "",                          /* addtl string data */
-           nundefswi,                   /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           undefswi,                    /* Keyword table */
-           &fl                          /* Pointer to next FDB */
-           );
-    cmfdbi(&fl,                         /* Anything that doesn't match */
-           _CMFLD,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           (cx == XXUNDEF) ? NULL : xxstring,
-           NULL,
-           NULL
-           );
-    while (1) {                         /* Parse 0 or more switches */
-        x = cmfdb(&sw);                 /* Parse something */
-        if (x < 0)
-          return(x);
-        if (cmresult.fcode != _CMKEY)   /* Break out if not a switch */
-          break;
-        c = cmgbrk();
-        if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
-            printf("?This switch does not take an argument\n");
-            return(-9);
-        }
-        switch (cmresult.nresult) {
-          case UND_MAT: domatch  = 1; break;
-          case UND_SIM: simulate = 1; /* fall thru on purpose */
-          case UND_VRB: verbose  = 1; break;
-
-#ifdef COMMENT
-          case UND_EXC:
-            if (!getval) break;
-            if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Pattern required\n");
-                    x = -9;
-                }
-                goto xgetx;
-            }
-            makestr(&except,cmresult.sresult);
-            break;
-#endif /* COMMENT */
-
-          default:
-            return(-2);
-        }
-    }
-    n = 0;
-    makestr(&(undeflist[n++]),cmresult.sresult);
-    for (i = 1; i < UNDEFMAX; i++) {
-        x = cmfld("Macro or variable name","",&s,
-                  ((cx == XXUNDEF) ? NULL : xxstring)
-                  );
-        if (x == -3) {
-            if ((y = cmcfm()) < 0)
-              return(y);
-            break;
-        } else if (y < 0) {
-            return(y);
-        }
-        makestr(&(undeflist[n++]),s);
-    }
-    /* Now we have a list of n variables or patterns to undefine */
-
-    for (i = 0; i < n; i++) {
-        flag = 0;
-        if (!(vnp = undeflist[i]))
-          continue;
-        if (vnp[0] == CMDQ && (vnp[1] == '%' || vnp[1] == '&')) {
-            flag++;
-            vnp++;
-        }
-        if (!domatch) {                 /* Pattern match not requested */
-            if (flag) {
-                if ((y = parsevar(vnp,&x,&z)) < 0) {
-                    vnp--;
-                    if (verbose) printf(" %s...error\n",vnp);
-                    continue;
-                }
-                vnp--;
-            }
-            x = xxundef(vnp,verbose,simulate);
-            if (x > -1) {
-                if (!x && !simulate) errors++;
-                rc += x;
-            }
-            continue;
-        }
-        /* Pattern match requested */
-
-        if (!flag) {                    /* It's a macro */
-            for (j = 0; j < nmac; j++) {
-                if (ckmatch(vnp,mactab[j].kwd,0,1)) {
-                    x = xxundef(mactab[j].kwd,verbose,simulate);
-                    if (x > -1) {
-                        rc += x;
-                        if (!x) errors++;
-                    }
-                    if (!simulate)
-                      j--;              /* Because mactab shifted up */
-                }
-            }
-        } else if (vnp[0] == '%') {     /* It's a \%x variable */
-            vnbuf[0] = CMDQ;
-            vnbuf[1] = '%';
-            vnbuf[3] = NUL;
-            for (j = '0'; j <= 'z'; j++) { /* 0..9 a..z */
-                vnbuf[2] = j;
-                if (ckmatch(vnp,&vnbuf[1],0,1)) {
-                    x = xxundef(vnbuf,verbose,simulate);
-                    if (x > -1) {
-                        if (!x) errors++;
-                        rc += x;
-                    }
-                }
-                if (j == '9') j = (int)'a' - 1; /* 9 -> a */
-            }
-        } else if (vnp[0] == '&') {
-            if (!arraymsg && !quiet) {
-                printf("?UNDEFINE /MATCH can't be used with arrays.\n");
-                printf("(Type HELP ARRAY to see other methods.)\n");
-            }
-            arraymsg++;
-            errors++;
-        }
-    }
-    if (verbose)
-      printf("undefined: %d, errors: %d\n",rc,errors);
-
-    for (i = 0; i < UNDEFMAX; i++) {    /* Check them all */
-        if (undeflist[i]) {             /* in case we were interrupted */
-            free(undeflist[i]);         /* previously... */
-            undeflist[i] = NULL;
-        }
-    }
-    return(success = (errors == 0) ? 1 : 0);
-}
-
-int
-dodef(cx) int cx; {
-    extern int xxdot;
-    extern char ppvnambuf[];
-    int doeval = 0;
-    char vnambuf[VNAML+1];              /* Buffer for variable names */
-    char *vnp;                          /* Pointer to same */
-    int k, mydot;
-    mydot = xxdot;                      /* Copy */
-    xxdot = 0;                          /* and reset */
-/*
-  In case we got here from a command that begins like ".\%a", cmkey() has
-  already evaluated \%a, but we don't want that, so we retrieve the variable
-  name from a special pre-evaluation buffer in the command module, and we
-  undo the "unget word" that would be done because of the token, because if
-  the variable was defined, it will unget its value rather than its name.
-*/
-    s = NULL;
-
-    if (mydot && ppvnambuf[0] == '.' && ppvnambuf[1]) {
-        s = ppvnambuf+1;
-        unungw();
-    }
-    if (!s) {
-        if (cx == XXDFX || cx == XXASX)
-          /* Evaluate variable name */
-          y = cmfld("Macro or variable name","",&s,xxstring);
-        else
-          /* Don't evaluate the variable name */
-          y = cmfld("Macro or variable name","",&s,NULL);
-        if (y < 0) {
-            if (y == -3) {
-                printf("?Variable name required\n");
-                return(-9);
-            } else return(y);
-        }
-    }
-    k = strlen(s);
-    if (k > VNAML) {
-        printf("?Name too long: \"%s\"\n",s);
-        return(-9);
-    }
-    ckstrncpy(vnambuf,s,VNAML);
-    vnambuf[VNAML] = NUL;
-    vnp = vnambuf;
-    if (vnambuf[0] == CMDQ && (vnambuf[1] == '%' || vnambuf[1] == '&')) vnp++;
-    if (*vnp == '%' || *vnp == '&') {
-        if ((y = parsevar(vnp,&x,&z)) < 0) return(y);
-#ifdef COMMENT
-        if (cx == XXUNDEF) {            /* Undefine */
-            if ((y = cmtxt("Text to be ignored","",&s,NULL)) < 0) return(y);
-            delmac(vnp,0);
-            return(success = 1);
-        }
-#endif /* COMMENT */
-        debug(F101,"dodef parsevar x","",x);
-        if (mydot) {
-            if ((doeval = cmkey(asgtab,nasgtab,"operator","=",NULL)) < 0)
-              return(doeval);
-            if (doeval > 0)             /* Type of assignment */
-              cx = XXASS;
-        }
-        if (y == 1) {                   /* Simple variable */
-            if ((y = cmtxt("Definition of variable","",&s,NULL)) < 0)
-              return(y);
-            s = brstrip(s);
-            debug(F110,"xxdef var name",vnp,0);
-            debug(F110,"xxdef var def",s,0);
-        } else if (y == 2) {            /* Array element */
-            if ((y = arraynam(vnp,&x,&z)) < 0) return(y);
-            if (x == 96) {
-                printf("?Argument vector array is read-only\n");
-                return(-9);
-            }
-            if (chkarray(x,z) < 0) return(-2);
-            if ((y = cmtxt("Definition of array element","",&s,NULL)) < 0)
-              return(y);
-            debug(F110,"xxdef array ref",vnp,0);
-            debug(F110,"xxdef array def",s,0);
-        }
-    } else {                            /* Macro */
-#ifdef COMMENT
-        if (cx == XXUNDEF) {            /* Undefine */
-            if ((y = cmtxt("Text to be ignored","",&s,NULL)) < 0) return(y);
-            delmac(vnp,0);
-            return(success = 1);
-        }
-#endif /* COMMENT */
-        if (mydot) {
-            if ((doeval = cmkey(asgtab,nasgtab,"operator","=",NULL)) < 0)
-              return(doeval);
-            if (doeval > 0)
-              cx = XXASS;
-        }
-        if ((y = cmtxt("Definition of macro","",&s,NULL)) < 0) return(y);
-#ifdef DEBUG
-        if (deblog) {
-            debug(F110,"xxdef macro name",vnp,0);
-            debug(F010,"xxdef macro def",s,0);
-        }
-#endif /* DEBUG */
-        s = brstrip(s);
-    }
-    if (*s == NUL) {                    /* No arg given, undefine */
-        delmac(vnp,1);                  /* silently... */
-        return(success = 1);            /* even if it doesn't exist... */
-    }
-    /* Defining a new macro or variable */
-
-    if (cx == XXASS || cx == XXASX) {   /* ASSIGN rather than DEFINE? */
-        int t;
-        t = LINBUFSIZ-1;
-        lp = line;                      /* If so, expand its value now */
-        zzstring(s,&lp,&t);
-        s = line;
-    }
-    if (doeval == 2) {                  /* Arithmetic evaluation wanted too? */
-        ckstrncpy(line,evala(s),LINBUFSIZ);
-        line[LINBUFSIZ] = NUL;
-    }
-    /* debug(F111,"calling addmac",s,(int)strlen(s)); */
-
-    y = addmac(vnp,s);                  /* Add it to the appropriate table. */
-    if (y < 0) {
-        printf("?%s failed\n",(cx == XXASS || cx == XXASX) ?
-               "ASSIGN" : "DEFINE");
-        return(success = 0);
-    } else if (cx == XXASX || cx == XXDFX) /* For _ASG or _DEF, */
-      return(1);                           /* don't change success variable */
-    else
-      return(success = 1);
-}
-#endif /* NOSPL */
-
-
-#ifndef NODIAL
-/*
-   L U D I A L  --  Lookup up dialing directory entry.
-
-   Call with string to look up and file descriptor of open dialing directory
-   file.  On success, returns number of matches found, with numbers stored
-   in an array accessible via getdnum().
-*/
-static char *dn_p[MAXDNUMS + 1];        /* Dial Number pointers */
-static char *dn_p2[MAXDNUMS + 1];       /* Converted dial number pointers */
-static int dn_x[MAXDNUMS + 1];          /* Type of call */
-static int dncount = 0;
-char * d_name = NULL;                   /* Dial name pointer */
-
-char *                                  /* Get dial directory entry name */
-getdname() {
-    return(d_name ? d_name : "");
-}
-
-char *
-getdnum(n) int n; {                     /* Get dial number n from directory */
-    if (n < 0 || n > dncount || n > MAXDNUMS)
-      return("");
-    else
-      return(dn_p[n]);
-}
-
-char *                  /* Check area code for spurious leading digit */
-chk_ac(i,buf) int i; char buf[]; {
-    char *p;
-    if (!buf)
-      return("");
-    p = (char *) buf;                   /* Country we are calling: */
-    if (i ==  44 ||                     /* UK */
-        i ==  49 ||                     /* Germany */
-        i ==  39 ||                     /* Italy */
-        i ==  31 ||                     /* Netherlands */
-        i == 351 ||                     /* Portugal */
-        i ==  55 ||                     /* Brazil */
-        i == 972 ||                     /* Israel */
-        i ==  41 ||                     /* Switzerland */
-        i ==  43 ||                     /* Austria */
-        i ==  42 ||                     /* Czech Republic */
-        i ==  36 ||                     /* Hungary */
-        i ==  30 ||                     /* Greece */
-        i == 352 ||                     /* Luxembourg */
-        i ==  48 ||                     /* Poland */
-        i ==  27 ||                     /* South Africa */
-        i ==  33 ||                     /* France (as of 1997) */
-        i ==  358                       /* Finland (ditto) */
-        ) {
-        if (buf[0] == '0')
-          p++;
-    }
-    return(p);
-}
-
-/* Call Is Long Distance -- Expand this to cover 10-digit local dialing etc */
-/*
-   src  = area code of caller
-   dest = area code of callee
-   Returns:
-     0 if call is local
-     1 if call is long distance
-     2 if call is local but area code must be dialed anyway
-*/
-static int
-callisld(src, dest) char * src, * dest; {
-    int i;
-    if (dialfld)                        /* Force long distance? */
-      return(1);
-    if (!strcmp(src,dest)) {            /* Area codes are the same */
-        for (i = 0; i < nlocalac; i++)  /* Is AC in the lc-area-codes list? */
-          if (!strcmp(src,diallcac[i]))
-            return(2);                  /* Yes so must be dialed */
-        return(0);                      /* No so don't dial it. */
-    }
-    for (i = 0; i < nlocalac; i++)      /* ACs not the same so look in list */
-      if (!strcmp(dest,diallcac[i]))    /* Match */
-        return(2);                      /* So local call with area code */
-    return(1);                          /* Not local so long-distance */
-}
-
-char pdsfx[64] = { NUL, NUL };
-
-#ifndef NOSPL
-static char *
-xdial(s) char *s; {                     /* Run dial string thru macro */
-    int x, m;
-    if (!dialmac)                       /* Dial macro name given? */
-      return(NULL);
-    if ((x = mxlook(mactab,dialmac,nmac)) < 0) /* Is the macro defined? */
-      return(NULL);
-    m = maclvl;
-    x = dodo(x,s,0);                    /* Set up the macro */
-    if (x > 0) {
-        while (maclvl > m)              /* Execute the parser */
-          parser(1);
-        return(mrval[maclvl+1]);        /* Return the result */
-    }
-    return(NULL);
-}
-#endif /* NOSPL */
-
-static int
-dncvt(k,cx, prefix, suffix)
-    int k, cx, prefix, suffix; {        /* Dial Number Convert */
-    int i, j, n, what;                  /* cx is top-level command index */
-    char *ss;                           /* prefix - add prefixes? */
-    char *p, *p2, *pxo;                 /* suffix - add suffixes? */
-    char *lac;
-    char *npr;
-    char *sfx;
-    /* char *psfx; */
-    char ccbuf[128];
-    int cc;
-    char acbuf[24];
-    char *acptr;
-    char outbuf[256];
-/*
-  First pass for strict (punctuation-based) interpretation.
-  If it fails, we try the looser (length-based) one.
-*/
-    dialtype = -1;
-    what = 0;                           /* Type of call */
-    s = dn_p[k];                        /* Number to be converted. */
-    debug(F111,"dncvt",s,k);
-    if (dn_p2[k]) {
-        free(dn_p2[k]);
-        dn_p2[k] = NULL;
-    }
-    if (!s) {
-        printf("Error - No phone number to convert\n");
-        return(-1);
-    }
-    if ((int)strlen(s) > 200) {
-        ckstrncpy(outbuf,s,40);
-        printf("?Too long: \"%s...\"\n",outbuf);
-        return(-1);
-    }
-    npr = (prefix && dialnpr) ? dialnpr : "";
-    sfx = (suffix && dialsfx) ? dialsfx : "";
-    /* if (partial) psfx = dialsfx ? dialsfx : ""; */
-    pxo = (prefix && dialpxo) ? dialpxo : "";
-    lac = diallac ? diallac : "";       /* Local area code */
-
-    outbuf[0] = NUL;                    /* Initialize conversion buffer */
-    ss = s;                             /* Remember original string */
-
-    if (*s != '+') {                    /* Literal number */
-        dn_x[k] = DN_UNK;               /* Sort key is "unknown". */
-        ckmakmsg(outbuf,256,            /* Sandwich it between */
-                 pxo,npr,s,sfx          /* DIAL PREFIX and SUFFIX */
-                );
-#ifdef CK_TAPI
-        if (tttapi &&                   /* TAPI does its own conversions */
-            !tapipass &&                /* if not in passthru mode */
-            tapiconv == CK_AUTO ||      /* and TAPI conversions are AUTO */
-            tapiconv == CK_ON           /* OR if TAPI conversions are ON */
-            ) {
-            char * p = NULL;
-            dialtype = -2;
-            if (!cktapiConvertPhoneNumber(dn_p[k], &p))
-              return(-1);
-            makestr(&dn_p2[k], p);
-            if (p) free(p);
-            return(0);
-        } else
-#endif /* CK_TAPI */
-          makestr(&dn_p2[k], outbuf);   /* Not TAPI */
-        dialtype = what;
-        return(0);                      /* Done. */
-    }
-    i = 0;                              /* Portable number */
-    s++;                                /* Tiptoe past the plus sign */
-    ccbuf[0] = NUL;                     /* Do country code first */
-
-    if (!diallcc) {                     /* Do we know our own? */
-        if (cx != XXLOOK)
-          printf("Error - prior SET DIAL COUNTRY-CODE command required\n");
-        return(-1);
-    }
-
-    /* Parse the number */
-
-    while (1) {                         /* Get the country code */
-        while (*s == HT || *s == SP)
-          s++;
-        if (!s)                         /* Not in standard format */
-          break;
-        if (*s == '(') {                /* Beginning of area code  */
-            s++;                        /* Skip past parenthesis   */
-            ccbuf[i] = NUL;             /* End of country code */
-            if (!s) {                   /* Check for end of string */
-                printf("Error - phone number ends prematurely: \"%s\"\n",ss);
-                return(-1);
-            }
-            break;
-        } else {                        /* Collect country code */
-            if (isdigit(*s))
-              ccbuf[i++] = *s;          /* copy this character */
-            s++;
-            if (!*s || i > 127)         /* watch out for memory leak */
-              break;
-        }
-    }
-    cc = atoi(ccbuf);                   /* Numeric version of country code */
-
-    i = 0;                              /* Now get area code */
-    acbuf[0] = NUL;                     /* Initialize area-code buffer */
-    acptr = acbuf;                      /* and pointer. */
-    while (1) {
-        while (*s == HT || *s == SP)    /* Ignore whitespace */
-          s++;
-        if (!s)                         /* String finished */
-          break;
-        if (*s == ')') {                /* End of area code  */
-            s++;                        /* Skip past parenthesis   */
-            acbuf[i] = NUL;             /* Terminate area-code buffer */
-            break;
-        } else {                        /* Part of area code */
-            if (isdigit(*s))            /* If it's a digit, */
-              acbuf[i++] = *s;          /* copy this character */
-            s++;                        /* Point to next */
-            if (!*s || i > 23)          /* Watch out for overflow */
-              break;
-        }
-    }
-
-/*
-   Here we strip any leading 0 for countries that we know have
-   0 as a long-distance prefix and do not have any area codes that
-   start with 0 (formerly also ditto for "9" in Finland...)
-*/
-    i = atoi(ccbuf);
-    acptr = chk_ac(i,acbuf);
-
-    while (*s == HT || *s == SP)        /* Skip whitespace */
-      s++;
-
-/* printf("S=[%s], ACPTR=[%s]\n",s,acptr); */
-
-    if (*s && *acptr) {                 /* Area code was delimited */
-
-        while (*s == '-' || *s == '.')  /* Skip past gratuitious punctuation */
-          s++;
-        if (!*s) s--;                   /* But not to end of string */
-
-        if (strcmp(diallcc,ccbuf)) {    /* Out of country? */
-            if (!dialixp) {             /* Need intl-prefix */
-                if (cx != XXLOOK)
-                  printf("Error - No international dialing prefix defined\n");
-                return(-1);
-            }
-            what = dn_x[k] = DN_INTL;
-            p  = (prefix && dialixp) ? dialixp : ""; /* Intl-prefix */
-            p2 = (suffix && dialixs) ? dialixs : ""; /* Intl-suffix */
-
-            /* Form the final phone number */
-#ifdef COMMENT
-            sprintf(pdsfx,"%s%s",p2,sfx); /* UNSAFE */
-            sprintf(outbuf,
-                    "%s%s%s%s%s%s%s%s",
-                    pxo,npr,p,ccbuf,acptr,s,p2,sfx
-                    );
-#else
-            ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-            ckmakxmsg(outbuf,256,pxo,npr,p,ccbuf,acptr,s,p2,sfx,
-                      NULL,NULL,NULL,NULL);
-#endif /* COMMENT */
-
-        } else if ((x = callisld(lac,acptr)) >= 1) { /* In-country LD */
-            if (!diallac && cx != XXLOOK) { /* Don't know my own area code */
-                if (cc == 1)
-                  printf("WARNING - Prior SET DIAL AREA-CODE needed\n");
-            }
-            if (x == 2) {               /* Local call with area code */
-                what = dn_x[k] = DN_LOCAL;      /* Local-call */
-                p  = (prefix && diallcp) ? diallcp : ""; /* local-prefix */
-                p2 = (suffix && diallcs) ? diallcs : ""; /* local-suffix */
-            } else {
-                what = dn_x[k] = DN_LONG;       /* Long-distance */
-                for (i = 0; i < ntollfree; i++) { /* But toll-free too? */
-                    if (!strcmp(acptr,dialtfc[i])) {
-                        what = dn_x[k] = DN_FREE;
-                        break;
-                    }
-                }
-                if (what == DN_FREE) {  /* Toll-free call */
-                    p = (prefix && dialtfp) ? dialtfp :
-                        ((prefix && dialldp) ? dialldp : "");
-                    p2 = "";            /* no suffix */
-                } else {                        /* normal long distance */
-                    p  = (prefix && dialldp) ? dialldp : ""; /* ld-prefix */
-                    p2 = (suffix && diallds) ? diallds : ""; /* ld-suffix */
-                }
-            }
-            /* Form the number to be dialed */
-#ifdef COMMENT
-            sprintf(outbuf,"%s%s%s%s%s%s%s",
-                    pxo,npr,p,acptr,s,p2,sfx
-                    );
-            sprintf(pdsfx,"%s%s",p2,sfx);
-#else
-            ckmakxmsg(outbuf,256,
-                      pxo,npr,p,acptr,s,p2,sfx,
-                      NULL,NULL,NULL,NULL,NULL);
-            ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-#endif /* COMMENT */
-        } else {                        /* Same country, same area code */
-            what = dn_x[k] = DN_LOCAL;  /* So it's a local call. */
-            if (!prefix || !(dialpxo || ndialpxx)) { /* Not dialing from PBX */
-                p  = (prefix && diallcp) ? diallcp : ""; /* local-prefix */
-                p2 = (suffix && diallcs) ? diallcs : ""; /* local-suffix */
-#ifdef COMMENT
-                if (x == 2)
-                  sprintf(outbuf,"%s%s%s%s%s%s",npr,p,acptr,s,p2,sfx);
-                else
-                  sprintf(outbuf,"%s%s%s%s%s",npr,p,s,p2,sfx);
-                sprintf(pdsfx,"%s%s",p2,sfx);
-#else
-                if (x == 2)
-                  ckmakxmsg(outbuf,256,
-                            npr,p,acptr,s,p2,sfx,
-                            NULL,NULL,NULL,NULL,NULL,NULL);
-                else
-                  ckmakxmsg(outbuf,256,
-                            npr,p,s,p2,sfx,
-                            NULL,NULL,NULL,NULL,NULL,NULL,NULL);
-                ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-#endif /* COMMENT */
-
-            } else {                    /* Dialing from a PBX and not TAPI */
-                if (ndialpxx) {         /* Is it internal? */
-#ifdef COMMENT
-                    i = (int) strlen(dialpxx);
-                    j = (int) strlen(s);
-                    x = -1;
-                    if (j > i)
-                      x = ckstrcmp(dialpxx,s,i,0);
-#else
-                    int kx;
-                    x = -1;
-                    j = (int) strlen(s);
-                    for (kx = 0; kx < ndialpxx; kx++) {
-                        i = (int) strlen(dialpxx[kx]);
-                        if (j > i)
-                          if (!(x = ckstrcmp(dialpxx[kx],s,i,0)))
-                            break;
-                    }
-#endif /* COMMENT */
-                    if (!x) {
-                        char * icp, buf[32];
-                        makestr(&matchpxx,dialpxx[kx]);
-                        debug(F111,"dncvt matchpxx",matchpxx,kx);
-                        what = dn_x[kx] = DN_INTERN;   /* Internal call. */
-                        s += i;
-                        /* Internal-call prefix */
-                        icp = dialpxi;
-#ifndef NOSPL
-                        if (icp) {
-                            if (*icp == '\\') {
-                                char c, *bp;
-                                int n;
-                                c = *(icp+1);
-                                if (isupper(c)) c = tolower(c);
-                                if (c == 'v' || c == 'f') {
-                                    n = 32;
-                                    bp = buf;
-                                    zzstring(icp,&bp,&n);
-                                    icp = buf;
-                                }
-                            }
-                        }
-#endif /* NOSPL */
-                        p = (prefix && icp) ? icp : "";
-#ifdef COMMENT
-                        sprintf(outbuf,"%s%s%s%s",npr,p,s,sfx);
-#else
-                        ckmakmsg(outbuf,256,npr,p,s,sfx);
-#endif /* COMMENT */
-                    } else {            /* External local call */
-                        /* local-prefix */
-                        p  = (prefix && diallcp) ? diallcp : "";
-                        /* local-suffix */
-                        p2 = (prefix && diallcs) ? diallcs : "";
-#ifdef COMMENT
-                        if (x == 2)
-                          sprintf(outbuf,"%s%s%s%s%s%s%s",
-                                  dialpxo ? dialpxo : "",
-                                  npr,p,acptr,s,p2,sfx);
-                        else
-                          sprintf(outbuf,
-                                  "%s%s%s%s%s%s",
-                                  dialpxo ? dialpxo : "",
-                                  npr,p,s,p2,sfx
-                                  );
-#else
-                        if (x == 2)
-                          ckmakxmsg(outbuf, 256,
-                                   dialpxo ? dialpxo : "",
-                                   npr,p,acptr,s,p2,sfx,
-                                   NULL,NULL,NULL,NULL,NULL);
-                        else
-                          ckmakxmsg(outbuf, 256,
-                                    dialpxo ? dialpxo : "",
-                                    npr,p,s,p2,sfx,
-                                    NULL,NULL,NULL,NULL,NULL,NULL);
-#endif /* COMMENT */
-                    }
-                }
-            }
-        }
-
-    } else {                            /* Area code was not delimited */
-
-        char xbuf[256];                 /* Comparison based only on length */
-        char ybuf[256];
-        int x, j;
-
-        s = ss;
-
-        for (i = 0; i < 255; i++) {
-            if (!*s) break;
-            while (!isdigit(*s)) {      /* Pay attention only to digits */
-                s++;
-                if (!*s) break;
-            }
-            xbuf[i] = *s++;
-        }
-        xbuf[i] = NUL;
-
-        x = 1;                          /* Assume LD */
-        n = 0;
-        if (!dialfld) {                 /* If LD not forced */
-            for (j = 0; j < nlocalac; j++) { /* check local AC list? */
-                ckmakmsg(ybuf,256,diallcc,diallcac[j],NULL,NULL);
-                n = (int) strlen(ybuf);
-                if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0)) {
-                    x = 2;
-                    break;
-                }
-            }
-            if (x == 1) {               /* Or exact match with local CC+AC? */
-                ckmakmsg(ybuf,256,diallcc,lac,NULL,NULL);
-                n = (int) strlen(ybuf);
-                if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0))
-                  x = 0;
-            }
-        }
-        if (x == 0 || x == 2) {         /* Local call */
-            int xx,kx;                  /* Begin 1 Dec 2001... */
-            /* Account for PBX internal calls */
-            if (ndialpxx) {
-                xx = -1;
-                j = (int) strlen(ybuf);
-                for (kx = 0; kx < ndialpxx; kx++) {
-                    i = (int) strlen(dialpxx[kx]);
-                    if (j >= i)
-                      if (!(xx = ckstrcmp(dialpxx[kx],&xbuf[j],i,0)))
-                        break;
-                }
-            }
-            if (!xx) {
-                char * icp, buf[32];
-                makestr(&matchpxx,dialpxx[kx]);
-                debug(F111,"dncvt matchpxx",matchpxx,kx);
-                what = dn_x[kx] = DN_INTERN; /* Internal call. */
-                s = xbuf + j + i;
-                icp = dialpxi;          /* Internal-call prefix */
-#ifndef NOSPL
-                if (icp) {
-                    if (*icp == '\\') {
-                        char c, *bp;
-                        int n;
-                        c = *(icp+1);
-                        if (isupper(c)) c = tolower(c);
-                        if (c == 'v' || c == 'f') {
-                            n = 32;
-                            bp = buf;
-                            zzstring(icp,&bp,&n);
-                            icp = buf;
-                        }
-                    }
-                }
-#endif /* NOSPL */
-                p = (prefix && icp) ? icp : "";
-                ckmakmsg(outbuf,256,npr,p,s,sfx);
-                /* End 1 Dec 2001... */
-
-            } else {                    /* Not PBX internal */
-
-                dn_x[k] = DN_LOCAL;
-                p = (prefix && diallcp) ? diallcp : "";
-                p2 = (suffix && diallcs) ? diallcs : "";
-                s = (char *) (xbuf + ((x == 0) ? n : (int)strlen(diallcc)));
-                ckmakxmsg(outbuf,256,
-                          pxo,npr,p,s,p2,sfx,
-                          NULL,NULL,NULL,NULL,NULL,NULL);
-                ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-            }
-        } else {                        /* Not local */
-            n = ckstrncpy(ybuf,diallcc,256);
-            if (n > 0 && !ckstrcmp(xbuf,ybuf,n,0)) { /* Long distance */
-                dn_x[k] = DN_LONG;
-                p = (prefix && dialldp) ? dialldp : "";
-                p2 = (suffix && diallds) ? diallds : "";
-                s = xbuf + n;
-                while (*s == '-' || *s == '.')
-                  s++;
-#ifdef COMMENT
-                sprintf(outbuf,"%s%s%s%s%s%s",pxo,npr,p,s,p2,sfx);
-                sprintf(pdsfx,"%s%s",p2,sfx);
-#else
-                ckmakxmsg(outbuf,256,
-                          pxo,npr,p,s,p2,sfx,
-                         NULL,NULL,NULL,NULL,NULL,NULL);
-                ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-#endif /* COMMENT */
-            } else {
-                dn_x[k] = DN_INTL;      /* International */
-                if (!dialixp) {
-                    if (cx != XXLOOK) {
-                        printf(
-                          "Error - No international dialing prefix defined\n"
-                               );
-                        return(-1);
-                    }
-                }
-                p = (prefix && dialixp) ? dialixp : "";
-                p2 = (suffix && dialixs) ? dialixs : "";
-#ifdef COMMENT
-                sprintf(outbuf,"%s%s%s%s%s%s",pxo,npr,p,xbuf,p2,sfx);
-                sprintf(pdsfx,"%s%s",p2,sfx);
-#else
-                ckmakxmsg(outbuf,256,
-                          pxo,npr,p,xbuf,p2,sfx,
-                          NULL,NULL,NULL,NULL,NULL,NULL);
-                ckmakmsg(pdsfx,64,p2,sfx,NULL,NULL);
-#endif /* COMMENT */
-            }
-        }
-    }
-#ifdef CK_TAPI
-    if (tttapi &&                       /* TAPI performs the conversions */
-        !tapipass &&
-        tapiconv == CK_AUTO ||
-        tapiconv == CK_ON
-        ) {
-        p = NULL;
-        dialtype = -2;
-        if (!cktapiConvertPhoneNumber(dn_p[k],&p))
-          return(-1);
-        makestr(&dn_p2[k], p);
-        if (p) free(p);
-        return(0);
-    } else {
-#endif /* CK_TAPI */
-        makestr(&dn_p2[k], outbuf);
-#ifdef CK_TAPI
-    }
-#endif /* CK_TAPI */
-    dialtype = what;
-    return(0);
-}
-
-static int
-ddcvt(s, f, n) char * s; FILE * f; int n; { /* Dial Directory Convert */
-    char linebuf[1024], *s2;            /* Buffers and pointers */
-#ifdef VMS
-    char * temp = NULL;
-#endif /* VMS */
-    char *info[8];                      /* Pointers to words from entry */
-    FILE * f2 = NULL;
-    int x, rc;
-    rc = -1;
-
-    debug(F110,"ddcvt file",s,0);
-
-    if (!s || !f)                       /* No filename or file */
-      return(-1);
-    if (!*s)
-
-    fclose(f);
-    znewn(s,&s2);                       /* s2 = address of static buffer */
-    debug(F110,"ddcvt newname",s2,0);
-
-#ifdef VMS
-    /* In VMS, znewn() returns the same file name with a new version number */
-    makestr(&temp,s);                   /* Swap - otherwise the new */
-    s = s2;                             /* version has the older version */
-    s2 = temp;                          /* number... */
-    debug(F110,"ddcvt after swap s",s,0);
-    debug(F110,"ddcvt after swap s2",s2,0);
-    makestr(&(dialdir[n]),s);           /* New file gets new version number */
-    debug(F110,"ddcvt after makestr s2",s2,0);
-    debug(F111,"ddcvt dialdir[n]",dialdir[n],n);
-#else
-    if (zrename(s,s2) < 0) {            /* Not VMS - rename old file */
-        perror(s2);                     /* to new (wierd) name. */
-        goto ddexit;
-    }
-#endif /* VMS */
-    debug(F110,"ddcvt s2 (old)",s2,0);
-    if ((f = fopen(s2,"r")) == NULL) {  /* Reopen old file with wierd name */
-        debug(F110,"ddcvt s2 open error",ck_errstr(),0);
-        dirline = 0;                    /* (or in VMS, old version) */
-        perror(s2);
-        goto ddexit;
-    }
-    debug(F110,"ddcvt fopen(s2) OK",s2,0);
-
-    debug(F110,"ddcvt s (new)",s,0);
-    if ((f2 = fopen(s,"w")) == NULL) {  /* Create new file with old name */
-        debug(F110,"ddcvt s open error",ck_errstr(),0);
-        perror(s);                      /* (or in VMS, new version) */
-        goto ddexit;
-    }
-    debug(F110,"ddcvt fopen(s) OK",s,0);
-
-    printf("\nSaving old directory as %s.\nConverting %s...",s2,s);
-    fprintf(f2,"; %s - Kermit dialing directory\n", s);
-    fprintf(f2,"%-16s %-20s ; %5s %-6s ; %s\n",
-               "; Name","Number","Speed","Parity","Comment"
-               );
-
-    while (1) {
-        linebuf[0] = NUL;               /* Read a line */
-        if (fgets(linebuf,1023,f) == NULL)
-          break;
-        debug(F110,"ddcvt linebuf",linebuf,0);
-        if (!linebuf[0]) {              /* Empty line */
-            fprintf(f2,"\n");
-            continue;
-        }
-        x = (int) strlen(linebuf);      /* Strip line terminator, */
-        while (x-- > 0) {               /* if any. */
-            if (linebuf[x] <= SP)
-              linebuf[x] = NUL;
-            else
-              break;
-        }
-        xwords(linebuf,5,info,1);       /* Parse it the old way */
-        for (x = 1; x < 6; x++)
-          if (!info[x]) info[x] = "";
-        fprintf(f2,"%-16s %-20s ; %5s %-6s %s\n",
-               info[1],info[2],info[3],info[4],info[5]
-               );
-    }
-    printf(" OK\n\n");
-    rc = 0;                             /* Success */
-  ddexit:
-    if (f) fclose(f);
-    if (f2) fclose(f2);
-#ifdef VMS
-    if (temp) free(temp);
-#endif /* VMS */
-    return(rc);
-}
-
-int                                     /* s = name to look up   */
-#ifdef CK_ANSIC                         /* cx = index of command */
-ludial(char *s, int cx)                 /* (DIAL, LOOKUP, etc)   */
-#else
-ludial(s, cx) char *s; int cx;
-#endif /* CK_ANSIC */
-/* ludial */ {
-
-    int dd, n1, n2, n3, i, j, t;        /* Workers */
-    int olddir, newdir, oldentry, newentry;
-    int pass = 0;
-    int oldflg = 0;
-    int ambiguous = 0;                  /* Flag for lookup was ambiguous */
-    char *info[7];                      /* Pointers to words from entry */
-    char *pp;                           /* Pointer to element of array */
-    FILE * f;
-    char *line;                         /* File input buffer */
-
-/* #define LUDEBUG */
-
-#ifdef LUDEBUG
-int zz = 1;
-#endif /* LUDEBUG */
-
-    if (!s || ndialdir < 1)             /* Validate arguments */
-      return(-1);
-
-    if ((n1 = (int) strlen(s)) < 1)     /* Length of string to look up */
-      return(-1);
-
-    if (!(line = malloc(1024)))         /* Allocate input buffer */
-      return(-1);
-
-#ifdef LUDEBUG
-if (zz) printf("LUDIAL 1 s[%s], n1=%d\n",s,n1);
-#endif /* LUDEBUG */
-
-    pass = 0;
-  lu_again:
-    f = NULL;                           /* Dial directory file descriptor */
-    t = dncount = 0;                    /* Dial-number match count */
-    dd = 0;                             /* Directory counter */
-    olddir = 0;
-    newdir = 0;
-/*
-  We need to recognize both old- and new-style directories.
-  But we can't allow old-style and new-style entries in the same
-  directory because there is no way to tell for sure the difference between
-  an old-style entry like this:
-
-    foo  5551212  9600
-
-  and a new-style literal entry like this:
-
-    foo  555 9600
-
-  I.e. is the "9600" a speed, or part of the phone number?
-*/
-    while (1) {                         /* We make one pass */
-        if (!f) {                       /* Directory not open */
-            if (dd >= ndialdir)         /* No directories left? */
-              break;                    /* Done. */
-            debug(F111,"ludial dialdir[dd]",dialdir[dd],dd);
-            if ((f = fopen(dialdir[dd],"r")) == NULL) { /* Open it */
-                perror(dialdir[dd]);    /* Can't, print message saying why */
-                if (line) {
-                    free(line);
-                    line = NULL;
-                }
-                dd++;                   /* Go on to next one, if any... */
-                continue;
-            }
-            dirline = 0;                /* Directory file line number */
-            if (dialdpy && !pass)
-              printf("Opening: %s...\n",dialdir[dd]);
-            dd++;
-            if (!oldflg) olddir = 0;
-            newdir = 0;
-        }
-        oldentry = 0;
-        newentry = 0;
-        line[0] = NUL;
-        if (getnct(line,1023,f,1) < 0) { /* Read a line */
-            if (f) {                    /* f can be clobbered! */
-                fclose(f);              /* Close the file */
-                f = NULL;               /* Indicate next one needs opening */
-                oldflg = 0;
-            }
-            continue;
-        }
-        if (!line[0])                   /* Empty line */
-          continue;
-#ifdef LUDEBUG
-if (zz) printf("LUDIAL 2 s[%s]\n",s);
-#endif /* LUDEBUG */
-
-        /* Make a copy and parse it the old way */
-        /* A copy is needed because xwords() pokes NULs into the string */
-
-        if ((pp = malloc((int)strlen(line) + 1))) {
-            strcpy(pp,line);            /* safe */
-            xwords(pp,5,info,0);        /* Parse it the old way */
-
-#ifdef LUDEBUG
-if (zz) printf("LUDIAL 3 s[%s]\n",s);
-#endif /* LUDEBUG */
-
-            if (!info[1])
-              continue;
-            if (*info[1] == ';') {      /* If full-line comment, */
-                newdir = 1;             /* (only new directories have them) */
-                continue;               /* keep reading. */
-            }
-            if (!info[2])
-              continue;
-            if (*info[2] == '+')
-              newentry = 1;
-            if (info[4]) {
-                if ((*info[4] == '=') ||
-                    !ckstrcmp(info[4],"none", 4,0) ||
-                    !ckstrcmp(info[4],"even", 4,0) ||
-                    !ckstrcmp(info[4],"space",5,0) ||
-                    !ckstrcmp(info[4],"mark", 4,0) ||
-                    !ckstrcmp(info[4],"odd",  3,0)
-                    )
-                  oldentry = 1;
-            }
-        }
-        if (pp) {
-            free(pp);
-            pp = NULL;
-        }
-
-        /* Check consistency */
-
-        if ((oldentry || olddir) && (newentry || newdir)) {
-            printf(
-"\nERROR: You seem to have old- and new-format entries mixed in your\n");
-            printf(
-"dialing directory.  You'll have to edit it by hand to convert it to the\n");
-#ifndef NOHELP
-            printf("new format.  Type HELP DIAL for further information.\n\n");
-#else
-            printf("new format.\n\n");
-#endif /* NOHELP */
-            if (line) {
-                free(line);
-                line = NULL;
-            }
-            return(-1);
-        }
-        if (!olddir && oldentry) {
-            int convert = 0;
-            olddir = 1;
-            if (dialcvt == 2) {         /* 2 == ASK */
-                sprintf(tmpbuf,
-"WARNING: Old-style dialing directory detected:\n%s", line);
-               convert = uq_ok(tmpbuf,
-                               "Shall I convert it for you? ",3,NULL,0);
-            } else
-              convert = dialcvt;
-            if (convert) {
-                debug(F111,"ludial calling ddcvt",dialdir[dd-1],dd);
-                if (ddcvt(dialdir[dd-1],f,dd-1) < 0) {
-                    debug(F111,"ludial ddcvt failed",dialdir[dd-1],dd);
-                    oldflg = 1;
-                    printf(
-"  Sorry, can't convert.");
-                    printf(
-"  Will ignore speed and parity fields, continuing...\n\n");
-                } else {
-                    olddir = newdir = 0;
-                    debug(F111,"ludial ddcvt ok",dialdir[dd-1],dd);
-                }
-                dd--;
-                f = NULL;
-                continue;
-            } else {
-                if (dialcvt == 2)
-                  printf(
-"  OK, will ignore speed and parity fields, continuing...\n\n");
-                olddir = 1;
-            }
-        }
-
-#ifdef LUDEBUG
-if (zz) printf("LUDIAL XX s[%s], n1=%d\n",s,n1);
-#endif /* LUDEBUG */
-
-        /* Now parse again for real */
-
-        if (oldentry)                   /* Parse it the old way */
-          xwords(line,5,info,0);
-        else                            /* Parse it the new way */
-          xwords(line,2,info,1);
-
-#ifdef LUDEBUG
-if (zz) printf("LUDIAL YY s[%s], n1=%d\n",s,n1);
-if (zz) printf("%s [%s]\n",info[1],info[2]);
-#endif /* LUDEBUG */
-
-        if (info[1]) {                  /* First word is entry name */
-            if ((n3 = (int) strlen(info[1])) < 1) /* Its length */
-              continue;                 /* If no first word, keep reading. */
-            if (n3 < n1)                /* Search name is longer */
-              continue;                 /* Can't possibly match */
-            if (ambiguous && n3 != n1)
-              continue;
-
-#ifdef LUDEBUG
-if (zz) printf("MATCHING: [%s] [%s], n1=%d\n",s,info[1],n1);
-#endif /* LUDEBUG */
-
-            if (ckstrcmp(s,info[1],n1,0)) /* Caseless string comparison */
-              continue;
-
-#ifdef LUDEBUG
-if (zz) printf("MATCH OK: [%s] [%s], n1=%d\n",s,info[1],n1);
-#endif /* LUDEBUG */
-
-            if (!info[2])               /* No phone number given */
-              continue;
-            if ((n2 = (int) strlen(info[2])) < 1) /* Length of phone number */
-              continue;                 /* Ignore empty phone numbers */
-
-            /* Got one */
-
-            if (!(pp = (char *)malloc(n2 + 1))) { /* Allocate storage for it */
-                printf("?internal error - ludial malloc 1\n");
-                if (line) {
-                    free(line);
-                    line = NULL;
-                }
-                dncount = 0;
-                return(-1);
-            }
-            strcpy(pp,info[2]);         /* safe */
-
-            if (dncount > MAXDNUMS) {
-                printf("Warning: %d matches found, %d max\n",
-                       dncount,
-                       MAXDNUMS
-                       );
-                dncount = MAXDNUMS;
-                break;
-            }
-            dn_p[dncount++] = pp;       /* Add pointer to array. */
-            if (dncount == 1) {         /* First one... */
-                if (d_name) free(d_name);
-                if (!(d_name = (char *)malloc(n3 + 1))) { /* Save its name */
-                    printf("?internal error - ludial malloc 2\n");
-                    if (line) {
-                        free(line);
-                        line = NULL;
-                    }
-                    dncount = 0;
-                    return(-1);
-                }
-                t = n3;                 /* And its length */
-                strcpy(d_name,info[1]); /* safe */
-            } else {                    /* Second or subsequent one */
-
-#ifdef LUDEBUG
-                if (zz)
-                  printf("d_name=[%s],info[1]=%s,t=[%d]\n",d_name,info[1],t);
-#endif /* LUDEBUG */
-
-                if ((int) strlen(info[1]) == t) /* Lengths compare */
-                  if (!ckstrcmp(d_name,info[1],t,0)) /* Caseless compare OK */
-                    continue;
-
-                /* Name given by user matches entries with different names */
-
-                if (ambiguous)          /* Been here before */
-                  break;
-
-                ambiguous = 1;          /* Now an exact match is required */
-                for (j = 0; j < dncount; j++) { /* Clean out previous list */
-                    if (dn_p[j]) {
-                        free(dn_p[j]);
-                        dn_p[j] = NULL;
-                    }
-                }
-                pass++;                 /* Second pass... */
-                goto lu_again;          /* Do it all over again. */
-            }
-        }
-    }
-    if (line) free(line);
-    if (dncount == 0 && ambiguous) {
-        printf(" Lookup: \"%s\" - ambiguous%s\n",
-               s,
-               cx == XXLOOK ? "" : " - dialing skipped"
-               );
-        return(-2);
-    }
-    return(dncount);
-}
-
-char *
-pncvt(s) char *s; {                     /* Phone number conversion */
-    char *p = NULL;                     /* (just a wrapper for dncvt() */
-    char *q = NULL;
-    static char pnbuf[128];
-    makestr(&p,dn_p[0]);                /* Save these in case they are */
-    makestr(&q,dn_p2[0]);               /* being used */
-    makestr(&dn_p[0],s);                /* Copy the argument string to here */
-    dncvt(0,XXLOOK,1,1);                /* Convert it */
-    if (!dn_p2[0])                      /* Put result where can return it */
-      pnbuf[0] = NUL;
-    else
-      ckstrncpy(pnbuf,dn_p2[0],127);
-    makestr(&dn_p[0],p);                /* Restore these */
-    makestr(&dn_p2[0],q);
-    makestr(&p,NULL);                   /* Free these */
-    makestr(&q,NULL);
-    return((char *)pnbuf);
-}
-
-int
-dodial(cx) int cx; {                    /* DIAL or REDIAL */
-    int i = 0, x = 0;                   /* Workers */
-    int sparity = -1;                   /* For saving global parity value */
-    int previous = 0;
-    int len = 0;
-    int literal = 0;
-    int flowsave;
-    int lufound = 0;                    /* Did any lookup succeed? */
-    int prefix = 1;
-    int postfix = 1;
-    int wasalpha = 0;
-    int xredial = 0;
-    int braces = 0;
-
-    char *p = NULL, *s3 = NULL, * sav = NULL;
-    int j = 0, t = 0, n = 0;
-    int xretries, xlcc;
-
-    debug(F101,"dodial cx","",cx);
-    debug(F111,"dodial diallcc",diallcc,diallcc);
-
-    xretries = dialrtr;                 /* If retries not set, */
-    if (diallcc) {                      /* choose default based on */
-        xlcc = atoi(diallcc);           /* local country code. */
-        if (xretries < 0) {
-            switch (xlcc) {
-              case 1: xretries = 10; break; /* No restrictions in NANP */
-                /* Add other country codes here */
-                /* that are known to have no restrictions on redialing. */
-              default: xretries = 1;
-            }
-        }
-    }
-    if (cx == XXPDIA) {                 /* Shortcut... */
-        cx = XXDIAL;
-        partial = 1;
-        debug(F100,"PDIAL sets partial=1","",0);
-        postfix = 0;                    /* Do not add postfix */
-    } else {
-        partial = 0;
-        debug(F100,"DIAL sets partial=0","",0);
-    }
-    previous = dialsta;                 /* Status of previous call, if any */
-    if (previous == DIA_PART) {
-        prefix = 0;                     /* do not add prefix */
-    }
-    s = NULL;                           /* Initialize user's dial string */
-    if (cx == XXRED) {                  /* REDIAL or... */
-        if ((y = cmcfm()) < 0)
-          return(y);
-    } else if (cx == XXANSW) {          /* ANSWER or ... */
-        if ((y = cmnum("timeout (seconds)","0",10,&x,xxstring)) < 0)
-          return(y);
-        dialatmo = x;
-        if ((y = cmcfm()) < 0)
-          return(y);
-    } else {                            /* DIAL or LOOKUP */
-        if (ndialdir > 0)
-          s3 = "Number to dial or entry from dial directory";
-        else
-          s3 = "Number to dial";
-        if ((x = cmtxt(s3, dialnum ? dialnum : "",&s,xxstring)) < 0)
-          return(x);
-        if (s) {
-            len = (int) strlen(s);
-            ckstrncpy(tmpbuf,s,TMPBUFSIZ); /* Save literal copy */
-#ifdef COMMENT
-            if (len > 1) {              /* Strip outer braces if given */
-                if (*s == '{') {
-                    if (s[len-1] == '}') {
-                        s[len-1] = NUL;
-                        s++;
-                        len -= 2;
-                    }
-                }
-            }
-#else
-            s = brstrip(s);             /* Strip outer braces or quotes */
-#endif /* COMMENT */
-        }
-    }
-
-    if (cx != XXLOOK) {                 /* Not LOOKUP */
-#ifdef IKSD
-        if (inserver) {
-            printf("Sorry, dialing is disabled.\r\n");
-            return(success = 0);
-        }
-#endif /* IKSD */
-#ifdef CK_TAPI
-        if (tttapi && !tapipass) {
-          ;                             /* Skip the modem test if TAPI */
-        } else
-#endif /* CK_TAPI */
-        if (mdmtyp < 1 && !dialtest) {
-            if (network
-#ifdef TN_COMPORT
-                 && !istncomport()
-#endif /* TN_COMPORT */
-                 )
-              printf("Please SET HOST first, and then SET MODEM TYPE\n");
-            else
-              printf("Sorry, you must SET MODEM TYPE first\n");
-            dialsta = DIA_NOMO;
-            return(success = 0);
-        }
-        if (!local && !dialtest) {
-            printf("Sorry, you must SET %s or SET HOST first\n",
-#ifdef OS2
-                   "PORT"
-#else
-                   "LINE"
-#endif /* OS2 */
-                   );
-            dialsta = DIA_NOLI;
-            return(success = 0);
-        }
-        if ((!network 
-#ifdef TN_COMPORT
-              || istncomport()
-#endif /* TN_COMPORT */
-              ) && !dialtest &&
-#ifdef CK_TAPI
-             !tttapi &&
-#endif /* CK_TAPI */
-            (speed < 0L)
-#ifdef UNIX
-            && (strcmp(ttname,"/dev/null"))
-#else
-#ifdef OSK
-            && (strcmp(ttname,"/nil"))
-#endif /* OSK */
-#endif /* UNIX */
-            ) {
-            printf("\nSorry, you must SET SPEED first\n");
-            dialsta = DIA_NOSP;
-            return(success = 0);
-        }
-    }
-    if (cx != XXANSW) {
-        for (j = 0; j < MAXDNUMS; j++) { /* Initialize dial-number list */
-            if (!dialnum) {             /* First time dialing */
-                dn_p[j] = NULL;         /* initialize all pointers. */
-                dn_p2[j] = NULL;
-            } else if (dn_p[j]) {       /* Not the first time, */
-                free(dn_p[j]);          /* free previous, if any, */
-                dn_p[j] = NULL;         /* then set to NULL. */
-                if (dn_p2[j])
-                  free(dn_p2[j]);
-                dn_p2[j] = NULL;
-            } else break;               /* Already NULL */
-        }
-        if (len == 0)
-          s = NULL;
-        if (!s)
-          s = dialnum;
-        if (!s) {
-            if (cx == XXLOOK)
-              printf("?Lookup what?\n");
-            else
-              printf("%s\n", (cx == XXRED) ?
-                   "?No DIAL command given yet" :
-                   "?You must specify a number to dial"
-                   );
-            return(-9);
-        }
-
-    /* Now we have the "raw" dial or lookup string and s is not NULL */
-
-        makestr(&dscopy,s);             /* Put it in a safe place */
-        s = dscopy;
-        n = 0;
-
-        debug(F111,"dodial",s,ndialdir);
-
-        wasalpha = 0;
-        if (isalpha(*s)) {
-            wasalpha = 1;
-            if (ndialdir > 0) {         /* Do we have a dialing directory? */
-                n = ludial(s,cx);       /* Look up what the user typed */
-                if (n == 0)
-                  printf(" Lookup: \"%s\" - not found%s\n",
-                         s,
-                         cx == XXLOOK ? "" : " - dialing as given\n"
-                         );
-            }
-            debug(F101,"dodial",s,n);
-            if (n < 0 && cx != XXLOOK) { /* Error out if they wanted to dial */
-                if (n == -1)            /* -2 means ludial already gave msg */
-                  printf(" Lookup: fatal error - dialing skipped\n");
-                dialsta = DIA_DIR;
-                return(-9);
-            }
-            if (n > 0)                  /* A successful lookup */
-              lufound = 1;
-        } else if (*s == '=') {         /* If number starts with = sign */
-            s++;                        /* strip it */
-            literal = 1;                /* remember this */
-            while (*s == SP) s++;       /* and then also any leading spaces */
-        } else if (tmpbuf[0] == '{' && tmpbuf[1] == '{') {
-            makelist(tmpbuf,dn_p,MAXDNUMS);
-            makestr(&dscopy,tmpbuf);
-            s = tmpbuf;
-            for (n = 0; n < MAXDNUMS; n++) /* (have to count how many) */
-              if (!dn_p[n]) break;
-            braces = 1;
-        }
-        if (cx == XXLOOK && !wasalpha && !braces) {
-            /* We've been told to lookup a number or a quoted name */
-            char *p;
-            n = 0;
-            p = literal ? s : pncvt(dscopy);
-            if (!p) p = "";
-            if (*p) {
-                printf("%s  => %s\n", dscopy, p);
-                return(success = 1);
-            } else {
-                printf("?Bad phone number\n");
-                return(success = 0);
-            }
-        }
-        /* Save DIAL or successful LOOKUP string for future DIAL or REDIAL */
-        /* But don't save pieces of partial dial ... */
-
-        debug(F101,"DIAL save dialnum partial","",partial);
-        debug(F101,"DIAL save dialnum previous","",previous);
-        if ((cx == XXDIAL && partial == 0 && previous != DIA_PART) ||
-            (cx == XXLOOK && n > 0)) {
-            makestr(&dialnum,dscopy);
-            if (!quiet && dscopy && !dialnum)
-              printf("WARNING - memory allocation failure: redial number\n");
-        }
-        if (n > 0) {
-            if (!quiet && !backgrd && !braces /* && dialdpy */ ) {
-                if (!strcmp(d_name,s))
-                  printf(" Lookup: \"%s\" - exact match\n",s);
-                else
-                  printf(" Lookup: \"%s\" - uniquely matches \"%s\"\n",
-                         s,
-                         d_name
-                         );
-            }
-            if ((cx == XXLOOK) ||
-                ((n > 1) && !quiet && !backgrd /* && dialdpy */ )) {
-                printf(" %d telephone number%sfound for \"%s\"%s\n",
-                       n,
-                       (n == 1) ? " " : "s ",
-                       s,
-                       (n > 0) ? ":" : "."
-                       );
-                s3 = getdname();
-            }
-            for (i = 0; i < n; i++) {   /* Convert */
-                dn_x[i] = -1;
-                if (dncvt(i,cx,prefix,postfix) < 0) {
-                    if (cx != XXLOOK) {
-                        dialsta = DIA_DIR;
-                        return(-9);
-                    }
-                }
-            }
-            if (dialsrt && n > 1) {     /* Sort into optimal order */
-                for (i = 0; i < n-1; i++) {
-                    for (j = i+1; j < n; j++) {
-                        if (dn_x[j] < dn_x[i]) {
-                            t = dn_x[j];
-                            dn_x[j] = dn_x[i];
-                            dn_x[i] = t;
-                            p = dn_p[j];
-                            dn_p[j] = dn_p[i];
-                            dn_p[i] = p;
-                            p = dn_p2[j];
-                            dn_p2[j] = dn_p2[i];
-                            dn_p2[i] = p;
-                        }
-                    }
-                }
-            }
-            if ((cx == XXLOOK) ||
-                ((n > 1) && !quiet && !backgrd /* && dialdpy */ )) {
-                int nn = n;
-#ifndef NOSPL
-                char * p;
-#endif /* NOSPL */
-                if (cx != XXLOOK)
-                  if (n > 12) nn = 12;
-                for (i = 0; i < nn; i++) {
-                    printf("%3d. %-12s  %-20s =>  %-20s  (%d)\n",i+1,
-                           s3, dn_p[i],
-                           dn_p2[i] ? dn_p2[i] : "(processing failed)",
-                           dn_x[i]
-                           );
-                }
-                if (cx != XXLOOK && n != nn)
-                  printf("And %d more...\n", n - nn);
-            }
-        } else if (n == 0) {            /* Not found in directory */
-            makestr(&(dn_p[0]),literal ? s : dscopy);
-            makestr(&d_name,literal ? s : dscopy);
-            dncount = 1;
-            n = 1;
-            if (dncvt(0,cx,prefix,postfix) < 0) { /* In case they typed a */
-                dialsta = DIA_DIR;      /* portable-format number ... */
-                return(-9);
-            }
-        }
-
-#ifndef NONET
-#ifdef NETCONN
-        /* It's not good that the networks directory depends on NOT-NODIAL.. */
-        if (cx == XXLOOK && dscopy) {   /* Networks here too... */
-            extern char *nh_p[], *nh_p2[], *n_name;
-            extern char *nh_px[4][MAXDNUMS+1];
-            n = -1;
-            if (nnetdir > 0) {          /* Do we have a network directory? */
-                dirline = 0;
-                n = lunet(dscopy);      /* Look up what the user typed */
-            }
-            if (n > -1) {
-                int k;
-                if (n > 0)              /* A successful lookup */
-                  lufound = 1;
-                if (cx == XXLOOK && n == 0)
-                  printf(" Lookup: \"%s\" - not found\n",dscopy);
-                else
-                  printf("%s %d network entr%s found for \"%s\"%s\n",
-                         cx == XXLOOK ? " Lookup:" : "",
-                         n,
-                         (n == 1) ? "y" : "ies",
-                         dscopy,
-                         (n > 0) ? ":" : "."
-                         );
-
-                for (i = 0; i < n; i++) {
-
-                    printf("%3d. %-12s => %-9s %s",
-                           i+1,n_name,nh_p2[i],nh_p[i]);
-                    for (k = 0; k < 4; k++) {
-                        if (nh_px[k][i]) {
-                            printf(" %s",nh_px[k][i]);
-                        } else
-                          break;
-                    }
-                    printf("\n");
-                }
-            }
-        }
-#endif /* NETCONN */
-#endif /* NONET */
-        if (cx == XXLOOK)
-          return(success = lufound);
-    } /* cx != XXANSW */
-
-#ifdef VMS
-    conres();                   /* So Ctrl-C/Y will work */
-#endif /* VMS */
-/*
-  Some modems do not react well to parity.  Also, if we are dialing through a
-  TCP/IP TELNET modem server, parity can be fatally misinterpreted as TELNET
-  negotiations.
-
-  This should work even if the user interrupts the DIAL command, because the
-  DIAL module has its own interrupt handler.  BUT... if, for some reason, a
-  dialing device actually *requires* parity (e.g. CCITT V.25bis says that even
-  parity should be used), this might prevent successful dialing.  For that
-  reason, we don't do this for V.25bis modems.
-*/
-    sparity = parity;                   /* Save current parity */
-    if ((dialcapas & CKD_V25) == 0)     /* If not V.25bis...  */
-      parity = 0;                       /* Set parity to NONE */
-
-    flowsave = flow;
-/*
-  These modems use some kind of screwy flow control while in command mode,
-  and do not present CTS as they should.  So if RTS/CTS is set (or even if
-  it isn't) disable flow control during dialing.
-*/
-#ifndef MINIDIAL
-    if (mdmtyp == n_ATT1910 || mdmtyp == n_ATT1900) {
-        flow = FLO_NONE;                /* This is not enough */
-#ifdef CK_TTSETFLOW
-        ttsetflow(FLO_NONE);            /* Really turn it off */
-#endif /* CK_TTSETFLOW */
-    }
-#endif /* MINIDIAL */
-    if (!network
-#ifdef TN_COMPORT
-        || istncomport()
-#endif /* TN_COMPORT */
-         ) {
-        int x;
-        if ((x = ttgmdm()) > -1) {
-            if (!x && msgflg) {
-                printf(
-"WARNING - No modem signals detected.  Is your modem turned on?  If not,\n\
-use Ctrl-C to interrupt dialing, turn on your modem, then %s.\n",
-                       cx == XXANSW ?
-                       "ANSWER again" :
-                       "REDIAL"
-                       );
-            }
-            if (flow == FLO_RTSC) {
-                if (!(x & BM_CTS)) {
-                    if (msgflg)
-                      printf(
-"WARNING - SET FLOW RTS/CTS is in effect but modem's CTS signal is off.\n\
-Disabling flow control temporarily %s...\n",
-                             cx == XXANSW ?
-                             "while waiting for call" :
-                             "during dialing"
-                             );
-                    flow = FLO_NONE;
-                }
-            }
-        }
-    }
-    if (cx == XXANSW) {                 /* ANSWER */
-        success = ckdial("",0,0,1,0);
-        goto dialfin;
-    }
-
-/* Edit 192 adds the ability to dial repeatedly. */
-
-    i = 0;
-    dialcount = 0;
-    do {
-        if (i > 0) printf("\nDial attempt %d of %d...\n", i+1, xretries);
-        dialcount = i+1;
-        success = 0;
-        /* And the ability to dial alternate numbers. */
-        /* Loop to dial each in a list of numbers for the same name... */
-        for (j = 0; j < n && !success; j++) { /* until one answers. */
-            s = dn_p2[j];               /* Next number in list */
-            if (dn_x[j] >= dialrstr) {  /* Dial restriction */
-                printf("Restricted: %s, skipping...\n",dn_p[j]);
-                continue;
-            }
-            xredial = (i == 0 && j == 0) ? 0 : 1;
-            if (!s) s = dn_p[j];
-
-#ifndef NOSPL
-            sav = s;
-            p = xdial(s);               /* Apply DIAL macro now */
-            if (p) s = p;
-#endif /* NOSPL */
-
-           /* Dial confirmation */
-           /* NOTE: the uq_xxx() calls allow for a GUI dialog */
-
-            if (i == 0 && dialcnf) {
-               char msgbuf[128];
-               ckmakmsg(msgbuf,128,"Dialing ",s,NULL,NULL);
-               x = uq_ok(msgbuf,"Is this number correct? ",3,NULL,0);
-                if (!x) {
-
-#ifndef COMMENT
-                   x = uq_txt(         /* Allow GUI dialog */
-#ifdef OS2
-" Please enter the correct number,\r\n or press Enter to skip.",
-#else
-" Please enter the correct number,\r\n or press Return to skip.",
-#endif /* OS2 */
-                              "Corrected phone number: ",
-                               1,
-                              NULL,
-                              atmbuf,
-                              ATMBL,
-                               s,
-                               DEFAULT_UQ_TIMEOUT
-                               );
-                   if (x && atmbuf[0]) { /* They gave a new one */
-                       s = atmbuf;
-                       makestr(&(dn_p2[j]), s);
-                   }                   
-
-#else  /* COMMENT */
-
-#ifdef CK_RECALL
-                    extern int on_recall;
-#endif /* CK_RECALL */
-                    cmsavp(psave,PROMPTL);
-                    cmsetp(
-#ifdef OS2
-" Please enter the correct number,\r\n or press Enter to skip: "
-#else
-" Please enter the correct number,\r\n or press Return to skip: "
-#endif /* OS2 */
-                           );
-                    cmini(ckxech);
-                    x = -1;
-                    if (pflag) prompt(NULL);
-#ifdef CK_RECALL
-                    on_recall = 0;
-#endif /* CK_RECALL */
-                    y = cmdgquo();
-                    cmdsquo(0);
-                    while (x < 0) {
-                        x = cmtxt("Corrected phone number","",&s,NULL);
-                        cmres();
-                    }
-                    if ((int) strlen(s) < 1) {
-                        cmsetp(psave);
-                        continue;
-                    }
-                    makestr(&(dn_p2[j]), s);
-                    cmdsquo(y);
-                    cmsetp(psave);
-#endif /* COMMENT */
-                }
-            }
-            if (dialtest) {             /* Just testing */
-                if (i + j == 0)
-                  printf("\nTESTING...\n");
-                if (dialmac)
-                  printf(" Number: \"%s\" => \"%s\"\n",sav,s);
-                else
-                  printf(" Number: \"%s\"\n",s);
-                dialsta = DIA_BUSY;
-                success = 0;
-            } else {
-                what |= W_DIALING;
-                success = ckdial(s,i,j,partial ? 3 : 0, xredial); /* Dial it */
-                what &= ~(W_DIALING);
-                if (!success) {
-                    if (dialsta < 8 ||  /* Break out if unrecoverable error */
-                        dialsta  == DIA_INTR ||
-                        dialsta  == DIA_ERR  ||
-                        previous == DIA_PART
-                        )
-                      break;
-                }
-            }
-        }
-        if (success)                    /* Succeeded, leave the outer loop */
-          break;
-        if (dialsta < 8 ||              /* Break out if unrecoverable error */
-            dialsta == DIA_INTR ||      /* Interrupted */
-            dialsta == DIA_NODT ||      /* No dialtone */
-            dialsta == DIA_NOAC ||      /* Access forbidden */
-            dialsta == DIA_BLCK ||      /* Blacklisted */
-            dialsta == DIA_DIR  ||      /* Dialing directory error */
-            dialsta == DIA_ERR  ||      /* Modem command error */
-            previous == DIA_PART)
-          break;
-        if (++i >= xretries)            /* Break out if too many tries */
-          break;
-        if (!backgrd && !quiet) {
-            if (dialint > 5)
-              printf(
-"\nWill redial in %d second%s- press any key to redial immediately.\n",
-                     dialint,
-                     dialint == 1 ? " " : "s "
-                     );
-            printf("Ctrl-C to cancel...\n");
-        }
-        x = dialint;                    /* Redial interval */
-        while (x-- > 0) {
-            if ((y = conchk()) > 0) {   /* Did they type something? */
-                while (y--) coninc(0);  /* Yes, absorb it */
-                break;                  /* And wake up */
-            }
-            sleep(1);                   /* No interrupt, sleep a sec */
-        }
-    } while (!success);
-
-  dialfin:
-
-    if (cx != XXLOOK) {
-        if (!success)
-          bleep((short) BP_FAIL);
-        else if (!quiet)
-          bleep((short) BP_NOTE);
-#ifdef OS2
-        setint();                       /* Fix OS/2 interrupts */
-#endif /* OS2 */
-        if (sparity > -1)
-          parity = sparity;             /* Restore parity if we saved it */
-        flow = flowsave;
-#ifdef OS2
-        ttres();                        /* Restore DIAL device */
-#endif /* OS2 */
-#ifdef VMS
-        concb((char)escape);            /* Restore console */
-#endif /* VMS */
-#ifdef OS2
-        {                               /* Set session title */
-            char * p, name[72];         /* in window list. */
-            char * q;
-            if (cx == XXANSW) {
-                q = "Incoming call";
-            } else {
-                if (d_name)
-                  q = d_name;
-                else if (dialnum)
-                  q = dialnum;
-                else if (ttname[0])
-                  q = ttname;
-                else q = "";
-            }
-            p = name;
-            if (success) {
-                strncpy(name,q,48);
-                while (*p) {            /* Uppercase it for emphasis. */
-                    if (islower(*p))
-                      *p = toupper(*p);
-                    p++;
-                }
-            } else
-              name[0] = NUL ;
-            os2settitle((char *) name, TRUE);
-        }
-#endif /* OS2 */
-    }
-    if (cx != XXLOOK) {
-        if (success) {
-            if (reliable == SET_AUTO) { /* It's not a reliable connection. */
-                reliable = SET_OFF;
-                debug(F101,"dodial reliable","",reliable);
-            }
-        } else {
-#ifndef NOHINTS
-            extern int hints;
-            if (hints && !quiet && dialsta != 9) { /* 9 == User interrupted */
-                extern int dialmhu, dialhng, dialdpy;
-                extern char * dialmsg[];
-                printf("\n*************************\n");
-                printf("DIAL-class command failed.\n");
-                printf("Modem type:  %s\n", gmdmtyp());
-                printf("Device:      %s\n", ttname);
-                printf("Speed:       %ld\n", speed);
-                printf("Dial status: %d",dialsta);
-                if (dialsta < 35 && dialmsg[dialsta])
-                  printf(" [%s]",dialmsg[dialsta]);
-                printf("\n");
-                if (dialsta == DIA_TIMO ||
-                    dialsta == DIA_NRDY ||
-                   (dialsta > 13 && dialsta != DIA_BUSY && dialsta != DIA_NOAN)
-                    ) {
-                    switch (dialsta) {
-                      case DIA_TIMO:
-                        printf(
-" . SET DIAL TIMEOUT to a greater value and try again.\n"
-                               );
-                        break;
-                      case DIA_NRSP:
-                      case DIA_NRDY:
-                      case DIA_NOIN:
-                        printf(
-" . Is the modem turned on?\n"
-                               );
-                        printf(
-" . Are you using the right communication port?\n"
-                               );
-                        break;
-                      case DIA_NODT:
-                        printf(
-" . Is the modem connected to the telephone line?\n"
-                               );
-                    }
-                    if (mdmtyp == n_GENERIC) {
-                        printf(
-" . Please choose a specific modem type with SET MODEM TYPE and try again.\n"
-                               );
-                        printf(
-"    SET MODEM TYPE ? to see the list of known modem types.\n"
-                               );
-                    } else {
-                        printf(
-" . Are you sure you have chosen the appropriate modem type?\n"
-                               );
-                    }
-                    if (speed > 19200L) {
-                        printf(
-" . Maybe the interface speed (%ld) is too fast:\n", speed
-                               );
-                        printf(
-"    SET SPEED to a lower speed and try again.\n"
-                               );
-                        printf(
-"    SET SPEED ? to see the list of valid speeds.\n"
-                               );
-                    }
-                    if (dialhng) {
-                        if (dialmhu)
-                          printf(
-" . SET MODEM HANGUP-METHOD RS232 and try again.\n"
-                                 );
-                        else
-                          printf(
-" . SET MODEM HANGUP-METHOD MODEM-COMMAND and try again.\n"
-                                 );
-                        printf(
-" . If that doesn't work, try again with SET DIAL HANGUP OFF.\n"
-                               );
-                    } else {
-                        printf(
-" . Give a HANGUP or SET DIAL HANGUP ON command and try again.\n"
-                               );
-                    }
-                    if (!dialdpy)
-                      printf(
-" . Use SET DIAL DISPLAY ON to watch the dialog between Kermit and modem.\n"
-                             );
-                }
-#ifndef NOSHOW
-                printf(
-" . SHOW COMMUNICATIONS, SHOW MODEM, SHOW DIAL to see current settings.\n"
-                       );
-#endif /* NOSHOW */
-
-#ifndef NOHELP
-                printf(
-" . HELP SET MODEM, HELP SET DIAL, and HELP DIAL for more information.\n"
-                       );
-#endif /* NOHELP */
-                printf("(Use SET HINTS OFF to suppress future hints.)\n");
-                printf("*************************\n\n");
-            }
-#endif /* NOHINTS */
-        }
-    }
-    return(success);
-}
-#endif /* NODIAL */
-
-/*  D O T Y P E  --  Type (display) a file with various options...  */
-
-#ifdef BIGBUFOK
-#define TYPBUFL 16384
-#else
-#define TYPBUFL 256
-#endif /* BIGBUFOK */
-
-int typ_lines = 0;                      /* \v(ty_ln) */
-int typ_mtchs = 0;                      /* \v(ty_lm) */
-static int typ_int = 0;                 /* Flag if TYPE interrupted */
-
-#ifdef UNICODE
-extern int fcharset, fileorder, byteorder, ucsorder;
-#define TYPXBUFL TYPBUFL+TYPBUFL+TYPBUFL+4
-static char * mp = NULL;
-static char * mbuf = NULL;
-static long xn = 0L;
-
-static int
-#ifdef CK_ANSIC
-storechar(char c)
-#else
-storechar(c) char c;
-#endif /* CK_ANSIC */
-{
-    if (!mp) return(-1);
-    if (++xn > TYPXBUFL)
-      return(-1);
-    debug(F111,"storechar xn",ckitoa((int)c),xn);
-    *mp++ = c;
-    return(0);
-}
-#endif /* UNICODE */
-
-static FILE * ofp = NULL;               /* For /OUTPUT: file */
-
-static int
-typeline(buf,len,outcs,ofp) char * buf; int len, outcs; FILE * ofp; {
-    register int i;
-
-    debug(F011,"typeline buf",buf,len);
-    /* debug(F101,"typeline outcs","",outcs); */
-
-#ifdef OS2
-#ifndef NOLOCAL
-#ifdef UNICODE
-    /* In K95 only, the buffer is guaranteed to be in UCS-2 if outcs >= 0. */
-    /* Len is its length in bytes.  There is no line terminator. */
-    /* outcs is the file character-set number (FC_xxx) of the target set */
-    /* that was requested by the user. */
-    if (!inserver && !k95stdout) {
-        extern int wherex[], wherey[];
-        extern unsigned char colorcmd;
-
-        VscrnWrtUCS2StrAtt( VCMD, (unsigned short *)buf, len/2,
-                           wherey[VCMD], wherex[VCMD], &colorcmd);
-        printf("\r\n");
-        return(0);
-    }
-#endif /* UNICODE */
-#endif /* NOLOCAL */
-#endif /* OS2 */
-
-/* In Unix, VMS, etc, the line has already been converted to the desired  */
-/* character-set, if one was given.  OR... on all platforms, including in */
-/* K95, we don't know the character set.  In either case we dump the line */
-/* byte by byte in case it contains NULs (printf() would truncate). */
-
-#ifdef COMMENT
-    for (i = 0; i < len; i++)
-      putchar(buf[i]);
-#else
-    for (i = 0; i < len; i++) {
-        if (ofp == stdout) {
-            putchar(buf[i]);
-        } else {
-            putc(buf[i],ofp);
-        }
-    }
-#endif /* COMMENT */
-
-#ifdef IKSD
-    if (inserver) {
-#ifdef UNICODE
-        if (outcs == FC_UCS2) {
-            if (ofp == stdout) {
-                putchar(NUL);
-            } else {
-                putc(NUL,ofp);
-            }
-        }
-#endif /* UNICODE */
-        if (ofp == stdout) {
-            putchar('\r');
-        } else {
-            putc('\r',ofp);
-        }
-    }
-#endif /* IKSD */
-#ifdef UNICODE
-    if (outcs == FC_UCS2) {
-        if (ofp == stdout) {
-            putchar(NUL);
-        } else {
-            putc(NUL,ofp);
-        }
-    }
-#endif /* UNICODE */
-    if (ofp == stdout) {
-        putchar('\n');
-    } else {
-        putc('\n',ofp);
-    }
-    fflush(stdout);
-    return(0);
-}
-
-static int                              /* Get translated line */
-typegetline(incs, outcs, buf, n) int incs, outcs, n; char * buf; {
-    int x = 0, c0, c1, len = 0, count = 0, eof = 0, xlate = 0;
-#ifdef UNICODE
-    int xxn = -1;
-    int yyn = -9;
-    xn = 0L;
-
-#ifdef DEBUG
-    if (deblog && typ_lines == 0) {
-        debug(F101,"typegetline incs","",incs);
-        debug(F101,"typegetline outcs","",outcs);
-        debug(F101,"typegetline feol","",feol);
-        debug(F101,"typegetline byteorder","",byteorder);
-        debug(F101,"typegetline ucsorder ","",ucsorder);
-        debug(F111,"typegetline fileorder","1",fileorder);
-    }
-#endif /* DEBUG */
-
-    if (incs < 0)                       /* Shouldn't happen */
-      return(-2);
-
-    if (outcs == -1)                    /* Can happen */
-      outcs = incs;
-
-    if (incs != outcs || incs == FC_UCS2) { /* See if we should translate */
-        xlate = 1;
-        if (!mbuf) {                    /* Allocate buffer if not allocated */
-            mbuf = (char *)malloc(TYPXBUFL+1); /* yet */
-            if (!mbuf) {
-                printf("WARNING: Translation buffer allocation failure.\n");
-                printf("Translation will be skipped...\n");
-                xlate = 0;
-            }
-        }
-    }
-    if (xlate) {                        /* Translating... */
-        mp = mbuf;                      /* Reset working buffer pointer */
-/*
-  Here we call xgnbyte() in a loop, having it return UCS-2 bytes.  In K95, we
-  use UCS-2 directly.  Elsewhere, we feed the UCS-2 bytes into xpnbyte() to
-  convert them to the desired target character set.  But since we are using
-  UCS-2, we have several sources for confusion: (1) xgnbyte() might return in
-  LE or BE byte order, with no explicit indication of what the order is; but
-  (2) xpnbyte() wants BE; but (3) Windows wants LE.
-*/
-        while (1) {
-            if (typ_int)                /* Quit if interrupted */
-              return(0);
-            c0 = xgnbyte(FC_UCS2,incs,NULL); /* Convert to UCS-2 */
-            debug(F000,"typegetline c0","",c0);
-            if (c0 < 0) {               /* EOF */
-                eof++;
-                break;
-            }
-            c1 = xgnbyte(FC_UCS2,incs,NULL); /* Convert to UCS-2 */
-            debug(F000,"typegetline c1","",c1);
-            if (c1 < 0) {               /* EOF */
-                eof++;
-                break;
-            }
-#ifdef DEBUG
-            if (deblog && typ_lines == 0) {
-                if (count == 0) /* Check fileorder after BOM */
-                  debug(F111,"typegetline fileorder","2",fileorder);
-            }
-#endif /* DEBUG */
-
-#ifdef COMMENT
-/* Now we have the two UCS-2 bytes.  Which order are they in? */
-
-            if (fileorder > 0) {        /* Little Endian */
-                int t;                  /* So swap them */
-                debug(F100,"typegetline swapping","",0);
-                t = c1;
-                c1 = c0;
-                c0 = t;
-            }
-#endif /* COMMENT */
-            if (c0 == 0 && c1 == 0x0D)  /* Now see if we have EOL */
-              yyn = xn;
-
-            if (c0 == 0 && c1 == 0x0A)  /* Now see if we have EOL */
-              xxn = xn;
-
-            count++;                    /* Count byte */
-
-/* Give the two bytes to xpnbyte() in BE order */
-
-            if ((x = xpnbyte(c0,TC_UCS2,outcs,storechar)) < 0) return(-1);
-            if ((x = xpnbyte(c1,TC_UCS2,outcs,storechar)) < 0) return(-1);
-
-            if (xxn > -1) {             /* Have end of line? */
-                xn = xxn;
-                if (yyn == xxn - 2)     /* Adjust for CRLF */
-                  xn = yyn;
-                break;                  /* And break out of loop. */
-            }
-        }
-        mbuf[xn] = NUL;
-        if (xn > n)                     /* Can truncate here... */
-          xn = n;
-        memcpy(buf,mbuf,xn);
-        debug(F011,"typegetline xlate",buf,xn);
-        return((eof && (xn == 0)) ? -1 : xn);
-    }
-#endif /* UNICODE */
-#ifdef COMMENT
-    /* We can't use this because, stupidly, zsinl() doesn't return a length. */
-    /* It could be changed but then we'd have to change all ck?fio.c modules */
-    x = zsinl(ZIFILE,buf,n);
-#else
-    /* So instead, we copy zsinl() to here... */
-    /* But note: This does not necessarily handle UCS-2 alignment properly;  */
-    /* that's what the code in the first section of this routine is for. */
-    /* But it does tolerate files that contain NULs. */
-    {
-        int a;
-        char *s;
-
-        s = buf;
-        a = -1;                         /* Current character, none yet. */
-        debug(F101,"typegetline zsinl simulation","",n);
-        while (n--) {                   /* Up to given length */
-#ifdef COMMENT
-            int old = 0;
-            if (feol)                   /* Previous character */
-              old = a;
-#endif /* COMMENT */
-            if (zchin(ZIFILE,&a) < 0) { /* Read a character from the file */
-                debug(F101,"typegetline zchin fail","",count);
-                if (count == 0)
-                  x = -1;               /* EOF or other error */
-                break;
-            } else
-              count++;
-            if (feol) {                 /* Single-character line terminator */
-                if (a == feol)
-                  break;
-            } else {                    /* CRLF line terminator */
-#ifdef COMMENT
-/* Debug log shows that in Windows, <CR><LF> is returned as <LF>. */
-/* Apparently we're not reading the file in binary mode. */
-
-                if (a == '\015')        /* CR, get next character */
-                  continue;
-                if (old == '\015') {    /* Previous character was CR */
-                    if (a == '\012') {  /* This one is LF, so we have a line */
-                        break;
-                    } else {            /* Not LF, deposit CR */
-                        *s++ = '\015';
-                        n--;
-                        len++;
-                    }
-                }
-#else
-                if (a == LF) {
-                    if (s[len] == CR) { /* This probably won't happen */
-                        s[len] = NUL;
-                        s--;
-                        len--;
-                    }
-                    break;
-                }
-#endif /* COMMENT */
-            }
-            *s = a;                     /* Deposit character */
-            s++;
-            len++;
-        }
-        *s = '\0';                      /* Terminate the string */
-    }
-#endif /* COMMENT */
-    return(x < 0 ? -1 : len);
-}
-
-
-#ifndef MAC
-SIGTYP
-#ifdef CK_ANSIC
-tytrap(int foo)                         /* TYPE interrupt trap */
-#else
-tytrap(foo) int foo;
-#endif /* CK_ANSIC */
-/* tytrap */ {
-#ifdef __EMX__
-    signal(SIGINT, SIG_ACK);
-#endif
-    debug(F100,"type tytrap SIGINT","",0);
-    typ_int = 1;                        /* (Need arg for ANSI C) */
-    SIGRETURN;
-}
-#endif /* MAC */
-
-int
-dotype(file, paging, first, head, pat, width, prefix, incs, outcs, outfile, z)
-    char * file, * pat, * prefix; int paging, first, head, width, incs, outcs;
-    char * outfile; int z;
-/* dotype */ {
-    extern long ffc;
-    char buf[TYPBUFL+2];
-    char * s = NULL;
-    int rc = 1, lines = 0, ucs2 = 0;
-    char ** tail = NULL;
-    int * tlen = NULL;
-    int tailing = 0, counting = 0;
-    int x, c, n, i, j, k = 0;
-    int number = 0, save, len, pfxlen = 0, evalpfx = 1;
-#ifdef UNICODE
-    int ucsbom_sav;
-    extern int ucsbom;
-#endif /* UNICODE */
-#ifdef NT
-    int gui = 0;
-#endif /* NT */
-
-#ifndef MAC
-#ifdef OS2
-#ifdef NT
-    SIGTYP (* oldsig)(int);             /* For saving old interrupt trap. */
-#else /* NT */
-    SIGTYP (* volatile oldsig)(int);
-#endif /* NT */
-#else /* OS2 */
-    SIGTYP (* oldsig)();
-#endif /* OS2 */
-#endif /* MAC */
-
-#ifdef KUI
-    if (outfile == (char *)1) {
-        gui = 1;
-        outfile = "";
-    }
-#endif /* KUI */
-
-    if (!file) file = "";
-    if (!*file) return(-2);
-
-    if (ofp != stdout) {                /* In case of previous interruption */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    if (!outfile) outfile = "";
-    if (outfile[0]) {
-        ofp = fopen(outfile,"w");       /* Open output file */
-        if (!ofp) {
-            printf("?Can't open output file %s: %s\n",outfile,ck_errstr());
-            ofp = stdout;
-            return(-9);
-        }
-    }
-    number = z;
-    if (number && prefix) prefix = NULL;
-
-#ifdef UNICODE
-    ucsbom_sav = ucsbom;                /* We are not creating a file */
-    ucsbom = 0;                         /* Do not use BOM bytes */
-#endif /* UNICODE */
-
-    typ_int = 0;
-
-    save = binary;                      /* Save file type */
-
-    debug(F101,"dotype incs","",incs);
-    debug(F101,"dotype outcs","",outcs);
-
-#ifdef UNICODE
-    debug(F111,"dotype fileorder","A",fileorder);
-#ifdef OS2
-    if (!inserver && !k95stdout)
-      outcs = FC_UCS2;
-#endif /* OS2 */
-
-    if (outcs == FC_UCS2)               /* Output is UCS-2? */
-      ucs2 = 1;
-    if (fileorder < 0)
-      fileorder = ucsorder;
-    debug(F111,"dotype fileorder","B",fileorder);
-#endif /* UNICODE */
-
-#ifdef CK_TTGWSIZ
-#ifdef OS2
-    ttgcwsz();
-#else /* OS2 */
-    /* Check whether window size changed */
-    if (ttgwsiz() > 0) {
-        if (tt_rows > 0 && tt_cols > 0) {
-            cmd_rows = tt_rows;
-            cmd_cols = tt_cols;
-            debug(F101,"dotype cmd_rows","",cmd_rows);
-            debug(F101,"dotype cmd_cols","",cmd_cols);
-        }
-    }
-#endif /* OS2 */
-#endif /* CK_TTGWSIZ */
-
-    if (prefix)
-      pfxlen = strlen(prefix);
-
-    if (paging < 0) {                   /* Count only, don't print */
-        counting = 1;
-        prefix = NULL;
-        width = 0;
-        paging = 0;
-    }
-    if (ucs2)                           /* Crude... */
-      width *= 2;
-
-#ifdef OS2
-    if (*file) {
-        ckstrncpy(buf, file, TYPBUFL);  /* Change / to \. */
-        p = buf;
-        while (*p) {
-            if (*p == '/') *p = '\\';
-            p++;
-        }
-        file = buf;
-    } else {
-        rc = 0;
-        goto xdotype;
-    }
-#endif /* OS2 */
-
-    if (zchki(file) == -2) {            /* It's a directory */
-        debug(F111,"dotype zchki failure",file,-2);
-        if (xcmdsrc == 0) {
-            printf("?Not a regular file: \"%s\"\n",file);
-            rc = -9;
-        } else
-          rc = 0;
-        goto xdotype;
-    }
-    if (!zopeni(ZIFILE, file)) {        /* Not a directory, open it */
-        debug(F111,"dotype zopeni failure",file,0);
-        if (xcmdsrc == 0) {
-            printf("?Can't open file: \"%s\"\n",file);
-            rc = -9;
-        } else
-          rc = 0;
-        goto xdotype;
-    }
-
-#ifndef AMIGA
-#ifndef MAC
-    errno = 0;
-    oldsig = signal(SIGINT, tytrap);    /* Save current interrupt trap. */
-    debug(F111,"type SIGINT trap set",ckitoa(errno),oldsig);
-#endif /* MAC */
-#endif /* AMIGA */
-
-    if (paging > -1)                    /* More-prompting */
-      xaskmore = paging;
-
-    binary = 0;
-
-    if (head < 0) {                     /* "tail" was requested */
-        tailing = 1;                    /* Set flag */
-        head = 0 - head;                /* Get absolute number of lines */
-        if (!counting) {
-            tail = (char **) malloc(head * sizeof(char *)); /* Allocate list */
-            if (!tail) {
-                printf("?Memory allocation failure\n");
-                goto xdotype;
-
-            }
-            tlen = (int *) malloc(head * sizeof(int));
-            if (!tlen) {
-                printf("?Memory allocation failure\n");
-                goto xdotype;
-
-            }
-            for (i = 0; i < head; i++) { /* Initialize each pointer in list. */
-                tail[i] = NULL;
-                tlen[i] = 0;
-            }
-        }
-    }
-    typ_lines = 0;
-    typ_mtchs = 0;
-
-#ifdef UNICODE
-    if (outcs > -1 && (incs != outcs || incs == FC_UCS2)) { /* Translating? */
-        ffc = 0L;
-        initxlate(incs,outcs);          /* Set up translation functions */
-    } else
-#endif /* UNICODE */
-      outcs = -1;                       /* Means we don't know the charset */
-
-    debug(F101,"dotype ffc","",ffc);
-    debug(F101,"dotype outcs 2","",outcs);
-#ifdef UNICODE
-    debug(F111,"dotype fileorder","C",fileorder);
-#endif /* UNICODE */
-
-    /* Allow the buffer to contain NULs */
-
-    for (n = first;
-         (len = typegetline(incs,outcs,buf,TYPBUFL)) > -1;
-         lines++
-         ) {
-        debug(F011,"dotype line",buf,len);
-#ifndef MAC
-        if (typ_int) {                  /* Interrupted? */
-            typ_int = 0;
-            debug(F101,"type interrupted line","",lines);
-            printf("^C...\n");          /* Print message */
-            if (ofp != stdout) {        /* Close any output file */
-                if (ofp) fclose(ofp);
-                ofp = stdout;
-            }
-            goto xxdotype;
-        }
-#endif /* MAC */
-        typ_lines++;                    /* For \v(ty_ln) */
-        if (pat)                        /* Matching? */
-          if (!ckmatch(pat,buf,1,1+4))  /* Line matches pattern? */
-            continue;                   /* No, skip it */
-        typ_mtchs++;
-
-        if (head > 0 && !tailing && lines == head) /* Handle /HEAD:n */
-          break;
-
-        buf[TYPBUFL+1] = NUL;           /* Just in case... */
-        if (prefix) {                   /* Add specified prefix to each line */
-            char pbuf[64];
-            char * pp;
-            pp = prefix;
-#ifndef NOSPL
-            if (evalpfx) {              /* Prefix is a variable? */
-                int n = 63;             /* Maybe - evaluate it and see */
-                char * p = pbuf;
-                zzstring(prefix,&p,&n); /* If there is no change */
-                if (!strcmp(prefix,pbuf)) { /* it's not a variable */
-                    evalpfx = 0;        /* So don't do this again. */
-                } else {                /* It was a variable */
-                    pp = pbuf;          /* So substitute its value */
-                    pfxlen = 63 - n;    /* and get its new length */
-                }
-            }
-#endif /* NOSPL */
-            if (len + pfxlen + 2 < TYPBUFL) {
-                /* Shift right to make room for prefix */
-                memcpy((char *)line+pfxlen,(char *)buf,len);
-                lset((char *)line,pp,pfxlen,SP);
-                debug(F110,"dotype prefix",line,pfxlen);
-                len += pfxlen;
-                memcpy((char *)buf,(char *)line,len);
-            }
-        } else if (number) {            /* Line numbers */
-            int x;
-            sprintf(line,"%4d. ",typ_lines);
-            x = strlen(line);
-            len += x;
-            if (len < LINBUFSIZ) {
-                memcpy((char *)&line[x],(char *)buf,len);
-                memcpy((char *)buf,(char *)line,len);
-            }
-        }
-        if (width > 0 && width <= TYPBUFL) { /* Truncate at given width. */
-            char * obuf = line;         /* But to do that first we must */
-            int i,k,z;                  /* expand tabs; assume every 8 cols. */
-            line[0] = NUL;
-            for (i = 0, k = 0; i < width; k++) { /* Character loop... */
-                if (!buf[k])            /* No more chars in this line, done. */
-                  break;
-                if (buf[k] != '\t') {   /* If it's not a tab */
-                    if (i >= LINBUFSIZ) /* Check for overflow */
-                      break;
-                    obuf[i++] = buf[k]; /* and then deposit it. */
-                    obuf[i] = NUL;      /* Keep it null-terminated */
-                    continue;
-                }
-                z = 8 - (i % 8);        /* It's a tab, expand it. */
-                if (z == 0) z = 8;
-                for (j = 0; j < z && i < LINBUFSIZ; j++) {
-#ifdef UNICODE
-                    if (ucs2 && !ucsorder)
-                      obuf[i++] = NUL;
-#endif /* UNICODE */
-                    obuf[i++] = ' ';
-#ifdef UNICODE
-                    if (ucs2 && ucsorder)
-                      obuf[i++] = NUL;
-#endif /* UNICODE */
-                }
-                obuf[i++] = NUL;
-                obuf[i] = NUL;
-            }
-            obuf[width] = NUL;          /* Now truncate at given width. */
-#ifdef COMMENT
-            /* This doesn't work for UCS-2 because it contains NULs */
-            ckstrncpy(buf,obuf,TYPBUFL); /* and copy it back (again?) */
-#else
-            memcpy((char *)buf,(char *)obuf,i); /* Copy it back */
-#endif /* COMMENT */
-            len = (i > width) ? width : i; /* Spare us another strlen()... */
-        }
-        if (tailing) {                  /* If /TAIL:n... */
-            k = lines % head;           /* save this line in circular buffer */
-            if (!counting) {
-                if (tail[k]) free(tail[k]);
-                tail[k] = malloc(len+2);
-                if (!tail[k]) {
-                    printf("?Memory allocation failure\n");
-                    goto xdotype;
-                }
-                memcpy(tail[k],buf,len);
-                tlen[k] = len;
-                continue;
-            }
-        }
-        if (counting)                   /* If only counting */
-          continue;                     /* we're done with this line */
-
-        if (paging) {                   /* Displaying this line... */
-            int u;
-            u = len;                    /* Length in BYTES */
-            if (ucs2)                   /* If outputting in UCS-2 */
-              u /= 2;                   /* convert length to CHARACTERS */
-            x = (u / cmd_cols) + 1;     /* Crudely allow for wrap */
-            if (cmd_rows > 0 && cmd_cols > 0)
-              n += x;                   /* This assumes terminal will wrap */
-        }
-#ifdef KUI
-        if ( gui ) {
-            int i;
-            unsigned short * uch = (unsigned short *)buf;
-            for ( i=0; i<len/2; i++)
-                gui_text_popup_append(uch[i]);
-                       gui_text_popup_append(CR);
-                       gui_text_popup_append(LF);
-        } 
-        else
-#endif /* KUI */
-        typeline(buf,len,outcs,ofp);    /* Print line, length based */
-#ifdef CK_TTGWSIZ
-        debug(F101,"dotype n","",n);
-        if (paging > 0 && ofp == stdout) { /* Pause at end of screen */
-            if (cmd_rows > 0 && cmd_cols > 0) {
-                if (n > cmd_rows - 3) {
-                    if (!askmore())
-                      goto xdotype;
-                    else
-                      n = 0;
-                }
-            }
-        }
-#endif /* CK_TTGWSIZ */
-    }
-
-  xdotype:
-    if (counting) {
-        fprintf(ofp,
-                "%s: %d line%s\n",file,typ_lines,typ_lines == 1 ? "" : "s");
-        if (pat)
-          fprintf(ofp,
-                  "%s: %d match%s\n",pat,typ_mtchs,typ_mtchs == 1 ? "" : "es");
-        goto xxdotype;
-    }
-    if (tailing && tail) {              /* Typing tail of file? */
-        if (lines < head) {             /* Yes, show the lines we saved */
-            k = 0;                      /* Show all lines */
-        } else {                        /* More lines than tail number */
-            lines = k;                  /* Last line to show */
-            k++;                        /* First line to show */
-            if (k >= head)
-              k = 0;
-        }
-        n = first;                      /* Output line counter */
-        for (i = k ;; i++) {            /* Loop thru circular buffer */
-#ifndef MAC
-            if (typ_int) {              /* Interrupted? */
-                printf("^C...\n");      /* Print message */
-                goto xxdotype;
-            }
-#endif /* MAC */
-            j = i % head;               /* Index of this line */
-            s = tail[j];                /* Point to line to display */
-            if (!s)                     /* (shouldn't happen...) */
-              break;
-            if (paging) {               /* Crudely allow for line wrap */
-                x = tlen[j];
-                if (ucs2) x /= 2;
-                x = x / cmd_cols + 1;
-                if (cmd_rows > 0 && cmd_cols > 0)
-                  n += x;
-            }
-            typeline(s,tlen[j],outcs,ofp); /* Display this line */
-            if (paging && ofp == stdout) { /* Pause at end of screen */
-                if (cmd_rows > 0 && cmd_cols > 0) {
-                    if (n > cmd_rows - 3) {
-                        if (!askmore())
-                          break;
-                        else
-                          n = 0;
-                    }
-                }
-            }
-            tail[j] = NULL;
-            free(s);                    /* Free the line */
-            if (i % head == lines)      /* When to stop */
-              break;
-        }
-        free((char *)tail);             /* Free the list */
-        tail = NULL;
-        if (tlen) free((char *)tlen);
-        tlen = NULL;
-    }
-
-/* Come here when finished or on SIGINT */
-
-  xxdotype:
-#ifndef AMIGA
-#ifndef MAC
-    signal(SIGINT,oldsig);              /* Put old signal action back. */
-#endif /* MAC */
-#endif /* AMIGA */
-    if (tailing && tail) {
-        for (i = 0; i < head; i++) {    /* Free each line. */
-            if (tail[i])
-              free(tail[i]);
-        }
-        free((char *)tail);             /* Free list pointer */
-        if (tlen)
-          free((char *)tlen);
-    }
-    x = zclose(ZIFILE);                 /* Done, close the input file */
-    if (ofp != stdout) {                /* Close any output file */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    binary = save;                      /* Restore text/binary mode */
-#ifdef UNICODE
-    ucsbom = ucsbom_sav;                /* Restore BOM usage */
-#endif /* UNICODE */
-
-#ifdef KUI
-    if ( gui )
-        gui_text_popup_wait(-1);        /* Wait for user to close the dialog */
-#endif /* KUI */
-    return(rc);
-}
-
-/* GREP command */
-
-#define GREP_CASE  0                    /* /CASE */
-#define GREP_COUN  1                    /* /COUNT */
-#define GREP_DOTF  2                    /* /DOTFILES */
-#define GREP_NAME  3                    /* /NAMEONLY */
-#define GREP_NOBK  4                    /* /NOBACKUP */
-#define GREP_NODO  5                    /* /NODOTFILES */
-#define GREP_NOLI  6                    /* /NOLIST */
-#define GREP_NOMA  7                    /* /INVERT = /NOMATCH */
-#define GREP_NOPA  8                    /* /NOPAGE */
-#define GREP_NUMS  9                    /* /LINENUMBERS */
-#define GREP_PAGE 10                    /* /PAGE */
-#define GREP_RECU 11                    /* /RECURSIVE */
-#define GREP_TYPE 12                    /* /TYPE: */
-#define GREP_OUTP 13                    /* /OUTPUTFILE: */
-
-static struct keytab greptab[] = {
-    { "/count",        GREP_COUN, CM_ARG },
-    { "/dotfiles",     GREP_DOTF, 0 },
-    { "/linenumbers",  GREP_NUMS, 0 },
-    { "/nameonly",     GREP_NAME, 0 },
-    { "/nobackupfiles",GREP_NOBK, 0 },
-    { "/nocase",       GREP_CASE, 0 },
-    { "/nodotfiles",   GREP_NODO, 0 },
-    { "/nolist",       GREP_NOLI, 0 },
-    { "/nomatch",      GREP_NOMA, 0 },
-    { "/nopage",       GREP_NOPA, 0 },
-    { "/output",       GREP_OUTP, CM_ARG },
-    { "/page",         GREP_PAGE, 0 },
-    { "/quiet",        GREP_NOLI, CM_INV },
-#ifdef RECURSIVE
-    { "/recursive",    GREP_RECU, 0 },
-#endif /* RECURSIVE */
-    { "/type",         GREP_TYPE, CM_ARG },
-    { "", 0, 0 }
-};
-static int ngreptab =  sizeof(greptab)/sizeof(struct keytab)-1;
-
-int
-dogrep() {
-    int match, x, y, fc, getval, mc = 0, count = 0, bigcount = 0;
-    int fline = 0, sline = 0, wild = 0, len = 0;
-    int xmode = -1, scan = 0;
-    char c, name[CKMAXPATH+1], outfile[CKMAXPATH+1], *p, *s, *cv = NULL;
-    FILE * fp = NULL;
-
-    int                                 /* Switch values and defaults */
-      gr_coun = 0,
-      gr_name = 0,
-      gr_nobk = 0,
-      gr_case = 1,
-      gr_noli = 0,
-      gr_noma = 0,
-      gr_nums = 0,
-      gr_page = xaskmore;
-
-    struct FDB sw, fl;
-
-    g_matchdot = matchdot;              /* Save global matchdot setting */
-    outfile[0] = NUL;
-
-    if (ofp != stdout) {                /* In case of previous interruption */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    cmfdbi(&sw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           "String or pattern to search for, or switch",
-           "",                          /* default */
-           "",                          /* addtl string data */
-           ngreptab,                    /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           greptab,                     /* Keyword table */
-           &fl                          /* Pointer to next FDB */
-           );
-    cmfdbi(&fl,                         /* Anything that doesn't match */
-           _CMFLD,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,                   /* xxstring */
-           NULL,
-           NULL
-           );
-    while (1) {                         /* Parse 0 or more switches */
-        x = cmfdb(&sw);                 /* Parse something */
-        if (x < 0)
-          return(x);
-        if (cmresult.fcode != _CMKEY)   /* Break out if not a switch */
-          break;
-        c = cmgbrk();
-        if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
-            printf("?This switch does not take an argument\n");
-            return(-9);
-        }
-        if ((cmresult.nresult != GREP_COUN) && !getval &&
-            (cmgkwflgs() & CM_ARG)) {
-            printf("?This switch requires an argument\n");
-            return(-9);
-        }
-        switch (cmresult.nresult) {
-          case GREP_COUN: {
-              gr_coun++;
-              if (getval) {
-                  if ((x = cmfld("Variable for result","",&s,NULL)) < 0)
-                    return(x);
-                  makestr(&cv,s);
-              }
-              break;
-          }
-          case GREP_CASE: gr_case=0; break;
-          case GREP_NAME: gr_name++; gr_noli=0; break;
-          case GREP_NOBK: gr_nobk++; break;
-          case GREP_NOLI: gr_noli++; gr_name=0; gr_nums=0; break;
-          case GREP_NOMA: gr_noma++; break;
-          case GREP_NOPA: gr_page=0; break;
-          case GREP_NUMS: gr_nums++; gr_noli=0; break;
-          case GREP_PAGE: gr_page++; gr_noli=0; break;
-          case GREP_NODO:
-            matchdot = 0;
-            break;
-          case GREP_DOTF:
-            matchdot = 1;
-            break;
-#ifdef RECURSIVE
-          case GREP_RECU:
-            recursive = 1;
-            break;
-#endif /* RECURSIVE */
-          case GREP_TYPE: {
-              extern struct keytab txtbin[];
-              if ((x = cmkey(txtbin,3,"","",xxstring)) < 0)
-                return(x);
-              if (x == 2) {             /* ALL */
-                  xmode = -1;
-              } else {                  /* TEXT or BINARY only */
-                  xmode = x;
-                  scan = 1;
-              }
-              break;
-          }
-          case GREP_OUTP:               /* Send output to file */
-            if ((x = cmofi("File for GREP'd lines","",&s,xxstring)) < 0)
-              return(x);
-            ckstrncpy(outfile,s,CKMAXPATH);
-            break;
-        }
-    }
-    if (outfile[0]) {
-        ofp = fopen(outfile,"w");       /* Open output file */
-        if (!ofp) {
-            printf("?Can't open output file %s: %s\n",outfile,ck_errstr());
-            ofp = stdout;
-            return(-9);
-        }
-        gr_page = 0;
-    }
-    s = cmresult.sresult;
-    s = brstrip(s);                     /* Strip braces from pattern */
-    if (!*s) {
-        printf("?Pattern required\n");
-        return(-9);
-    }
-    ckstrncpy(tmpbuf,s,TMPBUFSIZ);      /* Save pattern */
-    if ((x = cmifi("File(s) to search","",&s,&wild,xxstring)) < 0) {
-        if (x == -3) {
-            printf("?File specification required\n");
-            x = -9;
-        }
-        return(x);
-    }
-    s = brstrip(s);                     /* Strip braces from filename */
-#ifndef ZXREWIND
-    ckstrncpy(line,s,LINBUFSIZ);
-#endif /* ZXREWIND */
-    if ((y = cmcfm()) < 0)
-      return(y);
-
-    if (gr_page > -1)
-      xaskmore = gr_page;               /* Paging... */
-
-    p = tmpbuf;                         /* Point to pattern */
-#ifdef COMMENT
-/* Now this is done in ckmatch */
-    if (*p == '^') {                    /* '^' anchors pattern to beginning */
-        p++;
-    } else if (*p != '*') {             /* Otherwise prepend implied '*' */
-        tmpbuf[0] = '*';
-        p = tmpbuf;
-    }
-    x = strlen(p);                      /* Get length of result */
-    if (x > 0 && x < TMPBUFSIZ) {       /* '$' at end anchors pattern to end */
-        if (p[x-1] == '$') {
-            p[x-1] = NUL;
-        } else if (p[x-1] != '*') {
-            p[x] = '*';
-            p[x+1] = NUL;
-        }
-    }
-#endif /* COMMENT */
-    debug(F111,"grep pat",p,x);
-
-#ifdef ZXREWIND
-    fc = zxrewind();                    /* Rewind the file list */
-#else
-    {
-        int flags = ZX_FILONLY;         /* Expand file list */
-        if (matchdot)  flags |= ZX_MATCHDOT;
-        if (recursive) flags |= ZX_RECURSE;
-        fc = nzxpand(line,flags);
-    }
-#endif /* ZXREWIND */
-#ifdef UNIX
-    sh_sort(mtchs,NULL,fc,0,0,filecase);
-#endif /* UNIX */
-
-    debug(F101,"grep cmd_rows","",cmd_rows);
-    debug(F101,"grep cmd_cols","",cmd_cols);
-
-    while (1) {                         /* Loop for each file */
-        znext(name);                    /* Get next file */
-        if (!name[0])                   /* No more, done */
-          break;
-        if (gr_nobk)                    /* Skipping backup files? */
-          if (ckmatch("*.~[1-9]*~",name,1,1)) /* Backup file? */
-            continue;                   /* Yes, skip */
-        if (scan) {                     /* /TYPE: given? */
-            switch (scanfile(name,&y,nscanfile)) { /* Yes, scan the file */
-              case FT_BIN:
-                if (xmode != 1)
-                  continue;
-                break;
-              case FT_TEXT:
-              case FT_7BIT:
-              case FT_8BIT:
-#ifdef UNICODE
-              case FT_UTF8:
-              case FT_UCS2:
-#endif /* UNICODE */
-                if (xmode != 0)
-                  continue;
-            }
-        }
-        fp = fopen(name,"r");           /* Open */
-        if (!fp)                        /* Can't */
-          continue;                     /* Skip */
-        count = 0;                      /* Match count, this file */
-        fline = 0;                      /* Line count, this file */
-        while (1) {                     /* Loop for each line */
-            if (fgets(line,LINBUFSIZ,fp) == NULL) { /* Get next line */
-                fclose(fp);
-                fp = NULL;
-               debug(F100,"GREP EOF","",0);
-                break;
-            }
-            fline++;                    /* Count this line */
-            line[LINBUFSIZ] = NUL;      /* Make sure it's terminated */
-           debug(F111,"GREP",line,fline);
-            len = (int)strlen(line);    /* Get length */
-            while (len > 0 && (line[len-1] == '\n' || line[len-1] == '\r'))
-              line[--len] = NUL;        /* Chop off terminators */
-            match = ckmatch(p,line,gr_case,1+4); /* Match against pattern */
-            if (gr_noma)                /* Invert match sense if requested */
-              match = !match;
-            if (match) {                /* Have a matching line */
-                mc++;                   /* Total match count */
-                count++;                /* Match count this file */
-                if (gr_name) {          /* Don't care how many lines match */
-                    fclose(fp);         /* Close the file */
-                    fp = NULL;          /* and quit the line-reading loop. */
-                    break;
-                }
-                if (gr_coun || gr_noli) /* Not listing each line */
-                  continue;             /* so don't print anything now. */
-                if (wild) {            /* If searching multiple files */
-                    fprintf(ofp,"%s:",name); /* print filename. */
-                    len += (int)strlen(name) + 1;
-                }
-                if (gr_nums) {          /* If line numbers wanted */
-                    char nbuf[32];
-                    len += ckmakmsg(nbuf,32,ckitoa(fline),":",NULL,NULL);
-                    fprintf(ofp,"%s",nbuf);
-                }
-                if (cmd_rows > 0 && cmd_cols > 0)
-                  sline += (len / cmd_cols) + 1;
-                fprintf(ofp,"%s\n",line); /* Print the line. */
-                if (sline > cmd_rows - 3) {
-                    if (!askmore()) goto xgrep; else sline = 0;
-                }
-            }
-        }
-        if (!gr_noli) {                        /* If not not listing... */
-            x = 0;
-            if (gr_coun) {              /* Show match count only */
-                fprintf(ofp,"%s:%d\n",name,count);
-                x++;
-            } else if (gr_name && count > 0) { /* Show name only */
-                fprintf(ofp,"%s\n",name);
-                x++;
-            }
-            if (x > 0) {
-                if (++sline > cmd_rows - 3) {
-                    if (!askmore()) goto xgrep; else sline = 0;
-                }
-            }
-        }
-        bigcount += count;              /* Overall count */
-    }
-  xgrep:
-#ifndef NOSPL
-    if (gr_coun && cv) {                /* /COUNT:blah */
-        addmac(cv,ckitoa(bigcount));    /* set the variable */
-        makestr(&cv,NULL);              /* free this */
-    }
-#endif /* NOSPL */
-    if (fp) fclose(fp);                 /* close input file if still open */
-    if (ofp != stdout) {                /* Close any output file */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    return(success = mc ? 1 : 0);
-}
-
-/* System-independent directory */
-
-static char ** dirlist = NULL;
-static int ndirlist = 0;
-
-static VOID
-freedirlist() {
-    if (dirlist) {
-        int i;
-        for (i = 0; i < ndirlist; i++) {
-            if (dirlist[i])
-              free(dirlist[i]);
-        }
-        free((char *)dirlist);
-        dirlist = NULL;
-    }
-    ndirlist = 0;
-}
-
-static struct keytab dirswtab[] = {     /* DIRECTORY command switches */
-    { "/after",       DIR_AFT, CM_ARG },
-    { "/all",         DIR_ALL, 0 },
-#ifndef NOSPL
-    { "/array",       DIR_ARR, CM_ARG },
-#endif /* NOSPL */
-    { "/ascending",   DIR_ASC, 0 },
-    { "/backup",      DIR_BUP, 0 },
-    { "/before",      DIR_BEF, CM_ARG },
-    { "/brief",       DIR_BRF, 0 },
-    { "/descending",  DIR_DSC, CM_INV },
-    { "/directories", DIR_DIR, 0 },
-    { "/dotfiles",    DIR_DOT, 0 },
-    { "/englishdate", DIR_DAT, 0 },
-    { "/except",      DIR_EXC, CM_ARG },
-    { "/files",       DIR_FIL, 0 },
-    { "/heading",     DIR_HDG, 0 },
-    { "/isodate",     DIR_ISO, 0 },
-    { "/larger-than", DIR_LAR, CM_ARG },
-#ifdef CKSYMLINK
-    { "/followlinks", DIR_LNK, 0 },
-#endif /* CKSYMLINK */
-    { "/message",     DIR_MSG, CM_ARG },
-    { "/nobackupfiles",DIR_NOB, 0 },
-    { "/nodotfiles",  DIR_NOD, 0 },
-#ifdef CKSYMLINK
-    { "/nofollowlinks",DIR_NLK, 0 },
-#endif /* CKSYMLINK */
-    { "/noheading",   DIR_NOH, 0 },
-    { "/nomessage",   DIR_NOM, 0 },
-#ifdef CK_TTGWSIZ
-    { "/nopage",      DIR_NOP, 0 },
-#endif /* CK_TTGWSIZ */
-#ifdef RECURSIVE
-    { "/norecursive", DIR_NOR, 0 },
-#else
-#ifdef VMS
-    { "/norecursive", DIR_NOR, 0 },
-#else
-#ifdef datageneral
-    { "/norecursive", DIR_NOR, 0 },
-#endif /* datageneral */
-#endif /* VMS */
-#endif /* RECURSIVE */
-    { "/nosort",      DIR_NOS, 0 },
-    { "/not-after",   DIR_NAF, CM_ARG },
-    { "/not-before",  DIR_NBF, CM_ARG },
-    { "/not-since",   DIR_NAF, CM_INV|CM_ARG },
-    { "/noxfermode",  DIR_NOT, 0 },
-    { "/output",      DIR_OUT, CM_ARG },
-#ifdef CK_TTGWSIZ
-    { "/page",        DIR_PAG, 0 },
-#endif /* CK_TTGWSIZ */
-#ifdef RECURSIVE
-    { "/recursive",   DIR_REC, 0 },
-#else
-#ifdef VMS
-    { "/recursive",   DIR_REC, 0 },
-#else
-#ifdef datageneral
-    { "/recursive",   DIR_REC, 0 },
-#endif /* datageneral */
-#endif /* VMS */
-#endif /* RECURSIVE */
-    { "/reverse",     DIR_DSC, 0 },
-    { "/since",       DIR_AFT, CM_ARG|CM_INV },
-    { "/smaller-than",DIR_SMA, CM_ARG },
-    { "/sort",        DIR_SRT, CM_ARG },
-    { "/summary",     DIR_SUM, 0 },
-    { "/type",        DIR_BIN, CM_ARG },
-    { "/xfermode",    DIR_TYP, 0 },
-    { "/verbose",     DIR_VRB, 0 },
-    { "",0,0 }
-};
-static int ndirswtab = (sizeof(dirswtab) / sizeof(struct keytab)) - 1;
-
-static struct keytab dirsort[] = {      /* DIRECTORY /SORT: options */
-    { "date",         DIRS_DT, 0 },
-    { "name",         DIRS_NM, 0 },
-    { "size",         DIRS_SZ, 0 }
-};
-static int ndirsort = (sizeof(dirsort) / sizeof(struct keytab));
-
-static int dir_date = -1;               /* Option defaults (-1 means none) */
-static int dir_page = -1;
-static int dir_verb =  1;
-static int dir_msg  = -1;
-#ifdef VMS
-static int dir_sort = -1;               /* Names are already sorted in VMS */
-static int dir_rvrs = -1;
-#else
-static int dir_sort =  1;               /* Sort by default */
-static int dir_rvrs =  0;               /* Not in reverse */
-#endif /* VMS */
-static int dir_skey = DIRS_NM;          /* By name */
-#ifdef RECURSIVE
-static int dir_recu = -1;
-#endif /* RECURSIVE */
-static int dir_mode = -1;
-static int dir_show = -1;               /* Show all files by default */
-int dir_dots =  -1;                    /* Except dot files */
-int dir_back =  1;
-int dir_head =  0;
-static char * dirmsg = NULL;
-static int dirmsglen = 0;
-
-#ifndef NOSHOW
-VOID
-showdiropts() {
-    int x = 0;
-    extern int optlines;
-    prtopt(&optlines,"DIRECTORY");
-    if (dir_show > 0) {
-        prtopt(&optlines,(dir_show == 1) ? "/FILES" :
-               ((dir_show == 2) ? "/DIRECTORIES" : "/ALL"));
-        x++;
-    } else {
-        prtopt(&optlines,"/ALL");
-        x++;
-    }
-    if (dir_verb > -1) {
-        prtopt(&optlines,dir_verb ? "/VERBOSE" : "/BRIEF");
-        x++;
-    }
-    if (dir_page > -1) {
-        prtopt(&optlines,dir_page ? "/PAGE" : "/NOPAGE");
-        x++;
-    }
-    if (dir_date > -1) {
-        prtopt(&optlines,dir_date ? "/ENGLISHDATE" : "/ISODATE");
-        x++;
-    }
-    if (dir_dots > -1) {
-        prtopt(&optlines,dir_dots ? "/DOTFILES" : "/NODOTFILES");
-        x++;
-    }
-    if (dir_back > -1) {
-        prtopt(&optlines,dir_back ? "/BACKUP" : "/NOBACKUP");
-        x++;
-    }
-    if (dir_head > -1) {
-        prtopt(&optlines,dir_head ? "/HEADING" : "/NOHEADING");
-        x++;
-    }
-#ifdef RECURSIVE
-    if (dir_recu > -1) {
-        prtopt(&optlines,dir_recu ? "/RECURSIVE" : "/NORECURSIVE");
-        x++;
-    }
-#endif /* RECURSIVE */
-    if (dir_mode > -1) {
-        prtopt(&optlines,dir_mode ? "/XFERMODE" : "/NOXFERMODE");
-        x++;
-    }
-    if (dir_sort == 0) {
-        x++;
-        prtopt(&optlines,"/NOSORT ");
-    } else if (dir_sort > 0) {
-        x++;
-        if (dir_skey == DIRS_NM) s = "/SORT:NAME";
-        else if (dir_skey == DIRS_SZ) s = "/SORT:SIZE";
-        else if (dir_skey == DIRS_DT) s = "/SORT:DATE";
-        prtopt(&optlines,s);
-    }
-    if (dir_rvrs > -1) {
-        prtopt(&optlines,dir_rvrs ? "/REVERSE" : "/ASCENDING");
-        x++;
-    }
-    if (dir_msg > -1) {
-        if (dir_msg == 0) {
-            prtopt(&optlines,"/NOMESSAGE");
-        } else {
-            ckmakmsg(tmpbuf,TMPBUFSIZ,"/MESSAGE:{",dirmsg,"}",NULL);
-            prtopt(&optlines,tmpbuf);
-        }
-        x++;
-    }
-    if (!x) prtopt(&optlines,"(no options set)");
-    prtopt(&optlines,"");
-}
-#endif /* NOSHOW */
-
-int
-setdiropts() {                          /* Set DIRECTORY option defaults */
-    int xb = -1, xv = -1, xp = -1, xd = -1, xh = -1, xf = -1;
-    int xk = -1, xr = -1, xs = -1, xx = -1, xm = -1, xa = -1, xg = -1;
-    int getval;
-    char c;
-    while (1) {
-        if ((y = cmswi(dirswtab,ndirswtab,"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);
-        }
-        if (!getval && (cmgkwflgs() & CM_ARG)) {
-            printf("?This switch requires an argument\n");
-            return(-9);
-        }
-        switch (y) {
-          case DIR_BRF: xv = 0; break;
-          case DIR_VRB: xv = 1; break;
-          case DIR_PAG: xp = 1; break;
-          case DIR_NOP: xp = 0; break;
-          case DIR_ISO: xd = 0; break;
-          case DIR_DAT: xd = 1; break;
-          case DIR_HDG: xh = 1; break;
-          case DIR_NOH: xh = 0; break;
-          case DIR_DOT: xf = 1; break;
-          case DIR_NOD: xf = 0; break;
-          case DIR_ALL: xa = 3; break;
-          case DIR_DIR: xa = 2; break;
-          case DIR_FIL: xa = 1; break;
-          case DIR_SRT:
-            x = DIRS_NM;
-            if (getval)
-              if ((x = cmkey(dirsort,ndirsort,"Sort key","name",xxstring)) < 0)
-                return(x);
-            xk = x;
-            xs = 1;
-            break;
-          case DIR_NOS: xs = 0; break;
-          case DIR_ASC: xx = 0; break;
-          case DIR_DSC: xx = 1; break;
-          case DIR_REC: xr = 1; break;
-          case DIR_NOR: xr = 0; break;
-          case DIR_TYP: xm = 1; break;
-          case DIR_NOT: xm = 0; break;
-          case DIR_BUP: xb = 1; break;
-          case DIR_NOB: xb = 0; break;
-          case DIR_NOM: xg = 0; break;
-          case DIR_MSG:
-            if (getval)
-              if ((x = cmfld("Message to append to each line",
-                             "",
-                             &s,
-                             xxstring
-                             )) < 0)
-                return(x);
-            xg = 1;
-            ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ);
-            break;
-          default:
-            printf("?This option can not be set\n");
-            return(-9);
-        }
-    }
-    if ((x = cmcfm()) < 0)              /* Get confirmation */
-      return(x);
-    if (xv > -1) dir_verb = xv;         /* Confirmed, save defaults */
-    if (xp > -1) dir_page = xp;
-    if (xd > -1) dir_date = xd;
-    if (xh > -1) dir_head = xh;
-    if (xs > -1) dir_sort = xs;
-    if (xk > -1) dir_skey = xk;
-    if (xx > -1) dir_rvrs = xx;
-    if (xf > -1) dir_dots = xf;
-    if (xa > -1) dir_show = xa;
-    if (xm > -1) dir_mode = xm;
-    if (xb > -1) dir_back = xb;
-#ifdef RECURSIVE
-    if (xr > -1) dir_recu = xr;
-#endif /* RECURSIVE */
-    if (xg > -1) dir_msg  = xg;
-    if (xg > 0)
-      makestr(&dirmsg,tmpbuf);
-    return(success = 1);
-}
-
-int
-domydir() {                             /* Internal DIRECTORY command */
-    extern char *months[];
-#ifdef VMS
-    _PROTOTYP( char * zrelname, (char *,char *) );
-    char * cdp = NULL;
-#endif /* VMS */
-
-    char name[CKMAXPATH+1], outfile[CKMAXPATH+1], *p = NULL, c = NUL;
-    char linebuf[CKMAXPATH+256];
-    char * mstr = NULL, * dstr = NULL, * s2 = NULL;
-    long len = 0, ndirs = 0, nfiles = 0, nbytes = 0, nmatches = 0;
-    int verbose = 0, wild = 0, page = 0, n = 0, engdate = 0, summary = 0;
-    int heading = 0, xsort = 0, reverse = 0, sortby = 0, msg = 0;
-    int k, i = 0, x = 0, nx = 0, skey = 0, dlen = 0, itsadir = 0;
-    int show = 3, xfermod = 0, backup = 1, rc = 0, getval = 0;
-    int fs = 0;
-    int multiple = 0;
-    int cmifn1 = 1, cmifn2 = 0;
-    long minsize = -1L, maxsize = -1L;
-    struct FDB sw, fi, fl;
-    char dbuf[32], xbuf[32];
-
-#ifndef NOSPL
-    char array = NUL;
-    char ** ap = NULL;
-#endif /* NOSPL */
-    char
-      * dir_aft = NULL,
-      * dir_bef = NULL,
-      * dir_naf = NULL,
-      * dir_nbf = NULL,
-      * dir_exc = NULL;
-    char * xlist[16];
-
-    g_matchdot = matchdot;              /* Save global matchdot setting */
-    nolinks = 2;                        /* (it should already be 2) */
-    outfile[0] = NUL;                   /* No output file yet */
-
-    if (ofp != stdout) {                /* In case of previous interruption */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    for (i = 0; i < 16; i++) xlist[i] = NULL;
-
-    name[0] = NUL;
-    freedirlist();                      /* In case not freed last time */
-    page      = dir_page > -1 ? dir_page : xaskmore; /* Set option defaults */
-    engdate   = dir_date > -1 ? dir_date : 0;
-    verbose   = dir_verb > -1 ? dir_verb : 1;
-    heading   = dir_head > -1 ? dir_head : 0;
-    xsort     = dir_sort > -1 ? dir_sort : 0;
-    sortby    = dir_skey > -1 ? dir_skey : 0;
-    reverse   = dir_rvrs > -1 ? dir_rvrs : 0;
-    msg       = dir_msg  > -1 ? dir_msg  : 0;
-#ifdef UNIXOROSK
-    if (dir_dots > -1) matchdot = dir_dots;
-#endif /* UNIXOROSK */
-    xfermod   = dir_mode > -1 ? dir_mode : 0;
-    backup    = dir_back > -1 ? dir_back : 1;
-#ifdef RECURSIVE
-    recursive = dir_recu > -1 ? dir_recu : 0;
-#endif /* RECURSIVE */
-    show      = dir_show > -1 ? dir_show : 3;
-
-#ifdef CK_TTGWSIZ
-#ifdef OS2
-    ttgcwsz();                          /* Screen length for more-prompting */
-#else /* OS2 */
-    /* Check whether window size changed */
-    if (ttgwsiz() > 0) {
-        if (tt_rows > 0 && tt_cols > 0) {
-            cmd_rows = tt_rows;
-            cmd_cols = tt_cols;
-        }
-    }
-#endif /* OS2 */
-#endif /* CK_TTGWSIZ */
-
-    diractive = 1;
-    cmifn1 = nolinks | 1;               /* 1 = files or directories */
-    cmifn2 = 0;                         /* 0 = not directories only */
-
-  again:
-
-    cmfdbi(&sw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           "Enter or Return to confirm the command, or\n\
- file specification, or switch",
-           "",                          /* default */
-           "",                          /* addtl string data */
-           ndirswtab,                   /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           dirswtab,                    /* Keyword table */
-           &fi                          /* Pointer to next FDB */
-           );
-    cmfdbi(&fi,                         /* 2nd FDB - filespec to match */
-           _CMIFI,                      /* fcode */
-           "File specification",        /* hlpmsg */
-#ifdef datageneral
-           "+",                         /* Default filespec is wildcard */
-#else                                   /* that matches all files... */
-#ifdef VMS
-           "*.*",
-#else
-           "*",
-#endif /* VMS */
-#endif /* datageneral */
-           "",                          /* addtl string data */
-           cmifn1,
-           cmifn2,                      /* 1 = only dirs; 0 files or dirs */
-           xxstring,
-           NULL,
-           &fl
-           );
-    cmfdbi(&fl,                         /* Anything that doesn't match */
-           _CMFLD,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           NULL
-           );
-    while (1) {                         /* Parse 0 or more switches */
-        x = cmfdb(&sw);                 /* Parse something */
-        debug(F101,"domydir cmfdb","",x);
-        if (x < 0)
-          return(x);
-        if (cmresult.fcode != _CMKEY)   /* Break out if not a switch */
-          break;
-        c = cmgbrk();
-        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);
-        }
-        switch (k = cmresult.nresult) {
-          case DIR_BRF: verbose = 0; break;
-          case DIR_VRB: verbose = 1; break;
-#ifdef CK_TTGWSIZ
-          case DIR_PAG: page = 1;    break;
-          case DIR_NOP: page = 0;    break;
-#endif /* CK_TTGWSIZ */
-          case DIR_ISO: engdate = 0; break;
-          case DIR_DAT: engdate = 1; break;
-          case DIR_HDG: heading = 1; break;
-          case DIR_NOH: heading = 0; break;
-#ifdef UNIXOROSK
-          case DIR_DOT: matchdot = 1; break;
-          case DIR_NOD: matchdot = 0; break;
-#endif /* UNIXOROSK */
-          case DIR_ALL:
-            show = 3;
-            cmifn1 |= 1;
-            cmifn2 = 0;
-            goto again;
-          case DIR_DIR:
-            show = 2;
-            cmifn1 |= 1;
-            cmifn2 = 1;
-            goto again;
-          case DIR_FIL:
-            show = 1;
-            cmifn1 &= ~(1);
-            cmifn2 = 0;
-            goto again;
-          case DIR_SRT:
-            x = DIRS_NM;
-            if (c == ':' || c == '=')
-              if ((x = cmkey(dirsort,ndirsort,"Sort key","name",xxstring)) < 0)
-                return(x);
-            xsort = 1;
-            sortby = x;
-            break;
-
-          case DIR_BUP: backup  = 1; fs++;   break;
-          case DIR_NOB: backup  = 0; fs++;   break;
-
-          case DIR_NOS: xsort = 0;     break;
-          case DIR_ASC: reverse = 0;   break;
-          case DIR_DSC: reverse = 1;   break;
-#ifdef RECURSIVE
-          case DIR_REC: recursive = 1; diractive = 1; break;
-          case DIR_NOR: recursive = 0; diractive = 0; break;
-#endif /* RECURSIVE */
-          case DIR_TYP: xfermod = 1;   break;
-          case DIR_NOT: xfermod = 0;   break;
-
-#ifdef CKSYMLINK
-          case DIR_LNK:                 /* Follow links */
-            nolinks = 0;
-            cmifn1 &= ~(2);
-            goto again;
-          case DIR_NLK:                 /* Don't follow links */
-            nolinks = 2;
-            cmifn1 &= ~(2);
-            goto again;
-#endif /* CKSYMLINK */
-
-          case DIR_NOM: msg     = 0;   break;
-          case DIR_MSG:
-            if (c == ':' || c == '=')
-              if ((x = cmfld("Message to append to each line",
-                             "",
-                             &s,
-                             xxstring
-                             )) < 0)
-                return(x);
-            msg = 1;
-            ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ);
-            break;
-
-          case DIR_SMA:
-          case DIR_LAR:
-            if (!getval) break;
-            if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0)
-              return(x);
-            fs++;
-            show = 1;
-            switch (cmresult.nresult) {
-              case DIR_SMA: minsize = y; break;
-              case DIR_LAR: maxsize = y; break;
-            }
-            break;
-
-#ifndef NOSPL
-          case DIR_ARR:
-            if (c != ':' && c != '=') {
-                printf("?Array name required\n");
-                return(-9);
-            }
-            if ((x = cmfld("Array name (a single letter will do)",
-                           "",
-                           &s,
-                           NULL
-                           )) < 0) {
-                if (x == -3) {
-                    printf("?Array name required\n");
-                    return(-9);
-                } else
-                  return(x);
-            }
-            if (!*s) {
-                printf("?Array name required\n");
-                return(-9);
-            }
-            s2 = s;
-            if (*s == CMDQ) s++;
-            if (*s == '&') s++;
-            if (!isalpha(*s)) {
-                printf("?Bad array name - \"%s\"\n",s2);
-                return(-9);
-            }
-            array = *s++;
-            if (isupper(array)) array = tolower(array);
-            if (*s && (*s != '[' || *(s+1) != ']')) {
-                printf("?Bad array name - \"%s\"\n",s2);
-                return(-9);
-            }
-            break;
-#endif /* NOSPL */
-          case DIR_AFT:
-          case DIR_BEF:
-          case DIR_NAF:
-          case DIR_NBF:
-            if (!getval) break;
-            if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Date-time required\n");
-                    rc = -9;
-                } else
-                  rc = x;
-                goto xdomydir;
-            }
-            fs++;
-            switch (k) {
-              case DIR_AFT: makestr(&dir_aft,s); break;
-              case DIR_BEF: makestr(&dir_bef,s); break;
-              case DIR_NAF: makestr(&dir_naf,s); break;
-              case DIR_NBF: makestr(&dir_nbf,s); break;
-            }
-            break;
-          case DIR_EXC:
-            if (!getval) break;
-            if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Pattern required\n");
-                    rc = -9;
-                } else
-                  rc = x;
-                goto xdomydir;
-            }
-            fs++;
-            makestr(&dir_exc,s);
-            break;
-
-          case DIR_SUM:
-            summary = 1; break;
-
-          case DIR_BIN: {
-              extern struct keytab txtbin[];
-              extern int xfiletype;
-              if (!getval) break;
-              if ((x = cmkey(txtbin,3,"","all",xxstring)) < 0) {
-                  rc = x;
-                  goto xdomydir;
-              }
-              if (x == 2) {
-                  xfiletype = -1;
-              } else {
-                  xfiletype = x;
-                  fs = 1;
-              }
-              break;
-          }
-          case DIR_OUT:
-            if ((x = cmofi("File for directory listing","",&s,xxstring)) < 0)
-              return(x);
-            ckstrncpy(outfile,s,CKMAXPATH+1);
-            break;
-
-          default:
-            printf("?Sorry, not implemented yet - \"%s\"\n", atmbuf);
-            goto xdomydir;
-        }
-    }
-    ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Safe copy of filespec */
-
-/* ^^^ START MULTIPLE */
-    
-    while (1) {
-       x = cmfld("Another filespec or Enter","",&s,xxstring);
-       if (x == -3)
-         break;
-       if (x < 0)
-         return(x);
-       ckstrncat(line,",",LINBUFSIZ);
-       ckstrncat(line,s,LINBUFSIZ);
-       multiple++;
-    }
-    ckmakmsg(tmpbuf,TMPBUFSIZ,"{",line,"}",NULL);
-    ckstrncpy(line,tmpbuf,LINBUFSIZ);
-    cmresult.nresult = 1;
-    cmresult.fcode = _CMIFI;
-
-/* ^^^ END MULTIPLE */
-
-    s = line;
-
-    if ((x = cmcfm()) < 0)              /* Get confirmation */
-      return(x);
-    if (cmresult.fcode != _CMIFI) {     /* Nothing matched */
-        char * m;
-        if (*s == '/')
-#ifdef UNIXOROSK
-          m = "does not match switch or name of accessible file";
-#else
-#ifdef OS2
-          m = "does not match switch or name of accessible file";
-#else
-          m = "no switches match";
-#endif /* OS2 */
-#endif /* UNIXOROSX */
-        else
-          m = "not found or not accessible";
-        printf("\"%s\" - %s\n",s,m);
-        rc = -9;
-        goto xdomydir;
-    }
-    wild = cmresult.nresult;            /* Wildcard was given? */
-    debug(F111,"domydir cmifi2",s,wild);
-
-    if (outfile[0]) {
-        ofp = fopen(outfile,"w");       /* Open output file */
-        if (!ofp) {
-            printf("?Can't open output file %s: %s\n",outfile,ck_errstr());
-            ofp = stdout;
-            return(-9);
-        }
-        page = 0;
-    }
-
-#ifdef OS2
-    if (!wild) {
-        if (zchki(s) == -2) {           /* Found a directory */
-            p = s + (int)strlen(s) - 1; /* Yes */
-            if (*p == '\\' || *p == '/')
-              strcat(s, "*");
-            else if (*p == ':')
-              strcat(s, "./*");
-            else
-              strcat(s, "/*");
-            wild = 1;                   /* Now it's wild */
-        }
-    }
-#else
-    if (!wild) if (isdir(s)) {          /* Is it a directory? */
-        p = s + (int)strlen(s) - 1;     /* Yes */
-#ifdef VMS
-        {
-            /* Convert from FOO.DIR;1 to [x.FOO] if necessary */
-            char buf[CKMAXPATH+1];
-            debug(F000,"domydir directory 0",s,*p);
-            if (cvtdir(s,buf,CKMAXPATH) > 0)
-              ckstrncpy(line,buf,LINBUFSIZ);
-        }
-#endif /* VMS */
-        debug(F000,"domydir directory 1",s,*p);
-#ifdef VMS
-        if (*p == ']' || *p == '>' || *p == ':')
-          strcat(s, "*.*");
-#else
-#ifdef datageneral
-        if (*p == ':')
-          strcat(s, "+");
-        else
-          strcat(s, ":+");
-#else
-#ifdef STRATUS
-        if (*p == '>')
-          strcat(s, "*");
-        else
-          strcat(s, ">*");
-#endif /* STRATUS */
-#endif /* datageneral */
-#endif /* VMS */
-        wild = 1;                       /* Now it's wild */
-        debug(F000,"domydir directory 2",s,*p);
-    }
-#endif /* OS2 */
-
-#ifdef ZXREWIND
-/* cmifi() already called nzxpand so we can just re-use the same list. */
-    if (!multiple) {
-       x = zxrewind();                 /* Rewind the list */
-       debug(F111,"domydir zxrewind",s,x);
-    } else {
-#endif /* ZXREWIND */
-       nzxopts = (show == ZX_DIRONLY) ? ZX_DIRONLY :
-         (show == ZX_FILONLY ? ZX_FILONLY : 0);
-       if (matchdot)  nzxopts |= ZX_MATCHDOT;
-       if (recursive) nzxopts |= ZX_RECURSE;
-       x = nzxpand(s,nzxopts);             /* Expand file list */
-       debug(F111,"domydir nzxpand",s,x);
-#ifdef ZXREWIND
-    }
-#endif /* ZXREWIND */
-
-#ifndef NOSPL
-    if (array) {
-        int n, xx;
-        n = (x < 0) ? 0 : x;
-        if ((xx = dclarray(array,n)) < 0) {
-            printf("?Array declaration failure\n");
-            rc = -9;
-            goto xdomydir;
-        }
-        array = xx;
-        ap = a_ptr[array];
-        if (n < 1) {
-            rc = 0;
-            goto xdomydir;
-        }
-    } else
-#endif /* NOSPL */
-      if (x < 1) {
-#ifdef CKROOT
-          extern int ckrooterr;
-          if (ckrooterr)
-            printf("?Off limits: %s\n",s);
-          else
-#endif /* CKROOT */
-            if (x == 0 && isdir(s))
-              printf("?Empty directory - \"%s\"\n", s);
-            else
-              printf("?%s %s match - \"%s\"\n",
-                     (x == 0) ? "No" : "Too many",
-                     (show == 2) ? "directories" : "files",
-                     s
-                     );
-          rc = -9;
-          goto xdomydir;
-    }
-    nx = x;                             /* Remember how many files */
-
-    if (msg) {
-        makestr(&dirmsg,tmpbuf);
-        dirmsglen = strlen(tmpbuf);
-    }
-
-#ifdef VMS
-    cdp = zgtdir();                     /* Get current directory */
-    debug(F110,"domydir VMS zgtdir",cdp,0);
-#endif /* VMS */
-
-    if (xsort && verbose) {             /* If sorting, allocate space */
-        if (!(dirlist = (char **) malloc((x + 1) * sizeof(char **)))) {
-            if (!quiet) {
-                printf("* Warning: Failure to allocate memory for sorting.\n");
-                printf("* Will proceed without sorting...\n");
-            }
-            xsort = 0;
-        }
-        debug(F101,"domydir sort malloc","",xsort);
-    }
-
-    /* Display the listing */
-
-#ifndef NOSPL
-    if (array)                          /* Storing instead of printing */
-      heading = 0;
-#endif /* NOSPL */
-
-    if (heading) {                      /* If /HEADING print heading */
-        zfnqfp(s,TMPBUFSIZ,tmpbuf);
-        fprintf(ofp,"\nDirectory of %s\n\n",tmpbuf);
-        n += 3;
-    }
-    if (page > -1)                      /* Paging */
-      xaskmore = page;
-
-    if (!verbose) {                     /* /BRIEF */
-        if (outfile[0]) {               /* To file  */
-            int k = 0;
-            znext(name);
-            while (name[0]) {           /* One line per file */
-                k++;
-                if (fs) if (fileselect(name,
-                                       dir_aft,dir_bef,dir_naf,dir_nbf,
-                                       minsize,maxsize,!backup,16,xlist) < 1) {
-                    znext(name);
-                    continue;
-                }
-                fprintf(ofp,"%s\n",name);
-                znext(name);
-            }
-            if (heading)
-              fprintf(ofp,"Files: %d\n\n",k);
-            rc = 1;
-            goto xdomydir;
-        } else {
-            rc = filhelp(x,"","",n,0);
-            if (rc < 0)
-              goto xdomydir;
-            if (heading && rc > 0)
-              fprintf(ofp,"Files: %d\n\n",x); /* (Might scroll a line or 2) */
-            rc = 1;
-            goto xdomydir;
-        }
-    }
-    ndirs = nfiles = nbytes = 0L;       /* Initialize counters */
-
-    if (dir_exc)                        /* Have exception list? */
-      makelist(dir_exc,xlist,16);      /* Yes, convert to array */
-
-    diractive = 1;
-    znext(name);                        /* Get next file */
-    while (name[0]) {                   /* Loop for each file */
-        if (fs) if (fileselect(name,
-                       dir_aft,dir_bef,dir_naf,dir_nbf,
-                       minsize,maxsize,!backup,16,xlist) < 1) {
-            znext(name);
-            continue;
-        }
-        len = zgetfs(name);             /* Get file length */
-        debug(F111,"domydir zgetfs",name,len);
-#ifdef VMSORUNIX
-        itsadir = zgfs_dir;             /* See if it's a directory */
-#else
-        itsadir = (len == -2 || isdir(name));
-#endif /* VMSOUNIX */
-        debug(F111,"domydir itsadir",name,itsadir);
-        if ((itsadir && (show == 1)) || (!itsadir && (show == 2))) {
-            znext(name);
-            continue;
-        }
-        /* Get here when we know we have selected this file */
-
-        nmatches ++;
-        if (itsadir) {                  /* Accumulate totals for summary */
-            ndirs++;
-        } else {
-            nfiles++;
-            nbytes += len;
-        }
-        if (summary) {                  /* Summary only, no detail */
-            znext(name);
-            continue;
-        }
-#ifndef NOSPL
-        if (array) {
-            debug(F111,"domydir array",name,nfiles);
-            if (ap)
-              makestr(&(ap[nmatches]),name);
-            znext(name);
-            continue;
-        }
-#endif /* NOSPL */
-
-/*
-  NOTE: The sprintf's in this routine should be safe.  They involve
-  permission strings, date/time strings, and filenames, all of which have
-  known maximum lengths; none of these items is input from users.  The
-  destination buffers are large enough to hold maximum sizes for any and
-  all items.
-*/
-        dstr = zfcdat(name);            /* Get modification date/time */
-        debug(F111,"domydir zcfdat",dstr,0);
-        if (!dstr) dstr = "";
-        {
-/*
-  Note that zfcdat() always returns "" or yyyymmdd hh:mm:ss, so any warnings
-  about possible out-of-bounds dstr[] array refs do not apply.  This block of
-  code is to stifle the warnings and also allows for any out-of-spec
-  zfcdat() implementations.
-*/
-            int x;
-            char * p = "00000000 00:00:00";
-            x = ckstrncpy(xbuf,dstr,32);
-            if (x < 17) ckstrncpy(&xbuf[x],p+x,32-x);
-            dstr = xbuf;
-        }
-        if (engdate) {                  /* English date requested? */
-            short month, day, year, hour, minute, seconds;
-            month = (dstr[4]-48)*10 + (dstr[5]-48);
-            mstr  = (month > 0 && month <= 12) ? months[month-1] : "xxx";
-            day   = (dstr[6]-48)*10 + (dstr[7]-48);
-            year  = (((dstr[0]-48)*10 +
-                      (dstr[1]-48))*10 +
-                      (dstr[2]-48))*10 +
-                      (dstr[3]-48);
-            hour  = (dstr[9]-48)*10 + (dstr[10]-48);
-            minute = (dstr[12]-48)*10 + (dstr[13]-48);
-            seconds = (dstr[15]-48)*10 + (dstr[16]-48);
-            sprintf(dbuf,               /* SAFE */
-                    "%2d-%s-%4d %02d:%02d:%02d",
-                    day,mstr,year,hour,minute,seconds
-                    );
-            dstr = dbuf;
-        } else {                        /* ISO date */
-            dbuf[0] = dstr[0];          /* yyyy */
-            dbuf[1] = dstr[1];
-            dbuf[2] = dstr[2];
-            dbuf[3] = dstr[3];
-            dbuf[4] = '-';
-            dbuf[5] = dstr[4];          /* mm (numeric) */
-            dbuf[6] = dstr[5];
-            dbuf[7] = '-';
-            dbuf[8] = dstr[6];          /* dd */
-            dbuf[9] = dstr[7];
-            strcpy(dbuf+10,dstr+8);     /* hh:mm:ss */
-            dstr = dbuf;
-        }
-        dlen = strlen(dbuf);            /* Length of date */
-        name[CKMAXPATH] = NUL;
-#ifdef CK_PERMS
-#ifdef VMSORUNIX
-        p = ziperm(name);               /* Get permissions */
-        debug(F110,"ziperm perms",p,0);
-#else
-        p = zgperm(name);
-        debug(F110,"zgperm perms",p,0);
-#endif /* VMSORUNIX */
-#else
-        p = NULL;
-        debug(F110,"NULL perms",p,0);
-#endif /* CK_PERMS */
-
-#ifdef VMS
-        /* Get relative name to save space -- VMS fullnames are long... */
-        ckstrncpy(name,zrelname(name,cdp),CKMAXPATH);
-#endif /* VMS */
-
-        if (itsadir && len < 0) {       /* Directory */
-#ifdef VMS
-            sprintf(linebuf,"%-22s%-10s  %s  %s",p,"<DIR>",dstr,name);
-#else
-            if (p)
-              sprintf(linebuf,"%10s%-10s  %s  %s",p,"<DIR>",dstr,name);
-            else
-              sprintf(linebuf,"%-10s  %s  %s", "<DIR>", dstr, name);
-#endif /* VMS */
-        } else {                        /* Regular file */
-#ifdef VMS
-            sprintf(linebuf,"%-22s%10ld  %s  %s", p, len, dstr, name);
-#else
-            if (p)
-              sprintf(linebuf,"%10s%10ld  %s  %s", p, len, dstr, name);
-            else
-              sprintf(linebuf,"%10ld  %s  %s", len, dstr, name);
-#endif /* VMS */
-        }
-#ifdef UNIX
-#ifdef CKSYMLINK
-        if (zgfs_link) {
-            int n, m;
-            extern char linkname[];
-            n = strlen(linebuf);
-            m = strlen(linkname) + n;
-            if (m < CKMAXPATH + 58)
-              strcpy(linebuf+n, " -> "); /* safe (checked) */
-            if (m + 4 < CKMAXPATH - 58)
-              strcpy(linebuf+n+4, linkname); /* safe (checked) */
-        } else
-#endif /* CKSYMLINK */
-#endif /* UNIX */
-        if (xfermod) {                  /* Show transfer mode */
-            int i, x, y;
-            char * s = "";
-            y = -1;
-            x = scanfile(name,&y,nscanfile);
-            switch (x) {
-              case FT_TEXT: s = " (T)"; break;
-              case FT_7BIT: s = " (T)(7BIT)"; break;
-              case FT_8BIT: s = " (T)(8BIT)"; break;
-#ifdef UNICODE
-              case FT_UTF8: s = " (T)(UTF8)"; break;
-              case FT_UCS2:
-                s = y ? " (T)(UCS2LE)" : " (T)(UCS2BE)";
-                break;
-#endif /* UNICODE */
-              case FT_BIN:  s = " (B)"; break;
-            }
-            if (!*s) {
-                s = binary ? " (B)" : " (T)";
-            }
-            if (*s) {
-                int n;
-                n = strlen(linebuf);
-                if (n + 4 < CKMAXPATH - 58)
-                  strcpy(linebuf+n, s); /* safe (checked) */
-            }
-        }
-        if (msg && dirmsg) {
-            int n;
-            n = strlen(linebuf);
-            if (n + dirmsglen + 2 < CKMAXPATH)
-              sprintf((char *)(linebuf+n)," %s", dirmsg); /* SAFE */
-        }
-        if (xsort) {                    /* Sorting - save line */
-            i = strlen(linebuf);
-            if ((ndirlist >= nx) ||
-                !(dirlist[ndirlist] = (char *)malloc(i+1))) {
-                printf("?Memory allocation error - try /NOSORT\n");
-                rc = -9;
-                goto xdomydir;
-            }
-            strcpy(dirlist[ndirlist],linebuf); /* safe */
-            ndirlist++;
-        }
-        znext(name);                    /* Peek ahead to next file */
-
-        if (!xsort) {
-            fprintf(ofp,"%s\n",linebuf);
-            if (page && (name[0] || heading)) { /* If /PAGE */
-                if (cmd_cols > 0) {
-                    int x = strlen(linebuf);
-                    int y;
-                    y = (x % cmd_cols) ? 1 : 0;
-                    n += x / cmd_cols + y;
-                } else {
-                    n++;
-                }
-#ifdef CK_TTGWSIZ
-                if (n > (cmd_rows - 3)) { /* Do more-prompting */
-                    if (!askmore()) {
-                        rc = 0;
-                        goto xdomydir;
-                    } else
-                      n = 0;
-                }
-#endif /* CK_TTGWSIZ */
-            }
-        }
-    }
-#ifndef NOSPL
-    if (array) {
-        if (ap)
-          makestr(&(ap[0]),ckitoa(nmatches));
-        rc = 1;
-        goto xdomydir;
-    }
-#endif /* NOSPL */
-    if (xsort) {
-        skey = 0;
-#ifdef VMS
-        switch (sortby) {
-          case DIRS_NM: skey = dlen + 35; break;
-          case DIRS_DT: skey = 33; break;
-          case DIRS_SZ: skey = 21;
-        }
-#else
-        if (p) {
-            switch (sortby) {
-              case DIRS_NM: skey = dlen + 24; break;
-              case DIRS_DT: skey = 22; break;
-              case DIRS_SZ: skey = 10;
-            }
-        } else {
-            switch (sortby) {
-              case DIRS_NM: skey = dlen + 14; break;
-              case DIRS_DT: skey = 12; break;
-              case DIRS_SZ: skey = 0;
-            }
-        }
-#endif /* VMS */
-        sh_sort(dirlist,NULL,ndirlist,skey,reverse,filecase);
-        for (i = 0; i < ndirlist; i++) {
-            fprintf(ofp,"%s\n",dirlist[i]);
-            if (page && (i < ndirlist -1 || heading)) { /* If /PAGE */
-                if (cmd_cols > 0) {
-                    int x = strlen(dirlist[i]);
-                    int y;
-                    y = (x % cmd_cols) ? 1 : 0;
-                    n += ((int)strlen(dirlist[i]) / cmd_cols) + y;
-                } else {
-                    n++;
-                }
-#ifdef CK_TTGWSIZ
-                if (n > (cmd_rows - 3)) { /* Do more-prompting */
-                    if (!askmore()) {
-                        rc = 0;
-                        goto xdomydir;
-                    } else
-                      n = 0;
-                }
-#endif /* CK_TTGWSIZ */
-            }
-        }
-    }
-
-    if (heading || summary) {
-#ifdef CKFLOAT
-        CKFLOAT gm;
-#endif /* CKFLOAT */
-        fprintf(ofp,"\n%ld director%s, %ld file%s, %ld byte%s",
-               ndirs,
-               (ndirs == 1) ? "y" : "ies",
-               nfiles,
-               (nfiles == 1) ? "" : "s",
-               nbytes,
-               (nbytes == 1) ? "" : "s"
-               );
-#ifdef CKFLOAT
-        gm = ((CKFLOAT) nbytes ) / 1000000.0;
-        if (gm > 1000.0)
-          fprintf(ofp," (%0.2fGB)",(gm / 1000.0));
-        else if (gm >= 0.01)
-          fprintf(ofp," (%0.2fMB)",gm);
-#endif /* CKFLOAD */
-        fprintf(ofp,"\n\n");
-    }
-  xdomydir:
-    if (g_matchdot > -1) {
-        matchdot = g_matchdot;          /* Restore these... */
-        g_matchdot = -1;
-    }
-    freedirlist();
-    if (ofp != stdout) {                /* Close any output file */
-        if (ofp) fclose(ofp);
-        ofp = stdout;
-    }
-    if (rc > 0)
-      success = 1;
-    return(rc);
-}
-
-int
-dodir(cx) int cx; {                     /* Do the DIRECTORY command */
-    char *dc , *msg;
-
-#ifdef OS2
-    return(domydir());
-#else /* OS2 */
-    if (nopush
-#ifdef DOMYDIR                          /* Builds that domydir() by default */
-        || (cx == XXDIR || cx == XXLDIR)
-#endif /* DOMYDIR */
-        )
-      return(domydir());                /* Built-in directory command */
-
-    /* Use the system's directory command. */
-
-    msg = (cx == XXLS) ?
-      "Arguments for ls" :
-        "Directory and/or file specification";
-    if ((x = cmtxt(msg,"",&s,xxstring)) < 0)
-      return(x);
-
-    ckstrncpy(tmpbuf,s,TMPBUFSIZ);      /* Copy the filespec */
-    s = tmpbuf;
-
-    if ((y = cmcfm()) < 0) return(y);
-
-    lp = line;
-    if (!(dc = getenv("CK_DIR")))
-      dc = DIRCMD;
-    ckmakmsg(lp,LINBUFSIZ,dc," ",s,NULL);
-    debug(F110,"DIR",line,0);
-#ifdef VMS
-    conres();
-#endif /* VMS */
-    x = zshcmd(line);
-#ifdef VMS
-    concb((char)escape);
-#endif /* VMS */
-    return(success = (x < 1) ? 0 : 1);
-#endif /* OS2 */
-}
-
-#ifndef NOSERVER
-#ifndef NOFRILLS
-/* Do the ENABLE and DISABLE commands */
-
-int
-doenable(y,x) int y, x; {
-#ifdef CK_LOGIN
-    if (isguest)                        /* IKSD: Don't let guests */
-      return(0);                        /* enable anything that's disabled */
-#endif /* CK_LOGIN */
-    switch (x) {
-      case EN_ALL:
-        en_cwd = en_cpy = en_del = en_dir = en_fin = en_get = y;
-        en_ren = en_sen = en_set = en_spa = en_typ = en_ret = y;
-        if (!inserver)
-          en_who = en_mai = en_pri = y;
-        en_mkd = en_rmd = y;
-        en_xit = y;
-#ifndef datageneral
-        en_bye = y;
-#endif /* datageneral */
-#ifndef NOPUSH
-        if (!nopush && !inserver)
-          en_hos = y;
-#endif /* NOPUSH */
-#ifndef NOSPL
-        en_asg = en_que = y;
-#endif /* NOSPL */
-        break;
-
-      case EN_BYE:
-#ifndef datageneral
-/*
-  In Data General AOS/VS Kermit can't log out its superior process.
-*/
-        en_bye = y;
-#endif /* datageneral */
-        break;
-      case EN_CPY:
-        en_cpy = y;
-        break;
-      case EN_CWD:
-        en_cwd = y;
-#ifdef IKSD
-        if (inserver && y == 0) {
-            fnrpath = PATH_OFF;
-            fnspath = PATH_OFF;
-        }
-#endif /* IKSD */
-        break;
-      case EN_DEL:                      /* Deleting of files */
-        en_del = y;
-        break;
-      case EN_DIR:
-        en_dir = y;
-        break;
-      case EN_FIN:
-        en_fin = y;
-        break;
-      case EN_GET:
-        en_get = y;
-        break;
-#ifndef NOPUSH
-      case EN_HOS:
-        if (!nopush)
-         en_hos = y;
-        break;
-#endif /* NOPUSH */
-      case EN_REN:
-        en_ren = y;
-        break;
-      case EN_SEN:
-        en_sen = y;
-        break;
-      case EN_SET:
-        en_set = y;
-        break;
-      case EN_SPA:
-        en_spa = y;
-        break;
-      case EN_TYP:
-        en_typ = y;
-        break;
-      case EN_WHO:
-        en_who = y;
-        break;
-#ifndef NOSPL
-      case EN_ASG:
-        en_asg = y;
-        break;
-      case EN_QUE:
-        en_que = y;
-        break;
-#endif /* NOSPL */
-      case EN_RET:
-        en_del = y;
-        break;
-      case EN_MAI:
-#ifdef CK_LOGIN
-        if (isguest && y) {
-            printf("?Sorry, not valid for guests\n");
-            return(-9);
-        }
-#endif /* CK_LOGIN */
-        en_mai = y;
-        break;
-      case EN_PRI:
-#ifdef CK_LOGIN
-        if (isguest && y) {
-            printf("?Sorry, not valid for guests\n");
-            return(-9);
-        }
-#endif /* CK_LOGIN */
-        en_pri = y;
-        break;
-      case EN_MKD:
-        en_mkd = y;
-        break;
-      case EN_RMD:
-        en_rmd = y;
-        break;
-      case EN_XIT:
-        en_xit = y;
-        break;
-      case EN_ENA:
-        if (((y & 1) && !(en_ena & 1)) ||
-            ((y & 2) && !(en_ena & 2))) {
-            printf("?Sorry, DISABLE ENABLE can not be undone\n");
-            return(-9);
-        } else {
-            en_ena = y;
-            break;
-        }
-      default:
-        return(-2);
-    }
-    return(1);
-}
-#endif /* NOFRILLS */
-#endif /* NOSERVER */
-
-#ifndef NOFRILLS
-
-static int del_lis = 0;
-static int del_dot = 0;
-static int del_hdg = 0;
-static int del_pag = -1;
-static int del_ask = 0;
-
-#ifndef NOSHOW
-VOID
-showdelopts() {
-    int x = 0;
-    extern int optlines;
-    prtopt(&optlines,"");
-    prtopt(&optlines,"DELETE");
-    if (del_ask > -1) {
-        prtopt(&optlines, del_ask ? "/ASK" : "/NOASK");
-        x++;
-    }
-#ifdef UNIXOROSK
-    if (del_dot > -1) {
-        prtopt(&optlines, del_dot ? "/DOTFILES" : "/NODOTFILES");
-        x++;
-    }
-#endif /* UNIXOROSK */
-    if (del_lis > -1) {
-        prtopt(&optlines, del_lis ? "/LIST" : "/NOLIST");
-        x++;
-    }
-    if (del_hdg > -1) {
-        prtopt(&optlines, del_hdg ? "/HEADING" : "/NOHEADING");
-        x++;
-    }
-#ifndef CK_TTGWSIZ
-    if (del_pag > -1) {
-        prtopt(&optlines, del_pag ? "/PAGE" : "/NOPAGE");
-        x++;
-    }
-#endif /* CK_TTGWSIZ */
-    if (!x) prtopt(&optlines,"(no options set)");
-    prtopt(&optlines,"");
-}
-#endif /* NOSHOW */
-
-
-int
-setdelopts() {
-    int x_lis = -1, x_pag = -1, x_dot = -1, x_hdg = -1, x_ask = -1;
-    int getval = 0;
-    char c;
-    while (1) {
-        if ((y = cmswi(deltab,ndeltab,"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);
-        }
-        if (!getval && (cmgkwflgs() & CM_ARG)) {
-            printf("?This switch requires an argument\n");
-            return(-9);
-        }
-        switch (y) {
-          case DEL_DOT:
-            x_dot = 1;
-            break;
-          case DEL_NOD:
-            x_dot = 0;
-            break;
-          case DEL_HDG:
-            x_hdg = 1;
-            break;
-          case DEL_LIS:
-            x_lis = 1;
-            break;
-          case DEL_NOL:
-            x_lis = 0;
-            break;
-#ifndef CK_TTGWSIZ
-          case DEL_PAG:
-            x_pag = 1;
-            break;
-          case DEL_NOP:
-            x_pag = 0;
-            break;
-#endif /* CK_TTGWSIZ */
-          case DEL_QUI:
-            x_lis = 0;
-            break;
-          case DEL_VRB:
-            x_lis = 1;
-            break;
-          case DEL_ASK:
-            x_ask = 1;
-            break;
-          case DEL_NAS:
-            x_ask = 0;
-            break;
-          default:
-            printf("?Sorry, this option can not be set\n");
-            return(-9);
-        }
-    }
-    if ((x = cmcfm()) < 0)              /* Get confirmation */
-      return(x);
-    if (x_pag > -1) del_pag = x_pag;
-    if (x_dot > -1) del_dot = x_dot;
-    if (x_hdg > -1) del_hdg = x_hdg;
-    if (x_lis > -1) del_lis = x_lis;
-    if (x_ask > -1) del_ask = x_ask;
-    return(success = 1);
-}
-
-#ifdef OS2
-static char ** xmtchs = NULL;
-static int xmtchn = 0;
-#endif /* OS2 */
-
-int
-dodel() {                               /* DELETE */
-    int i, j, k, x;
-    int fs = 0;                         /* Need to call fileselect() */
-    int len = 0;
-    int bad = 0;
-    int getval = 0, asking = 0;
-    int simulate = 0, rc = 0;
-    long minsize = -1L, maxsize = -1L;
-    int havename = 0, confirmed = 0;
-    int qflag = 0;
-    int summary = 0;
-    int deldirs = 0;
-    int deltree = 0;
-    int itsadir = 0;
-    int argisdir = 0;
-    int xmode = -1, scan = 0, skip = 0;
-#ifdef COMMENT
-    int pass = 0;
-#endif /* COMMENT */
-    char c;
-    char * deldef = "";
-    char safebuf[CKMAXPATH+1];
-    struct FDB sw, fi, fl;
-    char
-      * del_aft = NULL,
-      * del_bef = NULL,
-      * del_naf = NULL,
-      * del_nbf = NULL,
-      * del_exc = NULL;
-    int
-      x_lis = 0,
-      /* x_dot = -1, */
-      x_hdg = 0;
-
-    char * dxlist[8];
-
-    for (i = 0; i < 8; i++) dxlist[i] = NULL;
-
-    g_matchdot = matchdot;
-
-    if (del_lis > -1) x_lis    = del_lis;
-    if (del_dot > -1) matchdot = del_dot;
-    if (del_hdg > -1) x_hdg    = del_hdg;
-    if (del_pag > -1) xaskmore = del_pag;
-    if (del_ask > -1) asking   = del_ask;
-
-    diractive = 1;
-    nolinks = 2;                        /* By default don't follow links */
-
-    cmfdbi(&sw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           "File specification;\n or switch",
-           "",                          /* default */
-           "",                          /* addtl string data */
-           ndeltab,                     /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           deltab,                      /* Keyword table */
-           &fi                          /* Pointer to next FDB */
-           );
-    cmfdbi(&fl,                         /* Anything that doesn't match */
-           _CMFLD,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           NULL
-           );
-  again:
-    cmfdbi(&fi,                         /* 2nd FDB - file to delete */
-           _CMIFI,                      /* fcode */
-           "File(s) to delete",         /* hlpmsg */
-           deldef,                      /* default */
-           "",                          /* addtl string data */
-           nolinks | deldirs,           /* 0 = files, 1 = files or dirs */
-           0,                           /* 1 = dirs only */
-           xxstring,
-           NULL,
-           &fl
-           );
-    while (!havename && !confirmed) {
-        x = cmfdb(&sw);                 /* Parse something */
-        if (x < 0) {                    /* Error */
-            if (x == -3)
-              break;
-            if (x == -2 || x == -9)
-              printf("?Does not match switch or filename: \"%s\"\n",atmbuf);
-            return(x);
-        }
-        if (cmresult.fcode != _CMKEY)   /* Break out if not a switch */
-          break;
-        c = cmgbrk();                   /* Get break character */
-        if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
-            printf("?This switch does not take an argument\n");
-            rc = -9;
-            goto xdelete;
-        }
-        if (!getval && (cmgkwflgs() & CM_ARG)) {
-            printf("?This switch requires an argument\n");
-            rc = -9;
-            goto xdelete;
-        }
-        switch (k = cmresult.nresult) {
-          case DEL_AFT:
-          case DEL_BEF:
-          case DEL_NAF:
-          case DEL_NBF:
-            if (!getval) break;
-            if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Date-time required\n");
-                    x = -9;
-                } else
-                  rc = x;
-                goto xdelete;
-            }
-            fs++;
-            deltree = 0;
-            switch (k) {
-              case DEL_AFT: makestr(&del_aft,s); break;
-              case DEL_BEF: makestr(&del_bef,s); break;
-              case DEL_NAF: makestr(&del_naf,s); break;
-              case DEL_NBF: makestr(&del_nbf,s); break;
-            }
-            break;
-          case DEL_DOT:
-            matchdot = 1;
-            break;
-          case DEL_NOD:
-            matchdot = 0;
-            break;
-          case DEL_ALL:
-            fs = 0;
-#ifdef VMS
-            deldef = "*.*";             /* UNIX, Windows, OS/2 */
-#else
-#ifdef datageneral
-            deldef = "+";               /* AOS/VS */
-#else
-            deldef = "*";               /* UNIX, Windows, OS/2, VMS... */
-#endif /* datageneral */
-#endif /* VMS */
-            deltree = 1;
-            nolinks = 2;
-            matchdot = 1;
-            recursive = 1;              /* Fall through purposely... */
-          case DEL_DIR:
-            deldirs = 1;
-            goto again;
-          case DEL_EXC:
-            if (!getval) break;
-            if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Pattern required\n");
-                    x = -9;
-                } else
-                  rc = x;
-                goto xdelete;
-            }
-            fs++;
-            deltree = 0;
-            makestr(&del_exc,s);
-            break;
-          case DEL_HDG:
-            x_hdg = 1;
-            break;
-#ifdef RECURSIVE
-          case DEL_REC:
-            recursive = 1;
-            break;
-#endif /* RECURSIVE */
-          case DEL_LIS:
-            x_lis = 1;
-            break;
-          case DEL_SUM:
-            summary = 1;
-            x_lis = 0;
-            x_hdg = 1;
-            break;
-          case DEL_NOL:
-            x_lis = 0;
-            break;
-#ifndef CK_TTGWSIZ
-          case DEL_PAG:
-            xaskmore = 1;
-            break;
-          case DEL_NOP:
-            xaskmore = 0;
-            break;
-#endif /* CK_TTGWSIZ */
-          case DEL_QUI:
-            qflag = 1;
-            x_lis = 0;
-            break;
-          case DEL_VRB:
-            x_lis = 1;
-            break;
-
-          case DEL_SMA:
-          case DEL_LAR:
-            if (!getval) break;
-            if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0)
-              return(x);
-            fs++;
-            deltree = 0;
-            switch (cmresult.nresult) {
-              case DEL_SMA: minsize = y; break;
-              case DEL_LAR: maxsize = y; break;
-            }
-            break;
-
-          case DEL_SIM:
-            simulate = 1;
-            x_lis = 1;
-            break;
-          case DEL_ASK:
-            asking = 1;
-            break;
-          case DEL_NAS:
-            asking = 0;
-            break;
-          case DEL_TYP: {
-              extern struct keytab txtbin[];
-              if (!getval) break;
-              if ((x = cmkey(txtbin,3,"","",xxstring)) < 0)
-                return(x);
-              if (x == 2) {             /* ALL */
-                  xmode = -1;
-              } else {                  /* TEXT or BINARY only */
-                  xmode = x;
-                  scan = 1;
-              }
-              break;
-          }
-          default:
-            printf("?Not implemented yet - \"%s\"\n",atmbuf);
-            return(-9);
-        }
-    }
-    if (qflag && (cmresult.fcode == _CMFLD)) {
-        if ((x = cmcfm()) < 0)
-          return(x);
-        else
-          return(success = 0);
-    }
-    if (cmresult.fcode != _CMIFI) {
-        if (*atmbuf) {
-           int x;
-            if (iswild(atmbuf) && nzxpand(atmbuf,nzxopts) == 0)
-              printf("?No files match: %s\n",atmbuf);
-            else if ((x = zchki(atmbuf)) == -1)
-             printf("?File not found: %s\n",atmbuf);
-           else if (x == -2)
-             printf("?Not a regular file: %s\n",atmbuf);
-           else
-              /* printf("?Not a deletable file: %s\n",atmbuf); */
-              goto tryanyway;
-        } else {
-            printf("?A file specification is required\n");
-        }
-        return(-9);
-    }
-  tryanyway:
-    ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ); /* Safe copy of filespec */
-    if (deldirs) {
-        ckstrncpy(safebuf,cmresult.sresult,CKMAXPATH);
-#ifdef VMSORUNIX
-        len = zgetfs(tmpbuf);           /* Is it a directory name? */
-        argisdir = zgfs_dir;            /* Then because of how zxpand() */
-        if (argisdir && zgfs_link)      /* works, we have to add it to */
-          argisdir = 0;                 /* the list. */
-        if (itsadir)
-          len = -2;
-#else
-        len = zchki(tmpbuf);
-        if (len < 0)
-          argisdir = isdir(tmpbuf);
-#endif /* VMSORUNIX */
-    }
-    debug(F110,"DELETE file",tmpbuf,0);
-    if ((x = cmcfm()) < 0)
-      return(x);
-
-#ifdef IKSD
-#ifdef CK_LOGIN
-    if (inserver && isguest) {
-        printf("?Sorry, DELETE unavailable to guests\n");
-        return(-9);
-    }
-#endif /* CK_LOGIN */
-#endif /* IKSD */
-
-#ifndef OS2ORUNIX
-    if (simulate) {
-        printf("?Sorry, /SIMULATE not implemented on this platform\n");
-        return(-9);
-    }
-#endif /* OS2ORUNIX */
-
-#ifdef COMMENT
-    /* (not needed) */
-    if (!iswild(tmpbuf)) {
-        char *m;
-        errno = 0;
-        x = zchki(tmpbuf);
-        if (x < 0) {
-            switch (x) {
-              case -2: m = "Not a regular file"; break;
-              case -1: m = "File not found or not accessible"; break;
-              default: m = errno ? ck_errstr() : "Can't delete";
-            }
-            printf("?%s: \"%s\"\n",m,tmpbuf);
-            return(-9);
-        }
-    }
-#endif /* COMMENT */
-
-    makelist(del_exc,dxlist,8);
-
-/* tmpbuf[] has the name - now do any needed conversions on it */
-
-#ifdef OS2
-    {   /* Lower level functions change / to \, not good for CMD.EXE. */
-        char *p = tmpbuf;
-        while (*p) {                    /* Change them back to \ */
-            if (*p == '/') *p = '\\';
-            p++;
-        }
-    }
-#endif /* OS2 */
-
-#ifdef VMS
-    if (iswild(tmpbuf)) {
-#ifdef COMMENT
-        /* Does not handle '.' as version separator */
-        char *p = tmpbuf;
-        x = 0;
-        while (*p) {
-            if (*p == ';') {
-                x = 1;
-                break;
-            } else
-              p++;
-        }
-        if (!x) ckstrncat(tmpbuf,";*",TMPBUFSIZ);
-#else
-        j = 0; x = 0;                   /* for end_dot and number of dots */
-        i = strlen(tmpbuf);
-        if (tmpbuf[i] == ';') {
-            ckstrncat(tmpbuf,"0",TMPBUFSIZ);
-        } else {
-            if (tmpbuf[i--] == '.')
-              j++;
-            for (; i >= 0; i--) {
-                if (tmpbuf[i] == ';' || tmpbuf[i] == ':' ||
-                    tmpbuf[i] == ']' || tmpbuf[i] == '>')
-                  break;
-                else if (tmpbuf[i] == '.')
-                  x++;
-            }
-            if (tmpbuf[i] != ';') {     /* dot may have been used */
-                if (j) {                /* last char is dot */
-                  if (x)                /* second is version separator */
-                    ckstrncat(tmpbuf,"0",TMPBUFSIZ);
-                  else                  /* 'foo.' */
-                    ckstrncat(tmpbuf,";0",TMPBUFSIZ);
-                } else if (x == 1)      /* lacking a version separator */
-                  ckstrncat(tmpbuf,";0",TMPBUFSIZ);
-                else if (x == 0)        /* x == 2 has a version */
-                  ckstrncat(tmpbuf,".*;0",TMPBUFSIZ);
-            }
-        }
-#endif /* COMMENT */
-    }
-#endif /* VMS */
-
-    debug(F110,"dodel tmpbuf",tmpbuf,0); /* Filename */
-
-#ifndef OS2ORUNIX                       /* No built-in DELETE code... */
-    /* Construct system command. */
-    ckmakmsg(line,LINBUFSIZ,DELCMD," ",tmpbuf,NULL);
-#else
-#ifdef VMS
-    if (asking) {                       /* Maybe overwrite in VMS */
-        if (x_lis)                      /* if options are needed... */
-          ckmakmsg(line,LINBUFSIZ,DELCMD," /confirm/log ",tmpbuf,NULL);
-        else
-          ckmakmsg(line,LINBUFSIZ,DELCMD," /confirm ",tmpbuf,NULL);
-    } else if (x_lis)
-      ckmakmsg(line,LINBUFSIZ,DELCMD," /log ",tmpbuf,NULL);
-    conres();
-#endif /* VMS */
-
-    debug(F110,"dodel line",line,0);
-#endif /* OS2ORUNIX */
-
-#ifdef MAC
-    success = (zdelet(tmpbuf) == 0);
-
-#else  /* !MAC ... */
-
-#ifdef OS2ORUNIX
-    {
-        int filespace = 0;
-        int count = 0;
-        int lines = 0;
-        int n = 0;
-
-        s = tmpbuf;
-
-#ifdef CK_TTGWSIZ
-#ifdef OS2
-        ttgcwsz();
-#else /* OS2 */
-        /* Check whether window size changed */
-        if (ttgwsiz() > 0) {
-            if (tt_rows > 0 && tt_cols > 0) {
-                cmd_rows = tt_rows;
-                cmd_cols = tt_cols;
-            }
-        }
-#endif /* OS2 */
-#endif /* CK_TTGWSIZ */
-
-        if (x_hdg > 0 && !summary) {
-            printf("Deleting %s...%s\n", s, simulate ? " (SIMULATION)" : "");
-            n += 2;
-        }
-#ifdef ZXREWIND
-        z = zxrewind();                 /* Rewind file list */
-#else
-        if (!deldirs)
-          nzxopts = ZX_FILONLY;
-        if (recursive) nzxopts |= ZX_RECURSE;
-        if (matchdot)  nzxopts |= ZX_MATCHDOT;
-        errno = 0;
-        z = nzxpand(s,nzxopts);         /* Expand file list */
-#endif /* ZXREWIND */
-        debug(F111,"dodel",s,z);
-
-        /* If deleting directories, sort in reverse order */
-        /* so we delete the files first, then the directory. */
-
-#ifdef OS2
-        /* In K95, we have no mtchs array, nor any control over */
-        /* the order in which znext() returns filenames, so we  */
-        /* must copy the array and sort it. */
-        {
-            int i;
-            if (xmtchs) {               /* Free previous list in case */
-                debug(F101,"dodel freeing previous list","",xmtchn);
-                for (i = 0; i < xmtchn; i++) /* it wasn't freed last time. */
-                  if (xmtchs[i])
-                    free(xmtchs[i]);
-                free(xmtchs);
-            }
-            xmtchn = 0;
-            xmtchs = (char **)malloc(z * (sizeof(char **))); /* Make new one */
-            if (!xmtchs) {
-                printf("?Memory allocation failure\n");
-                return(-9);
-            }
-            for (i = 0; i < z; i++) {
-                xmtchs[i] = NULL;
-                znext(tmpbuf);
-                if (!*tmpbuf)
-                  break;
-                makestr(&(xmtchs[i]),tmpbuf);
-                if (!xmtchs[i]) {
-                    printf("?Memory allocation failure\n");
-                    xmtchn = i - 1;
-                    rc = -9;
-                    goto xdelete;
-                }
-                /* debug(F111,"dodel add",xmtchs[i],i); */
-            }
-            xmtchn = i;
-            debug(F101,"dodel xmtchn","",xmtchn);
-            sh_sort(xmtchs,NULL,z,0,deldirs,0);
-        }
-#else
-#ifdef UNIX
-        sh_sort(mtchs,NULL,z,0,deldirs,filecase);
-#endif /* UNIX */
-#endif /* OS2 */
-
-        if (z > 0) {
-            int i;
-#ifdef OS2
-            int ix = 0;
-#endif /* OS2 */
-            success = 1;
-            if (x_hdg > 0)
-              printf("\n");
-
-            while (
-#ifdef OS2
-                   ix < xmtchn
-#else
-                   1
-#endif /* OS2 */
-                   ) {                  /* Loop for all files */
-#ifdef OS2
-                ckstrncpy(tmpbuf,xmtchs[ix++],TMPBUFSIZ);
-#else
-                znext(tmpbuf);          /* Get next file */
-#endif /* OS2 */
-                if (!*tmpbuf) {         /* No more */
-                    if (deldirs && recursive && argisdir) {
-                        ckstrncpy(tmpbuf,safebuf,TMPBUFSIZ);
-                        argisdir = 0;   /* (only do this once) */
-                    } else
-                      break;
-                }
-                skip = 0;
-                if (!deltree) {
-                    if (fs)
-                      if (fileselect(tmpbuf,
-                                     del_aft,del_bef,del_naf,del_nbf,
-                                     minsize,maxsize,0,8,dxlist) < 1) {
-                          skip++;
-                      }
-                }
-                if (!skip && scan && itsadir) {
-                    skip++;
-                }
-                if (!skip && scan) {
-                      switch (scanfile(tmpbuf,&y,nscanfile)) {
-                      case FT_BIN:
-                        if (xmode != 1)
-                          skip++;
-                        break;
-                      case FT_TEXT:
-                      case FT_7BIT:
-                      case FT_8BIT:
-#ifdef UNICODE
-                      case FT_UTF8:
-                      case FT_UCS2:
-#endif /* UNICODE */
-                        if (xmode != 0)
-                          skip++;
-                    }
-                }
-                if (!skip && asking) {
-                    int x;
-                    ckmakmsg(line,LINBUFSIZ," Delete ",tmpbuf,"? ",NULL);
-                    x = getyesno(line,3);
-                    switch (x) {
-                      case 0: continue;           /* no */
-                      case 1: break;              /* yes */
-                      case 2: goto xdelete;       /* quit */
-                      case 3: asking = 0; break;  /* go */
-                    }
-                }
-#ifdef VMSORUNIX
-                len = zgetfs(tmpbuf);   /* Get length and accessibility */
-                itsadir = zgfs_dir;
-                if (itsadir && zgfs_link) { /* Treat links to directories */
-                    itsadir = 0;        /* as regular files */
-                    if (scan)           /* But not if /TYPE: was given */
-                      skip++;
-                }
-                if (itsadir)            /* (emulate non-Unix code) */
-                  len = -2;
-#else
-                len = zchki(tmpbuf);    /* Get accessibility */
-                if (len < 0)            /* See if it's a directory */
-                  itsadir = isdir(tmpbuf);
-#endif /* VMSORUNIX */
-
-                if (skip) {
-#ifdef COMMENT                          /* Too verbose */
-                    if (x_lis > 0) {
-                        lines++;
-                        printf(" %s (SKIPPED)\n",tmpbuf);
-#ifdef CK_TTGWSIZ
-                        if (++n > cmd_rows - 3)
-                          if (!askmore()) goto xdelete; else n = 0;
-#endif /* CK_TTGWSIZ */
-                    }
-#endif /* COMMENT */
-                    continue;
-                }
-
-                debug(F111,"DELETE len",tmpbuf,len);
-                if (simulate) {
-                    filespace += len;
-                    count++;
-                    if (x_lis > 0) {
-                        lines++;
-                        printf(" %s (SELECTED)\n",tmpbuf);
-                        if (++n > cmd_rows - 3) {
-                            int xx;
-                            xx = askmore();
-                            if (!xx) goto xdelete; else n = 0;
-                        }
-                    }
-                } else if (len >= 0 || !itsadir) { /* Regular file */
-                    zdelet(tmpbuf);                /* or symlink, etc... */
-                    if (zchki(tmpbuf) < 0) {
-                        filespace += len;
-                        count++;
-                        if (x_lis > 0) {
-                            lines++;
-                            printf(" %s (OK)\n",tmpbuf);
-                            if (++n > cmd_rows - 3)
-                              if (!askmore()) goto xdelete; else n = 0;
-                        }
-                    } else {
-                        bad++;
-                        success = 0;
-                        if (x_lis > 0) {
-                            lines++;
-                            printf(" %s (FAILED: %s)\n",tmpbuf,ck_errstr());
-                            if (++n > cmd_rows - 3)
-                              if (!askmore()) goto xdelete; else n = 0;
-                        }
-                    }
-                } else if (/* pass > 0 && */ deldirs && itsadir) {
-                    /* It's a directory */
-                    if (zrmdir(tmpbuf) > -1) { /* Only works if empty */
-                        count++;
-                        if (x_lis > 0) {
-                            lines++;
-                            printf(" %s (OK)\n",tmpbuf);
-                            if (++n > cmd_rows - 3)
-                              if (!askmore()) goto xdelete; else n = 0;
-                        }
-                    } else {
-                        success = 0;
-                        if (x_lis > 0) {
-                            lines++;
-                            printf(" %s (FAILED: %s)\n",
-                                   tmpbuf,
-                                   ck_errstr());
-                            if (++n > cmd_rows - 3)
-                              if (!askmore()) goto xdelete; else n = 0;
-                        }
-                    }
-                } else if (x_lis > 0) {
-                    lines++;
-                    if (isdir(tmpbuf))
-                      printf(" %s (FAILED: directory)\n",tmpbuf);
-                    else
-                      printf(" %s (FAILED: not a regular file)\n",tmpbuf);
-                    if (++n > cmd_rows - 3)
-                      if (!askmore()) goto xdelete; else n = 0;
-                }
-            }
-            if (x_hdg > 0) {
-                if (lines > 0)
-                  printf("\n");
-                if (++n > cmd_rows - 3)
-                  if (!askmore()) goto xdelete; else n = 0;
-                printf("%d file%s %sdeleted, %d byte%s %sfreed%s\n",
-                       count,
-                       count != 1 ? "s" : "",
-                       simulate ? "would be " : "",
-                       filespace,
-                       filespace != 1 ? "s" : "",
-                       simulate ? "would be " : "",
-                       simulate ? " (maybe)" : ""
-                       );
-            }
-            if (!x_lis && !success && !quiet) {
-                printf("?DELETE failed for %d file%s \
-(use DELETE /LIST to see details)\n",
-                       bad, bad == 1 ? "" : "s"
-                       );
-            }
-        } else if (x_lis > 0) {
-            if (errno)
-              printf("?%s: %s\n",ck_errstr(), tmpbuf);
-            else
-              printf("?Can't delete: %s\n",tmpbuf);
-        }
-    }
-#else /* OS2ORUNIX */
-#ifndef VMS                             /* Others - let the system do it. */
-    xsystem(line);
-    x = nzxpand(tmpbuf,nzxopts);
-    success = (x > 0) ? 0 : 1;
-    if (x_hdg > 0)
-      printf("%s - %sdeleted\n", tmpbuf, success ? "" : "not ");
-#else
-    if (asking)
-      printf("\n");
-    x = xsystem(line);                  /* zshcmd returns 1 for success */
-    success = (x > 0) ? 1 : 0;
-    if (x_hdg > 0 && !asking)
-      printf("%s - %sdeleted\n", tmpbuf, success ? "" : "not ");
-    concb((char)escape);
-#endif /* VMS */
-#endif /* OS2ORUNIX */
-#endif /* MAC */
-  xdelete:
-    if (g_matchdot > -1) {
-        matchdot = g_matchdot;          /* Restore these... */
-        g_matchdot = -1;
-    }
-#ifdef OS2
-    if (xmtchs) {
-        int i;
-        debug(F101,"dodel freeing list","",xmtchn);
-        for (i = 0; i < xmtchn; i++)
-          if (xmtchs[i]) free(xmtchs[i]);
-        free(xmtchs);
-        xmtchs = NULL;
-        xmtchn = 0;
-    }
-#endif /* OS2 */
-    debug(F101,"dodel result","",rc);
-    return((rc < 0) ? rc : success);
-}
-#endif /* NOFRILLS */
-
-#ifndef NOSPL                           /* The ELSE command */
-_PROTOTYP( VOID pushqcmd, (char *) );
-
-int
-doelse() {
-    if (!ifcmd[cmdlvl]) {
-        printf("?ELSE doesn't follow IF\n");
-        return(-2);
-    }
-#ifdef COMMENT
-/*
-  Wrong.  This prevents IF..ELSE IF...ELSE IF...ELSE IF...ELSE...
-  from working.
-*/
-    ifcmd[cmdlvl] = 0;
-#endif /* COMMENT */
-    if (!iftest[cmdlvl]) {              /* If IF was false do ELSE part */
-        if (maclvl > -1 || tlevel > -1) { /* In macro or command file */
-            debug(F100,"doelse pushing","",0);
-#ifdef COMMENT
-            pushcmd(NULL);              /* save rest of command. */
-#else
-            /* This fixes certain obscure problems */
-            /* but breaks many other constructions that must work. */
-            pushqcmd(NULL);
-#endif /* COMMENT */
-        } else {                        /* If interactive, */
-            cmini(ckxech);              /* just start a new command */
-            printf("\n");               /* (like in MS-DOS Kermit) */
-            if (pflag) prompt(xxstring);
-        }
-    } else {                            /* Condition is false */
-        if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0)
-          return(y);                    /* Gobble up rest of line */
-    }
-    return(0);
-}
-#endif /* NOSPL */
-
-#ifndef NOSPL
-int
-doswitch() {
-    char *lp, *ap;                      /* Macro argument pointer */
-    int len = 0, x, y, pp = 0;
-    char brbuf[3];
-
-    /* Get variable name */
-
-    tmpbuf[0] = NUL;
-    brbuf[0] = '{';
-    brbuf[1] = '}';
-    brbuf[2] = NUL;
-
-    y = cmfld("Variable name","",&s,xxstring);
-    debug(F111,"doswitch cmfld",s,y);
-    if (y < 0) {
-        if (y == -3)                   /* Because brstrip() writes */
-          s = brbuf;                   /* into its argument. */
-        else
-          return(y);
-    }
-    debug(F110,"doswitch A",s,0);
-    if (!strcmp(s,"(")) {
-        pp++;
-        if ((y = cmfld("Variable name","",&s,xxstring)) < 0) {
-            if (y == -3)
-              s = brbuf;
-            else
-              return(y);
-           debug(F110,"doswitch B",s,0);
-        }
-    }
-    len = ckstrncpy(tmpbuf,brstrip(s),TMPBUFSIZ);
-    if (tmpbuf[0] == CMDQ) {
-        if (chkvar(s) < 1) {
-            printf("?Variable name required\n");
-            return(-9);
-        }
-    }
-    if (pp > 0) {                       /* If open paren given parse closing */
-        if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0)
-          return(y);
-        if (strcmp(atmbuf,")")) {
-            printf("?Closing parenthesis required\n");
-            return(-9);
-        }
-    }
-    lp = line;
-    x = ckstrncpy(lp,"_switx ",LINBUFSIZ); /* _switx + space */
-    lp += x;
-    ap = lp;
-    debug(F010,"SWITCH a",line,0);
-
-#ifdef COMMENT
-    x = ckmakmsg(lp,LINBUFSIZ-x,tmpbuf," ",NULL,NULL); /* variable name + SP */
-#else
-    {                                   /* variable name + SP */
-        char * p = tmpbuf;
-       if (len > 0) {
-           if (tmpbuf[0] == '(' && tmpbuf[len-1] == ')') {
-               tmpbuf[len-1] = NUL;
-               p++;
-           }
-        }
-        x = ckmakmsg(lp,LINBUFSIZ-x,"{",brstrip(p),"}"," ");
-    }
-#endif /* COMMENT */
-    debug(F010,"SWITCH b",line,0);
-    lp += x;
-
-    /* Get body */
-
-    if ((y = cmtxt("series of cases","",&s,NULL)) < 0) return(y);
-    if ((y = (int)strlen(s)) < 1) return(-2);
-    if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */
-        ckmakmsg(tmpbuf,TMPBUFSIZ,"{ ",s," }",NULL);
-        s = tmpbuf;
-    }
-    if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) {
-        printf("?Unbalanced braces\n");
-        return(0);
-    }
-    debug(F010,"SWITCH c",line,0);
-
-    x = mlook(mactab,"_switx",nmac);    /* Look up SWITCH macro definition */
-    if (x < 0) {                        /* Not there? */
-        addmmac("_switx",sw_def);       /* Put it back. */
-        if ((x = mlook(mactab,"_switx",nmac)) < 0) { /* Look it up again. */
-            printf("?SWITCH macro definition gone!\n"); /* Shouldn't happen. */
-            return(success = 0);
-        }
-    }
-    debug(F010,"SWITCH command",line,0); /* Execute the SWITCH macro. */
-    success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC);
-    debug(F101,"SWITCH status","",success);
-    return(success);
-}
-
-int
-dofor() {                               /* The FOR command. */
-    int i, fx, fy, fz;                  /* loop variables */
-    char *ap, *di;                      /* macro argument pointer */
-    int pp = 0;                         /* Paren level */
-    int mustquote = 0;
-
-    for (i = 0; i < 2; i++) {
-        if ((y = cmfld("Variable name","",&s,NULL)) < 0) {
-            if (y == -3) {
-                printf("?Variable name required\n");
-                return(-9);
-            } else
-              return(y);
-        }
-        if (strcmp(s,"("))
-          break;
-        pp++;
-    }
-#ifdef COMMENT
-    if ((y = parsevar(s,&x,&z)) < 0)    /* Check variable. */
-      return(y);
-#else
-    if (*s == CMDQ)                     /* If loop variable starts with */
-      mustquote++;                      /* backslash, mustquote is > 0. */
-#endif /* COMMENT */
-
-    lp = line;                          /* Build a copy of the command */
-    ckstrncpy(lp,"_forx ",LINBUFSIZ);
-    lp += (int)strlen(line);            /* "_for" macro. */
-    ap = lp;                            /* Save pointer to macro args. */
-
-    if (*s == CMDQ) s++;                /* Skip past backslash if any. */
-    while ((*lp++ = *s++)) ;            /* copy it */
-    lp--; *lp++ = SP;                   /* add a space */
-
-    if ((y = cmnum("initial value","",10,&fx,xxstring)) < 0) {
-        if (y == -3) return(-2);
-        else return(y);
-    }
-    debug(F101,"dofor fx","",fx);
-    s = atmbuf;                         /* Copy the atom buffer */
-
-    if ((int)strlen(s) < 1) goto badfor;
-/*
-  In edit 192, we change the loop variables to be evaluated at loop entry,
-  not each time through the loop.  This was required in order to allow
-  \v(argc) to be used as a loop variable, or in a loop-variable expression.
-  Thus, we can't have FOR loops that modify their own exit conditions by
-  changing the final value or the increment.  The problem with \v(argc) was
-  that it is on the macro stack; after entry into the _forx macro, it is at
-  the wrong place.
-*/
-    sprintf(tmpbuf,"%d",fx);            /* (SAFE) Substitute actual value */
-    s = tmpbuf;
-    while ((*lp++ = *s++)) ;            /* (what they actually typed) */
-    lp--; *lp++ = SP;
-#ifdef DEBUG
-    *lp = NUL;
-    debug(F110,"FOR A",line,0);
-#endif /* DEBUG */
-
-    if ((y = cmnum("final value","",10,&fy,xxstring)) < 0) {
-        if (y == -3) return(-2);
-        else return(y);
-    }
-    debug(F101,"dofor fy","",fy);
-    s = atmbuf;                         /* Same deal */
-    if ((int)strlen(s) < 1)
-      goto badfor;
-
-    sprintf(tmpbuf,"%d",fy);            /* SAFE */
-    s = tmpbuf;
-    while ((*lp++ = *s++)) ;
-    lp--;
-    *lp++ = SP;
-#ifdef DEBUG
-    *lp = NUL;
-    debug(F110,"FOR B",line,0);
-#endif /* DEBUG */
-
-    x_ifnum = 1;                        /* Increment or parenthesis */
-    di = (fx < fy) ? "1" : "-1";        /* Default increment */
-    if ((y = cmnum("increment",di,10,&fz,xxstring)) < 0) {
-        debug(F111,"dofor increment",atmbuf,y);
-        x_ifnum = 0;
-        if (y == -3) {                  /* Premature termination */
-            return(-2);
-        } else if (y == -2) {           /* Maybe closing paren */
-            if (!strcmp(atmbuf,")")) {
-                pp--;                   /* Count it */
-                s = di;                 /* supply default interval */
-                fz = atoi(s);
-            } else                      /* Not closing paren, invalid */
-              return(y);
-        } else                          /* Other error */
-          return(y);
-    } else {                            /* Number */
-        x_ifnum = 0;
-        debug(F101,"dofor fz","",fz);
-        s = atmbuf;                     /* Use it */
-    }
-    if ((int)strlen(s) < 1)
-      goto badfor;
-
-    sprintf(tmpbuf,"%d",fz);            /* (SAFE) Same deal */
-    s = tmpbuf;
-    while ((*lp++ = *s++)) ;
-    lp--; *lp++ = SP;
-
-#ifdef DEBUG
-    *lp = NUL;
-    debug(F110,"FOR C",line,0);
-#endif /* DEBUG */
-
-    /* Insert the appropriate comparison operator */
-    if (fz < 0)
-      *lp++ = '<';
-    else
-      *lp++ = '>';
-    *lp++ = SP;
-
-#ifdef DEBUG
-    *lp = NUL;
-    debug(F110,"FOR D",line,0);
-#endif /* DEBUG */
-
-    if (pp > 0) {                       /* If open paren given parse closing */
-        if ((y = cmfld("Closing parenthesis","",&s,NULL)) < 0)
-          return(y);
-        if (strcmp(atmbuf,")")) {
-            printf("?Closing parenthesis required\n");
-            return(-9);
-        }
-    }
-    if ((y = cmtxt("Command to execute","",&s,NULL)) < 0) return(y);
-    if ((y = (int)strlen(s)) < 1) return(-2);
-    if (s[0] != '{' && s[y-1] != '}') { /* Supply braces if missing */
-        ckmakmsg(tmpbuf,TMPBUFSIZ,"{ ",s," }",NULL);
-        s = tmpbuf;
-    }
-    if (litcmd(&s,&lp,(LINBUFSIZ - (lp - (char *)line) - 2)) < 0) {
-        printf("?Unbalanced braces\n");
-        return(0);
-    }
-#ifdef DEBUG
-    *lp = NUL;
-    debug(F110,"FOR E",line,0);
-#endif /* DEBUG */
-
-#ifdef COMMENT
-/* Too strict */
-    if (fz == 0) {
-        printf("?Zero increment not allowed\n");
-        return(0);
-    }
-#endif /* COMMENT */
-/*
-  In version 8.0 we decided to allow macro names anyplace a numeric-valed
-  variable could appear.  But this caused trouble for the FOR loops because
-  the quoting in for_def[] assumed a \%i-style loop variable.  We account
-  for this here in the if (mustquote)...else logic by invoking separate
-  FOR macro definitions in the two cases.
-*/
-    if (mustquote) {                    /* \%i-style loop variable */
-        x = mlook(mactab,"_forx",nmac); /* Look up FOR macro definition */
-        if (x < 0) {                    /* Not there? */
-            addmmac("_forx",for_def);   /* Put it back. */
-            if ((x = mlook(mactab,"_forx",nmac)) < 0) { /* Look it up again. */
-                printf("?FOR macro definition gone!\n");
-                return(success = 0);
-            }
-        }
-    } else {                            /* Loop variable is a macro */
-        x = mlook(mactab,"_forz",nmac);
-        if (x < 0) {
-            addmmac("_forz",foz_def);
-            if ((x = mlook(mactab,"_forz",nmac)) < 0) {
-                printf("?FOR macro definition gone!\n");
-                return(success = 0);
-            }
-        }
-    }
-    debug(F010,"FOR command",line,0);   /* Execute the FOR macro. */
-    return(success = dodo(x,ap,cmdstk[cmdlvl].ccflgs | CF_IMAC));
-
-badfor:
-    printf("?Incomplete FOR command\n");
-    return(-2);
-}
-#endif /* NOSPL */
-
-#ifndef NOFRILLS
-/* Do the BUG command */
-
-int
-dobug() {
-    int n;
-    char * s = "";
-    extern char * k_info_dir;
-
-    if (k_info_dir)
-      s = k_info_dir;
-
-#ifdef COMMENT
-    printf("\n%s,%s\n Numeric: %ld",versio,ckxsys,vernum);
-#endif /* COMMENT */
-    printf(
-"\nBefore requesting technical support from Columbia U., please consult:\n\n"
-           );
-    n = 7;
-#ifdef OS2
-    printf(" . Your \"Kermit 95\" user manual (use the MANUAL command).\n");
-    printf(" . The technical reference manual, \"Using C-Kermit\".\n");
-    n += 2;
-#else
-    printf(" . The book \"Using C-Kermit\" (type HELP for more info).\n");
-    n += 1;
-#endif /* OS2 */
-
-    printf(" . Your own organization's support staff, if any.\n");
-    printf(
-" . The comp.protocols.kermit.misc newsgroup.\n");
-    printf(
-" . The Kermit support website, http://www.columbia.edu/kermit/support.html \n"
-           );
-    printf(
-
-" . The Kermit FAQ, http://www.columbia.edu/kermit/newfaq.html \n");
-#ifdef OS2
-    printf(
-" . The Kermit 95 FAQ, http://www.columbia.edu/kermit/k95faq.html \n");
-    n++;
-#endif /* OS2 */
-
-    printf(
-" . The C-Kermit FAQ, http://www.columbia.edu/kermit/ckfaq.html \n");
-    n += 4;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf("\n\
-If you still need help or have a bug to report after consulting these sources,"
-           );
-    printf("\nsend e-mail to:\n\n");
-    n += 2;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf("  mailto:kermit-support@columbia.edu\n\n");
-    n += 1;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf("Or contact us by post:\n\n");
-    printf(
-"  Kermit, Columbia University, 612 W 115 Street, New York NY  10025, USA\n\n"
-           );
-    n += 1;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf("Or by fax at +1 (212) 662-6442.\n\n");
-    n += 1;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-#ifdef COMMENT
-    printf("Telephone support is available too:\n\n");
-    n += 1;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf(
-    "  +1 (212) 854-5126, from anywhere, $25.00 USD per call, MC/Visa\n\n");
-    n += 1;
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-#endif /* COMMENT */
-#ifndef NOSHOW
-#ifndef NOFRILLS
-    printf(
-"Before reporting problems, please use the SHOW FEATURES command\n");
-    if (++n > cmd_rows - 3) if (!askmore()) return(0); else n = 0;
-    printf(
-"to get detailed program version and configuration information.\n\n");
-#endif /* NOFRILLS */
-#endif /* NOSHOW */
-    return(1);
-}
-#endif /* NOFRILLS */
-
-#ifndef NOSPL
-
-/*  T O D 2 S E C  --  Convert time of day as hh:mm:ss to secs since midnite */
-/*
-  Call with a string hh:mm or hh:mm:ss.
-  Returns a 0 to 86400 on success, or a negative number on failure.
-*/
-long
-tod2sec(t) char * t; {
-    long t2;
-    long hh = 0L, mm = 0L, ss = 0L;
-
-    if (!t) t = "";
-    if (!*t)
-      return(-3L);
-    debug(F110,"tod2sec",t,0);
-
-    if (isdigit(*t))                    /* Get hours from argument */
-      hh = *t++ - '0';
-    else
-      return(-1L);
-    if (isdigit(*t))
-      hh = hh * 10 + *t++ - '0';
-#ifdef COMMENT
-    if (hh > 24L)
-      return(-1L);
-#endif /* COMMENT */
-    if (*t == ':')
-      t++;
-    else if (!*t)
-      goto xtod2sec;
-    else
-      return(-1L);
-
-    if (isdigit(*t))                    /* Minutes */
-      mm = *t++ - '0';
-    else
-      return(-1L);
-    if (isdigit(*t))
-      mm = mm * 10 + *t++ - '0';
-    if (mm > 60L)
-      return(-1L);
-    if (*t == ':')
-      t++;
-    else if (!*t)
-      goto xtod2sec;
-    else
-      return(-1L);
-
-    if (isdigit(*t))                    /* Seconds */
-      ss = *t++ - '0';
-    else
-      return(-1L);
-    if (isdigit(*t))
-      ss = ss * 10 + *t++ - '0';
-    if (ss > 60L)
-      return(-1L);
-
-    if (*t > 32)                        /* No trailing junk allowed */
-      return(-1L);
-
-  xtod2sec:
-
-    t2 = hh * 3600L + mm * 60L + ss;    /* Seconds since midnight from arg */
-    debug(F101,"tod2sec t2","",t2);
-
-    return(t2);
-}
-
-int waitinterval = 1;
-
-#ifdef OLDWAIT
-#undef OLDWAIT
-#endif /* OLDWAIT */
-
-int kbchar = NUL;
-
-int
-dopaus(cx) int cx; {
-    long zz;
-    extern int sleepcan;
-
-#ifdef OLDWAIT
-    zz = -1L;
-    x_ifnum = 1;                        /* Turn off internal complaints */
-    if (cx == XXWAI)
-      y = cmnum("seconds to wait, or time of day hh:mm:ss","1",10,&x,xxstring);
-    else if (cx == XXPAU)
-      y = cmnum("seconds to pause, or time of day hh:mm:ss",
-                "1",10,&x,xxstring);
-    else
-      y = cmnum("milliseconds to sleep, or time of day hh:mm:ss",
-                "100",10,&x,xxstring);
-    x_ifnum = 0;
-    if (y < 0) {
-        if (y == -2) {                  /* Invalid number or expression */
-            char *p = tmpbuf;           /* Retrieve string from atmbuf */
-            int n = TMPBUFSIZ;
-            *p = NUL;
-            zzstring(atmbuf,&p,&n);     /* Evaluate in case it's a variable */
-            zz = tod2sec(tmpbuf);       /* 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 (x < 0) x = 0;
-    switch (cx) {
-      case XXPAU:                       /* PAUSE */
-      case XXMSL:                       /* MSLEEP */
-        if ((y = cmcfm()) < 0) return(y);
-        break;
-      case XXWAI:                       /* WAIT */
-        z = 0;                          /* Modem signal mask */
-        while (1) {                     /* Read zero or more signal names */
-            y = cmkey(mstab,nms,"modem signal","",xxstring);
-            if (y == -3) break;         /* -3 means they typed CR */
-            if (y < 0) return(y);       /* Other negatives are errors */
-            z |= y;                     /* OR the bit into the signal mask */
-        }
-        if ((y = cmcfm()) < 0) return(y);
-        break;
-
-      default:                          /* Shouldn't happen */
-        return(-2);
-    }
-
-/* Command is entered, now do it. */
-
-    if (zz > -1L) {                     /* Time of day given? */
-        x = zz;
-        if (zz != (long) x) {
-            printf(
-"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n"
-                   );
-            return(-9);
-        }
-    }
-    if (cx == XXMSL) {                  /* Millisecond sleep */
-        msleep(zz < 0 ? x : x * 1000);
-        return(success = 1);
-    }
-    if (cx == XXPAU && !sleepcan) {     /* SLEEP CANCELLATION is OFF */
-        sleep(x);
-        return(success = 1);
-    }
-
-    /* WAIT, or else SLEEP with cancellation allowed... */
-
-    do {                                /* Sleep loop */
-        int mdmsig;
-        if (sleepcan) {                 /* Keyboard cancellation allowed? */
-            if (y = conchk()) {         /* Did they type something? */
-#ifdef COMMENT
-                while (y--) coninc(0);  /* Yes, gobble it all up */
-#else
-                /* There is a debate over whether PAUSE should absorb    */
-                /* its cancelling character(s).  There are several       */
-                /* reasons why it should gobble at least one character:  */
-                /* (1) MS-DOS Kermit does it                             */
-                /* (2) if not, subsequent PAUSE commands will terminate  */
-                /*     immediately                                       */
-                /* (3) if not, subsequent ASK commands will use it as    */
-                /*     valid input.  If \13, then it will get no input   */
-                /* (4) if not, then the character appears on the command */
-                /*     line after all enclosing macros are complete.     */
-                kbchar = coninc(0);     /* Gobble one up */
-#endif /* COMMENT */
-                break;                  /* And quit PAUSing or WAITing */
-            }
-        }
-        if (cx == XXWAI) {              /* WAIT (z == modem signal mask) */
-            debug(F101,"WAIT x","",x);
-            if (z > 0) {                /* Looking for any modem signals? */
-                mdmsig = ttgmdm();      /* Yes, get them */
-                if (mdmsig < 0)         /* Failed */
-                  return(success = 0);
-                if ((mdmsig & z) == z)  /* Got what we wanted? */
-                  return(success = 1);  /* Succeed */
-            }
-            if (x == 0)                 /* WAIT 0 and didn't get our signals */
-              break;
-        }
-        sleep(1);                       /* No interrupt, sleep one second */
-    } while (--x > 0);
-
-    if (cx == XXWAI)                    /* If WAIT and loop exhausted */
-      success = (z == 0);               /* Fail. */
-    else                                /*  */
-      success = (x == 0);               /* Set SUCCESS/FAILURE for PAUSE. */
-    return(success);
-
-#else  /* New code uses chained FDBs and allows FILE waits... */
-
-    char * m = "";                      /* Help message */
-    struct FDB nu, fl;                  /* Parse function descriptor blocks */
-    int filewait = 0;
-    int mdmsig = 0, fs = 0;
-    char filedate[32];
-
-    kbchar = 0;
-
-    switch (cx) {
-      case XXWAI: m = "seconds to wait, or time of day hh:mm:ss"; break;
-      case XXPAU: m = "seconds to pause, or time of day hh:mm:ss"; break;
-      case XXMSL: m = "milliseconds to sleep, or time of day hh:mm:ss"; break;
-    }
-    zz = -1L;
-    cmfdbi(&nu,
-           _CMNUM,                      /* Number */
-           m,                           /* Help message */
-           (cx == XXMSL) ? "100" : "1", /* Default */
-           "",                          /* N/A */
-           0,                           /* N/A */
-           0,                           /* N/A */
-           xxstring,                    /* Processing function */
-           NULL,                        /* N/A */
-           &fl                          /* Next */
-           );
-    cmfdbi(&fl,                         /* Time of day */
-           _CMFLD,                      /* Field */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,                    /* processing func */
-           NULL,                        /* N/A */
-           NULL                         /* No next */
-           );
-    x = cmfdb(&nu);                     /* Parse a number or a field */
-    if (x < 0) {
-        if (x == -3)
-          x = -2;
-        return(x);
-    }
-    switch (cmresult.fcode) {
-      case _CMNUM:                      /* Number */
-        x = cmresult.nresult;
-        break;
-      case _CMFLD:                      /* Field */
-        zz = tod2sec(cmresult.sresult); /* 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. */
-        }
-    }
-    debug(F101,"PAUSE/WAIT/MSLEEP zz","",zz);
-    switch (cx) {
-      case XXPAU:                       /* PAUSE */
-      case XXMSL:                       /* MSLEEP */
-        if ((y = cmcfm()) < 0) return(y);
-        break;
-      case XXWAI:                       /* WAIT */
-        z = 0;                          /* Modem signal mask */
-        y = cmkey(waittab,nwaittab,"","",xxstring);
-        if (y < 0) {
-            if (y == -3) {
-                if ((y = cmcfm()) < 0)
-                  return(y);
-                break;
-            } else
-              return(y);
-        }
-        if (y == WAIT_FIL) {            /* FILE */
-            int wild = 0;
-            if ((z = cmkey(wfswi,nwfswi,"event","",xxstring)) < 0)
-              return(z);
-            filewait = z;
-            if (filewait == WF_MOD || filewait == WF_DEL)
-              z = cmifi("Filename","",&s,&wild,xxstring);
-            else
-              z = cmfld("Filename","",&s,xxstring);
-            if (z < 0)
-              return(z);
-            if (wild || ((filewait == WF_CRE) && iswild(s))) {
-                printf("?Wildcards not valid here\n");
-                return(-9);
-            }
-            ckstrncpy(tmpbuf,s,TMPBUFSIZ);
-            if ((z = cmcfm()) < 0)
-              return(z);
-            break;
-        } else if (y != WAIT_MDM) {     /* A modem signal */
-            z |= y;                     /* OR the bit into the signal mask */
-        }
-        if (!filewait) {                /* Modem signals... */
-            while (1) {                 /* Get zero or more signal names */
-                y = cmkey(mstab,nms,"modem signal","",xxstring);
-                if (y == -3) break;     /* -3 means they typed CR */
-                if (y < 0) return(y);   /* Other negatives are errors */
-                z |= y;                 /* OR the bit into the signal mask */
-            }
-            if ((y = cmcfm()) < 0) return(y);
-            break;
-        }
-
-      default:                          /* Shouldn't happen */
-        return(-2);
-    } /* switch (cx) */
-
-/* Command is entered, now do it. */
-
-    if (zz > -1L) {                     /* Time of day given? */
-        x = zz;
-        if (zz != (long) x) {
-            printf(
-"Sorry, arithmetic overflow - hh:mm:ss not usable on this platform.\n"
-                   );
-            return(-9);
-        }
-    }
-    if (sleepcan)
-      concb((char)escape);              /* Ensure single-char wakeup */
-
-    if (cx == XXMSL) {                  /* Millisecond sleep */
-        msleep(zz < 0 ? x : x * 1000);
-        return(success = 1);
-    }
-    if (cx == XXPAU && !sleepcan) {     /* SLEEP CANCELLATION is OFF */
-        sleep(x);
-        return(success = 1);
-    }
-    if (filewait) {                     /* FILE... */
-        fs = zchki(tmpbuf);             /* Check if file exists */
-        switch (filewait) {
-          case WF_DEL:
-            if (fs == -1)
-              return(success = 1);
-            break;
-          case WF_MOD:
-            if (fs == -1) {
-                printf("?File does not exit: %s\n",tmpbuf);
-                return(-9);
-            }
-            s = zfcdat(tmpbuf);         /* Get current modification date */
-            if (!s) s = "";
-            if (ckstrncpy(filedate,s,32) != 17) {
-                printf("?Can't get modification time: %s\n",tmpbuf);
-                return(-9);
-            }
-            break;
-          case WF_CRE:
-            if (fs > -1)
-              return(success = 1);
-            break;
-        }
-    }
-    do {                                /* Polling loop */
-        if (sleepcan) {                 /* Keyboard cancellation allowed? */
-            if ((y = conchk()) > 0) {   /* Did they type something? */
-                kbchar = coninc(0);     /* Yes, get first char they typed */
-                debug(F000,"WAIT kbchar","",kbchar);
-#ifdef COMMENT
-                while (--y > 0)         /* Gobble the rest up */
-                  coninc(0);
-#endif /* COMMENT */
-                return(success = 0);    /* And quit PAUSing or WAITing */
-            }
-        }
-        if (filewait == 0) {
-            if (cx == XXWAI) {          /* WAIT for modem signals */
-                if (z != 0) {
-                    mdmsig = ttgmdm();  /* Get them. */
-                    debug(F101,"WAIT ttgmdm","",mdmsig);
-                    if (mdmsig < 0)     /* Failure to get them? */
-                      return(success = 0); /* Fail. */
-                    if ((mdmsig & z) == z) /* Got desired ones? */
-                      return(success = 1); /* Succeed. */
-                } else if (x == 0)
-                  return(success = 0);
-            }
-        } else {                        /* FILE... */
-            fs = zchki(tmpbuf);         /* Get file status */
-            if (filewait == WF_MOD) {   /* Wait for modification */
-                if (fs == -1)           /* Failure to get status */
-                  return(success = 0);  /* so WAIT fails. */
-                s = zfcdat(tmpbuf);     /* Get current modification time */
-                if (!s) s = "";         /* And compare with the time */
-                if (strcmp(s,filedate)) /* when the WAIT started */
-                  return(success = 1);
-            } else if (filewait == WF_DEL) { /* Wait for deletion */
-                if (fs == -1)           /* If file doesn't exist, */
-                  return(success = 1);  /* succeed. */
-            } else if (filewait == WF_CRE) { /* Wait for creation */
-                if (fs != -1)           /* If file exists */
-                  return(success = 1);  /* succeed. */
-            }
-        }
-        if (x < 1)                      /* SLEEP/WAIT/PAUSE 0 */
-          break;
-        sleep(waitinterval);            /* No interrupt, sleep */
-        x -= waitinterval;              /* Deduct sleep time */
-    } while (x > 0);
-
-    if (cx == XXWAI)                    /* WAIT time expired */
-      success = (z == 0);               /* Succeed if no modem signals */
-    else                                /* For SLEEP or PAUSE, success */
-      success = (x == 0);               /* depends on whether it was */
-    return(success);                    /* interrupted from the keyboard. */
-#endif /* OLDWAIT */
-}
-#endif /* NOSPL */
-
-#ifdef OS2ORUNIX
-_PROTOTYP(int zcmpfn,(char *, char *));
-#endif /* OS2ORUNIX */
-
-#ifndef NOFRILLS
-#ifdef NT
-int 
-dolink() {
-    /* Parse a file or a directory name */
-    int i, x, z, listing = 0, havename = 0, wild = 0, rc = 1;
-    struct FDB sw, fi;
-
-    cmfdbi(&sw,                         /* 2nd FDB - optional /PAGE switch */
-           _CMKEY,                      /* fcode */
-           "Filename or switch",        /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           nqvswtab,                    /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           qvswtab,                     /* Keyword table */
-           &fi                          /* Pointer to next FDB */
-           );
-
-    cmfdbi(&fi,                         /* 1st FDB - file to type */
-           _CMIFI,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           3,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           NULL
-           );
-
-    while (!havename) {
-        x = cmfdb(&sw);                 /* Parse something */
-        if (x < 0)                      /* Error */
-          return(x);
-        switch (cmresult.fcode) {
-          case _CMKEY:
-            switch (cmresult.nresult) {
-              case DEL_LIS:
-              case DEL_VRB:
-                listing = 1;
-                break;
-              case DEL_NOL:
-              case DEL_QUI:
-                listing = 0;
-                break;
-            }
-            break;
-          case _CMIFI:
-            s = cmresult.sresult;
-            havename = 1;
-            break;
-          default:
-            return(-2);
-        }
-    }
-    wild = cmresult.nresult;            /* Source specification wild? */
-
-    ckstrncpy(line,s,LINBUFSIZ);        /* Make a safe copy of source name */
-    s = line;
-
-    if (!wild)
-      wild = iswild(line);
-
-    p = tmpbuf;                         /* Place for new name */
-    if ((x = cmofi(wild ? "Target directory" : "New name",
-                   "",&s,xxstring)) < 0) { /* Get new name */
-        if (x == -3) {
-            printf("?%s required\n", wild ? "Target directory" : "New name");
-            return(-9);
-        } else return(x);
-    }
-    ckstrncpy(p,s,TMPBUFSIZ);           /* Make a safe copy of the new name */
-    if ((y = cmcfm()) < 0) return(y);
-
-    if (!wild) {                        /* Just one */
-        if (listing) printf("%s => %s ",line,p);
-        if (zlink(line,p) < 0) {
-            if (listing) printf("(FAILED: %s\n",ck_errstr());
-            rc = 0;
-        } else {
-            if (listing) printf("(OK)\n");
-        }
-        return(success = rc);
-    }
-    if (!isdir(p)) {                    /* Multiple */
-        printf(                         /* if target is not a directory */
-"?Multiple source files not allowed if target is not a directory.\n");
-        return(-9);
-    }
-#ifdef COMMENT
-    else {                              /* Show full path of target */
-        char buf[CKMAXPATH];            /* (too much) */
-        if (zfnqfp(p,CKMAXPATH,buf))
-          ckstrncpy(tmpbuf,buf,TMPBUFSIZ);
-    }
-#endif /* COMMENT */
-
-#ifdef VMS
-    conres();                           /* Let Ctrl-C work. */
-#endif /* VMS */
-    debug(F110,"dolink line",line,0);
-
-#ifdef ZXREWIND
-    z = zxrewind();                     /* Rewind file list */
-#else
-    z = nzxpand(s,0);                   /* Expand file list */
-#endif /* ZXREWIND */
-    debug(F111,"dolink p",p,z);
-
-#ifdef UNIX
-    if (wild && z > 1)
-      sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */
-#endif /* UNIX */
-
-    while (z-- > 0) {
-        if (!(z == 0 && !wild))
-          znext(line);
-        if (!line[0])
-          break;
-        if (listing) printf("%s => %s ",line,p);
-        if (zlink(line,p) < 0) {
-            if (listing) printf("(FAILED: %s\n",ck_errstr());
-            rc = 0;
-        } else {
-            if (listing) printf("(OK)\n");
-        }
-    }
-#ifdef VMS
-    concb((char)escape);
-#endif /* VMS */
-    return(success = rc);
-}
-#endif /* NT */
-
-#ifdef ZCOPY
-int
-docopy() {
-    int i, x, listing = 0, nolist = 0, havename = 0;
-    struct FDB sw, fi;
-    int targetisdir = 0;
-    int targetlen = 0;
-    int swapping = 0;
-    int appending = 0;
-    int fromb64 = 0;
-    int tob64 = 0;
-    int wild = 0;
-    int rc = 1;
-
-    cmfdbi(&sw,                         /* 2nd FDB - optional /PAGE switch */
-           _CMKEY,                      /* fcode */
-           "Filename or switch",        /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           ncopytab,                    /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           copytab,                     /* Keyword table */
-           &fi                          /* Pointer to next FDB */
-           );
-    cmfdbi(&fi,                         /* 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 */
-        if (x < 0)                      /* Error */
-          return(x);
-        switch (cmresult.fcode) {
-          case _CMKEY:
-            switch (cmresult.nresult) {
-              case DEL_LIS:
-              case DEL_VRB:
-               nolist = 0;
-                listing = 1;
-                break;
-              case DEL_NOL:
-              case DEL_QUI:
-               nolist = 1;
-                listing = 0;
-                break;
-              case 999:
-                swapping = 1;
-                break;
-              case 998:
-                appending = 1;
-                break;
-#ifndef NOSPL
-              case 997:
-                fromb64 = 1;
-                break;
-              case 996:
-                tob64 = 1;
-                break;
-#endif /* NOSPL */
-            }
-            break;
-          case _CMIFI:
-            s = cmresult.sresult;
-            havename = 1;
-            break;
-          default:
-            return(-2);
-        }
-    }
-    wild = cmresult.nresult;
-    ckstrncpy(line,s,LINBUFSIZ);        /* Make a safe copy of source name */
-    s = line;
-    p = tmpbuf;                         /* Place for new name */
-
-    /* Get destination name */
-    if ((x = cmofi("destination name and/or directory",
-#ifdef UNIX
-                   "."
-#else
-                   ""
-#endif /* UNIX */
-                   ,&s,xxstring)) < 0) {
-        if (x == -3) {
-            printf("?Name for destination file required\n");
-            return(-9);
-        } else return(x);
-    }
-    ckstrncpy(p,s,TMPBUFSIZ);           /* Safe copy of destination name */
-    if ((y = cmcfm()) < 0) return(y);
-    if (appending && swapping) {
-        printf("?Sorry, /APPEND and /SWAP conflict\n");
-        return(-9);
-    }
-#ifdef COMMENT
-/*
-  This unreasonably prevented "COPY /APPEND *.* bifile" from concatenating
-  a bunch of files into one big file.
-*/
-    if (appending && wild) {
-        printf("?Sorry, /APPEND can be used only with single files\n");
-        return(-9);
-    }
-#endif /* COMMENT */
-    targetisdir = isdir(p);
-    x = strlen(p);
-    if (targetisdir) {
-#ifdef UNIXOROSK
-        if (p[x-1] != '/') {
-            ckstrncat(p,"/",TMPBUFSIZ);
-            x++;
-        }
-#else
-#ifdef OS2
-        if (p[x-1] != '/') {
-            ckstrncat(p,"/",TMPBUFSIZ);
-            x++;
-        }
-#else
-#ifdef STRATUS
-        if (p[x-1] != '>') {
-            ckstrncat(p,">",TMPBUFSIZ);
-            x++;
-        }
-#else
-#ifdef datageneral
-        if (p[x-1] != ':') {
-            ckstrncat(p,":",TMPBUFSIZ);
-            x++;
-        }
-#else
-        if (p[x-1] != '/') {
-            ckstrncat(p,"/",TMPBUFSIZ);
-            x++;
-        }
-#endif /* datageneral */
-#endif /* STRATUS */
-#endif /* OS2 */
-#endif /* UNIXOROSK */
-    }
-    targetlen = x;
-
-    if (!appending) {                  /* If /APPEND not given */
-       if (wild && !targetisdir) {     /* No wildcards allowed */
-           printf(                     /* if target is not a directory */
-"?Multiple source files not allowed if target is not a directory.\n");
-           return(-9);
-       }
-    }
-
-#ifdef VMS
-    conres();                           /* Let Ctrl-C work. */
-#endif /* VMS */
-    debug(F110,"docopy line",line,0);
-    debug(F110,"docopy p",p,0);
-
-#ifdef ZXREWIND
-    z = zxrewind();                     /* Rewind file list */
-#else
-    z = nzxpand(s,0);                   /* Expand file list */
-#endif /* ZXREWIND */
-
-#ifdef UNIX
-    if (wild)
-      sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */
-#endif /* UNIX */
-
-#ifdef IKSD
-    if (!targetisdir && zchki(p) > -1) { /* Destination file exists? */
-        if (inserver && (!ENABLED(en_del)
-#ifdef CK_LOGIN
-                         || isguest
-#endif /* CK_LOGIN */
-                         )) {
-            printf("?Sorry, overwriting existing files is disabled\n");
-            return(-9);
-        }
-    }
-#endif /* IKSD */
-
-    if (tob64 && fromb64) {             /* To and from B64 = no conversion */
-        tob64 = 0;
-        fromb64 = 0;
-    }
-    debug(F110,"COPY dest",p,0);
-
-    while (z > 0) {
-
-        znext(line);
-        if (!line[0])
-          break;
-
-        errno = 0;                      /* Reset errno */
-
-        if (listing) printf("%s => %s ",line,p);
-
-        /* Straight copy */
-        if (!swapping && !appending && !fromb64 && !tob64) {
-            debug(F110,"COPY zcopy",line,0);
-
-            if ((x = zcopy(line,p)) < 0) { /* Let zcopy() do it. */
-                switch (x) {
-                  case -2:
-                   if (listing)
-                     printf("(FAILED: Not a regular file)\n");
-                   else if (!nolist)
-                     printf("?Not a regular file - %s\n",line);
-                    rc = 0;
-                    break;
-                  case -3:
-                   if (listing)
-                     printf("(FAILED: Not found or not accessible)\n");
-                   else if (!nolist)
-                     printf("?Not found or not accessible - %s\n",line);
-                    rc = 0;
-                    break;
-                  case -4:
-                   if (listing)
-                     printf("(FAILED: Permission denied)\n");
-                   else if (!nolist)
-                     printf("?Permission denied - %s\n",line);
-                    rc = 0;
-                    break;
-                  case -5:
-                   if (listing)
-                     printf("(Source and destination are the same file)\n");
-                   else if (!nolist)
-                     printf(
-                         "?Source and destination are the same file - %s\n",
-                         line
-                         );
-                    break;
-                  case -6:
-                   if (listing)
-                     printf("(FAILED: Input/Output error)\n");
-                   else if (!nolist)
-                     printf("?Input/Output error - %s\n",line);
-                    rc = 0;
-                    break;
-                  case -7:
-                   if (listing)
-                     printf("(FAILED: %s - %s)\n",p,ck_errstr());
-                   else if (!nolist)
-                     printf("?%s - %s\n",ck_errstr(),p);
-                    rc = 0;
-                    break;
-                  default:
-                   if (listing)
-                     printf("(FAILED: %s)\n",ck_errstr());
-                   else if (!nolist)
-                     printf("?%s\n",ck_errstr());
-                    rc = 0;
-                }
-            } else {
-                if (listing) printf("(OK)\n");
-            }
-
-        } else {                        /* Special options */
-
-            int prev, y, x = 0;         /* Variables needed for them */
-            int i, t;
-            char ibuf[100];
-            char obuf[200];
-            FILE * in = NULL;
-            FILE * out = NULL;
-
-            if ((in = fopen(line,"r")) == NULL) { /* Open input file */
-                if (listing)
-                 printf("(FAILED: %s)\n",ck_errstr());
-               else if (!nolist)
-                 printf("?%s - %s)\n",ck_errstr(),line);
-                rc = 0;
-                continue;
-            }
-            if (targetisdir) {          /* Target is directory */
-                char * buf = NULL;      /* so append this filename to it */
-                zstrip(line,&buf);
-                p[targetlen] = NUL;
-                if (buf)
-                  ckstrncat(p,buf,TMPBUFSIZ);
-            }
-#ifdef OS2ORUNIX
-            if (zcmpfn(line,p)) {       /* Input and output are same file? */
-                if (listing)
-                  printf("(FAILED: Source and destination identical)\n");
-               else if (!nolist)
-                  printf("?Source and destination identical - %s\n", line); 
-                rc = 0;
-                continue;
-            }
-#endif /* OS2ORUNIX */
-            if ((out = fopen(p, (appending ? "a" : "w"))) == NULL) {
-                fclose(in);
-                if (listing)
-                 printf("(FAILED: %s - %s)\n",p,ck_errstr());
-               else if (!nolist)
-                 printf("?%s - %s\n",p,ck_errstr());
-                rc = 0;
-                continue;
-            }
-#ifndef NOSPL
-            if (tob64) {                /* Converting to Base-64 */
-
-                debug(F110,"COPY tob64",line,0);
-
-                while (1) {             /* Loop... */
-                    prev = x;
-                    if ((x = fread(ibuf,1,54,in)) < 1) { /* EOF */
-                        if (listing)
-                          printf("(OK)\n");
-                        break;
-                    }
-                    if (prev % 3) {
-                        if (listing)
-                          printf("(FAILED: Phase error at %d)\n",prev);
-                       else if (!nolist)
-                          printf("?Phase error at %d\n",prev);
-                        rc = 0;
-                        break;
-                    }
-                    if (swapping) {
-                        if (x & 1) {
-                            if (listing)
-                              printf("(FAILED: Swap error)\n");
-                           else if (!nolist)
-                             printf("?Swap error\n");
-                            rc = 0;
-                            break;
-                        }
-                        for (i = 0; i < x; i+=2) {
-                            t = ibuf[i];
-                            ibuf[i] = ibuf[i+1];
-                            ibuf[i+1] = t;
-                        }
-                    }
-                    if ((y = b8tob64(ibuf,x,obuf,180)) < 0) {
-                        if (listing)
-                          printf("(FAILED: Encoding error)\n");
-                       else if (!nolist)
-                         printf("?Encoding error\n");
-                        rc = 0;
-                        break;
-                    }
-                    fprintf(out,"%s\n",obuf);
-                }
-
-            } else if (fromb64) {       /* Converting from Base 64 */
-
-                debug(F110,"COPY fromb64",line,0);
-
-                if ((out = fopen(p,appending ? "a" : "w")) == NULL) {
-                    fclose(in);
-                    if (listing)
-                     printf("(FAILED: %s - %s)\n",p,ck_errstr());
-                   else if (!nolist)
-                     printf("?%s - %s\n",p,ck_errstr());
-                    rc = 0;
-                    continue;
-                }
-                x = 1;
-                while (x) {
-                    x = fread(ibuf,1,80,in);
-                    if ((y = b64tob8(ibuf,x,obuf,80)) < 0) {
-                        if (listing)
-                          printf("(FAILED: Decoding error)\n");
-                       else if (!nolist)
-                         printf("?Decoding error\n");
-                        rc = 0;
-                        break;
-                    }
-                    if (swapping) {
-                        if (x & 1) {
-                            if (listing)
-                              printf("(FAILED: Swap error)\n");
-                           else if (!nolist)
-                             printf("?Swap error\n");
-                            rc = 0;
-                            break;
-                        }
-                        for (i = 0; i < y; i+=2) {
-                            t = obuf[i];
-                            obuf[i] = obuf[i+1];
-                            obuf[i+1] = t;
-                        }
-                    }
-                    if (y > 0) {
-                        if (fwrite(obuf,1,y,out) < 1) {
-                            if (listing)
-                              printf("(FAILED: %s - %s)\n",p,ck_errstr());
-                           else if (!nolist)
-                             printf("?%s - %s\n",p,ck_errstr());
-                            rc = 0;
-                            break;
-                        }
-                    }
-                }
-
-            } else
-#endif /* NOSPL */
-
-            if (swapping) {             /* Swapping bytes */
-
-                CHAR c[3];
-                c[2] = NUL;
-
-                debug(F110,"COPY swapping",line,0);
-
-                while (1) {
-                    x = fread((char *)c,1,2,in);
-                    if (x < 1) {
-                        if (listing)
-                          printf("(OK)\n");
-                        break;
-                    } else if (x == 1) {
-                        c[1] = c[0];
-                        c[0] = NUL;
-                        printf(
-                            "(WARNING: Odd byte count)");
-                        if (!listing) printf("\n");
-                    }
-                    if (fprintf(out,"%c%c",c[1],c[0]) == EOF) {
-                        if (listing)
-                          printf("(FAILED: %s - %s)\n",p,ck_errstr());
-                       else if (!nolist)
-                          printf("?%s - %s\n",p,ck_errstr());
-                        rc = 0;
-                        break;
-                    }
-                }
-
-            } else if (appending) {     /* Appending to target file */
-
-                char c;
-
-                debug(F110,"COPY appending",line,0);
-
-                while (1) {
-                    x = fread(&c,1,1,in);
-                    if (x < 1) {
-                        if (listing)
-                          printf("(OK)\n");
-                        break;
-                    }
-                    if (fwrite(&c,1,1,out) < 1) {
-                        if (listing)
-                          printf("(FAILED: %s - %s)\n",p,ck_errstr());
-                       else if (!nolist)
-                          printf("?%s - %s\n",p,ck_errstr());
-                        rc = 0;
-                        break;
-                    }
-                }
-            }
-            if (out) fclose(out);
-            if (in) fclose(in);
-        }
-#ifdef VMSORUNIX
-        concb((char)escape);
-#endif /* VMSORUNIX */
-    }
-    if (rc > -1) success = rc;
-    return(rc);
-}
-#endif /* ZCOPY */
-#endif /* NOFRILLS */
-
-#ifndef NORENAME
-#ifndef NOFRILLS
-#ifdef ZRENAME
-int
-dorenam() {
-    /* Parse a file or a directory name */
-    int i, x, z, listing = 0, havename = 0, wild = 0, rc = 1;
-    int nolist = 0;
-    struct FDB sw, fi;
-
-    cmfdbi(&sw,                         /* 2nd FDB - optional /PAGE switch */
-           _CMKEY,                      /* fcode */
-           "Filename or switch",        /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           nqvswtab,                    /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           qvswtab,                     /* Keyword table */
-           &fi                          /* Pointer to next FDB */
-           );
-
-    cmfdbi(&fi,                         /* 1st FDB - file to type */
-           _CMIFI,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           3,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           NULL
-           );
-
-    while (!havename) {
-        x = cmfdb(&sw);                 /* Parse something */
-        if (x < 0)                      /* Error */
-          return(x);
-        switch (cmresult.fcode) {
-          case _CMKEY:
-            switch (cmresult.nresult) {
-              case DEL_LIS:
-              case DEL_VRB:
-                listing = 1;
-                break;
-              case DEL_NOL:
-              case DEL_QUI:
-               nolist = 1;
-                listing = 0;
-                break;
-            }
-            break;
-          case _CMIFI:
-            s = cmresult.sresult;
-            havename = 1;
-            break;
-          default:
-            return(-2);
-        }
-    }
-    wild = cmresult.nresult;            /* Source specification wild? */
-
-    ckstrncpy(line,s,LINBUFSIZ);        /* Make a safe copy of source name */
-    s = line;
-
-    if (!wild)
-      wild = iswild(line);
-
-    p = tmpbuf;                         /* Place for new name */
-    if ((x = cmofi(wild ? "Target directory" : "New name",
-                   "",&s,xxstring)) < 0) { /* Get new name */
-        if (x == -3) {
-            printf("?%s required\n", wild ? "Target directory" : "New name");
-            return(-9);
-        } else return(x);
-    }
-    ckstrncpy(p,s,TMPBUFSIZ);           /* Make a safe copy of the new name */
-    if ((y = cmcfm()) < 0) return(y);
-
-    if (!wild) {                        /* Just one */
-        if (listing) printf("%s => %s ",line,p);
-        if (zrename(line,p) < 0) {
-            if (listing)
-             printf("(FAILED: %s)\n",ck_errstr());
-           else if (!nolist)
-             printf("?%s\n",ck_errstr());
-            rc = 0;
-        } else {
-            if (listing) printf("(OK)\n");
-        }
-        return(success = rc);
-    }
-    if (!isdir(p)) {                    /* Multiple */
-        printf(                         /* if target is not a directory */
-"?Multiple source files not allowed if target is not a directory.\n");
-        return(-9);
-    }
-#ifdef COMMENT
-    else {                              /* Show full path of target */
-        char buf[CKMAXPATH];            /* (too much) */
-        if (zfnqfp(p,CKMAXPATH,buf))
-          ckstrncpy(tmpbuf,buf,TMPBUFSIZ);
-    }
-#endif /* COMMENT */
-
-#ifdef VMS
-    conres();                           /* Let Ctrl-C work. */
-#endif /* VMS */
-    debug(F110,"dorename line",line,0);
-
-#ifdef ZXREWIND
-    z = zxrewind();                     /* Rewind file list */
-#else
-    z = nzxpand(s,0);                   /* Expand file list */
-#endif /* ZXREWIND */
-    debug(F111,"dorename p",p,z);
-
-#ifdef UNIX
-    if (wild && z > 1)
-      sh_sort(mtchs,NULL,z,0,0,filecase); /* Alphabetize the filename list */
-#endif /* UNIX */
-
-/*
-  Note: COPY, RENAME, DELETE and similar commands should have options to
-  stop or proceed when they are operating on multiple files and the operation
-  fails.
-*/
-    while (z-- > 0) {
-        if (!(z == 0 && !wild))
-          znext(line);
-        if (!line[0])
-          break;
-        if (listing) printf("%s => %s ",line,p);
-        if (zrename(line,p) < 0) {
-            if (listing)
-             printf("(FAILED: %s)\n",ck_errstr());
-           else if (!nolist)
-             printf("?%s - %s\n",ck_errstr(),line);
-            rc = 0;
-        } else {
-            if (listing) printf("(OK)\n");
-        }
-    }
-#ifdef VMS
-    concb((char)escape);
-#endif /* VMS */
-    return(success = rc);
-}
-#endif /* ZRENAME */
-#endif /* NOFRILLS */
-#endif /* NORENAME */
-
-#ifndef NOSPL
-
-/* Do the RETURN command */
-
-int
-doreturn(s) char *s; {
-    int x;
-    extern int tra_asg;
-    char * line, * lp;
-
-    if (cmdlvl < 1) {
-        printf("\n?Can't return from level %d\n",maclvl);
-        return(success = 0);
-    }
-    line = malloc(LINBUFSIZ);
-    if (line == NULL)
-      return(success = 0);
-    lp = line;                          /* Expand return value now */
-    x = LINBUFSIZ-1;
-    if (!s) s = "";
-    debug(F110,"RETURN s",s,0);
-    if (zzstring(s,&lp,&x) > -1) {
-        s = line;
-        debug(F110,"RETURN zzstring",s,0);
-    }
-
-    /* Pop from all FOR/WHILE/SWITCH/XIFs */
-    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],"_swi",4) ||
-            !strncmp(m_arg[maclvl-1][0],"_whi",4))) {
-        debug(F111,"RETURN IF/FOR/WHI/SWI pop",m_arg[maclvl-1][0],maclvl);
-        dogta(XXPTA);                   /* Put args back */
-        popclvl();                      /* Pop up two levels */
-        popclvl();
-    }
-    if (tra_asg) {                      /* If tracing show return value */
-        if (*s)
-          printf("<<< %s: \"%s\"\n", m_arg[maclvl][0], s);
-        else
-          printf("<<< %s: (null)\n", m_arg[maclvl][0]);
-    }
-    popclvl();                          /* Pop from enclosing TAKE or macro */
-    debug(F111,"RETURN tolevel",s,maclvl);
-    if (!s) s = "";
-    if (!*s) s = NULL;
-    makestr(&(mrval[maclvl+1]),s);      /* Set the RETURN value */
-    free(line);
-    return(success = 1);                /* Macro succeeds if we RETURN */
-}
-#endif /* NOSPL */
-
-#ifndef NOSPL
-/* Do the OPEN command */
-
-int
-doopen()  {                             /* OPEN { append, read, write } */
-    int x, y, z = 0; char *s;
-    static struct filinfo fcb;          /* (must be static) */
-    if ((x = cmkey(opntab,nopn,"mode","",xxstring)) < 0) {
-        if (x == -3) {
-            printf("?Mode required\n");
-            return(-9);
-        } else return(x);
-    }
-    switch (x) {
-      case OPN_FI_R:                    /* Old file (READ) */
-        if (chkfn(ZRFILE) > 0) {
-            printf("?Read file already open\n");
-            return(-2);
-        }
-        if ((z = cmifi("File to read","",&s,&y,xxstring)) < 0) {
-            if (z == -3) {
-                printf("?Input filename required\n");
-                return(-9);
-            } else return(z);
-        }
-        if (y) {                                /* No wildcards allowed */
-            printf("\n?Please specify a single file\n");
-            return(-2);
-        }
-        ckstrncpy(line,s,LINBUFSIZ);
-        if ((int)strlen(line) < 1) return(-2);
-        if ((z = cmnum("buffer size","4096",10,&y,xxstring)) < 0)
-          return(z);
-        if (y < 1) {
-            printf("?Positive number required\n");
-            return(-9);
-        }
-        if ((z = cmcfm()) < 0) return(z);
-        readblock = y;
-        if (readbuf)
-          free((char *)readbuf);
-        if (!(readbuf = (CHAR *) malloc(readblock+1))) {
-            printf("?Can't allocate read buffer\n");
-            return(-9);
-        }
-        return(success = zopeni(ZRFILE,line));
-
-#ifndef MAC
-#ifndef NOPUSH
-      case OPN_PI_R:                    /* Pipe/Process (!READ) */
-        if (nopush) {
-            printf("?Read from pipe disabled\n");
-            return(success=0);
-        }
-        if (chkfn(ZRFILE) > 0) {
-            printf("?Read file already open\n");
-            return(-2);
-        }
-        if ((y = cmtxt("System command to read from","",&s,xxstring)) < 0) {
-            if (y == -3) {
-                printf("?Command name required\n");
-                return(-9);
-            } else return(y);
-        }
-        ckstrncpy(line,brstrip(s),LINBUFSIZ);
-        if (!line[0]) return(-2);
-        if ((y = cmcfm()) < 0) return(y);
-        if (!readbuf) {
-            if (!(readbuf = (CHAR *) malloc(readblock+1))) {
-                printf("?Can't allocate read buffer\n");
-                return(-9);
-            }
-        }
-        return(success = zxcmd(ZRFILE,line));
-
-      case OPN_PI_W:                    /* Write to pipe */
-        if (nopush) {
-            printf("?Write to pipe disabled\n");
-            return(success=0);
-        }
-        if (chkfn(ZWFILE) > 0) {
-            printf("?Write file already open\n");
-            return(-2);
-        }
-        if ((y = cmtxt("System command to write to","",&s,xxstring)) < 0) {
-            if (y == -3) {
-                printf("?Command name required\n");
-                return(-9);
-            } else return(y);
-        }
-        ckstrncpy(line,brstrip(s),LINBUFSIZ);
-        if (!line[0]) return(-2);
-        if ((y = cmcfm()) < 0) return(y);
-        success = zxcmd(ZWFILE,line);
-        if (!success && msgflg)
-          printf("Can't open process for writing: %s\n",line);
-        return(success);
-#endif /* NOPUSH */
-#endif /* MAC */
-
-      case OPN_FI_W:                    /* New file (WRITE) */
-      case OPN_FI_A:                    /* (APPEND) */
-        if ((z = cmofi("Name of local file to create","",&s,xxstring)) < 0) {
-            if (z == -3) {
-                printf("?Filename required\n");
-                return(-9);
-            } else return(z);
-        }
-        if (z == 2) {
-            printf("?Sorry, %s is a directory name\n",s);
-            return(-9);
-        }
-        if (chkfn(ZWFILE) > 0) {
-            printf("?Write/Append file already open\n");
-            return(-2);
-        }
-        fcb.bs = fcb.cs = fcb.rl = fcb.fmt = fcb.org = fcb.cc = fcb.typ = 0;
-        fcb.lblopts = 0;
-        fcb.dsp = (x == OPN_FI_W) ? XYFZ_N : XYFZ_A; /* Create or Append */
-        ckstrncpy(line,s,LINBUFSIZ);
-        if ((int)strlen(line) < 1) return(-2);
-        if ((y = cmcfm()) < 0) return(y);
-        return(success = zopeno(ZWFILE,line,NULL,&fcb));
-
-#ifndef NOLOCAL
-      case OPN_SER:                     /* OPEN PORT or LINE */
-      case OPN_NET: {                   /* OPEN HOST */
-          extern int didsetlin, ttnproto;
-          if (x == OPN_NET) {
-              z = ttnproto;
-              ttnproto = NP_NONE;
-          }
-          if ((y = setlin((x == OPN_SER) ? XYLINE : XYHOST, 1, 0)) < 0) {
-              if (x == OPN_NET)
-                ttnproto = z;
-              success = 0;
-          }
-          didsetlin++;
-          return(y);
-      }
-#endif /* NOLOCAL */
-
-      default:
-        printf("?Not implemented");
-        return(-2);
-    }
-}
-#endif /* NOSPL */
-
-#ifndef NOXFER
-/*  D O X G E T  --  GET command parser with switches  */
-
-#ifdef CK_LABELED
-int g_lf_opts = -1;
-extern int lf_opts;
-#endif /* CK_LABELED */
-
-int
-doxget(cx) int cx; {
-    extern int                          /* External variables we need */
-#ifdef RECURSIVE
-      recursive,
-#endif /* RECURSIVE */
-      xfermode, fdispla, protocol, usepipes,
-      g_binary, g_xfermode, g_displa, g_rpath, g_usepipes;
-    extern char * rcv_move;             /* Directory to move new files to */
-    extern char * rcv_rename;           /* What to rename new files to */
-    extern char * rcvexcept[];          /* RECEIVE / GET exception list */
-    int opkt  =  0;                     /* Flag for O-Packet needed */
-
-#ifdef PIPESEND
-    extern int pipesend;
-    extern char * rcvfilter;
-#endif /* PIPESEND */
-    extern struct keytab rpathtab[];
-    extern int nrpathtab;
-    extern long calibrate;
-    int asname = 0;                     /* Flag for have as-name */
-    int konly = 0;                      /* Kermit-only function */
-    int c, i, n, confirmed = 0;         /* Workers */
-    int getval = 0;                     /* Whether to get switch value */
-    int rcvcmd = 0;                     /* Whether it is the RECEIVE command */
-    int mget = 0;                       /* Whether it is the MGET command */
-    struct stringint {                  /* Temporary array for switch values */
-        char * sval;
-        int ival;
-    } pv[SND_MAX+1];
-    struct FDB sw, fl, cm;              /* FDBs for each parse function */
-    char * cmdstr = "this command";
-
-#ifdef NEWFTP
-    if (cx == XXGET || cx == XXREGET || cx == XXMGET || cx == XXRETR) {
-        extern int ftpget;
-        extern int ftpisopen();
-        if ((ftpget == 1) || ((ftpget == 2) && ftpisopen()))
-          return(doftpget(cx,0));
-    }
-#endif /* NEWFTP */
-
-    debug(F101,"xget cx","",cx);
-
-    oopts = -1;
-    omode = -1;
-
-    for (i = 0; i <= SND_MAX; i++) {    /* Initialize switch values */
-        pv[i].sval = NULL;
-        pv[i].ival = -1;
-    }
-    /* Preset switch values based on top-level command that called us */
-
-    switch (cx) {
-      case XXREC:                       /* RECEIVE */
-        cmdstr = "RECEIVE";
-        rcvcmd = 1; break;
-      case XXGET:                       /* GET */
-        cmdstr = "GET";
-        konly = 1;
-        break;
-#ifdef CK_RESEND
-      case XXREGET:                     /* REGET */
-        cmdstr = "REGET";
-        konly = 1;
-        pv[SND_BIN].ival = 1;           /* Implies /BINARY */
-        pv[SND_RES].ival = 1; break;
-#endif /* CK_RESEND */
-      case XXRETR:                      /* RETRIEVE */
-        cmdstr = "RETRIEVE";
-        konly = 1;
-        pv[SND_DEL].ival = 1; break;
-#ifdef PIPESEND
-      case XXCREC:                      /* CRECEIVE */
-        cmdstr = "CRECEIVE";
-        konly = 1;
-        rcvcmd = 1;
-        pv[SND_CMD].ival = 1; break;
-      case XXCGET:                      /* CGET */
-        cmdstr = "CGET";
-        konly = 1;
-        pv[SND_CMD].ival = 1; break;
-#endif /* PIPESEND */
-#ifndef NOMGET
-      case XXMGET:                      /* MGET */
-        cmdstr = "MGET";
-        konly = 1;
-        mget = 1; break;
-#endif /* NOMGET */
-    }
-    debug(F111,"xget rcvcmd",cmdstr,rcvcmd);
-    debug(F101,"xget konly","",konly);
-
-#ifdef CK_XYZ
-    if (!rcvcmd && protocol != PROTO_K) {
-        printf("?Sorry, %s works only with Kermit protocol\n",cmdstr);
-        return(-9);
-    }
-#endif /* CK_XYZ */
-
-    /* Set up chained parse functions... */
-
-    cmfdbi(&sw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           rcvcmd ?
-           "Optional name/template to store incoming files under, or switch" :
-           "Remote filename, or switch", /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           rcvcmd ? nrcvtab : ngettab,  /* addtl numeric data 1: tbl size */
-           4,                           /* addtl numeric data 2: 4 = cmswi */
-           xxstring,                    /* Processing function */
-           rcvcmd ? rcvtab : gettab,    /* Keyword table */
-           &fl                          /* Pointer to next FDB */
-           );
-    if (rcvcmd || mget)                 /* RECEIVE or MGET */
-      cmfdbi(&fl,
-           _CMTXT,                      /* fcode */
-           rcvcmd ?                     /* hlpmsg */
-             "Output filename or Command" : /* Output filename */
-             "File(s) to GET",              /* Files we are asking for */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-#ifdef CK_XYZ
-           (protocol == PROTO_X || protocol == PROTO_XC) ?
-             xxstring :
-             (rcvcmd ? (xx_strp)0  : xxstring)
-#else
-           rcvcmd ? (xx_strp)0  : xxstring /* Processing function */
-#endif /* CK_XYZ */
-             ,
-           NULL,
-           &cm
-           );
-    else
-      cmfdbi(&fl,                       /* Remote filename or command */
-           _CMFLD,                      /* fcode */
-           "Remote filename",           /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           &cm
-           );
-    cmfdbi(&cm,                         /* Confirmation */
-           _CMCFM,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           NULL,
-           NULL,
-           NULL
-           );
-
-    /* (See doxsend() for fuller commentary) */
-
-    while (1) {                         /* Parse 0 or more switches */
-        x = cmfdb(&sw);                 /* Parse something */
-        debug(F101,"xget cmfdb","",x);
-        if (x < 0)                      /* Error */
-          goto xgetx;                   /* or reparse needed */
-        if (cmresult.fcode != _CMKEY)   /* Break out if not a switch */
-          break;
-        c = cmgbrk();                   /* Get break character */
-        if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
-            printf("?This switch does not take an argument\n");
-            x = -9;
-            goto xgetx;
-        }
-        if (!getval && (cmgkwflgs() & CM_ARG)) {
-            printf("?This switch requires an argument\n");
-            x = -9;
-            goto xgetx;
-        }
-        n = cmresult.nresult;           /* Numeric result = switch value */
-        debug(F101,"xget switch","",n);
-
-        switch (n) {                    /* Process the switch */
-#ifdef PIPESEND
-          case SND_CMD:                 /* These take no args */
-            if (nopush) {
-                printf("?Sorry, system command access is disabled\n");
-                x = -9;
-                goto xgetx;
-            } else if (rcvfilter) {
-                printf(
-"?Sorry, no GET /COMMAND when RECEIVE FILTER selected\n");
-                x = -9;
-                goto xgetx;
-            }
-            if (rcvcmd)
-              sw.hlpmsg = "Command, or switch"; /* Change help message */
-            /* Fall thru... */
-#endif /* PIPESEND */
-
-          case SND_REC:                 /* /RECURSIVE */
-            pv[SND_PTH].ival = PATH_REL; /* Implies relative pathnames */
-            pv[n].ival = 1;             /* Set the recursive flag */
-            break;
-
-          case SND_RES:                 /* /RECOVER */
-            pv[SND_BIN].ival = 1;       /* Implies /BINARY */
-            pv[n].ival = 1;             /* Set the resend flag */
-            break;
-
-          case SND_DEL:                 /* /DELETE */
-          case SND_SHH:                 /* /QUIET */
-          case SND_CAL:                 /* /CALIBRATE */
-          case SND_XPA:                 /* /TRANSPARENT */
-            pv[n].ival = 1;             /* Just set the appropriate flag */
-            break;
-
-          case SND_PIP:                 /* /PIPES:{ON,OFF} */
-            if (!getval) {
-                pv[n].ival = 1;
-                break;
-            }
-            if ((x = cmkey(onoff,2,"","on",xxstring)) < 0)
-              goto xgetx;
-            if (!nopush)
-              pv[n].ival = x;
-            break;
-
-          /* 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;       /* Unset all */
-            pv[SND_TXT].ival = 0;
-            pv[SND_IMG].ival = 0;
-            pv[SND_LBL].ival = 0;
-            pv[n].ival = 1;             /* Set the requested one */
-            break;
-
-          case SND_EXC:                 /* Excludes */
-            if (!getval) break;
-            if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
-                if (x == -3) {
-                    printf("?Pattern required\n");
-                    x = -9;
-                }
-                goto xgetx;
-            }
-            if (pv[n].sval) free(pv[n].sval);
-            y = strlen(s);
-            if (y > 256) {
-                printf("?Pattern too long - 256 max\n");
-                x = -9;
-                goto xgetx;
-            }
-            pv[n].sval = malloc(y+1);
-            if (pv[n].sval) {
-                strcpy(pv[n].sval,s);   /* safe */
-                pv[n].ival = 1;
-            }
-            break;
-
-#ifdef COMMENT
-          /* Not implemented */
-          case SND_PRI:                 /* GET to printer */
-            pv[n].ival = 1;
-            if (!getval) break;
-            if ((x = cmfld("Print options","",&s,xxstring)) < 0)
-              goto xgetx;
-            pv[n].sval = malloc((int)strlen(s)+1);
-            if (pv[n].sval)
-              strcpy(pv[n].sval,s);     /* safe */
-            break;
-#endif /* COMMENT */
-
-          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 xgetx;
-            }
-            if (pv[n].sval) {
-                free(pv[n].sval);
-                pv[n].sval = NULL;
-            }
-            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_ASN:                 /* As-name */
-            if (!getval) break;
-            if (mget) {
-                printf("?Sorry, as-name not allowed with MGET\n");
-                x = -9;
-                goto xgetx;
-            }
-            if ((x = cmfld("Name to store it under","",&s,NULL)) < 0)
-              goto xgetx;
-            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;
-
-#ifdef PIPESEND
-          case SND_FLT:                 /* Filter */
-            debug(F101,"xget /filter getval","",getval);
-            if (!getval) break;
-            if ((x = cmfld("Filter program to receive through",
-                           "",&s,NULL)) < 0) {
-                if (x == -3)
-                  s = "";
-                else
-                  goto xgetx;
-            }
-            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 xgetx;
-            }
-            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(rpathtab,nrpathtab,"","on",xxstring)) < 0)
-              goto xgetx;
-            pv[n].ival = x;             /* Ditto */
-            break;
-
-          case SND_NAM:                 /* Filenames */
-            if (!getval) break;
-            if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0)
-              goto xgetx;
-            pv[n].ival = x;
-            break;
-
-          case SND_PRO:                 /* Protocol to use */
-            if (!getval) break;
-            if ((x = cmkey(protos,nprotos,"File-transfer protocol","",
-                           xxstring)) < 0) {
-                if (x == -3)
-                  x = 0;
-                else
-                  goto xgetx;
-            }
-            debug(F111,"xget /proto",atmbuf,x);
-            pv[n].ival = x;
-            if (konly && x != PROTO_K) {
-                printf(
-"?Sorry, this command works only with Kermit protocol\n"
-                       );
-                x = -9;
-                goto xgetx;
-            }
-            break;
-
-          default:
-            printf("?Unexpected switch value - %d\n",cmresult.nresult);
-            x = -9;
-            goto xgetx;
-        }
-    }
-    debug(F101,"xget cmresult fcode","",cmresult.fcode);
-
-    cmarg = line;                       /* Initialize string pointers */
-    cmarg2 = tmpbuf;
-    asname = 0;
-    line[0] = NUL;                      /* and buffers. */
-    tmpbuf[0] = NUL;
-
-    switch (cmresult.fcode) {           /* How did we get out of switch loop */
-      case _CMFLD:                      /* (3) Remote filespec */
-        ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
-        break;
-      case _CMTXT:                      /* (4) As-name */
-        if (rcvcmd) {
-            ckstrncpy(tmpbuf,cmresult.sresult,TMPBUFSIZ);
-            if ((int)strlen(tmpbuf) > 0)
-              asname = 1;
-        } else {
-            ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
-        }
-      case _CMCFM:                      /* (6) Confirmation */
-        confirmed = 1;
-        break;
-      default:
-        printf("?Unexpected function code: %d\n",cmresult.fcode);
-        x = -9;
-        goto xgetx;
-    }
-    debug(F110,"xget string",cmarg,0);
-    debug(F101,"xget confirmed","",confirmed);
-
-    cmarg = brstrip(cmarg);             /* Strip any braces */
-
-    if (!confirmed) {                   /* CR not typed yet, get more fields */
-        if (pv[SND_CMD].ival > 0) {
-            debug(F100,"xget calling cmtxt","",0);
-            x = cmtxt("Local command to pipe into","",&s,NULL);
-            if (x < 0 && x != -3) goto xgetx;
-            if (x != -3) {
-                ckstrncpy(tmpbuf,s,TMPBUFSIZ);
-                asname = 1;
-            }
-        } else if (!rcvcmd) {
-#ifdef VMS
-            /* cmofi() fails if you give it a directory name */
-            x = cmfld("Name or directory for incoming file","",&s,NULL);
-            debug(F111,"xget cmfld",s,x);
-#else
-            x = cmofi("Name or directory for incoming file","",&s,NULL);
-            debug(F111,"xget cmofi",s,x);
-#endif /* VMS */
-            if (x < 0 && x != -3) goto xgetx;
-            if (x != -3) {
-                ckstrncpy(tmpbuf,s,TMPBUFSIZ);
-                if ((x = cmcfm()) < 0) goto xgetx;
-                asname = 1;
-            }
-        }
-    }
-    /* Arrive here with cmarg and cmarg2 all set */
-
-    debug(F111,"xget asname",cmarg2,asname);
-    if (!asname) {
-        if (pv[SND_ASN].sval)
-          ckstrncpy(tmpbuf,pv[SND_ASN].sval,TMPBUFSIZ);
-        else
-          tmpbuf[0] = NUL;
-    }
-    cmarg2 = brstrip(cmarg2);           /* Strip outer braces if any. */
-    debug(F110,"xget cmarg",cmarg,0);
-    debug(F110,"xget cmarg2",cmarg2,0);
-
-    if (!*cmarg &&
-        (cx == XXGET || cx == XXREGET || cx == XXCGET || cx == XXMGET)) {
-        printf("?A remote file specification is required\n");
-        x = -9;
-        goto xgetx;
-    }
-#ifdef PIPESEND
-    if (pv[SND_CMD].ival > 0) {         /* /COMMAND sets pipesend flag */
-        x = -9;
-        if (!*cmarg2) {
-            printf("?Command required\n");
-            goto xgetx;
-        } else if (nopush) {
-            printf("?Sorry, system command access is disabled\n");
-            goto xgetx;
-        } else if (rcvfilter) {
-            printf("?Sorry, no GET /COMMAND while RECEIVE FILTER selected\n");
-            goto xgetx;
-        } else
-          pipesend = 1;
-    }
-    debug(F101,"xget /COMMAND pipesend","",pipesend);
-#endif /* PIPESEND */
-
-#ifdef CK_RESEND
-    if (pv[SND_RES].ival > 0) {         /* REGET or GET /RECOVER */
-#ifdef RECURSIVE
-        if (pv[SND_REC].ival > 0) {     /* RECURSIVE */
-#ifdef COMMENT
-            printf("?Unsupported option combination: /RECOVER /RECURSIVE\n");
-            x = -9;
-            goto xgetx;
-#else
-            opkt = 1;
-#endif /* COMMENT */
-        }
-#endif /* RECURSIVE */
-        if (pv[SND_DEL].ival > 0) {     /* /DELETE */
-#ifdef COMMENT
-            printf("?Unsupported option combination: /RECOVER /DELETE\n");
-            x = -9;
-            goto xgetx;
-#else
-            opkt = 1;
-#endif /* COMMENT */
-        }
-    }
-#endif /* CK_RESEND */
-
-    if (pv[SND_EXC].ival > 0)           /* /EXCEPT */
-      makelist(pv[SND_EXC].sval,rcvexcept,NSNDEXCEPT);
-
-#ifdef IKS_OPTION
-    if (!rcvcmd
-#ifdef CK_XYZ
-         && protocol == PROTO_K
-#endif /* CK_XYZ */
-         ) {
-        if (!iks_wait(KERMIT_REQ_START,1)) {
-            printf(
-              "?A Kermit Server is not available to process this command\n");
-            x = -9;                     /* correct the return code */
-            goto xgetx;
-        }
-    }
-#endif /* IKS_OPTION */
-
-#ifdef CK_XYZ
-    {
-        int po, pg;                     /* (for clarity) */
-        po = pv[SND_PRO].ival;          /* /PROTOCOL option */
-        pg = protocol;                  /* Protocol global  */
-        if ((rcvcmd && !*cmarg2) &&     /* If no as-name was given */
-            /* and /PROTOCOL is XMODEM or global protocol is XMODEM... */
-            ((po <  0 && (pg == PROTO_X || pg == PROTO_XC)) ||
-             (po > -1 && (po == PROTO_X || po == PROTO_XC)))
-            ) {
-            printf(
-"Sorry, you must specify a name when receiving a file with XMODEM protocol\n"
-                   );
-            x = -9;
-            goto xgetx;
-        }
-    }
-#endif /* CK_XYZ */
-
-#ifdef RECURSIVE
-    if (pv[SND_REC].ival > 0) {         /* RECURSIVE */
-        recursive = 1;
-        pv[SND_PTH].ival = PATH_REL;    /* Implies relative pathnames too */
-    }
-#endif /* RECURSIVE */
-
-    if (pv[SND_PIP].ival > -1) {
-        g_usepipes = usepipes;
-        usepipes = pv[SND_PIP].ival;
-    }
-
-    /* Save global protocol parameters */
-
-    g_proto = protocol;
-#ifdef CK_LABELED
-    g_lf_opts = lf_opts;                /* Save labeled transfer options */
-#endif /* CK_LABELED */
-    g_urpsiz = urpsiz;                  /* Receive packet length */
-    g_spsizf = spsizf;                  /* Send packet length flag */
-    g_spsiz = spsiz;                    /* Send packet length */
-    g_spsizr = spsizr;                  /* etc etc */
-    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,"xget protocol","",protocol);
-    debug(F111,"xget cmarg2",cmarg2,xfermode);
-
-    g_xfermode = xfermode;
-    g_binary = binary;
-    if (pv[SND_BIN].ival > 0) {         /* Change according to switch */
-        xfermode = XMODE_M;
-        binary = XYFT_B;                /* FILE TYPE BINARY */
-        omode = GMOD_BIN;               /* O-Packet mode */
-        debug(F101,"doxget /BINARY xfermode","",xfermode);
-    } else if (pv[SND_TXT].ival > 0) {  /* Ditto for /TEXT */
-        xfermode = XMODE_M;
-        binary = XYFT_T;
-        omode = GMOD_TXT;
-        debug(F101,"doxget /TEXT xfermode","",xfermode);
-    } else if (pv[SND_IMG].ival > 0) {
-        xfermode = XMODE_M;
-#ifdef VMS
-        binary = XYFT_I;
-#else
-        binary = XYFT_B;
-#endif /* VMS */
-        omode = GMOD_TXT;
-        debug(F101,"doxget /IMAGE xfermode","",xfermode);
-    }
-#ifdef CK_LABELED
-    else if (pv[SND_LBL].ival > 0) {
-        xfermode = XMODE_M;
-        binary = XYFT_L;
-        omode = GMOD_LBL;
-        debug(F101,"doxget /LABELED xfermode","",xfermode);
-    }
-#endif /* CK_LABELED */
-    debug(F101,"xget binary","",binary);
-    debug(F101,"xget omode","",omode);
-
-    if (pv[SND_XPA].ival > 0)           /* /TRANSPARENT */
-      xfrxla = 0;                       /* Don't translate character sets */
-
-#ifdef PIPESEND
-    if (pv[SND_FLT].ival > 0)
-      makestr(&rcvfilter,pv[SND_FLT].sval);
-#endif /* PIPESEND */
-
-#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 xgetx;
-        }
-#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 xgetx;
-                }
-            }
-#else
-            printf("?Directory \"%s\" not found\n",p);
-            x = -9;
-            goto xgetx;
-#endif /* CK_MKDIR */
-        }
-        zfnqfp(p,LINBUFSIZ,line);
-        makestr(&rcv_move,line);
-    }
-#endif /* CK_TMPDIR */
-
-    if (pv[SND_REN].ival > 0) {         /* /RENAME-TO:name */
-        char * p = pv[SND_REN].sval;
-#ifdef CK_LOGIN
-        if (isguest) {
-            printf("?Sorry, /RENAME-TO not available to guests\n");
-            x = -9;
-            goto xgetx;
-        }
-#endif /* CK_LOGIN */
-        if (!p) p = "";
-        if (!*p) {
-            printf("?New name required for /RENAME\n");
-            x = -9;
-            goto xgetx;
-        }
-        p = brstrip(p);
-        makestr(&rcv_rename,p);
-        debug(F110,"xget rcv_rename","",0);
-    }
-
-#ifdef CALIBRATE
-    if (pv[SND_CAL].ival > 0)
-      calibrate = 1L;
-#endif /* CALIBRATE */
-    g_displa = fdispla;
-    if (pv[SND_SHH].ival > 0)
-      fdispla = 0;
-    debug(F101,"xget display","",fdispla);
-
-    if (pv[SND_NAM].ival > -1) {        /* /FILENAMES */
-        g_fncnv = fncnv;                /* Save global value */
-        fncnv = pv[SND_NAM].ival;
-        debug(F101,"xsend fncnv","",fncnv);
-        /* We should also handle O packet filename option here */
-        /* but we don't really need to since WHATAMI already handles it */
-    }
-    if (pv[SND_PTH].ival > -1) {        /* PATHNAMES */
-        g_rpath = fnrpath;              /* Save global values */
-        fnrpath = pv[SND_PTH].ival;
-        debug(F101,"xsend fnrpath","",fnrpath);
-#ifndef NZLTOR
-        if (fnrpath != PATH_OFF) {
-            g_fncnv = fncnv;
-            fncnv = XYFN_L;
-            debug(F101,"xsend fncnv","",fncnv);
-        }
-        /* We should also handle O packet pathname option here */
-        /* but we don't really need to since WHATAMI already handles it */
-#endif /* NZLTOR */
-    }
-
-    /* Set protocol start state */
-
-    if (opkt) {                         /* Extended GET Options*/
-        sstate = (CHAR) 'o';
-        oopts = 0;
-        if (pv[SND_DEL].ival > 0) oopts |= GOPT_DEL; /* GET /DELETE */
-        if (pv[SND_RES].ival > 0) oopts |= GOPT_RES; /* GET /RECOVER */
-        if (pv[SND_REC].ival > 0) oopts |= GOPT_REC; /* GET /RECURSIVE */
-    } else if (rcvcmd)
-      sstate = (CHAR) 'v';              /* RECEIVE or CRECEIVE */
-    else if (pv[SND_DEL].ival > 0)
-      sstate = (CHAR) 'h';              /* GET /DELETE (= RETRIEVE) */
-    else if (pv[SND_RES].ival > 0)
-      sstate = (CHAR) 'j';              /* GET /RECOVER (= REGET) */
-    else
-      sstate = (CHAR) 'r';              /* Regular GET */
-    getcmd = 1;
-    debug(F000,"xget sstate","",sstate);
-#ifdef MAC
-    what = W_RECV;
-    scrcreate();
-#endif /* MAC */
-    if (local) {
-        if (pv[SND_SHH].ival != 0)
-          displa = 1;
-        ttflui();
-    }
-    x = 0;
-#ifdef PIPESEND
-    if (pipesend)
-      goto xgetx;
-#endif /* PIPESEND */
-
-#ifdef CK_TMPDIR
-/*
-  cmarg2 is also allowed to be a device or directory name;
-  even the name of a directory that doesn't exist.
-*/
-    y = strlen(cmarg2);
-    debug(F111,"xget strlen(cmarg2)",cmarg2,y);
-    if ((y > 0) &&
-#ifdef OS2
-        ((isalpha(cmarg2[0]) &&
-         cmarg2[1] == ':' &&
-         cmarg2[2] == NUL) ||
-        (cmarg[y-1] == '/' || cmarg[y-1] == '\\') ||
-        isdir(cmarg2))
-#else
-#ifdef UNIXOROSK
-        (cmarg2[y-1] == '/' || isdir(cmarg2))
-#else
-#ifdef VMS
-        (cmarg2[y-1] == ']' || cmarg2[y-1] == '>' || isdir(cmarg2))
-#else
-#ifdef STRATUS
-        (cmarg2[y-1] == '>' || isdir(cmarg2))
-#else
-#ifdef datageneral
-        (cmarg2[y-1] == ':' || cmarg[0] == ':' || isdir(cmarg2))
-#else
-        isdir(cmarg2)
-#endif /* datageneral */
-#endif /* STRATUS */
-#endif /* VMS */
-#endif /* UNIXOROSK */
-#endif /* OS2 */
-        ) {
-        debug(F110,"doxget RECEIVE cmarg2 disk or dir",cmarg2,0);
-        if (!f_tmpdir) {
-            int x;
-            s = zgtdir();
-            if (s) {
-                ckstrncpy(savdir,s,TMPDIRLEN); /* remember old disk/dir */
-                f_tmpdir = 1;   /* and that we did this */
-            } else {
-                printf("?Can't get current directory\n");
-                cmarg2 = "";
-                f_tmpdir = 0;
-                x = -9;
-                goto xgetx;
-            }
-#ifdef CK_MKDIR
-            x = zchki(cmarg2);          /* Does as-name exist? */
-            if (x == -1) {              /* Doesn't exist */
-                char * p = NULL;        /* Try to create it */
-                x = strlen(cmarg2);
-                if ((p = (char *)malloc(x+4))) {
-                    sprintf(p,"%s%s",cmarg2,"x.x"); /* SAFE (prechecked) */
-                    x = zmkdir(p);
-                    free(p);
-                    if (x < 0) {
-                        printf("?Can't create %s\n",cmarg2);
-                        x = -9;
-                        goto xgetx;
-                    }
-                }
-            }
-#endif /* CK_MKDIR */
-            if (!zchdir(cmarg2)) {      /* change to given disk/directory, */
-                printf("?Can't access %s\n",cmarg2);
-                x = -9;
-                goto xgetx;
-            }
-            cmarg2 = "";
-        }
-    }
-#endif /* CK_TMPDIR */
-
-    ckstrncpy(fspec,cmarg,CKMAXPATH);   /* Note - this is a REMOTE filespec */
-    debug(F111,"xget fspec",fspec,fspeclen);
-    debug(F110,"xget cmarg2",cmarg2,0);
-
-  xgetx:
-    for (i = 0; i < SND_MAX; i++)
-      if (pv[i].sval)
-        free(pv[i].sval);
-    return(x);
-}
-#endif /* NOXFER */
-
-#ifndef NOSPL
-
-/*
-  D O G T A  --  Do _GETARGS or _PUTARGS Command.
-
-  Used by XIF, FOR, WHILE, and SWITCH, each of which are implemented as
-  2-level macros; the first level defines the macro, the second runs it.
-  This routine hides the fact that they are macros by importing the
-  macro arguments (if any) from two levels up, to make them available
-  in the IF, FOR, SWITCH, and WHILE commands themselves; for example as
-  loop indices, etc, and within the IF/FOR/WHILE/SWITCH body itself.
-  _PUTARGS is in case we changed any of these variables or used SHIFT
-  on them, so the new values won't be lost as we pop up the stack.
-*/
-int
-dogta(cx) int cx; {
-    int i, n;
-    char c, *p,  mbuf[4];
-    extern int topargc, cmdint;
-    extern char ** topxarg;
-
-    if ((y = cmcfm()) < 0)
-      return(y);
-    debug(F101,"dogta cx","",cx);
-    debug(F101,"dogta maclvl","",maclvl);
-    if (cx == XXGTA) {
-        debug(F101,"dogta _GETARGS maclvl","",maclvl);
-    } else if (cx == XXPTA) {
-        debug(F101,"dogta _PUTARGS maclvl","",maclvl);
-    } else {
-        return(-2);
-    }
-    if (maclvl < 1)
-      return(success = 0);
-
-    /* Make new copies of macro arguments /%0..9 */
-
-    mbuf[0] = '%'; mbuf[1] = '0'; mbuf[2] = NUL; /* Argument name buf */
-
-    if (cx == XXPTA) {                  /* Go NOINT because _PUTARGS */
-        if (cmdint)                     /* temporarily changes maclvl. */
-          connoi();                     /* Interrupts OFF. */
-    }
-    for (i = 0; i < 10; i++) {          /* For all args */
-        c = (char) (i + '0');           /* Make name */
-        mbuf[1] = (char) c;             /* Insert digit */
-        if (cx == XXGTA) {              /* Get arg from level-minus-2 */
-            if (maclvl == 1) p = g_var[c]; /* If at level 1 use globals 0..9 */
-            else p = m_arg[maclvl-2][i];   /* Otherwise they're on the stack */
-            addmac(mbuf,p);
-#ifdef COMMENT
-            if (maclvl > 1)
-              makestr(&(m_line[maclvl]),m_line[maclvl-2]);
-#endif /* COMMENT */
-        } else if (cx == XXPTA) {       /* Put args level+2 */
-            maclvl -= 2;                /* This is gross, it's because we're */
-            addmac(mbuf,m_arg[maclvl+2][i]); /* adding macros two levels up */
-            maclvl += 2;                     /* and addmac() uses maclvl. */
-            count[cmdlvl - 2]  = count[cmdlvl];
-            intime[cmdlvl - 2] = intime[cmdlvl];
-            inpcas[cmdlvl - 2] = inpcas[cmdlvl];
-            takerr[cmdlvl - 2] = takerr[cmdlvl];
-            merror[cmdlvl - 2] = merror[cmdlvl];
-            xquiet[cmdlvl - 2] = xquiet[cmdlvl];
-        } else return(success = 0);     /* Bad call to this routine */
-    }
-    if (cx == XXPTA) {                  /* Restore interrupts if we */
-        if (cmdint)                     /* turned them off above. */
-          conint(trap,stptrap);
-    }
-    /* Now take care of the argument vector array \&_[], \v(return), */
-    /* and \v(argc) by just copying the pointers. */
-
-    if (cx == XXGTA) {                  /* GETARGS from 2 levels up */
-        if (maclvl == 1) {
-            a_ptr[0] = topxarg;         /* \&_[] array */
-            a_dim[0] = topargc - 1;     /* Dimension doesn't include [0] */
-            m_xarg[maclvl] = topxarg;
-            n_xarg[maclvl] = topargc;   /* But \v(argc) does include \%0 */
-            macargc[maclvl] = topargc;
-            makestr(&(mrval[maclvl+1]),mrval[0]); /* (see vnlook()) */
-        } else {
-            a_ptr[0] = m_xarg[maclvl-2];
-            a_dim[0] = n_xarg[maclvl-2];
-            m_xarg[maclvl] = m_xarg[maclvl-2];
-            n_xarg[maclvl] = n_xarg[maclvl-2];
-            macargc[maclvl] = n_xarg[maclvl-2];
-            makestr(&(mrval[maclvl+1]),mrval[maclvl-1]); /* (see vnlook()) */
-
-        }
-    } else {                            /* PUTARGS 2 levels up */
-        if (maclvl > 1) {
-            a_ptr[0] = m_xarg[maclvl];
-            m_xarg[maclvl-2] = m_xarg[maclvl];
-            a_dim[0] = n_xarg[maclvl];
-            n_xarg[maclvl-2] = n_xarg[maclvl];
-            macargc[maclvl-2] = n_xarg[maclvl];
-        }
-    }
-    return(1);                  /* Internal command - don't change success */
-}
-#endif /* NOSPL */
-
-#ifndef NOSPL
-/*
-  Do the GOTO and [_]FORWARD commands.
-  s = Label to search for, cx = function code: XXGOTO, XXFWD, or XXXFWD.
-*/
-#ifdef BIGBUFOK
-#define LBLMAXLEN 255                   /* Max label length */
-#else
-#define LBLMAXLEN 63
-#endif /* BIGBUFOK */
-
-int
-dogoto(s, cx) char *s; int cx; {
-    int i, j, x, y, z, bc;
-    int empty = 0, stopflg = 0;
-    char * cmd;                         /* Name of this command */
-    char tmplbl[LBLMAXLEN+1], *lp;      /* Current label from command stream */
-    char tmp2[LBLMAXLEN+1];             /* SWITCH label conversion buffer */
-    char tmp3[LBLMAXLEN+1];             /* Target label */
-
-    stopflg = (cx == XXXFWD);           /* _FORWARD (used in SWITCH) */
-    bc = 0;                             /* Brace counter */
-
-    cmd = (cx == XXGOTO) ? "GOTO" : ((cx == XXFWD) ? "FORWARD" : "_FORWARD");
-    if (!s) s = "";
-    if (!*s) empty = 1;
-
-#ifdef DEBUG
-    if (deblog) {
-        debug(F111,"GOTO command",cmd,cx);
-        debug(F101,"GOTO cmdlvl","",cmdlvl);
-        debug(F101,"GOTO maclvl","",maclvl);
-        debug(F101,"GOTO tlevel","",tlevel);
-        debug(F111,"GOTO target",s,empty);
-    }
-#endif /* DEBUG */
-    debug(F110,cmd,s,0);
-    ckstrncpy(tmp3+1,s,LBLMAXLEN-1);
-    s = tmp3+1;
-    if (*s != ':') {                    /* Make copy of label */
-        tmp3[0] = ':';                  /* guaranteed to start with ":" */
-        s--;
-    }
-    if (!stopflg && !empty) {
-        if (s[1] == '.' || s[1] == SP || s[1] == NUL) {
-            printf("?Bad label syntax - '%s'\n",s);
-            return(success = 0);
-        }
-    }
-    if (cmdlvl == 0) {
-        printf("?Sorry, %s only works in a command file or macro\n",cmd);
-        return(success = 0);
-    }
-    y = strlen(s);                      /* y = length of target label */
-    debug(F111,cmd,s,y);
-
-    while (cmdlvl > 0) {                /* As long as not at top level... */
-        if (cmdstk[cmdlvl].src == CMD_MD) { /* GOTO inside macro */
-            int i, m, flag;
-            char *xp, *tp;
-
-            /* GOTO: rewind the macro; FORWARD: start at current position */
-
-            lp = (cx == XXGOTO) ? macx[maclvl] : macp[maclvl];
-            m = (int)strlen(lp) - y + 1;
-            debug(F010,"GOTO in macro",lp,0);
-
-            flag = 1;                   /* flag for valid label position */
-            for (i = 0; i < m; i++,lp++) { /* search for label in macro body */
-                if (*lp == '{')         /* But only at this level */
-                  bc++;                 /* Anything inside braces is off */
-                else if (*lp == '}')    /* limits. */
-                  bc--;
-                if (stopflg && bc > 0)  /* This is good for SWITCH */
-                  continue;             /* but interferes with WHILE, etc. */
-                if (*lp == ',') {
-                    flag = 1;
-                    continue;
-                }
-                if (flag) {             /* If in valid label position */
-                    if (*lp == SP)      /* eat leading spaces */
-                      continue;
-                    if (*lp != ':') {   /* Look for label introducer */
-                        flag = 0;       /* this isn't it */
-                        continue;       /* keep looking */
-                    }
-                }
-                if (!flag)              /* We don't have a label */
-                  continue;             /*  so keep looking... */
-                xp = lp; tp = tmplbl;   /* Copy the label from the macro */
-                j = 0;                  /* to make it null-terminated */
-                while ((*tp = *xp)) {
-                    if (j++ > LBLMAXLEN) /* j = length of word from macro */
-                      break;
-#ifdef COMMENT
-                    if (*tp < 33 || *tp == ',') /* Look for end of word */
-#else
-                    if (!*tp || *tp == ',')     /* Look for end of word */
-#endif /* COMMENT */
-                      break;
-                    else tp++, xp++;    /* Next character */
-                }
-                *tp = NUL;              /* In case we stopped early */
-                /* Now do caseless string comparison, using longest length */
-                debug(F111,"macro GOTO label",s,y);
-                debug(F111,"macro target label",tmplbl,j);
-                if (stopflg) {          /* Allow variables as SWITCH labels */
-                    int n = LBLMAXLEN - 1;
-                    char * p = tmp2;
-                    zzstring(tmplbl,&p,&n);
-                    ckstrncpy(tmplbl,tmp2,LBLMAXLEN);
-                    tmp2[49] = NUL;
-                }
-                debug(F111,"GOTO s",s,y);
-                debug(F111,"GOTO tmplbl",tmplbl,j);
-                debug(F101,"GOTO empty",ckitoa(stopflg),empty);
-
-                if (empty) {              /* Empty target */
-                   z = (!strcmp(s,":") && /* String is empty */
-                        /* and Label is ":" or ":*"... */
-                        (!strcmp(tmplbl,":") || !strcmp(tmplbl,":*")))
-                       ? 0 : 1;
-                   debug(F111,"GOTO","A",z);
-                } else if (stopflg) {
-                    z = ckmatch(tmplbl,s,inpcas[cmdlvl],1) ? 0 : 1;
-                   debug(F111,"GOTO","B",z);
-                } else {
-                    z = (stopflg && inpcas[cmdlvl]) ?
-                      strcmp(s,tmplbl) :
-                        ckstrcmp(s,tmplbl,(y > j) ? y : j, 0);
-                   debug(F111,"GOTO","C",z);
-                }
-                if (!z) {
-                    break;
-                } else if (stopflg &&
-                         !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j, 0)) {
-                    debug(F100,"GOTO DEFAULT","",0);
-                    break;
-                } else {
-                    flag = 0;
-                }
-            }
-            debug(F111,"GOTO macro i",cmd,i);
-            debug(F111,"GOTO macro m",cmd,m);
-            if (i >= m) {               /* Didn't find the label */
-                debug(F101,"GOTO failed cmdlvl","",cmdlvl);
-#ifdef COMMENT
-               /* MOVED TO AFTER POPCLVL ABOUT 20 LINES DOWN 5 AUG 2002 */
-                  if (stopflg)
-                  return(0);
-#endif /* COMMENT */
-                if ((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],"_swi",4) ||
-                        !strncmp(m_arg[maclvl-1][0],"_whi",4))) {
-                    dogta(XXPTA);       /* Restore args */
-                    debug(F101,"GOTO in XIF/FOR/WHI/SWI popping","",cmdlvl);
-                    popclvl();          /* Pop an extra level */
-                }
-                debug(F101,"GOTO popping","",cmdlvl);
-                if (!popclvl()) {       /* pop up to next higher level */
-                    printf("?Label '%s' not found\n",s); /* if none */
-                    return(0);          /* Quit */
-                } else if (stopflg) {  /* SWITCH no case label match */
-                   return(0);          /* and no DEFAULT lable. */
-               } else {
-                   continue;        /* otherwise look again */
-               }
-            }
-            debug(F110,"GOTO found macro label",tmplbl,0);
-            macp[maclvl] = lp;          /* set macro buffer pointer */
-            return(1);
-        } else if (cmdstk[cmdlvl].src == CMD_TF) {
-            x = 0;                      /* GOTO issued in take file */
-            debug(F111,"GOTO in TAKE file",cmd,cx);
-            if (cx == XXGOTO) {         /* If GOTO, but not FORWARD, */
-                rewind(tfile[tlevel]);  /* search file from beginning */
-                tfline[tlevel] = 0;
-            }
-            while (! feof(tfile[tlevel])) {
-#ifdef COMMENT
-/* This is wrong - it lets us jump to labels inside inferior blocks */
-                tfline[tlevel]++;
-                if (fgets(line,LINBUFSIZ,tfile[tlevel]) == NULL) /* Get line */
-#else
-                if (getnct(line,LINBUFSIZ,tfile[tlevel],0) < 0)
-#endif /* COMMENT */
-                  break;                /* If no more, done, label not found */
-                lp = line;              /* Got line */
-                while (*lp == SP || *lp == HT)
-                  lp++;                 /* Strip leading whitespace */
-                if (*lp != ':') continue; /* Check for label introducer */
-                while (*(lp+1) == SP) { /* Remove space between : and name */
-                    *(lp+1) = ':';
-                    lp++;               /* Strip leading whitespace */
-                }
-                tp = lp;                /* Get end of word */
-                j = 0;
-                while (*tp) {           /* And null-terminate it */
-                    if (*tp < 33) {
-                        *tp = NUL;
-                        break;
-                    } else tp++, j++;
-                }
-                if (!ckstrcmp(lp,s,(y > j) ? y : j,0)) { /* Caseless compare */
-                    x = 1;              /* Got it */
-                    break;              /* done. */
-                } else if (stopflg &&
-                           !ckstrcmp(":default",tmplbl,(8 > j) ? 8 : j,0)) {
-                    x = 1;
-                    break;
-                }
-            }
-            if (x == 0) {               /* If not found, print message */
-                debug(F101,"GOTO failed at cmdlvl","",cmdlvl);
-                if (stopflg)
-                  return(0);
-                if (!popclvl()) {       /* pop up to next higher level */
-                    printf("?Label '%s' not found\n",s); /* if none */
-                    return(0);          /* quit */
-                } else continue;        /* otherwise look again */
-            }
-            return(x);                  /* Send back return code */
-        }
-    }
-    printf("?Stack problem in GOTO %s\n",s); /* Shouldn't see this */
-    return(0);
-}
-#endif /* NOSPL */
-
-/* Finish parsing and do the IF, XIF, and WHILE commands */
-
-#ifndef NOSPL
-
-/*  C H K V A R  --  Check (if it's a) Variable  */
-
-
-#ifdef OLDCHKVAR
-/*
-  Crude and disgusting, but needed for OS/2, DOS, and Windows, where filenames
-  have backslashes in them.  How do we know if a backslash in a filename is a
-  directory separator, or if it's a Kermit backslash?  This routine does a
-  rough syntax check of the next few characters and if it looks like it MIGHT
-  be a variable, then it tries to evaluate it, and if the result is not empty,
-  we say it's a variable, although sometimes it might not be -- some cases are
-  truly ambiguous.  For example there might a DOS directory called \%a, and
-  we also have a variable with the same name.  This is all for the sake of not
-  having to tell PC users that they have to double all backslashes in file
-  and directory names.
-*/
-#else
-/*
-  Somewhat less crude & disgusting.  The previous method was nondeterministic
-  and (worse) it interfered with macro argument passing.  So now we only
-  check the syntax of backslash-items to see if they are variables, but we
-  do NOT check their values.
-*/
-#endif /* OLDCHKVAR */
-/*
-  Call with a string pointer pointing at the backslash of the purported
-  variable.  Returns 1 if it has the syntax of a variable, 0 if not.
-*/
-int
-chkvar(s) char *s; {
-    int z = 0;                          /* Return code - assume failure. */
-    if (!s) s = "";                     /* Watch our for null pointers. */
-    if (!*s) return(0);                 /* Empty arg so not a variable. */
-    if (*s == CMDQ) {                   /* Object begins with backslash. */
-        char c;
-        c = s[1];                       /* Character following backslash. */
-        if (c) {
-            int t = 0;
-            if (c == CMDQ)              /* Quoted backslash */
-              return(1);
-            c = (char) (islower(c) ? toupper(c) : c); /* Otherwise... */
-            if (c == '%') {             /* Simple variable */
-#ifdef OLDCHKVAR
-                t = 1;
-#else
-                return(1);
-#endif /* OLDCHKVAR */
-            } else if (c == '&') {      /* Array */
-                if (!s[2]) return(0);
-                if (s[3] == '[')
-                  t = ckindex("]",s,4,0,1);
-#ifndef OLDCHKVAR
-                return((t > 0) ? 1 : 0);
-#endif /* OLDCHKVAR */
-            } else if (c == '$' ||      /* Environment variable */
-                       c == 'V' ||      /* Built-in variable */
-                       c == 'M') {      /* Macro name */
-                t = (s[2] == '(');
-#ifndef OLDCHKVAR
-                return((t > 0) ? 1 : 0);
-#endif /* OLDCHKVAR */
-            } else if (c == 'F') {      /* Function reference */
-                /* Don't actually call it - it might have side effects */
-                int x;
-                if ((x = ckindex("(",s,3,0,1))) /* Just check syntax */
-                  if ((x = ckindex(")",s,x,0,1)))
-                    z = 1;
-                /* Insert a better syntax check here if necessary */
-            }
-#ifdef OLDCHKVAR
-            if (t) {
-                t = 255;                /* This lets us test \v(xxx) */
-                lp = line;              /* and even \f...(xxx) */
-                zzstring(s,&lp,&t);     /* Evaluate it, whatever it is. */
-                t = strlen(line);       /* Get its length. */
-                debug(F111,"chkvar",line,t);
-                z = t > 0;              /* If length > 0, it's defined */
-            }
-#endif /* OLDCHKVAR */
-        }
-    }
-    return(z);
-}
-
-/*  B O O L E X P  --  Evaluate a Boolean expression  */
-
-#define BOOLLEN 1024
-static char boolval[BOOLLEN];
-
-int
-boolexp(cx) int cx; {
-    int x, y, z; char *s, *p;
-    int parens = 0, pcount = 0, ecount = 0;
-    char *q, *bx;
-    struct FDB kw, nu;
-#ifdef FNFLOAT
-    struct FDB fl;
-    CKFLOAT f1 = 0.0, f2 = 0.0;
-    int f1flag = 0, f2flag = 0;
-#endif /* FNFLOAT */
-#ifdef OS2
-    extern int keymac;
-#endif /* OS2 */
-
-    not = 0;                            /* Flag for whether "NOT" was seen */
-    z = 0;                              /* Initial IF condition */
-    ifargs = 0;                         /* Count of IF condition words */
-    bx = boolval;                       /* Initialize boolean value */
-    *bx = NUL;
-
-  ifagain:
-    cmfdbi(&kw,                         /* First FDB - command switches */
-           _CMKEY,                      /* fcode */
-           "Number, numeric-valued variable, Boolean expression, or keyword",
-           "",                          /* default */
-           "",                          /* addtl string data */
-           nif,                         /* addtl numeric data 1: tbl size */
-           0,                           /* addtl numeric data 2: 4 = silent */
-           xxstring,                    /* Processing function */
-           iftab,                       /* Keyword table */
-           &nu                          /* Pointer to next FDB */
-           );
-    cmfdbi(&nu,                         /* 2nd FDB - An integer */
-           _CMNUM,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* Default */
-           "",                          /* addtl string data */
-           0,
-           0,
-           xxstring,
-           NULL,
-#ifdef FNFLOAT
-           &fl
-#else
-           NULL
-#endif /* FNFLOAT */
-           );
-#ifdef FNFLOAT
-    cmfdbi(&fl,                         /* A floating-point number */
-           _CMFLD,                      /* fcode */
-           "",                          /* hlpmsg */
-           "",                          /* default */
-           "",                          /* addtl string data */
-           0,                           /* addtl numeric data 1 */
-           0,                           /* addtl numeric data 2 */
-           xxstring,
-           NULL,
-           NULL
-           );
-#endif /* FNFLOAT */
-    x = cmfdb(&kw);                     /* Parse a keyword or a number */
-    debug(F111,"boolval cmfdb","",x);
-    if (x < 0) {
-        if (x == -3)
-          x = -2;
-        return(x);
-    }
-    debug(F111,"boolval switch","",cmresult.fcode);
-    switch (cmresult.fcode) {           /* What did we get? */
-#ifdef FNFLOAT
-      case _CMFLD:                      /* A "field" */
-        if (isfloat(cmresult.sresult,0)) { /* A floating-point number? */
-            f1 = floatval;              /* Yes, get its value */
-            f1flag = 1;                 /* remember we did this */
-            ifc = 9999;                 /* Set special "if-code" */
-        } else
-          return(-2);
-#endif /* FNFLOAT */
-      case _CMNUM:                      /* A number... */
-        ifc = 9999;                     /* Set special "if-code" */
-        break;
-      case _CMKEY:                      /* A keyword */
-        ifc = cmresult.nresult;         /* Get if-code */
-        break;
-      default:
-        return(-2);
-    }
-    switch (ifc) {                      /* set z = 1 for true, 0 for false */
-      case 9999:                        /* Number */
-#ifdef FNFLOAT
-        if (f1flag) {
-            z = (f1 == 0.0) ? 0 : 1;
-        } else
-#endif /* FNFLOAT */
-        z = (cmresult.nresult == 0) ? 0 : 1;
-        break;
-      case XXIFLP:                      /* Left paren */
-        if (pcount == 0 && ifargs > 0)
-          return(-2);
-        parens = 1;
-        pcount++;
-        ifargs++;
-        *bx++ = '(';
-        goto ifagain;
-      case XXIFRP:                      /* Right paren */
-        if (!parens)
-          return(-2);
-        if (--pcount < 0)
-          return(-2);
-        ifargs++;
-        *bx++ = ')';
-        *bx = NUL;
-        if (pcount == 0)
-          goto ifend;
-        goto ifagain;
-      case XXIFAN:                      /* AND (&&) */
-        ifargs++;
-        if (!ecount)
-          return(-2);
-        *bx++ = '&';
-        goto ifagain;
-      case XXIFOR:                      /* OR (||) */
-        ifargs++;
-        if (!ecount)
-          return(-2);
-        *bx++ = '|';
-        goto ifagain;
-      case XXIFNO:                      /* IF NOT [ NOT [ NOT ... ] ] */
-        if (bx > boolval) {             /* evala() doesn't like cascaded */
-            if (*(bx-1) == '!') {       /* unary operators... */
-                *(bx-1) = NUL;          /* So here, two wrongs make a right. */
-                bx--;
-            } else {
-                *bx++ = '!';
-            }
-        } else {
-            *bx++ = '!';
-        }
-        ifargs++;
-        goto ifagain;
-      case XXIFTR:                      /* IF TRUE */
-        z = 1;
-        debug(F101,"if true","",z);
-        ifargs += 1;
-        break;
-      case XXIFNT:                      /* IF FALSE */
-        z = 0;
-        debug(F101,"if true","",z);
-        ifargs += 1;
-        break;
-      case XXIFSU:                      /* IF SUCCESS */
-        z = ( success != 0 ) ? 1 : 0;
-        debug(F101,"if success","",z);
-        ifargs += 1;
-        break;
-      case XXIFFA:                      /* IF FAILURE */
-        z = ( success == 0 ) ? 1 : 0;
-        debug(F101,"if failure","",z);
-        ifargs += 1;
-        break;
-
-      case XXIFDE:                      /* IF DEFINED */
-        if ((x = cmfld("Macro or variable name","",&s,NULL)) < 0)
-          return((x == -3) ? -2 : x);
-
-        if (*s == CMDQ) {
-            char * lp;
-            char line[256];
-            int t, x;
-            if (*(s+1) == 'f' || *(s+1) == 'F') { /* Built-in function */
-                extern struct keytab fnctab[];
-                extern int nfuncs;
-                ckstrncpy(line,s+2,256);
-                if (line[0]) {
-                    lp = ckstrchr(line,'(');
-                    if (lp) *lp = NUL;
-                    x = lookup(fnctab,line,nfuncs,&t);
-                    z = x > -1;
-                }
-                debug(F111,"if defined function",line,z);
-            } else if (*(s+1) == 'v' || *(s+1) == 'V') { /* 8.0.200 */
-                extern struct keytab vartab[];
-                extern int nvars;
-                z = 0;
-                if (*(s+2) == '(') {
-                    ckstrncpy(line,s+3,256);
-                    if (line[0]) {
-                        lp = ckstrchr(line,')');
-                        if (lp) *lp = NUL;
-                        x = lookup(vartab,line,nvars,&t);
-                        z = x > -1;
-                       if (z) {        /* 8.0.203 */
-                           int t;      /* It must have a value to succeed */
-                           t = 255;    /* as in C-Kermit 6.0 and 7.0 */
-                           lp = line;  /* (this was broken in 8.0.200-201) */
-                           zzstring(s,&lp,&t);
-                           t = strlen(line);
-                           z = line[0] ? 1 : 0;
-                       }
-                    }
-                }
-                debug(F111,"if defined variable",line,z);
-            } else {
-                z = chkvar(s);          /* Starts with backslash */
-                if (z > 0) {            /* Yes... */
-                    t = 255;            /* than buffer so if zzstring fails  */
-                    lp = line;          /* check for that -- overflow means */
-                    line[0] = NUL;      /* the quantity is defined. */
-                    x = zzstring(s,&lp,&t);
-                    if ((x < 0 && t != 255) || !line[0])
-                      z = 0;
-                    debug(F111,"if defined zzstring",line,z);
-                    debug(F101,"if defined zzstring t","",t);
-                }
-            }
-        } else {
-            z = (mxlook(mactab,s,nmac) > -1); /* Look for exact match */
-        }
-        debug(F111,"if defined final",s,z);
-        ifargs += 2;
-        break;
-
-      case XXIFDC: {                    /* IF DECLARED */
-          char * lp;
-          char line[32];
-          int j, k, t, x;
-          if ((x = cmfld("Array name","",&s,NULL)) < 0)
-            return((x == -3) ? -2 : x);
-          if (*s == CMDQ) {
-              if (*(s+1) != '&') {
-                  t = 31;
-                  lp = line;
-                  line[0] = NUL;
-                  x = zzstring(s,&lp,&t);
-                  s = line;
-              }
-          }
-          z = 0;
-          if ((x = arraybounds(s,&j,&k)) > -1) {
-              if (a_ptr[x]) {
-                  if (j < 1)
-                    z = 1;
-                  else if (j <= a_dim[x])
-                    z = 1;
-                  if (z == 1 && k > a_dim[x])
-                    z = 0;
-              }
-          }
-          break;
-      }
-      case XXIFBG:                      /* IF BACKGROUND */
-      case XXIFFG:                      /* IF FOREGROUND */
-        bgchk();                        /* Check background status */
-        if (ifc == XXIFFG)              /* Foreground */
-          z = pflag ? 1 : 0;
-        else z = pflag ? 0 : 1;         /* Background */
-        ifargs += 1;
-        break;
-
-      case XXIFCO:                      /* IF COUNT */
-        z = ( --count[cmdlvl] > 0 );
-        if (cx == XXWHI) count[cmdlvl] += 2; /* Don't ask... */
-        debug(F101,"if count","",z);
-        ifargs += 1;
-        break;
-
-      case XXIFEX:                      /* IF EXIST */
-#ifdef CK_TMPDIR
-      case XXIFDI:                      /* IF DIRECTORY */
-#endif /* CK_TMPDIR */
-      case XXIFAB:                      /* IF ABSOLUTE */
-        if ((x = cmfld(
-                       ((ifc == XXIFDI) ? "Directory name" : "File"),
-                       "",&s,
-#ifdef OS2
-                       NULL             /* This allows \'s in filenames */
-#else
-                       xxstring
-#endif /* OS2 */
-                       )) < 0) {
-            if (x == -3) {
-                extern int cmflgs;
-                if (cmflgs == 1) {
-                    printf("?File or directory name required\n");
-                    return(-9);
-                }
-            } else return(x);
-        }
-        s = brstrip(s);
-        if (ifc == XXIFAB) {
-            z = isabsolute(s);
-        } else if (ifc == XXIFEX) {
-            z = (zgetfs(s) > -1L);
-            debug(F101,"if exist 1","",z);
-#ifdef OS2
-            if (!z) {                   /* File not found. */
-                int t;                  /* Try expanding variables */
-                t = LINBUFSIZ-1;        /* and looking again. */
-                lp = line;
-                zzstring(s,&lp,&t);
-                s = line;
-                z = ( zchki(s) > -1L );
-                debug(F101,"if exist 2","",z);
-            }
-#endif /* OS2 */
-#ifdef CK_TMPDIR
-        } else {
-#ifdef VMS
-            z = (zchki(s) == -2)
-#else
-/* Because this doesn't catch $DISK1:[FOO]BLAH.DIR;1 */
-            z = isdir(s)
-#ifdef OS2
-              || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL)
-#endif /* OS2 */
-#endif /* VMS */
-              ;
-            debug(F101,"if directory 1","",z);
-
-            if (!z) {                  /* File not found. */
-                int t;                  /* Try expanding variables */
-                t = LINBUFSIZ-1;        /* and looking again. */
-                lp = line;
-                zzstring(s,&lp,&t);
-                s = line;
-                z = isdir(s)
-#ifdef OS2
-                  || (isalpha(s[0]) && s[1] == ':' && s[2] == NUL)
-#endif /* OS2 */
-                    ;
-                debug(F101,"if directory 2","",z);
-            }
-#endif /* CK_TMPDIR */
-        }
-        ifargs += 2;
-        break;
-
-      case XXIFEQ:                      /* IF EQUAL (string comparison) */
-      case XXIFLL:                      /* IF Lexically Less Than */
-      case XXIFLG:                      /* If Lexically Greater Than */
-        if ((x = cmfld("first word or variable name","",&s,xxstring)) < 0) {
-            if (x == -3) {
-                printf("?Text required\n");
-                return(-9);
-            } else return(x);
-        }
-        s = brstrip(s);                 /* Strip braces */
-        x = (int)strlen(s);
-        if (x > LINBUFSIZ-1) {
-            printf("?IF: strings too long\n");
-            return(-2);
-        }
-        lp = line;                      /* lp points to first string */
-        ckstrncpy(line,s,LINBUFSIZ);
-        if ((y = cmfld("second word or variable name","",&s,xxstring)) < 0) {
-            if (y == -3) {
-                printf("?Text required\n");
-                return(-9);
-            } else return(y);
-        }
-        s = brstrip(s);
-        y = (int)strlen(s);
-        if (x + y + 2 > LINBUFSIZ) {
-            printf("?IF: strings too long\n");
-            return(-2);
-        }
-        tp = lp + x + 2;                /* tp points to second string */
-        strcpy(tp,s);                   /* safe (checked) */
-        x = ckstrcmp(lp,tp,-1,inpcas[cmdlvl]); /* Use longest length */
-        switch (ifc) {
-          case XXIFEQ:                  /* IF EQUAL (string comparison) */
-            z = (x == 0);
-            break;
-          case XXIFLL:                  /* IF Lexically Less Than */
-            z = (x < 0);
-            break;
-          case XXIFLG:                  /* If Lexically Greater Than */
-            z = (x > 0);
-            break;
-        }
-        debug(F101,"IF EQ result","",z);
-        ifargs += 3;
-        break;
-
-      case XXIFVE:                      /* IF VERSION */
-      case XXIFAE:                      /* IF (arithmetically) = */
-      case XXIFNQ:                      /* IF != (not arithmetically equal) */
-      case XXIFLT:                      /* IF <  */
-      case XXIFLE:                      /* IF <= */
-      case XXIFGE:                      /* IF >= */
-      case XXIFGT: {                    /* IF >  */
-
-        /* Really should use longs here... */
-        /* But cmnum parses ints. */
-        int xx, n1 = 0, n2 = 0;
-        if (ifc == XXIFVE) {
-            n1 = (int) vernum;
-        } else {
-            x = cmfld("first number or variable name","",&s,xxstring);
-            if (x == -3) {
-                printf("?Quantity required\n");
-                return(-9);
-            }
-            if (x < 0) return(x);
-            debug(F101,"xxifgt cmfld","",x);
-            ckstrncpy(line,s,LINBUFSIZ);
-            lp = brstrip(line);
-            debug(F110,"xxifgt exp1",lp,0);
-
-/* The following bit is for compatibility with old versions of MS-DOS Kermit */
-
-            if (!ckstrcmp(lp,"count",5,0)) {
-                n1 = count[cmdlvl];
-            } else if (!ckstrcmp(lp,"version",7,0)) {
-                n1 = (int) vernum;
-            } else if (!ckstrcmp(lp,"argc",4,0)) {
-                n1 = (int) macargc[maclvl];
-            } else {
-
-/* End of compatibility bit */
-
-#ifdef FNFLOAT
-                if (isfloat(lp,0) > 1) { /* Allow floating-point comparisons */
-                    f1 = floatval;
-                    f1flag = 1;
-                } else
-#endif /* FNFLOAT */
-                  if (chknum(lp)) {
-                      n1 = atoi(lp);
-                  } else {              /* Check for arithmetic expression */
-                      q = evala(lp);    /* cmnum() does this but ... */
-                      if (chknum(q))    /* we're not using cmnum(). */
-                        n1 = atoi(q);
-                      else
-                        return(-2);
-                  }
-            }
-        }
-        y = cmfld("number or variable name","",&s,xxstring);
-        if (y == -3) {
-            printf("?Quantity required\n");
-            return(-9);
-        }
-        if (y < 0) return(y);
-        s = brstrip(s);
-        if (!*s) return(-2);
-        if (ifc == XXIFVE) {
-            tp = line;
-        } else {
-            x = (int)strlen(lp);
-            tp = line + x + 2;
-        }
-        ckstrncpy(tp,s,LINBUFSIZ-x-2);
-        debug(F110,"xxifgt exp2",tp,0);
-        if (!ckstrcmp(tp,"count",5,0)) {
-            n2 = count[cmdlvl];
-        } else if (!ckstrcmp(tp,"version",7,0)) {
-            n2 = (int) vernum;
-        } else if (!ckstrcmp(tp,"argc",4,0)) {
-            n2 = (int) macargc[maclvl];
-        } else {
-#ifdef FNFLOAT
-            if (isfloat(tp,0) > 1) {
-                f2 = floatval;
-                f2flag = 1;
-            } else
-#endif /* FNFLOAT */
-            if (chknum(tp)) {
-                n2 = atoi(tp);
-            } else {
-                q = evala(tp);
-                if (chknum(q))
-                  n2 = atoi(q);
-                else
-                  return(-2);
-            }
-        }
-        xx = (ifc == XXIFVE) ? XXIFGE : ifc;
-
-#ifdef FNFLOAT
-        if (f1flag && !f2flag) {
-            f2 = (CKFLOAT)n2;
-            f2flag = 1;
-        }
-        if (f2flag && !f1flag)
-          f1 = (CKFLOAT)n1;
-        if (f1flag)
-          z = ((f1 <  f2 && xx == XXIFLT)
-               || (f1 != f2 && xx == XXIFNQ)
-               || (f1 <= f2 && xx == XXIFLE)
-               || (f1 == f2 && xx == XXIFAE)
-               || (f1 >= f2 && xx == XXIFGE)
-               || (f1 >  f2 && xx == XXIFGT));
-        else
-#endif /* FNFLOAT */
-          z = ((n1 <  n2 && xx == XXIFLT)
-               || (n1 != n2 && xx == XXIFNQ)
-               || (n1 <= n2 && xx == XXIFLE)
-               || (n1 == n2 && xx == XXIFAE)
-               || (n1 >= n2 && xx == XXIFGE)
-               || (n1 >  n2 && xx == XXIFGT));
-        debug(F101,"xxifge z","",z);
-        if (ifc == XXIFVE)
-          ifargs += 2;
-        else
-          ifargs += 3;
-        break;
-      }
-
-      case XXIFNU:                      /* IF NUMERIC */
-        x = cmfld("variable name or constant","",&s,NULL);
-        if (x == -3) {
-            extern int cmflgs;
-            if (cmflgs == 1) {
-                printf("?Quantity required\n");
-                return(-9);
-            }
-        } else if (x < 0)
-          return(x);
-        x = LINBUFSIZ-1;
-        lp = line;
-        zzstring(s,&lp,&x);
-        lp = line;
-        debug(F110,"xxifnu quantity",lp,0);
-        z = chknum(lp);
-#ifdef COMMENT
-/*
-  This works, but it's not wise -- IF NUMERIC is mostly used to see if a
-  string really does contain only numeric characters.  If they want to force
-  evaluation, they can use \feval() on the argument string.
-*/
-        if (!z) {                       /* Not a number */
-            x_ifnum = 1;                /* Avoid "eval" error messages */
-            q = evala(lp);              /* Maybe it's an expression */
-            z = chknum(q);              /* that evaluates to a number */
-            x_ifnum = 0;                /* Put eval messages back to normal */
-            if (z) debug(F110,"xxifnu exp",lp,0);
-        }
-#endif /* COMMENT */
-        debug(F101,"xxifnu chknum","",z);
-        ifargs += 2;
-        break;
-
-#ifdef ZFCDAT
-      case XXIFNE: {                    /* IF NEWER */
-        char d1[20], * d2;              /* Buffers for 2 dates */
-        if ((z = cmifi("First file","",&s,&y,xxstring)) < 0)
-          return(z);
-        ckstrncpy(d1,zfcdat(s),20);
-        if ((z = cmifi("Second file","",&s,&y,xxstring)) < 0)
-          return(z);
-        d2 = zfcdat(s);
-        if ((int)strlen(d1) != 17 || (int)strlen(d2) != 17) {
-            printf("?Failure to get file date\n");
-            return(-9);
-        }
-        debug(F110,"xxifnewer d1",d1,0);
-        debug(F110,"xxifnewer d2",d2,0);
-        z = (strcmp(d1,d2) > 0) ? 1 : 0;
-        debug(F101,"xxifnewer","",z);
-        ifargs += 2;
-        break;
-      }
-#endif /* ZFCDAT */
-
-#ifdef CK_IFRO
-      case XXIFRO:                      /* REMOTE-ONLY advisory */
-        ifargs++;
-#ifdef NOLOCAL
-        z = 1;
-#else
-        z = remonly;
-#endif /* NOLOCAL */
-        break;
-#endif /* CK_IFRO */
-
-      case XXIFAL:                      /* ALARM */
-        ifargs++;
-        debug(F101,"IF ALARM ck_alarm","",ck_alarm);
-        debug(F110,"IF ALARM alrm_date",alrm_date,0);
-        debug(F110,"IF ALARM alrm_time",alrm_time,0);
-
-        if (ck_alarm < 1L || alrm_date[0] < '0' || alrm_time[0] < '0') {
-            z = 0;                      /* ALARM not SET */
-            break;                      /* so IF ALARM fails */
-        }
-        /* Get current date and time */
-        ckstrncpy(tmpbuf,ckcvtdate("",1),TMPBUFSIZ);
-        s = tmpbuf;
-        s[8] = NUL;
-        z = (int) strncmp(tmpbuf,alrm_date,8); /* Compare dates */
-        debug(F101,"IF ALARM date z","",z);
-        if (z == 0) {                   /* Dates are the same */
-            /* Compare times */
-            z = (tod2sec(tmpbuf+9) >= atol(alrm_time)) ? 1 : -1;
-            debug(F101,"IF ALARM time z","",z);
-        }
-        tmpbuf[0] = NUL;                /* z >= 0 if alarm is passed */
-        z = ((z >= 0) ? 1 : 0);         /* z <  0 otherwise */
-        debug(F101,"IF ALARM final z","",z);
-        break;
-
-      case XXIFOP:                      /* IF OPEN */
-        if ((x = cmkey(iotab,niot,"file or log","",xxstring)) < 0)
-          return(x);
-        if (x == 9999 || x == ZSTDIO) {
-            bgchk();                    /* Check background status */
-            z = pflag ? 1 : 0;
-        } else if (x == 8888) {
-            z = local ? ttchk() > -1 : 0;
-#ifdef CKLOGDIAL
-        } else if (x == 7777) {
-            extern int dialog;
-            z = dialog ? 1 : 0;
-#endif /* CKLOGDIAL */
-        } else
-          z = (chkfn(x) > 0) ? 1 : 0;
-        ifargs += 1;
-        break;
-
-      case XXIFSD:                      /* Started-From-Dialer */
-#ifdef OS2
-        z = StartedFromDialer;
-#else
-        z = 0;
-#endif /* OS2 */
-        break;
-
-      case XXIFTM:                      /* Terminal-Macro */
-#ifdef OS2
-        z = cmdstk[cmdlvl].ccflgs & CF_KMAC;
-#else
-        z = 0;
-#endif /* OS2 */
-        break;
-
-      case XXIFEM:                      /* Emulation is active */
-#ifdef OS2
-        z = 1;
-#else
-        z = 0;
-#endif /* OS2 */
-        break;
-
-      case XXIFIK:                      /* Running as IKSD? */
-        z = inserver;
-        break;
-
-      case XXIFTA:                      /* Connection is TAPI */
-        z = 0;
-#ifndef NODIAL
-#ifdef CK_TAPI
-        if (local && !network && tttapi)
-          z = 1;
-#endif /* CK_TAPI */
-#endif /* NODIAL */
-        break;
-
-      case XXIFMA:                      /* IF MATCH */
-        x = cmfld("String or variable","",&s,xxstring);
-        if (x == -3) {
-            extern int cmflgs;
-            if (cmflgs == 1) {
-                printf("?String required\n");
-                return(-9);
-            }
-        } else if (x < 0)
-          return(x);
-        ckstrncpy(line,s,LINBUFSIZ);
-        s = brstrip(line);
-        debug(F110,"xxifma string",line,0);
-        x = cmfld("Pattern","",&p,xxstring);
-        if (x == -3) {
-            extern int cmflgs;
-            if (cmflgs == 1) {
-                printf("?Pattern required\n");
-                return(-9);
-            }
-        } else if (x < 0)
-          return(x);
-        ckstrncpy(tmpbuf,p,TMPBUFSIZ);
-        p = brstrip(tmpbuf);
-        debug(F110,"xxifma pattern",tmpbuf,0);
-        z = ckmatch(p,s,inpcas[cmdlvl],1);
-        break;
-
-      case XXIFFL: {                    /* IF FLAG */
-          extern int ooflag;
-          z = ooflag;
-          break;
-      }
-      case XXIFAV: {                    /* IF AVAILABLE */
-          if ((x = cmkey(availtab,availtabn,"","",xxstring)) < 0)
-            return(x);
-          switch (x) {
-            case AV_KRB4:
-              z = ck_krb4_is_installed();
-              break;
-            case AV_KRB5:
-              z = ck_krb5_is_installed();
-              break;
-            case AV_SRP:
-              z = ck_srp_is_installed();
-              break;
-            case AV_SSL:
-              z = ck_ssleay_is_installed();
-              break;
-            case AV_NTLM:
-              z = ck_ntlm_is_installed();
-              break;
-            case AV_CRYPTO:
-              z = ck_crypt_is_installed();
-              break;
-            case AV_SSH:
-              z = ck_ssh_is_installed();
-              break;
-            default:
-              z = 0;
-          }
-          break;
-      }
-      case XXIFAT:                      /* IF ASKTIMEOUT */
-        z = asktimedout;
-        break;
-
-      case XXIFRD:                      /* IF READABLE */
-      case XXIFWR:                      /* IF WRITEABLE */
-        if ((x = cmfld("File or directory name",
-                       "",
-                       &s,
-#ifdef OS2
-                       NULL             /* This allows \'s in filenames */
-#else
-                       xxstring
-#endif /* OS2 */
-                       )) < 0) {
-            if (x == -3) {
-                extern int cmflgs;
-                if (cmflgs == 1) {
-                    printf("?File or directory name required\n");
-                    return(-9);
-                }
-            } else return(x);
-        }
-        s = brstrip(s);
-/*
-  zchk[io]() do not do what we want here for directories, so we set
-  a global flag telling it to behave specially in this case.  Othewise
-  we'd have to change the API and change all ck?fio.c modules accordingly.
-*/
-        y = 0;                          /* Try-again control */
-#ifdef OS2
-  ifrdagain:
-#endif /* OS2 */
-        if (ifc == XXIFRD) {            /* IF READABLE */
-            zchkid = 1;
-            z = zchki(s) > -1;
-            zchkid = 0;
-        } else if (ifc == XXIFWR) {     /* IF WRITEABLE */
-            zchkod = 1;
-            z = zchko(s) > -1;
-            zchkod = 0;
-        }
-#ifdef OS2
-        if (!z && !y) {                 /* File not found. */
-            int t;                      /* Try expanding variables */
-            t = LINBUFSIZ-1;            /* and looking again. */
-            lp = line;
-            zzstring(s,&lp,&t);
-            s = line;
-            z = zchko(s) > -1;
-            y++;
-            goto ifrdagain;
-        }
-#endif /* OS2 */
-        ifargs += 2;
-        break;
-      case XXIFQU:                      /* IF QUIET */
-        z = quiet ? 1 : 0;
-        debug(F101,"if quiet","",z);
-        ifargs += 1;
-        break;
-
-      case XXIFWI:                      /* WILD */
-        if ((x = cmfld("File specification","",&s,xxstring)) < 0) return(x);
-        z = iswild(s);
-        break;
-
-      case XXIFCK:                      /* C-KERMIT */
-#ifdef OS2
-        z = 0;
-#else
-        z = 1;
-#endif /* OS2 */
-        break;
-
-      case XXIFK9:                      /* K-95 */
-#ifdef OS2
-        z = 1;
-#else
-        z = 0;
-#endif /* OS2 */
-        break;
-
-      case XXIFGU:                      /* GUI */
-#ifdef KUI
-        z = 1;
-#else
-        z = 0;
-#endif /* KUI */
-        break;
-
-      case XXIFMS:                      /* MS-KERMIT */
-        z = 0;
-        break;
-
-      case XXIFLO:                      /* IF LOCAL */
-        z = local ? 1 : 0;
-        break;
-
-      case XXIFCM: {                    /* IF COMMAND */
-          extern struct keytab cmdtab[];
-          extern int ncmd;
-          if ((x = cmfld("Word","",&s,xxstring)) < 0)
-            return(x);
-          z = lookup(cmdtab,s,ncmd,&y);
-          z = (z == -2 || z > -1) ? 1 : 0;
-          break;
-      }
-#ifdef CKFLOAT
-      case XXIFFP:                      /* IF FLOAT */
-        if ((x = cmfld("Number","",&s,xxstring)) < 0)
-          if (x != -3)                  /* e.g. empty variable */
-            return(x);
-        z = isfloat(s,0);
-        break;
-#endif /* CKFLOAT */
-
-      case XXIFKB:                      /* KBHIT */
-        z = conchk();
-        if (z < 0) z = 0;
-        if (z > 1) z = 1;
-        break;
-
-      case XXIFKG: {                    /* KERBANG */
-          extern int cfilef;
-          z = (xcmdsrc == 0) ? 0 : cfilef;
-          break;
-      }
-
-      default:                          /* Shouldn't happen */
-        return(-2);
-    } /* end of switch */
-
-    if (z)
-      *bx++ = '1';
-    else
-      *bx++ = '0';
-    *bx = NUL;
-    if (bx > boolval + BOOLLEN - 2) {
-        printf("?Boolean expression too long");
-        return(-9);
-    }
-    ecount++;                           /* Expression counter */
-    debug(F101,"boolexp parens","",parens);
-    debug(F101,"boolexp pcount","",pcount);
-    if (parens && pcount > 0)
-      goto ifagain;
-
-  ifend:                                /* No more - done */
-    *bx = NUL;
-    z = atoi(evalx(boolval));
-    debug(F111,"boolexp boolval",boolval,z);
-    return(z);
-}
-
-/*  D O I F  --  Do the IF command  */
-
-int
-doif(cx) int cx; {
-    int x, y, z; char *s, *p;
-    char *q;
-#ifdef OS2
-    extern int keymac;
-#endif /* OS2 */
-
-    debug(F101,"doif cx","",cx);
-
-    z = boolexp(cx);                    /* Evaluate the condition(s) */
-    debug(F010,"doif cmdbuf",cmdbuf,0);
-    debug(F101,"doif boolexp","",z);
-    if (z < 0)
-      return(z);
-
-    if (cx == XXIF) {                   /* Allow IF to have XIF semantics. */
-        char * p;
-        p = cmpeek();
-        if (!p) p = "";
-        while (*p) {
-            if (*p == SP || *p == HT)
-              p++;
-            else
-              break;
-        }
-        if (*p == '{')
-          cx = XXIFX;
-    }
-    switch (cx) {                       /* Separate handling for IF and XIF */
-
-      case XXASSER:                     /* And ASSERT */
-        if ((x = cmcfm()) < 0)
-          return(x);
-        return(success = z);
-
-      case XXIF:                        /* This is IF... */
-        ifcmd[cmdlvl] = 1;              /* We just completed an IF command */
-        debug(F101,"doif condition","",z);
-        if (z) {                        /* Condition is true */
-            iftest[cmdlvl] = 1;         /* Remember that IF succeeded */
-            if (maclvl > -1) {          /* In macro, */
-                pushcmd(NULL);          /* save rest of command. */
-            } else if (tlevel > -1) {   /* In take file, */
-                debug(F100, "doif: pushing command", "", 0);
-                pushcmd(NULL);          /* save rest of command. */
-            } else {                    /* If interactive, */
-                cmini(ckxech);          /* just start a new command */
-                printf("\n");           /* (like in MS-DOS Kermit) */
-                if (pflag) prompt(xxstring);
-            }
-        } else {                        /* Condition is false */
-            iftest[cmdlvl] = 0;         /* Remember command failed. */
-            if ((y = cmtxt("command to be ignored","",&s,NULL)) < 0)
-              return(y);                /* Gobble up rest of line */
-        }
-        return(0);
-
-      case XXIFX: {                     /* This is XIF (Extended IF) */
-          char *p;
-          char e[5];
-          int i;
-          if ((y = cmtxt("Object command","",&s,NULL)) < 0)
-            return(y);                  /* Get object command. */
-          p = s;
-          lp = line;
-          debug(F110,"doif THEN part",s,-54);
-          if (litcmd(&p,&lp,LINBUFSIZ - 1) < 0) { /* Quote THEN-part */
-              return(-2);
-          }
-          debug(F111,"doif THEN part 2",line,z);
-
-          while (*p == SP) p++;         /* Strip trailing spaces */
-          ifcmd[cmdlvl] = 0;            /* Assume ELSE part in same line */
-          iftest[cmdlvl] = z ? 1 : 0;
-          if (*p) {                     /* At end? */
-              if (!z) {                 /* No, use ELSE-part, if any */
-                  for (i = 0; i < 4; i++) e[i] = *p++;
-                  if (ckstrcmp(e,"else",4,0)) /* See if we have an ELSE */
-                    return(-2);         /* Something else - error. */
-                  debug(F010,"doif ELSE line 1",p,0);
-                  while (*p == SP) p++; /* Skip spaces */
-                  if (*p != '{') {      /* Brace ELSE part if necessary */
-                      ckmakmsg(tmpbuf,TMPBUFSIZ,"{",p," }",NULL);
-                      p = tmpbuf;
-                      debug(F010,"doif ELSE line 2",p,0);
-                  }
-                  lp = line;            /* Write over THEN part... */
-                  *lp = NUL;            /* with ELSE part. */
-                  if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) {
-                      return(-2);
-                  }
-                  while (*p == SP) p++; /* Strip trailing spaces */
-                  if (*p) return(-2);   /* Should be nothing here. */
-                  debug(F010,"doif ELSE line 3",line,0);
-              }
-          } else {                      /* At end, treat like an IF command */
-              if (!z) line[0] = NUL;    /* Condition not true and no ELSE */
-              ifcmd[cmdlvl] = 1;        /* Allow ELSE on next line */
-              debug(F101,"IF condition","",z);
-          }
-          if (line[0]) {
-              x = mlook(mactab,"_xif",nmac); /* Get index of "_xif" macro. */
-              if (x < 0) {                      /* Not there? */
-                  addmmac("_xif",xif_def);      /* Put it back. */
-                  if (mlook(mactab,"_xif",nmac) < 0) { /* Look it up again. */
-                      printf("?XIF macro gone!\n");
-                      return(success = 0);
-                  }
-              }
-              dodo(x,line,cmdstk[cmdlvl].ccflgs | CF_IMAC);
-          }
-          return(0);
-      }
-      case XXWHI: {                     /* WHILE Command */
-          p = cmdbuf;                   /* Capture IF condition */
-          ifcond[0] = NUL;              /* from command buffer */
-          while (*p == SP) p++;
-          while (*p != SP) p++;
-          ifcp = ifcond;
-          ifcp += ckstrncpy(ifcp,"{ \\flit(if ( not ",IFCONDLEN);
-#ifdef COMMENT
-/*
-  This doesn't work because it breaks on the first left brace, which does
-  not necessarily start the command list, e.g. "while equal \%a {\35}".
-*/
-          while (*p != '{' && *p != NUL) *ifcp++ = *p++;
-          p = " ) goto _..bot) } ";
-          while (*ifcp++ = *p++) ;
-#else
-/*
-  The command parser sets cmbptr to the spot where it left off parsing in
-  the command buffer.
-*/
-          {
-              extern char * cmbptr;
-              if (cmbptr) {
-                  while (p < cmbptr && *p != NUL)
-                    *ifcp++ = *p++;
-                  p = " ) goto _..bot) } ";
-                  while ((*ifcp++ = *p++)) ;
-              } else {
-                  printf("?Internal error parsing WHILE condition\n");
-                  return(-9);
-              }
-          }
-#endif /* COMMENT */
-
-          debug(F110,"WHILE cmd",ifcond,0);
-
-          if ((y = cmtxt("Object command","",&s,NULL)) < 0)
-            return(y);                  /* Get object command. */
-          p = s;
-          lp = line;
-          if (litcmd(&p,&lp,LINBUFSIZ - 2) < 0) { /* Quote object command */
-              return(-2);
-          }
-          debug(F101,"WHILE body",line,-54);
-          if (line[0]) {
-              char *p;
-              x = mlook(mactab,"_while",nmac); /* index of "_while" macro. */
-              if (x < 0) {              /* Not there? */
-                  addmmac("_while",whil_def); /* Put it back. */
-                  if (mlook(mactab,"_while",nmac) < 0) { /* Look it up again */
-                      printf("?WHILE macro definition gone!\n");
-                      return(success = 0);
-                  }
-              }
-              p = malloc((int)strlen(ifcond) + (int)strlen(line) + 2);
-              if (p) {
-                  strcpy(p,ifcond);     /* safe (prechecked) */
-                  strcat(p,line);       /* safe (prechecked) */
-                  debug(F010,"WHILE dodo",p,0);
-                  dodo(x,p,cmdstk[cmdlvl].ccflgs | CF_IMAC);
-                  free(p);
-                  p = NULL;
-              } else {
-                  printf("?Can't allocate storage for WHILE command");
-                  return(success = 0);
-              }
-          }
-          return(0);
-      }
-      default:
-        return(-2);
-    }
-}
-#endif /* NOSPL */
-
-/* Set up a TAKE command file */
-
-int
-dotake(s) char *s; {
-#ifndef NOSPL
-    extern int tra_cmd;
-#endif /* NOSPL */
-#ifndef NOLOCAL
-#ifdef OS2
-    extern int term_io;
-    int term_io_sav = term_io;
-#endif /* OS2 */
-#endif /* NOLOCAL */
-    int slen;
-
-    debug(F110,"dotake",s,0);
-    if (!s) s = "";
-    if (!*s) return(success = 0);
-    slen = strlen(s);
-    debug(F101,"dotake len","",slen);
-
-    if ((tfile[++tlevel] = fopen(s,"r")) == NULL) {
-        perror(s);
-        debug(F110,"dotake fail",s,0);
-        tlevel--;
-        return(success = 0);
-    } else {
-        tfline[tlevel] = 0;             /* Line counter */
-#ifdef VMS
-        conres();                       /* So Ctrl-C will work */
-#endif /* VMS */
-#ifndef NOLOCAL
-#ifdef OS2
-        term_io = 0;                    /* Disable Terminal Emulator I/O */
-#endif /* OS2 */
-#endif /* NOLOCAL */
-#ifndef NOSPL
-        cmdlvl++;                       /* Entering a new command level */
-        debug(F111,"CMD +F",s,cmdlvl);
-        debug(F101,"dotake cmdlvl","",cmdlvl);
-        debug(F101,"dotake tlevel","",tlevel);
-        if (cmdlvl > CMDSTKL) {
-            debug(F100,"dotake stack overflow","",0);
-            cmdlvl--;
-            debug(F111,"CMD*-F",s,cmdlvl);
-            fclose(tfile[tlevel--]);
-            printf("?TAKE files and/or DO commands nested too deeply\n");
-            return(success = 0);
-        }
-        if (tfnam[tlevel]) {            /* Copy the filename */
-            free(tfnam[tlevel]);
-            tfnam[tlevel] = NULL;
-        }
-        if ((tfnam[tlevel] = malloc(strlen(s) + 1))) {
-            strcpy(tfnam[tlevel],s);    /* safe */
-        } else {
-            printf("?Memory allocation failure\n");
-            return(success = 0);
-        }
-        ifcmd[cmdlvl] = 0;              /* Set variables for this cmd file */
-        iftest[cmdlvl] = 0;
-        count[cmdlvl]  = count[cmdlvl-1];  /* Inherit this */
-        intime[cmdlvl] = intime[cmdlvl-1]; /* Inherit this */
-        inpcas[cmdlvl] = inpcas[cmdlvl-1]; /* Inherit this */
-        takerr[cmdlvl] = takerr[cmdlvl-1]; /* Inherit this */
-        merror[cmdlvl] = merror[cmdlvl-1]; /* Inherit this */
-        xquiet[cmdlvl] = quiet;
-        xcmdsrc = CMD_TF;
-        cmdstk[cmdlvl].src = CMD_TF;    /* Say we're in a TAKE file */
-        cmdstk[cmdlvl].lvl = tlevel;    /* nested at this level */
-        cmdstk[cmdlvl].ccflgs = cmdstk[cmdlvl-1].ccflgs;
-#else
-        takerr[tlevel] = takerr[tlevel-1]; /* Inherit this */
-#endif /* NOSPL */
-    }
-#ifndef NOSPL
-    if (tra_cmd)
-      printf("[%d] +F: \"%s\"\n",cmdlvl,s);
-#endif /* NOSPL */
-#ifndef NOLOCAL
-#ifdef OS2
-    term_io = term_io_sav;
-#endif /* OS2 */
-#endif /* NOLOCAL */
-    return(1);
-}
-#endif /* NOICP */