ckuusr.c
上传用户:dufan58
上传日期:2007-01-05
资源大小:3407k
文件大小:233k
源码类别:

通讯/手机编程

开发平台:

Windows_Unix

  1. #include "ckcsym.h"
  2. char *userv = "User Interface 7.0.222, 1 Jan 2000";
  3. /*  C K U U S R --  "User Interface" for C-Kermit (Part 1)  */
  4. /*
  5.   Author: Frank da Cruz <fdc@columbia.edu>
  6.   Columbia University Academic Information Systems, New York City.
  7.   Copyright (C) 1985, 2000,
  8.     Trustees of Columbia University in the City of New York.
  9.     All rights reserved.  See the C-Kermit COPYING.TXT file or the
  10.     copyright text in the ckcmai.c module for disclaimer and permissions.
  11. */
  12. /*
  13.   Originally the entire user interface was in one module, ckuusr.c.  Over
  14.   the years it has been split into many modules: ckuus2.c, ckuus3.c, ...,
  15.   ckuus7.c.  ckuus2.c contains the help command parser and help text strings
  16.   ckuusy.c contains the UNIX-style command-line interface; ckuusx.c contains
  17.   routines needed by both the command-line interface and the interactive
  18.   command parser.
  19. */
  20. /*
  21.   The ckuus*.c modules depend on the existence of C library features like
  22.   fopen, fgets, feof, (f)printf, argv/argc, etc.  Other functions that are
  23.   likely to vary among different platforms -- like setting terminal modes or
  24.   interrupts -- are invoked via calls to functions that are defined in the
  25.   system- dependent modules, ck?[ft]io.c.  The command line parser processes
  26.   any arguments found on the command line, as passed to main() via argv/argc.
  27.   The interactive parser uses the facilities of the cmd package (developed for
  28.   this program, but usable by any program).  Any command parser may be
  29.   substituted for this one.  The only requirements for the Kermit command
  30.   parser are these:
  31.   . Set parameters via global variables like duplex, speed, ttname, etc.  See
  32.     ckmain.c for the declarations and descriptions of these variables.
  33.   . If a command can be executed without the use of Kermit protocol, then
  34.     execute the command directly and set the variable sstate to 0. Examples
  35.     include 'set' commands, local directory listings, the 'connect' command.
  36.   . If a command requires the Kermit protocol, set the following variables:
  37.      sstate                             string data
  38.        'x' (enter server mode)            (none)
  39.        'r' (send a 'get' command)         cmarg, cmarg2
  40.        'v' (enter receive mode)           cmarg2
  41.        'g' (send a generic command)       cmarg
  42.        's' (send files)                   nfils, cmarg & cmarg2 OR cmlist
  43.        'c' (send a remote host command)   cmarg
  44.      cmlist is an array of pointers to strings.
  45.      cmarg, cmarg2 are pointers to strings.
  46.      nfils is an integer.
  47.      cmarg can be a filename string (possibly wild), or
  48. a pointer to a prefabricated generic command string, or
  49. a pointer to a host command string.
  50.      cmarg2 is an "as-name" - the name to send file(s) under, or
  51. the name under which to store incoming file(s); must not be wild.
  52. A null or empty value means to use the file's own name.
  53.      cmlist is a list of filenames, such as passed via argv.
  54.      nfils is an integer, interpreted as follows:
  55.        -1: filespec (possibly wild) in cmarg, must be expanded internally.
  56. 0: send from stdin (standard input).
  57.        >0: number of files to send, from cmlist.
  58.   The screen() function is used to update the screen during file transfer.
  59.   The tlog() function writes to a transaction log.
  60.   The debug() function writes to a debugging log.
  61.   The intmsg() and chkint() functions provide the user i/o for interrupting
  62.     file transfers.
  63. */
  64. int g_fncact = -1; /* Needed for NOICP builds */
  65. int noinit = 0; /* Flag for skipping init file */
  66. #ifndef NOICP
  67. /* Includes */
  68. #include "ckcdeb.h"
  69. #include "ckcasc.h"
  70. #include "ckcker.h"
  71. #include "ckcnet.h" /* Network symbols */
  72. #include "ckuusr.h"
  73. #include "ckcxla.h"
  74. #ifdef OS2
  75. #ifndef NT
  76. #define INCL_NOPM
  77. #define INCL_VIO /* Needed for ckocon.h */
  78. #include <os2.h>
  79. #undef COMMENT
  80. #else
  81. #define APIRET ULONG
  82. #include <windows.h>
  83. #include <tapi.h>
  84. #include "cknwin.h"
  85. #include "ckntap.h" /* CK_TAPI definition */
  86. #endif /* NT */
  87. #include "ckowin.h"
  88. #include "ckocon.h"
  89. extern int tcp_avail;
  90. extern bool viewonly;
  91. extern tt_status;
  92. int display_demo = 1;
  93. #endif /* OS2 */
  94. int optlines = 0;
  95. int didsetlin = 0;
  96. #ifdef VMS
  97. extern int batch;
  98. #endif /* VMS */
  99. #ifdef datageneral
  100. #include <packets:common.h>
  101. #define fgets(stringbuf,max,fd) dg_fgets(stringbuf,max,fd)
  102. #endif /* datageneral */
  103. extern int hints, cmflgs, whyclosed;
  104. #ifndef NOCSETS
  105. extern int nfilc;
  106. extern struct keytab fcstab[];
  107. extern int fcharset;
  108. #endif /* NOCSETS */
  109. char * g_pswd = NULL;
  110. int g_pcpt = -1;
  111. int g_pflg = -1;
  112. extern int cmd_rows, cmd_cols;
  113. #ifndef NOXFER
  114. extern int atcapr, atdiso, nfils, moving, protocol, sendmode, epktflg, size,
  115.   sndsrc, server, displa, inserver, fncnv, fnspath, fnrpath, xfermode, urpsiz,
  116.   spsizf, spsiz, spsizr, spmax, wslotr, prefixing, fncact;
  117. #ifdef CK_LOGIN
  118. extern int isguest;
  119. #endif /* CK_LOGIN */
  120. extern long sendstart;
  121. extern char *cmarg, *cmarg2, **cmlist, * dftty;
  122. extern struct keytab fntab[]; extern int nfntab;
  123. extern struct ck_p ptab[NPROTOS];
  124. int sndcmd = 0; /* Last command was a SEND-class command. */
  125. int g_xfermode = -1;
  126. int g_proto  = -1;
  127. int g_urpsiz = -1;
  128. int g_spsizf = -1;
  129. int g_spsiz  = -1;
  130. int g_spsizr = -1;
  131. int g_spmax  = -1;
  132. int g_wslotr = -1;
  133. int g_prefixing = -1;
  134. int g_fncnv  = -1;
  135. int g_fnspath = -1;
  136. int g_fnrpath = -1;
  137. int g_fnact  = -1;
  138. int g_displa = -1;
  139. int g_spath  = -1;
  140. int g_rpath  = -1;
  141. char * g_sfilter = NULL;
  142. char * g_rfilter = NULL;
  143. #ifdef PATTERNS
  144. extern int patterns;
  145. int g_patterns = -1;
  146. #endif /* PATTERNS */
  147. int g_skipbup = -1;
  148. #ifdef PIPESEND
  149. extern int usepipes, pipesend;
  150. extern char * sndfilter, * rcvfilter;
  151. #endif /* PIPESEND */
  152. #ifdef PATTERNS
  153. extern char *txtpatterns[], *binpatterns[];
  154. #endif /* PATTERNS */
  155. #ifndef NOSPL
  156. extern int sndxlo, sndxhi, sndxin;
  157. #endif /* NOSPL */
  158. extern char fspec[]; /* Most recent filespec */
  159. extern int fspeclen; /* Length of fspec[] buffer */
  160. #ifndef NOFRILLS
  161. extern int rmailf; /* MAIL command items */
  162. extern char optbuf[];
  163. #endif /* NOFRILLS */
  164. extern int
  165.   en_cpy, en_cwd, en_del, en_dir, en_fin, en_get, en_bye, en_mai, en_pri,
  166.   en_hos, en_ren, en_sen, en_spa, en_set, en_typ, en_who, en_ret, en_xit,
  167.   en_mkd, en_rmd, en_asg;
  168. #ifndef NOMSEND /* Multiple SEND */
  169. extern char *msfiles[];
  170. int filesinlist = 0; /* And ADD ... */
  171. extern struct filelist * filehead;
  172. extern struct filelist * filetail;
  173. extern struct filelist * filenext;
  174. extern int addlist;
  175. #endif /* NOMSEND */
  176. static struct keytab addtab[] = {
  177. #ifdef PATTERNS
  178.     "binary-patterns", ADD_BIN, 0,
  179. #endif /* PATTERNS */
  180. #ifndef NOMSEND
  181.     "send-list", ADD_SND, 0,
  182. #endif /* NOMSEND */
  183. #ifdef PATTERNS
  184.     "text-patterns", ADD_TXT, 0,
  185. #endif /* PATTERNS */
  186.     "", 0, 0
  187. };
  188. static int naddtab = sizeof(addtab)/sizeof(struct keytab) - 1;
  189. #ifndef NOCSETS
  190. struct keytab assoctab[] = {
  191.     "file-character-set",     ASSOC_FC, 0,
  192.     "transfer-character-set", ASSOC_TC, 0,
  193.     "xfer-character-set",     ASSOC_TC, CM_INV
  194. };
  195. static int nassoc = sizeof(assoctab)/sizeof(struct keytab);
  196. extern int afcset[MAXFCSETS+1]; /* Character-set associations */
  197. extern int axcset[MAXTCSETS+1];
  198. #endif /* NOCSETS */
  199. #ifndef ADDCMD
  200. #ifndef NOMSEND
  201. #define ADDCMD
  202. #endif /* NOMSEND */
  203. #ifndef ADDCMD
  204. #ifdef PATTERNS
  205. #define ADDCMD
  206. #endif /* PATTERNS */
  207. #endif /* ADDCMD */
  208. #endif /* ADDCMD */
  209. #endif /* NOXFER */
  210. /* External Kermit Variables, see ckmain.c for description. */
  211. extern xx_strp xxstring;
  212. extern long xvernum;
  213. extern int local, xitsta, binary, msgflg, escape, duplex, quiet, tlevel,
  214.   pflag, zincnt, ckxech, carrier, what, nopush, haveline, bye_active;
  215. #ifdef TNCODE
  216. extern int debses;
  217. extern char tn_msg[];
  218. #endif /* TNCODE */
  219. int sleepcan = 1;
  220. int g_binary = -1;
  221. int g_recursive = -1;
  222. int g_matchdot = -1;
  223. extern long vernum;
  224. extern char *versio, *copyright[];
  225. extern char *ckxsys;
  226. #ifndef NOHELP
  227. extern char *introtxt[];
  228. extern char *newstxt[];
  229. #endif /* NOHELP */
  230. #ifndef OS2
  231. #ifndef UNIX
  232. extern char *PWDCMD;
  233. #endif /* UNIX */
  234. extern char *WHOCMD;
  235. #endif /* OS2 */
  236. extern char ttname[];
  237. extern CHAR sstate;
  238. extern int network; /* Have active network connection */
  239. #ifdef NETCONN
  240. extern int nettype, /* Type of network */
  241.   ttnproto; /* Network Protocol */
  242. #endif /* NETCONN */
  243. #ifndef NODIAL
  244. extern int dialsta, dialatmo, dialcon, dialcq; /* DIAL status, etc. */
  245. #endif /* NODIAL */
  246. #ifdef CK_APC
  247. extern int apcactive, apcstatus;
  248. #endif /* CK_APC */
  249. #ifndef NOPUSH
  250. #ifndef NOFRILLS
  251. extern char editor[];
  252. extern char editopts[];
  253. extern char editfile[];
  254. #endif /* NOFRILLS */
  255. #endif /* NOPUSH */
  256. #ifdef BROWSER
  257. extern char browser[]; /* Web browser application */
  258. extern char browsopts[]; /* Web browser options */
  259. extern char browsurl[]; /* Most recent URL */
  260. char ftpapp[CKMAXPATH+1] = { NUL, NUL }; /* ftp executable */
  261. char ftpopts[128] = { NUL, NUL }; /* ftp command-line options */
  262. #endif /* BROWSER */
  263. extern struct keytab onoff[]; /* On/Off keyword table */
  264. #ifdef CK_TMPDIR
  265. int f_tmpdir = 0; /* Directory changed temporarily */
  266. char savdir[TMPDIRLEN]; /* For saving current directory */
  267. extern char * dldir;
  268. #endif /* CK_TMPDIR */
  269. int activecmd = -1; /* Keyword index of active command */
  270. int doconx = -1; /* CONNECT-class command active */
  271. int ooflag = 0; /* User-settable on/off flag */
  272. int rcflag = 0; /* Pointer to home directory string */
  273. int repars, /* Reparse needed */
  274.     techo = 0; /* Take echo */
  275. int secho = 1; /* SCRIPT echo */
  276. int xitwarn = /* Warn about open connection on exit */
  277. #ifdef NOWARN
  278. 0
  279. #else
  280. 1
  281. #endif /* NOWARN */
  282. ;
  283. struct keytab onoffsw[] = {
  284.     "/off", 0, 0,
  285.     "/on",  1, 0
  286. };
  287. #ifdef CKEXEC
  288. struct keytab redirsw[] = {
  289.     "/redirect", 1, 0
  290. };
  291. #endif /* CKEXEC */
  292. #ifndef NOXMIT
  293. /* Variables for TRANSMIT command */
  294. int xmitx = 1; /* Whether to echo during TRANSMIT */
  295. int xmitf = 0; /* Character to fill empty lines */
  296. int xmitl = 0; /* 0 = Don't send linefeed too */
  297. int xmitp = LF; /* Host line prompt */
  298. int xmits = 0; /* Use shift-in/shift-out, 0 = no */
  299. int xmitw = 0; /* Milliseconds to pause during TRANSMIT */
  300. int xmitt = 1; /* Seconds to wait for each char to echo */
  301. int xmita = 1; /* Action upon timeout */
  302. #define XMI_BIN 1
  303. #define XMI_TXT 2
  304. #define XMI_CMD 3
  305. #define XMI_TRA 4
  306. #define XMI_VRB 5
  307. #define XMI_QUI 6
  308. #define XMI_NOW 7
  309. static struct keytab xmitsw[] = { /* TRANSMIT command options */
  310.     "/binary",          XMI_BIN, 0,
  311. #ifdef PIPESEND
  312.     "/command",         XMI_CMD, CM_INV,
  313. #endif /* PIPESEND */
  314.     "/nowait",          XMI_NOW, 0,
  315. #ifdef PIPESEND
  316.     "/pipe",            XMI_CMD, 0,
  317. #endif /* PIPESEND */
  318. #ifdef COMMENT
  319.     "/quiet",           XMI_QUI, 0,
  320. #endif /* COMMENT */
  321.     "/text",            XMI_TXT, 0,
  322.     "/transparent",     XMI_TRA, 0,
  323. #ifdef COMMENT
  324.     "/verbose",         XMI_VRB, 0,
  325. #endif /* COMMENT */
  326.     "", 0, 0
  327. };
  328. #define NXMITSW sizeof(xmitsw)/sizeof(struct keytab) - 1
  329. static int nxmitsw = NXMITSW;
  330. #endif /* NOXMIT */
  331. /* Declarations from ck?fio.c module */
  332. extern char *SPACMD, *SPACM2; /* SPACE commands */
  333. /* Command-oriented items */
  334. #ifdef DCMDBUF
  335. extern char *cmdbuf; /* Command buffers */
  336. extern char *atmbuf;
  337. extern char *line; /* Character buffer for anything */
  338. extern char *tmpbuf; /* Short temporary string buffer */
  339. extern int *ifcmd;
  340. extern int *intime;
  341. extern char *inpcas;
  342. #else
  343. extern char cmdbuf[]; /* Command buffers */
  344. extern char atmbuf[];
  345. extern char line[]; /* Character buffer for anything */
  346. extern char tmpbuf[]; /* Temporary buffer */
  347. extern int ifcmd[];
  348. extern int intime[];
  349. extern char inpcas[];
  350. #endif /* DCMDBUF */
  351. char *lp; /* Pointer to line buffer */
  352. #ifndef NOSPL
  353. int oldeval = 0;
  354. char evalbuf[33]; /* EVALUATE result */
  355. extern char * inpbuf; /* Buffer for INPUT and REINPUT */
  356. char *inpbp; /* And pointer to same */
  357. extern char lblbuf[]; /* Buffer for labels */
  358. int m_found; /* MINPUT result */
  359. int i_active = 0; /* INPUT command is active */
  360. char *ms[MINPMAX]; /* Pointers to MINPUT strings */
  361. static int mp[MINPMAX]; /* and flags */
  362. extern int fndiags, fnerror, fnsuccess; /* Function diagnostics */
  363. #endif /* NOSPL */
  364. char psave[PROMPTL] = { NUL }; /* For saving & restoring prompt */
  365. extern int success; /* Command success/failure flag */
  366. extern int cmdlvl; /* Current position in command stack */
  367. #ifndef NOSPL
  368. int /* SET INPUT parameters. */
  369. /* Note, INPUT TIMEOUT, intime[], is on the command-level stack. */
  370.   inbufsize = 0, /* INPUT buffer size */
  371.   indef = 1, /* default timeout, seconds */
  372.   inecho = 1, /* 1 = echo on */
  373.   inautodl = 0, /* INPUT autodownload */
  374.   inintr = 1, /* INPUT interrupion allowed */
  375.   insilence = 0; /* 0 = no silence constraint */
  376. #ifdef OS2
  377. int interm = 1; /* Terminal emulator displays input */
  378. #endif /* OS2 */
  379. int maclvl = -1; /* Macro nesting level */
  380. int mecho = 0; /* Macro echo, 0 = don't */
  381. char varnam[6]; /* For variable names */
  382. extern int macargc[]; /* ARGC from macro invocation */
  383. extern char *m_arg[MACLEVEL][NARGS]; /* Stack of macro arguments */
  384. extern char *mrval[];
  385. extern char **a_ptr[]; /* Array pointers */
  386. extern int a_dim[]; /* Array dimensions */
  387. #ifdef DCMDBUF
  388. extern struct cmdptr *cmdstk; /* The command stack itself */
  389. #else
  390. extern struct cmdptr cmdstk[]; /* The command stack itself */
  391. #endif /* DCMDBUF */
  392. long ck_alarm = 0; /* SET ALARM value */
  393. char alrm_date[10] = { ' ',' ',' ',' ',' ',' ',' ',' ',' ' };
  394. char alrm_time[ 8] = { ' ',' ',' ',' ',' ',' ',' ' };
  395. #endif /* NOSPL */
  396. static int x, y, z = 0; /* Local workers */
  397. static char *s;
  398. #define xsystem(s) zsyscmd(s)
  399. /* Top-Level Interactive Command Keyword Table */
  400. /* Keywords must be in lowercase and in alphabetical order. */
  401. struct keytab cmdtab[] = {
  402. #ifndef NOPUSH
  403.     "!",    XXSHE, CM_INV, /* Shell escape */
  404. #else
  405.     "!",    XXNOTAV, CM_INV,
  406. #endif /* NOPUSH */
  407.     "#",        XXCOM, CM_INV, /* Comment */
  408. #ifndef NOSPL
  409.     ".",           XXDEF, CM_INV, /* Assignment */
  410.     ":",           XXLBL, CM_INV, /* Label */
  411. #endif /* NOSPL */
  412. #ifdef CK_REDIR
  413. #ifndef NOPUSH
  414.     "<",           XXFUN, CM_INV, /* REDIRECT */
  415. #else
  416.     "<",           XXNOTAV, CM_INV, /* REDIRECT */
  417. #endif /* NOPUSH */
  418. #endif /* CK_REDIR */
  419. #ifndef NOPUSH
  420.     "@",           XXSHE, CM_INV, /* DCL escape */
  421. #else
  422.     "@",           XXNOTAV, CM_INV, /* DCL escape */
  423. #endif /* NOPUSH */
  424.     "about",       XXVER, CM_INV, /* Synonym for VERSION */
  425. #ifndef NOSPL
  426. #ifdef ADDCMD
  427.     "add",         XXADD, 0, /* ADD */
  428. #endif /* ADDCMD */
  429. #ifndef NODIAL
  430.     "answer",      XXANSW, 0, /* ANSWER the phone */
  431. #else
  432.     "answer",      XXNOTAV, CM_INV, /* ANSWER the phone */
  433. #endif /* NODIAL */
  434.     "apc",         XXAPC, 0, /* Application Program Command */
  435. #ifndef NOSPL
  436.     "array",       XXARRAY, 0,          /* Array operations */
  437. #endif /* NOSPL */
  438.     "ascii",       XXASC, CM_INV,
  439.     "asg",         XXASS, CM_INV,       /* Invisible synonym for ASSIGN */
  440.     "ask",         XXASK, 0, /* ASK for text, assign to variable */
  441.     "askq",        XXASKQ,0,            /* ASK quietly (no echo) */
  442. #ifndef NOSPL
  443.     "ass",         XXASS, CM_INV|CM_ABR,
  444.     "assert",      XXASSER, 0, /* ASSERT */
  445.     "assign",      XXASS, 0, /* ASSIGN */
  446. #endif /* NOSPL */
  447. #ifndef NOXFER
  448. #ifndef NOCSETS
  449.     "associate",   XXASSOC, 0, /* ASSOCIATE */
  450. #else
  451.     "associate",   XXNOTAV, CM_INV, /* ASSOCIATE */
  452. #endif /* NOCSETS */
  453. #endif /* NOXFER */
  454. #ifdef CK_KERBEROS
  455.     "authenticate",XXAUTH, /* Authentication */
  456. #ifdef CK_AUTHENTICATION
  457.                           0,
  458. #else
  459.                           CM_INV,
  460. #endif /* CK_AUTHENTICATION */
  461. #endif /* CK_KERBEROS */
  462. #endif /* NOSPL */
  463. #ifndef NOFRILLS
  464.     "back",        XXBACK,0, /* BACK to previous directory */
  465. #else
  466.     "back",        XXNOTAV,CM_INV,
  467. #endif /* NOFRILLS */
  468.     "beep",        XXBEEP,CM_INV, /* BEEP */
  469. #ifndef NOXFER
  470.     "binary",      XXBIN, CM_INV, /* == SET FILE TYPE BINARY */
  471. #endif /* NOXFER */
  472. #ifndef NOFRILLS
  473.     "bug",         XXBUG, CM_INV, /* BUG report instructions */
  474. #else
  475.     "bug",         XXNOTAV, CM_INV,
  476. #endif /* NOFRILLS */
  477. #ifdef BROWSER
  478.     "browse",      XXBROWS, 0, /* BROWSE (start browser) */
  479. #else
  480.     "browse",      XXNOTAV, CM_INV, /* BROWSE (start browser) */
  481. #endif /* BROWSER */
  482. #ifndef NOXFER
  483.     "bye",         XXBYE, 0, /* BYE to remote server */
  484. #endif /* NOXFER */
  485. #ifndef NOLOCAL
  486.     "c",           XXCON, CM_INV|CM_ABR, /* invisible synonym for CONNECT */
  487. #endif /* NOLOCAL */
  488. #ifndef NOFRILLS
  489.     "cat",         XXTYP, CM_INV, /* Invisible synonym for TYPE */
  490. #endif /* NOFRILLS */
  491. #ifndef NOSPL
  492. #ifdef COMMENT
  493. #ifndef NOXFER
  494.     "cautious",    XXCAU, CM_INV,
  495. #endif /* NOXFER */
  496. #endif /* COMMENT */
  497. #endif /* NOSPL */
  498.     "cd",          XXCWD, 0, /* Change Directory */
  499. #ifndef NOXFER
  500. #ifdef PIPESEND
  501.     "cget",        XXCGET, CM_INV, /* CGET */
  502. #else
  503.     "cget",        XXNOTAV, CM_INV, /* CGET */
  504. #endif /* PIPESEND */
  505. #endif /* NOXFER */
  506.     "check",       XXCHK, 0, /* CHECK for a feature */
  507.     "ckermit",     XXKERMI, CM_INV,
  508. #ifndef NOFRILLS
  509.     "clear",       XXCLE, 0, /* CLEAR input and/or device buffer */
  510. #else
  511.     "clear",       XXNOTAV, CM_INV,
  512. #endif /* NOFRILLS */
  513.     "close",    XXCLO, 0, /* CLOSE a log or other file */
  514.     "cls",         XXCLS, CM_INV, /* Clear Screen (CLS) */
  515.     "comment",     XXCOM, CM_INV, /* Introduce a comment */
  516. #ifndef NOLOCAL
  517.     "connect",     XXCON, 0, /* Begin terminal connection */
  518. #else
  519.     "connect",     XXNOTAV, 0,
  520. #endif /* NOLOCAL */
  521. #ifndef NOFRILLS
  522. #ifdef ZCOPY
  523.     "co",          XXCPY, CM_INV|CM_ABR,
  524.     "cop",         XXCPY, CM_INV|CM_ABR,
  525.     "copy",        XXCPY, 0, /* COPY a file */
  526. #else
  527.     "copy",        XXNOTAV, CM_INV,
  528. #endif /* ZCOPY */
  529.     "copyright",   XXCPR, CM_INV, /* COPYRIGHT */
  530. #ifdef ZCOPY
  531.     "cp",          XXCPY, CM_INV, /* COPY a file */
  532. #endif /* ZCOPY */
  533. #ifndef NOLOCAL
  534. #ifndef OS2
  535.     "cq",          XXCQ, CM_INV, /* CQ (connect quietly) */
  536. #endif /* OS2 */
  537. #endif /* NOLOCAL */
  538. #ifndef NOXFER
  539. #ifdef PIPESEND
  540.     "creceive",    XXCREC,CM_INV, /* CRECEIVE (receive to command) */
  541.     "csend",       XXCSEN,CM_INV, /* CSEND (send from command) */
  542. #else
  543.     "creceive",    XXNOTAV,CM_INV, /* CRECEIVE (receive to command) */
  544.     "csend",       XXNOTAV,CM_INV, /* CSEND (send from command) */
  545. #endif /* PIPESEND */
  546. #endif /* NOXFER */
  547. #endif /* NOFRILLS */
  548.     "cwd",    XXCWD, CM_INV, /* Invisible synonym for cd */
  549. #ifndef NOSPL
  550.     "date",        XXDATE,0, /* DATE */
  551.     "dcl",         XXDCL, CM_INV, /* DECLARE an array (see ARRAY) */
  552.     "declare",     XXDCL, CM_INV, /* DECLARE an array (see ARRAY) */
  553.     "decrement",   XXDEC, 0, /* DECREMENT a numeric variable */
  554.     "define",      XXDEF, 0, /* DEFINE a macro or variable */
  555. #else
  556.     "date",        XXNOTAV, CM_INV,
  557.     "dcl",         XXNOTAV, CM_INV,
  558.     "declare",     XXNOTAV, CM_INV,
  559.     "decrement",   XXNOTAV, CM_INV,
  560.     "define",      XXNOTAV, CM_INV,
  561. #endif /* NOSPL */
  562. #ifndef NOFRILLS
  563.     "delete",      XXDEL, 0, /* DELETE a file */
  564. #else
  565.     "delete",      XXNOTAV, CM_INV,
  566. #endif /* NOFRILLS */
  567. #ifndef NODIAL
  568.     "dial",    XXDIAL,0, /* DIAL a phone number */
  569. #else
  570.     "dial",    XXNOTAV, CM_INV,
  571. #endif /* NODIAL */
  572.     "directory",   XXDIR, 0, /* DIRECTORY of files */
  573. #ifndef NOFRILLS
  574. #ifndef NOSERVER
  575.     "disable",     XXDIS, 0, /* DISABLE a server function */
  576. #else
  577.     "disable",     XXNOTAV, CM_INV,
  578. #endif /* NOSERVER */
  579. #endif /* NOFRILLS */
  580. #ifndef NOSPL
  581.     "do",          XXDO,  0, /* DO (execute) a macro */
  582. #else
  583.     "do",          XXNOTAV, CM_INV,
  584. #endif /* NOSPL */
  585.     "e",           XXEXI, CM_INV|CM_ABR,
  586. #ifndef NOFRILLS
  587. #ifndef NOXFER
  588.     "e-packet",    XXERR, CM_INV, /* Send an Error-Packet */
  589. #endif /* NOXFER */
  590. #endif /* NOFRILLS */
  591.     "echo",        XXECH, 0, /* ECHO text */
  592. #ifndef NOFRILLS
  593. #ifndef NOPUSH
  594.     "edit",        XXEDIT, 0, /* EDIT */
  595. #else
  596.     "edit",        XXNOTAV, CM_INV, /* EDIT */
  597. #endif /* NOPUSH */
  598. #endif /* NOFRILLS */
  599.     "eightbit",    XXEIGHT, 0, /* EIGHTBIT */
  600. #ifndef NOSPL
  601.     "else",        XXELS, CM_INV, /* ELSE part of IF statement */
  602. #else
  603.     "else",        XXNOTAV, CM_INV, /* ELSE part of IF statement */
  604. #endif /* NOSPL */
  605. #ifndef NOSERVER
  606. #ifndef NOFRILLS
  607.     "enable",      XXENA,  0, /* ENABLE a server function */
  608. #else
  609.     "enable",      XXNOTAV, CM_INV,
  610. #endif /* NOFRILLS */
  611. #endif /* NOSERVER */
  612. #ifndef NOSPL
  613.     "end",         XXEND,  0, /* END command file or macro */
  614.     "evaluate",    XXEVAL, 0, /* EVALUATE */
  615. #else
  616.     "end",         XXNOTAV, CM_INV,
  617.     "evaluate",    XXNOTAV, CM_INV,
  618. #endif /* NOSPL */
  619.     "ex",          XXEXI, CM_INV|CM_ABR, /* Let "ex" still be EXIT */
  620. #ifdef CKEXEC
  621.     "exec",        XXEXEC, CM_INV, /* exec() */
  622. #else
  623.     "exec",        XXNOTAV, CM_INV,
  624. #endif /* CKEXEC */
  625.     "exit",    XXEXI, 0, /* EXIT from C-Kermit */
  626.     "extended-options", XXXOPTS,CM_INV|CM_HLP, /* Extended-Options */
  627. #ifdef OS2
  628.     "extproc",     XXCOM, CM_INV, /* Dummy command for OS/2 */
  629. #endif /* OS2 */
  630. #ifndef NOXFER
  631.     "f",           XXFIN, CM_INV|CM_ABR, /* Invisible abbreviation for FIN */
  632. #endif /* NOXFER */
  633. #ifndef NOSPL
  634.     "fail",        XXFAIL,0, /* FAIL */
  635. #ifdef COMMENT
  636. #ifndef NOXFER
  637.     "fast",        XXFAST, CM_INV,
  638. #endif /* NOXFER */
  639. #endif /* COMMENT */
  640. #ifdef CKCHANNELIO
  641.     "fclose",      XXF_CL, CM_INV, /* FCLOSE */
  642.     "fcount",      XXF_CO, CM_INV, /* FCOUNT */
  643.     "fflush",      XXF_FL, CM_INV, /* FFLUSH */
  644. #endif /* CKCHANNELIO */
  645. #ifndef NOXFER
  646.     "fi",          XXFIN, CM_INV|CM_ABR, /* FINISH */
  647. #endif /* NOXFER */
  648. #ifdef CKCHANNELIO
  649.     "file",        XXFILE, 0, /* FILE */
  650. #endif /* CKCHANNELIO */
  651. #endif /* NOSPL */
  652. #ifndef NOXFER
  653.     "finish",      XXFIN, 0, /* FINISH */
  654. #endif /* NOXFER */
  655. #ifdef CKCHANNELIO
  656.     "flist",      XXF_LI, CM_INV, /* FLIST */
  657.     "fopen",      XXF_OP, CM_INV, /* FOPEN */
  658. #endif /* CKCHANNELIO */
  659. #ifndef NOSPL
  660.     "fo",          XXFOR, CM_INV|CM_ABR, /* Invisible abbreviation for... */
  661.     "for",         XXFOR, 0, /* FOR loop */
  662.     "forward",     XXFWD, CM_INV, /* FORWARD */
  663. #endif /* NOSPL */
  664. #ifndef NOFRILLS
  665.     "fot",    XXDIR, CM_INV, /* "fot" = "dir" (for Chris) */
  666. #endif /* NOFRILLS */
  667. #ifdef CKCHANNELIO
  668.     "fread",      XXF_RE, CM_INV, /* FREAD */
  669.     "frewind",    XXF_RW, CM_INV, /* FREWIND */
  670.     "fseek",      XXF_SE, CM_INV, /* FSEEK */
  671.     "fstatus",    XXF_ST, CM_INV, /* FSTATUS */
  672. #endif /* CKCHANNELIO */
  673. #ifdef TCPSOCKET
  674. #ifndef NOPUSH
  675.     "ftp",    XXFTP,   CM_INV, /* FTP */
  676. #else
  677.     "ftp",    XXNOTAV, CM_INV,
  678. #endif /* NOPUSH */
  679. #else
  680.     "ftp",    XXNOTAV, CM_INV,
  681. #endif /* TCPSOCKET */
  682. #ifndef NOSPL
  683.     "function",    XXFUNC, CM_INV|CM_HLP, /* Function (for HELP FUNCTION) */
  684. #endif /* NOSPL */
  685. #ifdef CKCHANNELIO
  686.     "fwrite",      XXF_WR, CM_INV, /* FWRITE */
  687. #endif /* CKCHANNELIO */
  688. #ifndef NOXFER
  689.     "g",           XXGET, CM_INV|CM_ABR, /* Invisible abbreviation for GET */
  690. #ifndef NOSPL
  691.     "ge",          XXGET, CM_INV|CM_ABR, /* Ditto */
  692. #endif /* NOSPL */
  693.     "get",         XXGET, 0, /* GET */
  694. #endif /* NOXFER */
  695. #ifndef NOSPL
  696.     "getc",        XXGETC, 0, /* GETC */
  697. #ifdef OS2
  698.     "getkeycode",  XXGETK, 0, /* GETKEYCODE */
  699. #endif /* OS2 */
  700. #ifndef NOFRILLS
  701.     "getok",       XXGOK, 0, /* GETOK (ask for Yes/No/OK) */
  702. #endif /* NOFRILLS */
  703. #endif /* NOSPL */
  704. #ifndef NOSPL
  705.     "goto",        XXGOTO,0,  /* GOTO label in take file or macro */
  706. #endif /* NOSPL */
  707.     "h",           XXHLP, CM_INV|CM_ABR, /* Invisible synonym for HELP */
  708. #ifndef NOLOCAL
  709.     "hangup",      XXHAN, 0,  /* HANGUP the connection */
  710. #endif /* NOLOCAL */
  711.     "help",    XXHLP, 0,  /* Display HELP text */
  712. #ifndef NOHTTP
  713. #ifdef TCPSOCKET
  714.     "http",        XXHTTP,CM_INV,  /* HTTP operations (not yet) */
  715. #endif /* TCPSOCKET */
  716. #endif /* NOHTTP */
  717. #ifndef NOSPL
  718.     "i",           XXINP, CM_INV|CM_ABR, /* Invisible synonym for INPUT */
  719.     "if",          XXIF,  0,  /* IF ( condition ) command */
  720. #ifdef TCPSOCKET
  721.     "iksd",        XXIKSD,0,            /* IKSD (TCP/IP only) */
  722. #else
  723.     "iksd",        XXNOTAV, CM_INV,
  724. #endif /* TCPSOCKET */
  725.     "in",          XXINP, CM_INV|CM_ABR, /* Invisible synonym for INPUT */
  726.     "increment",   XXINC, 0,  /* Increment a numeric variable */
  727.     "input",       XXINP, 0,  /* INPUT text from comm device */
  728. #endif /* NOSPL */
  729. #ifndef NOHELP
  730.     "int",         XXINT, CM_INV|CM_ABR,
  731.     "intr",        XXINT, CM_INV|CM_ABR,
  732.     "intro",       XXINT, 0,
  733.     "introduction",XXINT, CM_INV, /* Print introductory text */
  734. #else
  735.     "intro",       XXNOTAV, CM_INV,
  736.     "introduction",XXNOTAV, CM_INV,
  737. #endif /* NOHELP */
  738. #ifdef OS2
  739.     "k95",         XXKERMI, CM_INV, /* Hmmm what's this... */
  740.     "kermit",      XXKERMI, CM_INV,
  741. #else
  742.     "kermit",      XXKERMI, CM_INV,
  743. #endif /* OS2 */
  744. #ifdef OS2
  745. #ifndef NOKVERBS
  746.     "kverb",       XXKVRB, CM_INV|CM_HLP, /* Keyboard verb */
  747. #endif /* NOKVERBS */
  748. #endif /* OS2 */
  749. #ifndef NOFRILLS
  750.     "l",           XXLOG, CM_INV|CM_ABR, /* Invisible synonym for log */
  751. #endif /* NOFRILLS */
  752. #ifndef NOSPL
  753.     "lineout",     XXLNOUT, 0, /* LINEOUT = OUTPUT + eol */
  754. #endif /* NOSPL */
  755. #ifndef NOFRILLS
  756.     "lo",           XXLOG, CM_INV|CM_ABR, /* Invisible synonym for log */
  757. #endif /* NOFRILLS */
  758. #ifndef NOSPL
  759.     "local",       XXLOCAL, 0, /* LOCAL variable declaration */
  760. #else
  761.     "local",       XXNOTAV, CM_INV,
  762. #endif /* NOSPL */
  763.     "log",      XXLOG, 0, /* Open a log file */
  764.     "login",       XXLOGIN,  0, /* LOGIN to server or IKSD */
  765.     "logout",      XXLOGOUT, 0,         /* LOGOUT from server or IKSD */
  766. #ifndef NOFRILLS
  767. #ifndef NODIAL
  768.     "lookup",      XXLOOK,0, /* LOOKUP */
  769. #else
  770.     "lookup",      XXNOTAV, CM_INV,
  771. #endif /* NODIAL */
  772. #ifdef UNIXOROSK
  773.     "ls",          XXLS,  0, /* UNIX ls command */
  774. #else
  775.     "ls",          XXDIR, CM_INV, /* Invisible synonym for DIR */
  776. #endif /* UNIXOROSK */
  777. #ifndef NOXFER
  778.     "mail",        XXMAI, 0, /* Send a file as e-mail */
  779. #endif /* NOXFER */
  780. #ifndef NOHELP
  781.     "manual",      XXMAN, 0, /* MAN(UAL) */
  782. #else
  783.     "manual",      XXNOTAV, CM_INV,
  784. #endif /* NOHELP */
  785. #endif /* NOFRILLS */
  786. #ifdef CK_MKDIR
  787.     "md",          XXMKDIR, CM_INV, /* Synonym for MKDIR */
  788. #endif /* CK_MKDIR */
  789. #ifdef CK_MINPUT
  790.     "minput",      XXMINP, 0, /* MINPUT */
  791. #else
  792.     "minput",      XXNOTAV, CM_INV,
  793. #endif /* CK_MINPUT */
  794. #ifndef NOMSEND
  795.     "mget",        XXMGET, 0, /* MGET */
  796. #else
  797.     "mget",        XXNOTAV, CM_INV,
  798. #endif /* NOMSEND */
  799. #ifdef CK_MKDIR
  800.     "mkdir",       XXMKDIR, 0, /* MKDIR */
  801. #else
  802.     "mkdir",       XXNOTAV, CM_INV,
  803. #endif /* CK_MKDIR */
  804. #ifndef NOXFER
  805. #ifndef NOMSEND
  806.     "mmove",       XXMMOVE, 0, /* MMOVE */
  807. #else
  808.     "mmove",       XXNOTAV, CM_INV,
  809. #endif /* NOMSEND */
  810. #endif /* NOXFER */
  811. #ifndef NOFRILLS
  812.     "more",        XXMORE, CM_INV, /* MORE */
  813. #endif /* NOFRILLS */
  814. #ifndef NOXFER
  815.     "move",        XXMOVE, 0, /* MOVE  */
  816. #endif /* NOXFER */
  817. #ifndef NOSPL
  818.     "mpause",      XXMSL, CM_INV, /* Millisecond sleep */
  819. #else
  820.     "mpause",      XXNOTAV, CM_INV,
  821. #endif /* NOSPL */
  822. #ifndef NOXFER
  823. #ifndef NOMSEND
  824.     "mput",        XXMSE, CM_INV, /* MPUT = MSEND */
  825.     "ms",          XXMSE, CM_INV|CM_ABR,
  826.     "msend",       XXMSE, 0, /* Multiple SEND */
  827. #else
  828.     "mput",        XXNOTAV, CM_INV,
  829.     "msend",       XXNOTAV, CM_INV,
  830. #endif /* NOMSEND */
  831. #endif /* NOXFER */
  832. #ifndef NOSPL
  833.     "msleep",      XXMSL, 0, /* Millisecond sleep */
  834. #else
  835.     "msleep",      XXNOTAV, CM_INV,
  836. #endif /* NOSPL */
  837. #ifndef NOFRILLS
  838.     "mv",          XXREN, CM_INV, /* Synonym for rename */
  839. #endif /* NOFRILLS */
  840. #ifndef NOHELP
  841.     "news",        XXNEW, CM_INV, /* Display NEWS of new features */
  842. #else
  843.     "news",        XXNOTAV, CM_INV,
  844. #endif /* NOHELP */
  845.     "nolocal",     XXNLCL, CM_INV, /* Disable SET LINE / SET HOST */
  846.     "nopush",      XXNPSH, CM_INV, /* Disable PUSH command/features */
  847. #ifndef NOSPL
  848.     "o",           XXOUT, CM_INV|CM_ABR, /* Invisible synonym for OUTPUT */
  849.     "open",        XXOPE, 0, /* OPEN file for reading or writing */
  850. #else
  851.     "open",        XXNPSH, CM_INV, /* Disable PUSH command/features */
  852. #endif /* NOSPL */
  853. #ifndef NOHELP
  854.     "options",     XXOPTS,CM_INV|CM_HLP, /* Options */
  855. #endif /* NOHELP */
  856. #ifndef NOSPL
  857.     "output",      XXOUT, 0, /* OUTPUT text to comm device */
  858. #else
  859.     "output",      XXNOTAV, CM_INV,
  860. #endif /* NOSPL */
  861. #ifdef ANYX25
  862. #ifndef IBMX25
  863.     "pad",         XXPAD, 0,            /* X.3 PAD commands */
  864. #endif /* IBMX25 */
  865. #endif /* ANYX25 */
  866. #ifndef NOSPL
  867.     "pause",       XXPAU, 0, /* Sleep for specified interval */
  868. #else
  869.     "pause",       XXNOTAV, CM_INV,
  870. #endif /* NOSPL */
  871. #ifndef NODIAL
  872.     "pdial",       XXPDIA,0, /* PDIAL (partial dial) */
  873. #else
  874.     "pdial",       XXNOTAV, CM_INV,
  875. #endif /* NODIAL */
  876. #ifdef TCPSOCKET
  877. #ifndef NOPUSH
  878.     "ping",        XXPNG, CM_INV, /* PING */
  879. #else
  880.     "ping",        XXNOTAV, CM_INV,
  881. #endif /* NOPUSH */
  882. #endif /* TCPSOCKET */
  883. #ifdef NETCMD
  884. #ifndef NOPUSH
  885.     "pipe",        XXPIPE, 0, /* PIPE */
  886. #else
  887.     "pipe",        XXNOTAV, CM_INV, /* PIPE */
  888. #endif /* NOPUSH */
  889. #endif /* NETCMD */
  890. #ifndef NOSPL
  891.     "pop",         XXEND, CM_INV, /* Invisible synonym for END */
  892. #endif /* NOSPL */
  893. #ifndef NOFRILLS
  894.     "print",       XXPRI, 0, /* PRINT a file locally */
  895. #endif /* NOFRILLS */
  896. #ifndef NOXFER
  897. #ifdef CK_RESEND
  898.     "psend",       XXPSEN, CM_INV, /* PSEND */
  899. #else
  900.     "psend",       XXNOTAV, CM_INV,
  901. #endif /* CK_RESEND */
  902. #endif /* NOXFER */
  903. #ifdef NETPTY
  904.     "pty",         XXPTY, 0, /* PTY */
  905. #else
  906.     "pty",         XXNOTAV, CM_INV,
  907. #endif /* NETPTY */
  908. #ifndef NOPUSH
  909.     "pu",          XXSHE, CM_INV|CM_ABR, /* PU = PUSH */
  910. #endif /* NOPUSH */
  911. #ifdef CKPURGE
  912.     "purge",       XXPURGE, 0, /* PURGE (real) */
  913. #else
  914. #ifdef VMS
  915.     "purge",       XXPURGE, 0, /* PURGE (fake) */
  916. #else
  917.     "purge",       XXNOTAV, CM_INV,
  918. #endif /* VMS */
  919. #endif /* CKPURGE */
  920. #ifndef NOPUSH
  921.     "push",        XXSHE, 0, /* PUSH command (like RUN, !) */
  922. #else
  923.     "push",        XXNOTAV, CM_INV,
  924. #endif /* NOPUSH */
  925. #ifndef NOXFER
  926.     "put",    XXSEN, CM_INV, /* PUT = SEND */
  927. #endif /* NOXFER */
  928.     "pwd",         XXPWD, 0,            /* Print Working Directory */
  929.     "q",           XXQUI, CM_INV|CM_ABR, /* Invisible synonym for QUIT */
  930. #ifndef NOXFER
  931.     "query",       XXRQUE,0,
  932. #endif /* NOXFER */
  933.     "quit",    XXQUI, 0, /* QUIT from program = EXIT */
  934. #ifndef NOXFER
  935.     "r",           XXREC, CM_INV|CM_ABR, /* Invisible synonym for RECEIVE */
  936. #endif /* NOXFER */
  937. #ifndef NOXFER
  938.     "rasg",        XXRASG, CM_INV, /* REMOTE ASSIGN */
  939.     "rassign",     XXRASG, CM_INV, /* ditto */
  940.     "rcd",         XXRCWD, CM_INV, /* REMOTE CD */
  941.     "rcopy",       XXRCPY, CM_INV, /* REMOTE COPY */
  942.     "rcwd",        XXRCWD, CM_INV, /* REMOTE CWD */
  943.     "rdelete",     XXRDEL, CM_INV, /* REMOTE DELETE */
  944.     "rdirectory",  XXRDIR, CM_INV, /* REMODE DIRECTORY */
  945. #endif /* NOXFER */
  946. #ifndef NOSPL
  947.     "read",        XXREA, 0,            /* READ a line from a file */
  948. #else
  949.     "read",        XXNOTAV, CM_INV,
  950. #endif /* NOSPL */
  951. #ifndef NOXFER
  952.     "receive",    XXREC, 0, /* RECEIVE files */
  953. #endif /* NOXFER */
  954. #ifndef NODIAL
  955.     "red",         XXRED, CM_INV|CM_ABR, /* Invisible synonym for REDIAL */
  956.     "redi",        XXRED, CM_INV|CM_ABR, /* Invisible synonym for REDIAL */
  957.     "redial",      XXRED, 0, /* REDIAL last DIAL number */
  958. #else
  959.     "red",         XXNOTAV, CM_INV,
  960.     "redi",        XXNOTAV, CM_INV,
  961.     "redial",      XXNOTAV, CM_INV,
  962. #endif /* NODIAL */
  963. #ifdef CK_REDIR
  964. #ifdef OS2
  965. #ifndef NOPUSH
  966.     "redirect",    XXFUN, CM_INV, /* REDIRECT local command to ttyfd */
  967. #else
  968.     "redirect",    XXNOTAV, CM_INV,
  969. #endif /* NOPUSH */
  970. #else /* OS2 */
  971. #ifndef NOPUSH
  972.     "redirect",    XXFUN, 0, /* REDIRECT local command to ttyfd */
  973. #else
  974.     "redirect",    XXNOTAV, CM_INV,
  975. #endif /* NOPUSH */
  976. #endif /* OS2 */
  977. #endif /* CK_REDIR */
  978. #ifdef CK_RECALL
  979.     "redo",        XXREDO,  CM_NOR, /* REDO */
  980. #else
  981.     "redo",        XXNOTAV, CM_INV,
  982. #endif /* CK_RECALL */
  983. #ifndef NOXFER
  984. #ifdef CK_RESEND
  985.     "reget",       XXREGET, 0, /* REGET */
  986. #else
  987.     "reget",       XXNOTAV, CM_INV,
  988. #endif /* CK_RESEND */
  989. #endif /* NOXFER */
  990. #ifndef NOHELP
  991.     "regular-expressions", XXWILD,CM_INV|CM_HLP,
  992. #endif /* NOHELP */
  993. #ifndef NOSPL
  994.     "reinput",     XXREI, 0,            /* REINPUT (from INPUT buffer) */
  995. #else
  996.     "reinput",     XXNOTAV, CM_INV,
  997. #endif /* NOSPL */
  998. #ifndef NOXFER
  999. #ifdef ADDCMD
  1000.     "rem",         XXREM, CM_INV|CM_ABR,
  1001.     "remo",        XXREM, CM_INV|CM_ABR,
  1002. #endif /* ADDCMD */
  1003.     "remote",    XXREM, 0, /* Send REMOTE command to server */
  1004. #endif /* NOXFER */
  1005. #ifdef ADDCMD
  1006.     "remove",      XXREMV,0, /* REMOVE (something from a list) */
  1007. #else
  1008.     "remove",      XXNOTAV, CM_INV,
  1009. #endif /* ADDCMD */
  1010. #ifndef NOFRILLS
  1011. #ifndef NORENAME
  1012.     "rename",      XXREN, 0, /* RENAME a local file */
  1013. #else
  1014.     "rename",      XXNOTAV, CM_INV,
  1015. #endif /* NORENAME */
  1016.     "replay",      XXTYP, CM_INV, /* REPLAY (for now, just type) */
  1017. #endif /* NOFRILLS */
  1018. #ifndef NOXFER
  1019. #ifdef CK_RESEND
  1020.     "res",         XXRSEN, CM_INV|CM_ABR, /* RESEND */
  1021.     "rese",        XXRSEN, CM_INV|CM_ABR, /* RESEND */
  1022.     "resend",      XXRSEN, 0,   /* RESEND */
  1023. #else
  1024.     "res",         XXNOTAV, CM_INV,
  1025.     "rese",        XXNOTAV, CM_INV,
  1026.     "resend",      XXNOTAV, CM_INV,
  1027. #endif /* CK_RESEND */
  1028. #endif /* NOXFER */
  1029.     "reset",       XXRESET, CM_INV, /* RESET */
  1030. #ifdef CK_RESEND
  1031. #ifndef NOSPL
  1032.     "ret",         XXRET, CM_INV|CM_ABR,
  1033. #endif /* NOSPL */
  1034. #endif /* CK_RESEND */
  1035. #ifndef NOXFER
  1036.     "retrieve",    XXRETR, CM_INV, /* RETRIEVE */
  1037. #endif /* NOXFER */
  1038. #ifndef NOSPL
  1039.     "return",      XXRET, 0, /* RETURN from a function */
  1040. #else
  1041.     "return",      XXNOTAV, CM_INV,
  1042. #endif /* NOSPL */
  1043. #ifndef NOXFER
  1044.     "rexit",      XXRXIT, CM_INV, /* REMOTE EXIT */
  1045. #endif /* NOXFER */
  1046. #ifdef CK_REXX
  1047. #ifndef NOPUSH
  1048.     "rexx",       XXREXX, 0, /* Execute a Rexx command */
  1049. #else
  1050.     "rexx",       XXNOTAV, CM_INV,
  1051. #endif /* NOPUSH */
  1052. #endif /* CK_REXX */
  1053. #ifndef NOXFER
  1054.     "rhelp",      XXRHLP, CM_INV, /* REMOTE HELP */
  1055.     "rhost",      XXRHOS, CM_INV, /* REMOTE HOST */
  1056.     "rkermit",    XXRKER, CM_INV, /* REMOTE KERMIT */
  1057. #endif /* NOXFER */
  1058. #ifdef TCPSOCKET
  1059.     "rlogin",    XXRLOG, 0, /* Make an Rlogin connection */
  1060. #else
  1061.     "rlogin",    XXNOTAV, CM_INV,
  1062. #endif /* TCPSOCKET */
  1063. #ifndef NOFRILLS
  1064.     "rm",          XXDEL, CM_INV, /* Invisible synonym for delete */
  1065. #endif /* NOFRILLS */
  1066. #ifdef CK_MKDIR
  1067.     "rmdir",       XXRMDIR, 0,          /* RMDIR */
  1068. #else
  1069.     "rmdir",       XXNOTAV, CM_INV,
  1070. #endif /* CK_MKDIR */
  1071. #ifndef NOXFER
  1072.     "rmkdir",      XXRMKD, CM_INV, /* REMOTE MKDIR */
  1073. #ifndef NOSPL
  1074.     "robust",      XXROB,  CM_INV,
  1075. #else
  1076.     "robust",      XXNOTAV, CM_INV,
  1077. #endif /* NOSPL */
  1078.     "rpwd",        XXRPWD, CM_INV, /* REMOTE PWD */
  1079.     "rquery",      XXRQUE, CM_INV, /* REMOTE QUERY */
  1080. #endif /* NOXFER */
  1081. #ifdef CK_RECALL
  1082.     "rr",          XXREDO, CM_INV|CM_NOR,
  1083. #endif /* CK_RECALL */
  1084. #ifndef NOXFER
  1085.     "rrename",    XXRREN, CM_INV, /* REMOTE RENAME */
  1086.     "rrmdir",     XXRRMD, CM_INV, /* REMOTE REMDIR */
  1087.     "rset",       XXRSET, CM_INV, /* REMOTE SET */
  1088.     "rspace",     XXRSPA, CM_INV, /* REMOTE SPACE */
  1089.     "rtype",      XXRTYP, CM_INV, /* REMOTE TYPE */
  1090. #endif /* NOXFER */
  1091. #ifndef NOPUSH
  1092.     "run",         XXSHE, 0, /* RUN a program or command */
  1093. #else
  1094.     "run",         XXNOTAV, CM_INV,
  1095. #endif /* NOPUSH */
  1096. #ifndef NOXFER
  1097.     "rwho",        XXRWHO, CM_INV, /* REMOTE WHO */
  1098.     "s",           XXSEN, CM_INV|CM_ABR, /* Invisible synonym for send */
  1099. #endif /* NOXFER */
  1100. #ifndef NOSETKEY
  1101. #ifdef OS2
  1102.     "save",    XXSAVE, 0, /* SAVE something */
  1103. #else
  1104.     "save",    XXSAVE, CM_INV,
  1105. #endif /* OS2 */
  1106. #else
  1107.     "save",    XXNOTAV, CM_INV,
  1108. #endif /* NOSETKEY */
  1109. #ifndef NOSCRIPT
  1110.     "sc",     XXLOGI, CM_INV|CM_ABR,
  1111.     "scr",    XXLOGI, CM_INV|CM_ABR,
  1112. #endif /* NOSCRIPT */
  1113.     "screen",      XXSCRN, 0, /* SCREEN actions */
  1114. #ifndef NOSCRIPT
  1115.     "script",    XXLOGI,0, /* Expect-Send-style script line */
  1116. #else
  1117.     "script",    XXNOTAV, CM_INV,
  1118. #endif /* NOSCRIPT */
  1119. #ifndef NOXFER
  1120.     "send",    XXSEN, 0, /* Send (a) file(s) */
  1121. #ifndef NOSERVER
  1122.     "server",    XXSER, 0, /* Be a SERVER */
  1123. #else
  1124.     "server",    XXNOTAV, CM_INV,
  1125. #endif /* NOSERVER */
  1126. #endif /* NOXFER */
  1127.     "set",    XXSET, 0, /* SET parameters */
  1128. #ifndef NOSPL
  1129. #ifndef NOSHOW
  1130.     "sh",          XXSHO, CM_INV|CM_ABR,/* SHOW parameters */
  1131. #endif /* NOSHOW */
  1132.     "shift",       XXSHIFT, 0, /* SHIFT args */
  1133. #else
  1134.     "shift",       XXNOTAV, CM_INV,
  1135. #endif /* NOSPL */
  1136. #ifndef NOSHOW
  1137.     "show",     XXSHO, 0, /* SHOW parameters */
  1138. #else
  1139.     "show",     XXNOTAV, CM_INV,
  1140. #endif /* NOSHOW */
  1141. #ifndef NOSPL
  1142. #ifndef NOFRILLS
  1143.     "sleep",       XXPAU, CM_INV, /* SLEEP for specified interval */
  1144. #endif /* NOFRILLS */
  1145.     "sort",        XXSORT, CM_INV, /* (see ARRAY) */
  1146. #else
  1147.     "sort",        XXNOTAV, CM_INV,
  1148. #endif /* NOSPL */
  1149. #ifndef MAC
  1150. #ifndef NOFRILLS
  1151.     "sp",          XXSPA, CM_INV|CM_ABR,
  1152.     "spa",         XXSPA, CM_INV|CM_ABR,
  1153. #endif /* NOFRILLS */
  1154.     "space",       XXSPA, 0, /* Show available disk SPACE */
  1155. #endif /* MAC */
  1156. #ifndef NOFRILLS
  1157. #ifndef NOPUSH
  1158.     "spawn",       XXSHE, CM_INV, /* Synonym for PUSH, RUN */
  1159. #else
  1160.     "spawn",       XXNOTAV, CM_INV, /* Synonym for PUSH, RUN */
  1161. #endif /* NOPUSH */
  1162. #endif /* NOFRILLS */
  1163. #ifndef NOXFER
  1164.     "sta",         XXSTA, CM_INV|CM_ABR,
  1165.     "stat",        XXSTA, CM_INV|CM_ABR,
  1166.     "statistics",  XXSTA, 0, /* Display file transfer stats */
  1167. #endif /* NOXFER */
  1168.     "status",      XXSTATUS, 0, /* Show status of previous command */
  1169. #ifndef NOSPL
  1170.     "stop",        XXSTO, 0, /* STOP all take files and macros */
  1171.     "succeed",     XXSUCC, 0, /* SUCCEED */
  1172. #else
  1173.     "stop",        XXNOTAV, CM_INV,
  1174.     "succeed",     XXNOTAV, CM_INV,
  1175. #endif /* NOSPL */
  1176. #ifndef NOFRILLS
  1177.     "support",     XXBUG, 0, /* BUG report instructions */
  1178. #else
  1179.     "support",     XXNOTAV, CM_INV,
  1180. #endif /* NOFRILLS */
  1181. #ifndef NOJC
  1182.     "suspend",     XXSUS, 0, /* SUSPEND C-Kermit (UNIX only) */
  1183. #else
  1184.     "suspend",     XXNOTAV, CM_INV,
  1185. #endif /* NOJC */
  1186. #ifndef NOSPL
  1187.     "switch",      XXSWIT, 0, /* SWITCH */
  1188. #else
  1189.     "switch",      XXNOTAV, CM_INV,
  1190. #endif /* NOSPL */
  1191. #ifdef CK_TAPI
  1192.     "ta",    XXTAK, CM_INV|CM_ABR, /* (because of TAPI) */
  1193. #endif /* CK_TAPI */
  1194.     "take",    XXTAK, 0, /* TAKE commands from a file */
  1195. #ifdef CK_TAPI
  1196.     "tapi",    XXTAPI, 0, /* Microsoft TAPI commands */
  1197. #else
  1198.     "tapi",    XXNOTAV, CM_INV,
  1199. #endif /* CK_TAPI */
  1200. #ifndef NOFRILLS
  1201. #ifdef TCPSOCKET
  1202.     "tel",         XXTEL, CM_INV|CM_ABR,
  1203.     "telnet",      XXTEL, 0, /* TELNET (TCP/IP only) */
  1204.     "telopt",      XXTELOP, CM_INV,     /* TELOPT (ditto) */
  1205. #else
  1206.     "tel",         XXNOTAV, CM_INV,
  1207.     "telnet",      XXNOTAV, CM_INV,
  1208.     "telopt",      XXNOTAV, CM_INV,
  1209. #endif /* TCPSOCKET */
  1210. #ifdef OS2
  1211.     "terminal",    XXTERM, 0, /* == SET TERMINAL TYPE */
  1212. #else
  1213.     "terminal",    XXTERM, CM_INV,
  1214. #endif /* OS2 */
  1215. #endif /* NOFRILLS */
  1216. #ifndef NOXFER
  1217.     "text",        XXASC, CM_INV, /* == SET FILE TYPE TEXT */
  1218. #endif /* NOXFER */
  1219. #ifndef NOSPL
  1220.     "trace",       XXTRACE, 0, /* TRACE */
  1221. #else
  1222.     "trace",       XXNOTAV, CM_INV,
  1223. #endif /* NOSPL */
  1224. #ifndef NOCSETS
  1225.     "translate",   XXXLA, 0, /* TRANSLATE local file char sets */
  1226. #else
  1227.     "translate",   XXNOTAV, CM_INV,
  1228. #endif /* NOCSETS */
  1229. #ifndef NOXMIT
  1230.     "transmit",    XXTRA, 0, /* Send (upload) a file, no protocol */
  1231. #else
  1232.     "transmit",    XXNOTAV, CM_INV,
  1233. #endif /* NOXMIT */
  1234. #ifndef NOFRILLS
  1235.     "type",        XXTYP, 0, /* Display a local file */
  1236. #endif /* NOFRILLS */
  1237. #ifndef NOSPL
  1238.     "undefine",    XXUNDEF, 0, /* UNDEFINE a variable or macro */
  1239. #else
  1240.     "undefine",    XXNOTAV, CM_INV,
  1241. #endif /* NOSPL */
  1242. #ifdef COMMENT
  1243.     "updates",     XXUPD, 0, /* View UPDATES file */
  1244. #endif /* COMMENT */
  1245.     "version",     XXVER, 0, /* VERSION-number display */
  1246. #ifdef OS2
  1247.     "viewonly",    XXVIEW, 0, /* VIEWONLY Terminal Mode */
  1248. #endif /* OS2 */
  1249. #ifndef NOSPL
  1250.     "wait",        XXWAI, 0, /* WAIT (like pause) */
  1251. #else
  1252.     "wait",        XXNOTAV, CM_INV,
  1253. #endif /* NOSPL */
  1254.     "wermit",      XXKERMI, CM_INV,
  1255. #ifndef NOXFER
  1256.     "where",       XXWHERE, 0, /* WHERE (did my file go?) */
  1257. #endif /* NOXFER */
  1258. #ifndef NOSPL
  1259.     "while",       XXWHI, 0, /* WHILE loop */
  1260. #else
  1261.     "while",       XXNOTAV, CM_INV,
  1262. #endif /* NOSPL */
  1263. #ifndef OS2
  1264. #ifndef MAC
  1265. #ifndef NOFRILLS
  1266.     "who",         XXWHO, 0, /* WHO's logged in? */
  1267. #endif /* NOFRILLS */
  1268. #endif /* MAC */
  1269. #endif /* OS2 */
  1270. #ifndef NOHELP
  1271.     "wildcards",   XXWILD,CM_INV|CM_HLP, /* Wildcard syntax */
  1272. #endif /* NOHELP */
  1273. #ifndef NOSPL
  1274.     "wr",          XXWRI, CM_INV|CM_ABR,
  1275.     "wri",         XXWRI, CM_INV|CM_ABR,
  1276.     "writ",        XXWRI, CM_INV|CM_ABR,
  1277.     "write",       XXWRI, 0, /* WRITE characters to a file */
  1278.     "write-line",  XXWRL, CM_INV, /* WRITE a line to a file */
  1279.     "writeln",     XXWRL, CM_INV, /* Pascalisch synonym for write-line */
  1280. #else
  1281.     "wr",          XXNOTAV, CM_INV,
  1282.     "wri",         XXNOTAV, CM_INV,
  1283.     "writ",        XXNOTAV, CM_INV,
  1284.     "write",       XXNOTAV, CM_INV,
  1285.     "write-line",  XXNOTAV, CM_INV,
  1286.     "writeln",     XXNOTAV, CM_INV,
  1287. #endif /* NOSPL */
  1288. #ifndef NOFRILLS
  1289.     "xecho",       XXXECH,0, /* XECHO */
  1290. #endif /* NOFRILLS */
  1291. #ifndef NOSPL
  1292.     "xif",         XXIFX, CM_INV, /* Extended IF command (obsolete) */
  1293. #else
  1294.     "xif",         XXNOTAV, CM_INV,
  1295. #endif /* NOSPL */
  1296. #ifndef NOCSETS
  1297.     "xlate",       XXXLA, CM_INV, /* Synonym for TRANSLATE */
  1298. #else
  1299.     "xlate",       XXNOTAV, CM_INV,
  1300. #endif /* NOCSETS */
  1301. #ifndef NOXMIT
  1302.     "xmit",        XXTRA, CM_INV, /* Synonym for TRANSMIT */
  1303. #else
  1304.     "xmit",        XXNOTAV, CM_INV,
  1305. #endif /* NOXMIT */
  1306. #ifndef OS2
  1307. #ifndef NOJC
  1308.     "z",           XXSUS, CM_INV, /* Synonym for SUSPEND */
  1309. #else
  1310.     "z",           XXNOTAV, CM_INV,
  1311. #endif /* NOJC */
  1312. #endif /* OS2 */
  1313. #ifdef CK_RECALL
  1314.     "^",           XXREDO,CM_INV|CM_NOR, /* Synonym for REDO */
  1315. #endif /* CK_RECALL */
  1316. #ifndef NOSPL
  1317.     "_asg",        XXASX,   CM_INV, /* Used internally by FOR, etc */
  1318.     "_assign",     XXASX,   CM_INV, /* Used internally by FOR, etc */
  1319.     "_decrement",  XX_DECR, CM_INV,
  1320.     "_define",     XXDFX,   CM_INV, /* Used internally by FOR, etc */
  1321.     "_evaluate",   XX_EVAL, CM_INV,
  1322.     "_forward",    XXXFWD,  CM_INV, /* Used internally by SWITCH   */
  1323.     "_getargs",    XXGTA,   CM_INV, /* Used internally by FOR, etc */
  1324.     "_increment",  XX_INCR, CM_INV,
  1325.     "_putargs",    XXPTA,   CM_INV, /* Used internally by FOR, etc */
  1326. #endif /* NOSPL */
  1327.       "", 0, 0
  1328. };
  1329. int ncmd = (sizeof(cmdtab) / sizeof(struct keytab)) - 1;
  1330. char toktab[] = {
  1331. #ifndef NOPUSH
  1332.     '!', /* Shell escape */
  1333. #endif /* NOPUSH */
  1334.     '#', /* Comment */
  1335. #ifndef NOSPL
  1336.     '.', /* Assignment */
  1337. #endif /* NOSPL */
  1338.     ';', /* Comment */
  1339. #ifndef NOSPL
  1340.     ':', /* Label */
  1341. #endif /* NOSPL */
  1342. #ifndef NOPUSH
  1343. #ifdef CK_REDIR
  1344.     '<', /* REDIRECT */
  1345. #endif /* CK_REDIR */
  1346.     '@', /* DCL escape */
  1347. #endif /* NOPUSH */
  1348. #ifdef CK_RECALL
  1349.     '^', /* Command recall */
  1350. #endif /* CK_RECALL */
  1351. #ifndef NOSPL
  1352.     '{', /* Immediate macro */
  1353. #endif /* NOSPL */
  1354.     '' /* End of this string */
  1355. };
  1356. int xxdot = 0; /* Used with "." token */
  1357. struct keytab yesno[] = { /* Yes/No keyword table */
  1358.     "no",    0, 0,
  1359.     "ok",    1, 0,
  1360.     "yes",   1, 0
  1361. };
  1362. int nyesno = (sizeof(yesno) / sizeof(struct keytab));
  1363. /* Save keyword table */
  1364. struct keytab savtab[] = {
  1365. #ifdef OS2
  1366.     "command",  XSCMD, 0,
  1367. #endif /* OS2 */
  1368. #ifndef NOSETKEY
  1369.     "keymap",   XSKEY, 0,
  1370. #endif /* NOSETKEY */
  1371. #ifdef OS2
  1372.     "terminal", XSTERM, 0,
  1373. #endif /* OS2 */
  1374. "",  0,  0
  1375. };
  1376. int nsav = (sizeof(savtab) / sizeof(struct keytab)) - 1;
  1377. /* Parameter keyword table */
  1378. struct keytab prmtab[] = {
  1379.     "alarm",            XYALRM,  0,
  1380.     "ask-timer",        XYTIMER, 0,
  1381. #ifndef NOXFER
  1382.     "attributes",       XYATTR,  0,
  1383. #endif /* NOXFER */
  1384. #ifdef CK_AUTHENTICATION
  1385.     "authentication",   XYAUTH,  0,
  1386. #else /* CK_AUTHENTICATION */
  1387. #ifdef CK_SSL
  1388.     "authentication",   XYAUTH,  0,
  1389. #endif /* CK_SSL */
  1390. #endif /* CK_AUTHENTICATION */
  1391.     "b", XYBACK,  CM_INV|CM_ABR,
  1392.     "ba", XYBACK,  CM_INV|CM_ABR,
  1393. #ifdef VMS
  1394.     "background",       XYBACK,  CM_INV,
  1395.     "batch",            XYBACK,  0,
  1396. #else
  1397.     "background",       XYBACK,  0,
  1398.     "batch",            XYBACK,  CM_INV,
  1399. #endif /* VMS */
  1400. #ifndef NOLOCAL
  1401.     "baud",         XYSPEE,  CM_INV,
  1402. #endif /* NOLOCAL */
  1403.     "bell",             XYBELL,  0,
  1404. #ifndef NOXFER
  1405.     "block-check",   XYCHKT,  0,
  1406. #endif /* NOXFER */
  1407. #ifdef OS2
  1408. #ifdef BPRINT
  1409.     "bprinter",         XYBDCP,  CM_INV,
  1410. #endif /* BPRINT */
  1411. #endif /*  OS2 */
  1412. #ifdef BROWSER
  1413.     "browser",          XYBROWSE,0,
  1414. #endif /* BROWSER */
  1415. #ifndef NOXFER
  1416. #ifdef DYNAMIC
  1417.     "buffers",          XYBUF,   0,
  1418. #endif /* DYNAMIC */
  1419. #endif /* NOXFER */
  1420. #ifndef NOLOCAL
  1421. #ifndef MAC
  1422.     "carrier-watch",    XYCARR,  0,
  1423. #endif /* MAC */
  1424. #endif /* NOLOCAL */
  1425. #ifndef NOSPL
  1426.     "case",             XYCASE,  0,
  1427. #endif /* NOSPL */
  1428.     "cd",               XYCD,    0,
  1429. #ifndef NOXFER
  1430.     "cl",               XYCLEAR, CM_INV|CM_ABR,
  1431.     "cle",              XYCLEAR, CM_INV|CM_ABR,
  1432.     "clea",             XYCLEAR, CM_INV|CM_ABR,
  1433.     "clear",            XYCLEAR, CM_INV|CM_ABR,
  1434.     "clear-channel",    XYCLEAR, 0,
  1435.     "clearchannel",     XYCLEAR, CM_INV,
  1436. #endif /* NOXFER */
  1437. #ifndef NOLOCAL
  1438.     "close-on-disconnect", XYDISC, CM_INV,
  1439. #endif /* NOLOCAL */
  1440.     "cmd",              XYCMD,   CM_INV,
  1441.     "command",          XYCMD,   0,
  1442. #ifdef CK_SPEED
  1443.     "con",              XYQCTL,  CM_INV|CM_ABR,
  1444. #endif /* CK_SPEED */
  1445.     "console",          XYCMD,   CM_INV,
  1446. #ifdef CK_SPEED
  1447.     "control-character",XYQCTL,  0,
  1448. #endif /* CK_SPEED */
  1449. #ifndef NOSPL
  1450.     "count",            XYCOUN,  0,
  1451. #endif /* NOSPL */
  1452. #ifndef NOXFER
  1453.     "d", XYDELA,  CM_INV|CM_ABR,
  1454.     "de", XYDELA,  CM_INV|CM_ABR,
  1455. #endif /* NOXFER */
  1456.     "debug",            XYDEBU,  CM_INV,
  1457. #ifdef VMS
  1458.     "default",          XYDFLT,  0,
  1459. #else
  1460. #ifndef MAC
  1461.     "default",          XYDFLT,  CM_INV,
  1462. #endif /* MAC */
  1463. #endif /* VMS */
  1464. #ifndef NOXFER
  1465.     "delay",      XYDELA,  0,
  1466.     "destination", XYDEST,  0,
  1467. #endif /* NOXFER */
  1468. #ifndef NODIAL
  1469.     "di", XYDIAL,  CM_INV|CM_ABR,
  1470.     "dia", XYDIAL,  CM_INV|CM_ABR,
  1471.     "dial",             XYDIAL,  0,
  1472. #endif /* NODIAL */
  1473. #ifdef OS2
  1474.     "dialer", XYDLR,   CM_INV,
  1475. #endif /* OS2 */
  1476. #ifndef NOLOCAL
  1477.     "disconnect",       XYDISC,  0,
  1478.     "duplex",      XYDUPL,  0,
  1479. #endif /* NOLOCAL */
  1480. #ifndef NOPUSH
  1481. #ifndef NOFRILLS
  1482.     "editor",           XYEDIT,  0,
  1483. #endif /*  NOFRILLS */
  1484. #endif /* NOPUSH */
  1485. #ifdef CK_CTRLZ
  1486.     "eof",              XYEOF,   CM_INV,
  1487. #endif /* CK_CTRLZ */
  1488. #ifndef NOLOCAL
  1489.     "escape-character", XYESC,   0,
  1490. #endif /* NOLOCAL */
  1491. #ifndef NOSPL
  1492.     "evaluate",         XYEVAL,  CM_INV,
  1493. #endif /* NOSPL */
  1494.     "exit", XYEXIT,  0,
  1495. #ifndef NOXFER
  1496.     "f-ack-bug",        XYFACKB, CM_INV,
  1497.     "f-ack-path",       XYFACKP, CM_INV,
  1498. #endif /* NOXFER */
  1499.     "file",     XYFILE,  0,
  1500.     "fl",            XYFLOW,  CM_INV|CM_ABR,
  1501. #ifndef NOSPL
  1502.     "flag",             XYFLAG,  0,
  1503. #endif /* NOSPL */
  1504. #ifdef BROWSER
  1505.     "ftp-client",       XYFTP,   0,
  1506. #endif /* BROWSER */
  1507.     "flow-control",  XYFLOW,  0,
  1508. #ifndef NOSPL
  1509.     "function",         XYFUNC,  0,
  1510. #endif /* NOSPL */
  1511.     "handshake",     XYHAND,  0,
  1512.     "hints",            XYHINTS, 0,
  1513. #ifdef NETCONN
  1514.     "host",             XYHOST,  0,
  1515. #endif /* NETCONN */
  1516. #ifndef NOSPL
  1517.     "i", XYINPU,  CM_INV|CM_ABR,
  1518.     "in", XYINPU,  CM_INV|CM_ABR,
  1519. #endif /* NOSPL */
  1520. #ifndef NOXFER
  1521.     "incomplete",    XYIFD,   CM_INV,
  1522. #endif /* NOXFER */
  1523. #ifndef NOSPL
  1524.     "input",            XYINPU,  0,
  1525. #endif /* NOSPL */
  1526. #ifndef NOSETKEY
  1527.     "key", XYKEY,   0,
  1528. #endif /* NOSETKEY */
  1529.     "l",                XYLINE,  CM_INV|CM_ABR,
  1530. #ifndef NOCSETS
  1531.     "language",         XYLANG,  0,
  1532. #endif /* NOCSETS */
  1533. #ifndef NOLOCAL
  1534.     "line",             XYLINE,  0,
  1535.     "local-echo", XYLCLE,  CM_INV,
  1536. #endif /* NOLOCAL */
  1537. #ifndef NOSPL
  1538.     "login", XYLOGIN, 0,
  1539. #endif /* NOSPL */
  1540. #ifndef NOSPL
  1541.     "macro",            XYMACR,  0,
  1542. #endif /* NOSPL */
  1543. #ifdef COMMENT
  1544. #ifdef VMS
  1545.     "messages",         XYMSGS,  0,
  1546. #endif /* VMS */
  1547. #endif /* COMMENT */
  1548. #ifndef NODIAL
  1549.     "modem", XYMODM,  0,
  1550. #endif /* NODIAL */
  1551. #ifndef NOLOCAL
  1552. #ifdef OS2MOUSE
  1553.     "mouse", XYMOUSE, 0,
  1554. #endif /* OS2MOUSE */
  1555. #endif /* NOLOCAL */
  1556. #ifdef OS2
  1557.     "mskermit",         XYMSK,   0,
  1558. #endif /* OS2 */
  1559. #ifdef NETCONN
  1560.     "network",          XYNET,   0,
  1561. #endif /* NETCONN */
  1562. #ifndef NOSPL
  1563.     "output",           XYOUTP,  0,
  1564. #endif /* NOSPL */
  1565.     "options",          XYOPTS,  0,
  1566.     "pause",            XYSLEEP, CM_INV,
  1567. #ifdef ANYX25
  1568. #ifndef IBMX25
  1569.     "pad",              XYPAD,   0,
  1570. #endif /* IBMX25 */
  1571. #endif /* ANYX25 */
  1572.     "parity",      XYPARI,   0,
  1573. #ifndef NOLOCAL
  1574. #ifdef OS2
  1575.     "port",             XYLINE,   0,
  1576. #else
  1577.     "port",             XYLINE,   CM_INV,
  1578. #endif /* OS2 */
  1579. #endif /* NOLOCAL */
  1580. #ifndef NOFRILLS
  1581.     "pr",         XYPROM,  CM_INV|CM_ABR,
  1582.     "printer",          XYPRTR,  0,
  1583. #endif /* NOFRILLS */
  1584. #ifdef OS2
  1585.     "priority",         XYPRTY,  0,
  1586. #endif /* OS2 */
  1587. #ifdef CK_SPEED
  1588.     "prefixing",        XYPREFIX, 0,
  1589. #endif /* CK_SPEED */
  1590. #ifndef NOFRILLS
  1591.     "prompt",      XYPROM,  0,
  1592. #endif /* NOFRILLS */
  1593. #ifndef NOXFER
  1594.     "protocol", XYPROTO, 0,
  1595. #endif /* NOXFER */
  1596.     "q", XYQUIE,  CM_INV|CM_ABR,
  1597. #ifndef NOXFER
  1598.     "q8flag",           XYQ8FLG, CM_INV,
  1599. #endif /* NOXFER */
  1600. #ifdef QNX
  1601.     "qnx-port-lock",    XYQNXPL, 0,
  1602. #else
  1603.     "qnx-port-lock",    XYQNXPL, CM_INV,
  1604. #endif /* QNX */
  1605.     "quiet", XYQUIE,  0,
  1606. #ifndef NOXFER
  1607.     "rec",              XYRECV,  CM_INV|CM_ABR,
  1608.     "receive",          XYRECV,  0,
  1609.     "recv",             XYRECV,  CM_INV,
  1610. #endif /* NOXFER */
  1611.     "reliable",         XYRELY,  0,
  1612. #ifndef NOXFER
  1613.     "repeat",           XYREPT,  0,
  1614.     "retry-limit",      XYRETR,  0,
  1615. #endif /* NOXFER */
  1616. #ifndef NOSCRIPT
  1617.     "script", XYSCRI,  0,
  1618. #endif /* NOSCRIPT */
  1619. #ifndef NOXFER
  1620.     "send",             XYSEND,  0,
  1621. #ifndef NOLOCAL
  1622. #ifndef NOSERVER
  1623.     "ser",              XYSERV,  CM_INV|CM_ABR,
  1624. #endif /* NOSERVER */
  1625. #endif /* NOXFER */
  1626.     "serial",           XYSERIAL,0,
  1627. #endif /* NOLOCAL */
  1628. #ifndef NOSERVER
  1629.     "server",           XYSERV,  0,
  1630. #endif /* NOSERVER */
  1631. #ifdef SESLIMIT
  1632. #ifndef NOLOCAL
  1633.     "session-l",        XYSESS,  CM_INV|CM_ABR,
  1634. #endif /* NOLOCAL */
  1635.     "session-limit",    XYLIMIT, CM_INV,        /* Session Limit */
  1636. #endif /* SESLIMIT */
  1637. #ifndef NOLOCAL
  1638. #ifdef OS2ORUNIX
  1639.     "session-log",      XYSESS,  0,
  1640. #else
  1641. #ifdef OSK
  1642.     "session-log",      XYSESS,  0,
  1643. #endif /* OSK */
  1644. #endif /* OS2ORUNIX */
  1645. #endif /* NOLOCAL */
  1646.     "sleep",            XYSLEEP, 0,
  1647. #ifndef NOLOCAL
  1648.     "speed",         XYSPEE,  0,
  1649. #endif /* NOLOCAL */
  1650. #ifndef NOSPL
  1651.     "startup-file",     XYSTARTUP, CM_INV,
  1652. #endif /* NOSPL */
  1653. #ifndef NOLOCAL
  1654. #ifdef HWPARITY
  1655.     "stop-bits",        XYSTOP, 0,
  1656. #endif /* HWPARITY */
  1657. #endif /* NOLOCAL */
  1658. #ifndef NOXFER
  1659. #ifdef STREAMING
  1660.     "streaming",        XYSTREAM, 0,
  1661. #endif /* STREAMING */
  1662. #endif /* NOXFER */
  1663. #ifndef NOJC
  1664.     "suspend",          XYSUSP,  0,
  1665. #endif /* NOJC */
  1666. #ifdef CKSYSLOG
  1667.     "syslog",           XYSYSL,  CM_INV,
  1668. #endif /* CKSYSLOG */
  1669.     "take",             XYTAKE,  0,
  1670. #ifdef CK_TAPI
  1671.     "tapi",             XYTAPI,  0,
  1672. #endif /* CK_TAPI */
  1673. #ifndef NOTCPOPTS
  1674. #ifdef TCPSOCKET
  1675.     "tcp",              XYTCP, 0,
  1676. #endif /* TCPSOCKET */
  1677. #endif /* NOTCPOPTS */
  1678. #ifdef TNCODE
  1679.     "tel",              XYTEL,   CM_INV|CM_ABR,
  1680.     "telnet",           XYTEL,   0,
  1681.     "telopt",           XYTELOP, 0,
  1682. #endif /* TNCODE */
  1683. #ifndef NOSPL
  1684.     "temp-directory",   XYTMPDIR,0,
  1685. #endif /* NOSPL */
  1686. #ifndef NOLOCAL
  1687.     "terminal",         XYTERM,  0,
  1688. #endif /* NOLOCAL */
  1689. #ifdef OS2
  1690.     "title", XYTITLE, 0,
  1691. #endif /* OS2 */
  1692. #ifdef TLOG
  1693.     "transaction-log",  XYTLOG,  0,
  1694. #endif /* TLOG */
  1695. #ifndef NOXFER
  1696.     "transfer",         XYXFER,  0,
  1697. #endif /* NOXFER */
  1698. #ifndef NOXMIT
  1699.     "transmit",         XYXMIT,  0,
  1700. #endif /* NOXMIT */
  1701. #ifndef NOXFER
  1702. #ifndef NOCSETS
  1703.     "unknown-char-set", XYUNCS,  0,
  1704. #endif /* NOCSETS */
  1705. #endif /* NOXFER */
  1706.     "wait",             XYSLEEP, CM_INV,
  1707. #ifndef NOPUSH
  1708. #ifdef UNIX
  1709.     "wildcard-expansion", XYWILD, 0,
  1710. #endif /* UNIX */
  1711. #endif /* NOPUSH */
  1712. #ifdef NT
  1713.     "w",                XYWIND,  CM_INV|CM_ABR,
  1714.     "wi",               XYWIND,  CM_INV|CM_ABR,
  1715.     "win",              XYWIND,  CM_INV|CM_ABR,
  1716. #endif /* NT */
  1717.     "window-size",      XYWIND,  0,
  1718. #ifdef NT
  1719.     "win95",            XYWIN95, 0,
  1720. #endif /* NT */
  1721. #ifdef ANYX25
  1722.     "x.25",             XYX25,   0,
  1723.     "x25",              XYX25,   CM_INV,
  1724. #endif /* ANYX25 */
  1725.     "xfer",             XYXFER,  CM_INV,
  1726. #ifndef NOXMIT
  1727.     "xmit",             XYXMIT,  CM_INV,
  1728. #endif /* NOXMIT */
  1729.     "", 0, 0
  1730. };
  1731. int nprm = (sizeof(prmtab) / sizeof(struct keytab)) - 1; /* How many */
  1732. struct keytab scntab[] = {
  1733.     "clear",   SCN_CLR, 0,
  1734.     "cleol",   SCN_CLE, 0,
  1735.     "move-to", SCN_MOV, 0
  1736. };
  1737. int nscntab = (sizeof(scntab) / sizeof(struct keytab)); /* How many */
  1738. /* Table of networks */
  1739. #ifdef NETCONN
  1740. struct keytab netkey[] = {
  1741.     "directory",     XYNET_D,  0,
  1742.     "type",          XYNET_T,  0
  1743. };
  1744. int nnetkey = (sizeof(netkey) / sizeof(struct keytab));
  1745. struct keytab netcmd[] = {
  1746. /*
  1747.   These are the network types.
  1748. */
  1749. #ifdef NETCMD
  1750.     "command",       NET_CMD,  CM_INV, /* Command */
  1751. #endif /* NETCMD */
  1752. #ifdef DECNET /* DECnet / PATHWORKS */
  1753.     "decnet",        NET_DEC,  0,
  1754. #endif /* DECNET */
  1755. #ifdef NETDLL
  1756.     "dll",           NET_DLL,  CM_INV,  /* DLL to be loaded */
  1757. #endif /* NETDLL */
  1758. #ifdef NETFILE
  1759.     "file",           NET_FILE, CM_INV,  /* FILE (real crude) */
  1760. #endif /* NETFILE */
  1761. #ifdef NPIPE /* Named Pipes */
  1762.     "named-pipe",     NET_PIPE,  0,
  1763. #endif /* NPIPE */
  1764. #ifdef CK_NETBIOS
  1765.     "netbios",        NET_BIOS,  0, /* NETBIOS */
  1766. #endif /* CK_NETBIOS */
  1767. #ifdef DECNET /* DECnet / PATHWORKS (alias) */
  1768.     "pathworks",     NET_DEC,  CM_INV,
  1769. #endif /* DECNET */
  1770. #ifdef NETCMD
  1771.     "pipe",          NET_CMD,  0, /* Pipe */
  1772. #endif /* NETCMD */
  1773. #ifdef NETPTY
  1774.     "pseudoterminal", NET_PTY, 0, /* Pseudoterminal */
  1775. #endif /* NETPTY */
  1776. #ifdef NETPTY
  1777.     "pty",           NET_PTY,  CM_INV, /* Invisible synonym for pseudoterm */
  1778. #endif /* NETPTY */
  1779. #ifdef SSH
  1780.     "ssh",           NET_SSH,  CM_INV,  /* SSH */
  1781. #endif /* SSH */
  1782. #ifdef SUPERLAT
  1783.    "superlat",        NET_SLAT,  0, /* Meridian Technologies' SuperLAT */
  1784. #endif /* SUPERLAT */
  1785. #ifdef TCPSOCKET /* TCP/IP sockets library */
  1786.     "tcp/ip",       NET_TCPB,    0,
  1787. #endif /* TCPSOCKET */
  1788. #ifdef SUPERLAT
  1789.     "tes32",        NET_SLAT,   0, /* Emulux TES32 */
  1790. #endif /* SUPERLAT */
  1791. #ifdef ANYX25 /* X.25 */
  1792. #ifdef SUNX25
  1793.     "x",            NET_SX25, CM_INV|CM_ABR,
  1794.     "x.25",         NET_SX25, 0,
  1795.     "x25",          NET_SX25, CM_INV,
  1796. #else
  1797. #ifdef STRATUSX25
  1798.     "x",            NET_VX25, CM_INV|CM_ABR,
  1799.     "x.25",         NET_VX25, 0,
  1800.     "x25",          NET_VX25, CM_INV,
  1801. #endif /* STRATUSX25 */
  1802. #endif /* SUNX25 */
  1803. #ifdef IBMX25
  1804.     "x",            NET_IX25, CM_INV|CM_ABR,
  1805.     "x.25",         NET_IX25, CM_INV,
  1806.     "x25",          NET_IX25, CM_INV,
  1807. #endif /* IBMX25 */
  1808. #ifdef HPX25
  1809.     "x",            NET_IX25, CM_INV|CM_ABR,
  1810.     "x.25",         NET_IX25, 0,
  1811.     "x25",          NET_IX25, CM_INV,
  1812. #endif /* HPX25 */
  1813. #endif /* ANYX25 */
  1814.     "", 0, 0
  1815. };
  1816. int nnets = (sizeof(netcmd) / sizeof(struct keytab));
  1817. #ifndef NOTCPOPTS
  1818. #ifdef TCPSOCKET
  1819. /* TCP options */
  1820. struct keytab tcpopt[] = {
  1821.    "address",   XYTCP_ADDRESS, 0,
  1822. #ifdef CK_DNS_SRV
  1823.    "dns-service-records", XYTCP_DNS_SRV, 0,
  1824. #endif /* CK_DNS_SRV */
  1825. #ifdef SO_DONTROUTE
  1826.     "dontroute",   XYTCP_DONTROUTE, 0,
  1827. #endif /* SO_DONTROUTE */
  1828. #ifdef SO_KEEPALIVE
  1829.    "keepalive", XYTCP_KEEPALIVE, 0,
  1830. #endif /* SO_KEEPALIVE */
  1831. #ifdef SO_LINGER
  1832.    "linger", XYTCP_LINGER, 0,
  1833. #endif  /* SO_LINGER */
  1834. #ifdef TCP_NODELAY
  1835.    "nagle",  XYTCP_NAGLE,    CM_INV,
  1836.    "nodelay", XYTCP_NODELAY, 0,
  1837. #endif /* TCP_NODELAY */
  1838.    "reverse-dns-lookup", XYTCP_RDNS, 0,
  1839. #ifdef SO_RCVBUF
  1840.    "recvbuf", XYTCP_RECVBUF, 0,
  1841. #endif /* SO_RCVBUF */
  1842. #ifdef SO_SNDBUF
  1843.    "sendbuf", XYTCP_SENDBUF, 0,
  1844. #endif /* SO_SNDBUF */
  1845. #ifdef VMS
  1846. #ifdef DEC_TCPIP
  1847.    "ucx-port-bug", XYTCP_UCX, 0,
  1848. #endif /* DEC_TCPIP */
  1849. #endif /* VMS */
  1850.    "",0,0
  1851. };
  1852. int ntcpopt = (sizeof(tcpopt) / sizeof(struct keytab));
  1853. #endif /* TCPSOCKET */
  1854. #endif /* NOTCPOPTS */
  1855. #endif /* NETCONN */
  1856. #ifdef OS2
  1857. /* K95 Manual Chapter Table -- Keep these two tables in sync! */
  1858. static char * linktbl[] = { /* Internal links in k95.htm */
  1859.     "#top", /* 00 */
  1860.     "#what", /* 01 */
  1861.     "#install", /* 02 */
  1862.     "#start", /* 03 */
  1863.     "#dialer", /* 04 */
  1864.     "#entries", /* 05 */
  1865.     "#command", /* 06 */
  1866.     "#terminal", /* 07 */
  1867.     "#transfer", /* 08 */
  1868.     "#hostmode" /* 09 */
  1869. };
  1870. static struct keytab chaptbl[] = {
  1871.     "Command-Screen",     6, 0,
  1872.     "Contents",           0, 0,
  1873.     "Dialer-Entries",     5, 0,
  1874.     "File-Transfer",      8, 0,
  1875.     "Getting-Started",    3, 0,
  1876.     "Host-Mode",          9, 0,
  1877.     "Installation",       2, 0,
  1878.     "Terminal-Emulation", 7, 0,
  1879.     "Using-The-Dialer",   4, 0,
  1880.     "What-Is-K95",        1, 0,
  1881.     "",                   0, 0,
  1882. };
  1883. static int nchaptbl = (sizeof(chaptbl) / sizeof(struct keytab));
  1884. #endif /* OS2 */
  1885. #ifndef NOXFER
  1886. /* Remote Command Table */
  1887. struct keytab remcmd[] = {
  1888. #ifndef NOSPL
  1889.     "as",  XZASG, CM_INV|CM_ABR, /*  */
  1890.     "asg",  XZASG, CM_INV,
  1891.     "assign",  XZASG, 0,
  1892. #endif /* NOSPL */
  1893.     "cd",        XZCWD, 0,
  1894.     "copy",      XZCPY, 0,
  1895.     "cwd",       XZCWD, CM_INV,
  1896.     "delete",    XZDEL, 0,
  1897.     "directory", XZDIR, 0,
  1898.     "exit",      XZXIT, 0,
  1899.     "help",      XZHLP, 0,
  1900. #ifndef NOPUSH
  1901.     "host",      XZHOS, 0,
  1902. #endif /* NOPUSH */
  1903. #ifndef NOFRILLS
  1904.     "kermit",    XZKER, 0,
  1905.     "l",         XZLGI, CM_ABR|CM_INV,
  1906.     "lo",        XZLGI, CM_ABR|CM_INV,
  1907.     "log",       XZLGI, CM_ABR|CM_INV,
  1908.     "login",     XZLGI, 0,
  1909.     "logout",    XZLGO, 0,
  1910.     "mkdir",     XZMKD, 0,
  1911.     "print",     XZPRI, 0,
  1912. #endif /* NOFRILLS */
  1913.     "pwd",       XZPWD, 0,
  1914. #ifndef NOSPL
  1915.     "query",  XZQUE, 0,
  1916. #endif /* NOSPL */
  1917.     "rename",    XZREN, 0,
  1918.     "rmdir",     XZRMD, 0,
  1919.     "set",       XZSET, 0,
  1920.     "space",  XZSPA, 0
  1921. #ifndef NOFRILLS
  1922. ,   "type",   XZTYP, 0,
  1923.     "who",    XZWHO, 0
  1924. #endif /* NOFRILLS */
  1925. };
  1926. int nrmt = (sizeof(remcmd) / sizeof(struct keytab));
  1927. #endif /* NOXFER */
  1928. struct keytab logtab[] = {
  1929. #ifdef CKLOGDIAL
  1930.     "connections",  LOGM, CM_INV,
  1931.     "cx",           LOGM, 0,
  1932. #endif /* CKLOGDIAL */
  1933. #ifdef DEBUG
  1934.     "debugging",    LOGD, 0,
  1935. #endif /* DEBUG */
  1936.     "packets",     LOGP, 0,
  1937. #ifndef NOLOCAL
  1938.     "session",      LOGS, 0,
  1939. #endif /* NOLOCAL */
  1940. #ifdef TLOG
  1941.     "transactions", LOGT, 0,
  1942. #endif /* TLOG */
  1943.     "", 0, 0
  1944. };
  1945. int nlog = (sizeof(logtab) / sizeof(struct keytab)) - 1;
  1946. struct keytab writab[] = {
  1947. #ifndef NOSPL
  1948.     "append-file",     LOGW, CM_INV,
  1949. #endif /* NOSPL */
  1950.     "debug-log",       LOGD, 0,
  1951.     "error",           LOGE, 0,
  1952. #ifndef NOSPL
  1953.     "file",            LOGW, 0,
  1954. #endif /* NOSPL */
  1955.     "packet-log",      LOGP, 0,
  1956.     "screen",          LOGX, 0,
  1957. #ifndef NOLOCAL
  1958.     "session-log",     LOGS, 0,
  1959. #endif /* NOLOCAL */
  1960.     "sys$output",      LOGX, CM_INV,
  1961.     "t",               LOGT, CM_ABR|CM_INV, /* Because of a typo in */
  1962.     "tr",              LOGT, CM_ABR|CM_INV, /* the book... */
  1963.     "tra",             LOGT, CM_ABR|CM_INV,
  1964.     "tran",            LOGT, CM_ABR|CM_INV,
  1965.     "trans",           LOGT, CM_ABR|CM_INV,
  1966.     "transa",          LOGT, CM_ABR|CM_INV,
  1967.     "transac",         LOGT, CM_ABR|CM_INV,
  1968.     "transact",        LOGT, CM_ABR|CM_INV,
  1969.     "transacti",       LOGT, CM_ABR|CM_INV,
  1970.     "transactio",      LOGT, CM_ABR|CM_INV,
  1971.     "transaction",     LOGT, CM_ABR|CM_INV,
  1972.     "transaction-log", LOGT, 0,
  1973.     "transactions",    LOGT, CM_INV
  1974. };
  1975. int nwri = (sizeof(writab) / sizeof(struct keytab));
  1976. #ifdef COMMENT /* INPUT switches not used yet... */
  1977. static struct keytab inswtab[] = {
  1978. #ifdef COMMENT
  1979.     "/assign",       IN_ASG, CM_ARG,
  1980. #endif /* COMMENT */
  1981.     "/autodownload", IN_ADL, CM_ARG,
  1982.     "/case",         IN_CAS, CM_ARG,
  1983.     "/echo",         IN_ECH, CM_ARG,
  1984.     "/interrupts",   IN_NOI, CM_ARG,
  1985.     "/silence",      IN_SIL, CM_ARG,
  1986. #ifdef COMMENT
  1987.     "/pattern",      IN_PAT, CM_ARG,
  1988. #endif /* COMMENT */
  1989.     "", 0, 0
  1990. };
  1991. static int ninswtab = (sizeof(inswtab) / sizeof(struct keytab)) - 1;
  1992. #endif /* COMMENT */
  1993. static struct keytab clrtab[] = { /* Keywords for CLEAR command */
  1994. #ifndef NOSPL
  1995.     "alarm",            CLR_ALR,         0,
  1996. #ifdef CK_APC
  1997.     "apc",              CLR_APC,         0,
  1998. #endif /* CK_APC */
  1999. #ifdef PATTERNS
  2000.     "binary-patterns",  CLR_BIN,         0,
  2001. #endif /* PATTERNS */
  2002.     "both",             CLR_DEV|CLR_INP, CM_INV,
  2003. #endif /* NOSPL */
  2004. #ifdef OS2
  2005.     "command-screen",   CLR_CMD,         0,
  2006. #endif /* OS2 */
  2007. #ifndef NOSPL
  2008.     "device",           CLR_DEV,         CM_INV|CM_ABR,
  2009.     "device-and-input", CLR_DEV|CLR_INP, 0,
  2010. #endif /* NOSPL */
  2011.     "device-buffer",    CLR_DEV,         0,
  2012. #ifndef NODIAL
  2013.     "dial-status",      CLR_DIA,  0,
  2014. #endif /* NODIAL */
  2015. #ifndef NOSPL
  2016.     "input-buffer",     CLR_INP,         0,
  2017. #endif /* NOSPL */
  2018.     "send-list",        CLR_SFL,         0,
  2019. #ifdef OS2
  2020.     "scr",              CLR_SCL,         CM_INV|CM_ABR,
  2021. #endif /* OS2 */
  2022.     "screen",           CLR_SCR,         0,
  2023. #ifdef OS2
  2024.     "scrollback",       CLR_SCL,         CM_INV,
  2025.     "terminal-screen",  CLR_TRM,         0,
  2026. #endif /* OS2 */
  2027. #ifdef PATTERNS
  2028.     "text-patterns",    CLR_TXT,         0,
  2029. #endif /* PATTERNS */
  2030.     "", 0, 0
  2031. };
  2032. int nclear = (sizeof(clrtab) / sizeof(struct keytab)) - 1;
  2033. struct keytab clstab[] = { /* Keywords for CLOSE command */
  2034. #ifndef NOSPL
  2035.     "!read",           LOGR, CM_INV,
  2036.     "!write",          LOGW, CM_INV,
  2037. #ifndef NOPUSH
  2038. #endif /* NOPUSH */
  2039. #endif /* NOSPL */
  2040. #ifndef NOSPL
  2041.     "append-file",     LOGW, CM_INV,
  2042. #endif /* NOSPL */
  2043. #ifndef NOLOCAL
  2044.     "connection",      9999, 0,
  2045. #endif /* NOLOCAL */
  2046. #ifdef CKLOGDIAL
  2047.     "cx-log",          LOGM, 0,
  2048. #endif /* CKLOGDIAL */
  2049. #ifdef DEBUG
  2050.     "debug-log",       LOGD, 0,
  2051. #endif /* DEBUG */
  2052.     "host",            9999, CM_INV, /* Synonym for CLOSE CONNECTION */
  2053.     "line",            9999, CM_INV, /* Synonym for CLOSE CONNECTION */
  2054.     "packet-log",      LOGP, 0,
  2055.     "port",            9999, CM_INV, /* Synonym for CLOSE CONNECTION */
  2056. #ifndef NOSPL
  2057.     "read-file",       LOGR, 0,
  2058. #endif /* NOSPL */
  2059. #ifndef NOLOCAL
  2060.     "session-log",     LOGS, 0,
  2061. #endif /* NOLOCAL */
  2062. #ifdef TLOG
  2063.     "t",               LOGT, CM_ABR|CM_INV, /* Because of a typo in */
  2064.     "tr",              LOGT, CM_ABR|CM_INV, /* the book... */
  2065.     "tra",             LOGT, CM_ABR|CM_INV,
  2066.     "tran",            LOGT, CM_ABR|CM_INV,
  2067.     "trans",           LOGT, CM_ABR|CM_INV,
  2068.     "transa",          LOGT, CM_ABR|CM_INV,
  2069.     "transac",         LOGT, CM_ABR|CM_INV,
  2070.     "transact",        LOGT, CM_ABR|CM_INV,
  2071.     "transacti",       LOGT, CM_ABR|CM_INV,
  2072.     "transactio",      LOGT, CM_ABR|CM_INV,
  2073.     "transaction",     LOGT, CM_ABR|CM_INV,
  2074.     "transaction-log", LOGT, 0,
  2075.     "transactions",    LOGT, CM_INV,
  2076. #endif /* TLOG */
  2077. #ifndef NOSPL
  2078.     "write-file",      LOGW, 0,
  2079. #endif /* NOSPL */
  2080.     "", 0, 0
  2081. };
  2082. int ncls = (sizeof(clstab) / sizeof(struct keytab)) - 1;
  2083. /* SHOW command arguments */
  2084. #ifndef NOSHOW
  2085. struct keytab shotab[] = {
  2086. #ifndef NOSPL
  2087.     "alarm", SHALRM, 0,
  2088.     "arg",  SHARG, CM_INV|CM_ABR,
  2089.     "arguments", SHARG, 0,
  2090.     "args", SHARG, CM_INV,
  2091.     "arrays", SHARR, 0,
  2092. #endif /* NOSPL */
  2093. #ifndef NOCSETS
  2094.     "associations", SHASSOC, 0,
  2095. #endif /* NOCSETS */
  2096. #ifndef NOXFER
  2097.     "attributes", SHATT, 0,
  2098. #endif /* NOXFER */
  2099. #ifdef CK_AUTHENTICATION
  2100.     "authentication", SHOAUTH, CM_INV,
  2101. #endif /* CK_AUTHENTICATION */
  2102. #ifndef NOPUSH
  2103. #ifdef BROWSER
  2104.     "browser", SHBROWSE, 0,
  2105. #endif /*  BROWSER */
  2106. #endif /* NOPUSH */
  2107.     "cd", SHCD, 0,
  2108.     "character-sets", SHCSE, 0,
  2109.     "cmd",  SHCMD, CM_INV,
  2110. #ifndef NOLOCAL
  2111.     "com",  SHCOM, CM_INV|CM_ABR,
  2112.     "comm", SHCOM, CM_INV|CM_ABR,
  2113.     "communications", SHCOM, 0,
  2114. #endif /* NOLOCAL */
  2115.     "command", SHCMD, 0,
  2116. #ifdef CK_SPEED
  2117.     "control-prefixing", SHCTL, 0,
  2118. #endif /* CK_SPEED */
  2119. #ifdef CKLOGDIAL
  2120.     "connection", SHCONNX, 0,
  2121.     "cx", SHCONNX, CM_INV,
  2122. #endif /* CKLOGDIAL */
  2123. #ifndef NOSPL
  2124.     "count", SHCOU, 0,
  2125. #endif /* NOSPL */
  2126.     "d",       SHDIA, CM_INV|CM_ABR,
  2127. #ifdef VMS
  2128.     "default", SHDFLT, 0,
  2129. #else
  2130.     "default", SHDFLT, CM_INV,
  2131. #endif /* VMS */
  2132. #ifndef NODIAL
  2133.     "dial", SHDIA, 0,
  2134. #endif /* NODIAL */
  2135.     "double/ignore", SHDBL, 0,
  2136. #ifndef NOPUSH
  2137. #ifndef NOFRILLS
  2138.     "editor",        SHEDIT, 0,
  2139. #endif /*  NOFRILLS */
  2140. #endif /* NOPUSH */
  2141. #ifndef NOLOCAL
  2142.     "escape", SHESC, 0,
  2143. #endif /* NOLOCAL */
  2144.     "exit", SHEXI, 0,
  2145.     "extended-options", SHXOPT, CM_INV,
  2146.     "features", SHFEA, 0,
  2147.     "file", SHFIL, 0,
  2148. #ifndef NOLOCAL
  2149.     "flow-control", SHOFLO, 0,
  2150. #endif /* NOLOCAL */
  2151. #ifdef BROWSER
  2152.     "ftp", SHOFTP, 0,
  2153. #endif /* BROWSER */
  2154. #ifndef NOSPL
  2155.     "functions", SHFUN, 0,
  2156.     "globals", SHVAR, 0,
  2157. #endif /* NOSPL */
  2158.     "ignore/double", SHDBL, CM_INV,
  2159. #ifndef NOSPL
  2160.     "input", SHINP, 0,
  2161. #endif /* NOSPL */
  2162. #ifndef NOSETKEY
  2163.     "k",   SHKEY, CM_INV|CM_ABR,
  2164.     "key", SHKEY, 0,
  2165. #ifndef NOKVERBS
  2166.     "kverbs", SHKVB, 0,
  2167. #endif /* NOKVERBS */
  2168. #endif /* NOSETKEY */
  2169. #ifdef CK_LABELED
  2170.     "labeled-file-info", SHLBL, 0,
  2171. #endif /* CK_LABELED */
  2172. #ifndef NOCSETS
  2173.     "languages", SHLNG, 0,
  2174. #endif /* NOCSETS */
  2175.     "logs", SHLOG, 0,
  2176. #ifndef NOSPL
  2177.     "macros", SHMAC, 0,
  2178. #endif /* NOSPL */
  2179. #ifndef NODIAL
  2180.     "modem", SHMOD, 0,
  2181. #else
  2182.     "modem-signals", SHCOM, CM_INV,
  2183. #endif /* NODIAL */
  2184. #ifndef NOLOCAL
  2185. #ifdef OS2MOUSE
  2186.     "mouse", SHMOU, 0,
  2187. #endif /* OS2MOUSE */
  2188. #endif /* NOLOCAL */
  2189. #ifdef NETCONN
  2190.     "network", SHNET, 0,
  2191. #else
  2192.     "network", SHNET, CM_INV,
  2193. #endif /* NETCONN */
  2194.     "options", SHOPTS, 0,
  2195. #ifndef NOSPL
  2196.     "output", SHOUTP, CM_INV,
  2197. #endif /* NOSPL */
  2198. #ifdef ANYX25
  2199. #ifndef IBMX25
  2200.     "pad", SHPAD, 0,
  2201. #endif /* IBMX25 */
  2202. #endif /* ANYX25 */
  2203.     "parameters", SHPAR, CM_INV,
  2204. #ifdef PATTERNS
  2205.     "patterns", SHOPAT, 0,
  2206. #endif /* PATTERNS */
  2207.     "printer",  SHPRT, 0,
  2208. #ifdef CK_SPEED
  2209.     "prefixing", SHCTL, CM_INV,
  2210. #endif /* CK_SPEED */
  2211. #ifndef NOXFER
  2212.     "protocol", SHPRO, 0,
  2213. #endif /* NOXFER */
  2214. #ifndef NOSPL
  2215.     "scripts", SHSCR, 0,
  2216. #endif /* NOSPL */
  2217.     "send-list", SHSFL, 0,
  2218. #ifndef NOSERVER
  2219.     "server", SHSER, 0,
  2220. #endif /* NOSERVER */
  2221.     "stack", SHSTK, 0,
  2222.     "status", SHSTA, 0,
  2223. #ifdef STREAMING
  2224.     "streaming", SHOSTR, 0,
  2225. #endif /* STREAMING */
  2226. #ifndef NOLOCAL
  2227. #ifdef OS2
  2228.     "tabs",SHTAB, CM_INV,
  2229. #endif /* OS2 */
  2230. #ifdef CK_TAPI
  2231.     "tapi",          SHTAPI, 0,
  2232.     "tapi-comm",     SHTAPI_C, CM_INV,
  2233.     "tapi-location", SHTAPI_L, CM_INV,
  2234.     "tapi-modem",    SHTAPI_M, CM_INV,
  2235. #endif /* CK_TAPI */
  2236. #ifdef TNCODE
  2237.     "tel",      SHTEL,  CM_INV|CM_ABR,
  2238.     "telnet",   SHTEL,  0,
  2239.     "telopt",   SHTOPT, 0,
  2240. #endif /* TNCODE */
  2241.     "terminal", SHTER, 0,
  2242. #endif /* NOLOCAL */
  2243. #ifndef NOXMIT
  2244.     "tr",    SHXMI, CM_INV|CM_ABR,
  2245.     "tra",   SHXMI, CM_INV|CM_ABR,
  2246.     "tran",  SHXMI, CM_INV|CM_ABR,
  2247.     "trans", SHXMI, CM_INV|CM_ABR,
  2248. #endif /* NOXMIT */
  2249. #ifndef NOXFER
  2250.     "transfer", SHOXFER, 0,
  2251. #endif /* NOXFER */
  2252. #ifndef NOXMIT
  2253.     "transmit", SHXMI, 0,
  2254. #endif /* NOXMIT */
  2255. #ifdef CK_TRIGGER
  2256.     "trigger", SHTRIG, 0,
  2257. #endif /* CK_TRIGGER */
  2258. #ifndef NOSETKEY
  2259. #ifndef NOKVERBS
  2260. #ifdef OS2
  2261.      "udk", SHUDK, 0,
  2262. #endif /* OS2 */
  2263. #endif /* NOKVERBS */
  2264. #endif /* NOSETKEY */
  2265. #ifndef NOSPL
  2266.     "variables", SHBUI, 0,
  2267. #endif /* NOSPL */
  2268. #ifndef NOFRILLS
  2269.     "versions", SHVER, 0,
  2270. #endif /* NOFRILLS */
  2271. #ifdef OS2
  2272.     "vscrn",    SHVSCRN, CM_INV,
  2273. #endif /* OS2 */
  2274.     "xfer", SHOXFER, CM_INV,
  2275. #ifndef NOXMIT
  2276.     "xmit", SHXMI, CM_INV,
  2277. #endif /* NOXMIT */
  2278.     "", 0, 0
  2279. };
  2280. int nsho = (sizeof(shotab) / sizeof(struct keytab)) - 1;
  2281. #endif /* NOSHOW */
  2282. #ifdef ANYX25
  2283. #ifndef IBMX25
  2284. struct keytab padtab[] = {              /* PAD commands */
  2285.     "clear",      XYPADL, 0,
  2286.     "interrupt",  XYPADI, 0,
  2287.     "reset",      XYPADR, 0,
  2288.     "status",     XYPADS, 0
  2289. };
  2290. int npadc = (sizeof(padtab) / sizeof(struct keytab));
  2291. #endif /* IBMX25 */
  2292. #endif /* ANYX25 */
  2293. #ifndef NOSERVER
  2294. static struct keytab kmstab[] = {
  2295.     "both",    3, 0,
  2296.     "remote",  2, 0,
  2297.     "local",   1, 0
  2298. };
  2299. static struct keytab enatab[] = { /* ENABLE commands */
  2300.     "all",        EN_ALL,  0,
  2301. #ifndef NOSPL
  2302.     "as",         EN_ASG,  CM_INV|CM_ABR,
  2303.     "asg",        EN_ASG,  CM_INV,
  2304.     "assign",     EN_ASG,  0,
  2305. #endif /* NOSPL */
  2306. #ifndef datageneral
  2307.     "bye",        EN_BYE,  0,
  2308. #endif /* datageneral */
  2309.     "cd",         EN_CWD,  0,
  2310. #ifdef ZCOPY
  2311.     "copy",       EN_CPY,  0,
  2312. #endif /* ZCOPY */
  2313.     "cwd",        EN_CWD,  CM_INV,
  2314.     "delete",     EN_DEL,  0,
  2315.     "directory",  EN_DIR,  0,
  2316.     "enable",     EN_ENA,  CM_INV,
  2317.     "exit",       EN_XIT,  0,
  2318.     "finish",     EN_FIN,  0,
  2319.     "get",        EN_GET,  0,
  2320.     "host",       EN_HOS,  0,
  2321.     "mail",       EN_MAI,  0,
  2322.     "mkdir",      EN_MKD,  0,
  2323. #ifndef NOSPL
  2324.     "query",      EN_QUE,  0,
  2325. #endif /* NOSPL */
  2326.     "print",      EN_PRI,  0,
  2327.     "rename",     EN_REN,  0,
  2328.     "retrieve",   EN_RET,  CM_INV,
  2329.     "rmdir",      EN_RMD,  0,
  2330.     "send",       EN_SEN,  0,
  2331.     "set",        EN_SET,  0,
  2332.     "space",      EN_SPA,  0,
  2333.     "type",       EN_TYP,  0,
  2334.     "who",        EN_WHO,  0
  2335. };
  2336. static int nena = (sizeof(enatab) / sizeof(struct keytab));
  2337. #endif /* NOSERVER */
  2338. #ifndef NOXFER
  2339. static struct keytab sndtab[] = { /* SEND command options */
  2340.     "/after",           SND_AFT, CM_ARG,
  2341. #ifndef NOSPL
  2342.     "/array",           SND_ARR, CM_ARG,
  2343. #endif /* NOSPL */
  2344.     "/as-name",         SND_ASN, CM_ARG,
  2345.     "/b",               SND_BIN, CM_INV|CM_ABR,
  2346.     "/before",          SND_BEF, CM_ARG,
  2347.     "/binary",          SND_BIN, 0,
  2348. #ifdef CALIBRATE
  2349.     "/c",               SND_CMD, CM_INV|CM_ABR,
  2350.     "/calibrate",       SND_CAL, CM_INV|CM_ARG,
  2351. #endif /* CALIBRATE */
  2352.     "/command",         SND_CMD, 0,
  2353.     "/delete",          SND_DEL, 0,
  2354. #ifdef UNIXOROSK
  2355.     "/dotfiles",        SND_DOT, 0,
  2356. #endif /* UNIXOROSK */
  2357.     "/except",          SND_EXC, CM_ARG,
  2358. #ifdef PIPESEND
  2359.     "/filter",          SND_FLT, CM_ARG,
  2360. #endif /* PIPESEND */
  2361.     "/filenames",       SND_NAM, CM_ARG,
  2362. #ifdef VMS
  2363.     "/image",           SND_IMG, 0,
  2364. #else
  2365.     "/image",           SND_BIN, CM_INV,
  2366. #endif /* VMS */
  2367. #ifdef CK_LABELED
  2368.     "/labeled",         SND_LBL, 0,
  2369. #endif /* CK_LABELED */
  2370.     "/larger-than",     SND_LAR, CM_ARG,
  2371.     "/listfile",        SND_FIL, CM_ARG,
  2372. #ifndef NOFRILLS
  2373.     "/mail",            SND_MAI, CM_ARG,
  2374. #endif /* NOFRILLS */
  2375. #ifdef CK_TMPDIR
  2376.     "/move-to",         SND_MOV, CM_ARG,
  2377. #endif /* CK_TMPDIR */
  2378.     "/nobackup",        SND_NOB, 0,
  2379. #ifdef UNIXOROSK
  2380.     "/nodotfiles",      SND_NOD, 0,
  2381. #endif /* UNIXOROSK */
  2382.     "/not-after",       SND_NAF, CM_ARG,
  2383.     "/not-before",      SND_NBE, CM_ARG,
  2384.     "/pathnames",       SND_PTH, CM_ARG,
  2385.     "/print",           SND_PRI, CM_ARG,
  2386. #ifdef CK_XYZ
  2387.     "/protocol",        SND_PRO, CM_ARG,
  2388. #else
  2389.     "/protocol",        SND_PRO, CM_ARG|CM_INV,
  2390. #endif /* CK_XYZ */
  2391.     "/quiet",           SND_SHH, 0,
  2392.     "/recover",         SND_RES, 0,
  2393. #ifdef RECURSIVE
  2394. /* Systems where we do recursion */
  2395.     "/recursive",       SND_REC, 0,
  2396. #else
  2397. #ifdef VMS
  2398. /* Systems that do recursion themselves without our assistance */
  2399. /* if we give them the right kind of wildcard */
  2400.     "/recursive",       SND_REC, 0,
  2401. #else
  2402. #ifdef datageneral
  2403.     "/recursive",       SND_REC, 0,
  2404. #else
  2405.     "/recursive",       SND_REC, CM_INV,
  2406. #endif /* datageneral */
  2407. #endif /* VMS */
  2408. #endif /* RECURSIVE */
  2409.     "/rename-to",       SND_REN, CM_ARG,
  2410.     "/since",           SND_AFT, CM_INV|CM_ARG,
  2411.     "/smaller-than",    SND_SMA, CM_ARG,
  2412.     "/starting-at",     SND_STA, CM_ARG,
  2413. #ifndef NOFRILLS
  2414.     "/su",              SND_ASN, CM_ARG|CM_INV|CM_ABR,
  2415.     "/sub",             SND_ASN, CM_ARG|CM_INV|CM_ABR,
  2416.     "/subject",         SND_ASN, CM_ARG,
  2417. #endif /* NOFRILLS */
  2418. #ifdef RECURSIVE
  2419.     "/subdirectories",  SND_REC, CM_INV,
  2420. #endif /* RECURSIVE */
  2421.     "/text",            SND_TXT, 0
  2422. };
  2423. #define NSNDTAB sizeof(sndtab)/sizeof(struct keytab)
  2424. static int nsndtab = NSNDTAB;
  2425. #ifndef NOMSEND
  2426. static struct keytab msndtab[] = { /* MSEND options */
  2427.     "/after",           SND_AFT, CM_ARG,
  2428.     "/before",          SND_BEF, CM_ARG,
  2429.     "/binary",          SND_BIN, 0,
  2430.     "/delete",          SND_DEL, 0,
  2431.     "/except",          SND_EXC, CM_ARG,
  2432.     "/filenames",       SND_NAM, CM_ARG,
  2433. #ifdef VMS
  2434.     "/image",           SND_IMG, 0,
  2435. #else
  2436.     "/image",           SND_BIN, CM_INV,
  2437. #endif /* VMS */
  2438. #ifdef CK_LABELED
  2439.     "/labeled",         SND_LBL, 0,
  2440. #endif /* CK_LABELED */
  2441.     "/larger-than",     SND_LAR, CM_ARG,
  2442.     "/list",            SND_FIL, CM_ARG,
  2443. #ifndef NOFRILLS
  2444.     "/mail",            SND_MAI, CM_ARG,
  2445. #endif /* NOFRILLS */
  2446. #ifdef CK_TMPDIR
  2447.     "/move-to",         SND_MOV, CM_ARG,
  2448. #endif /* CK_TMPDIR */
  2449.     "/not-after",       SND_NAF, CM_ARG,
  2450.     "/not-before",      SND_NBE, CM_ARG,
  2451.     "/pathnames",       SND_PTH, CM_ARG,
  2452.     "/print",           SND_PRI, CM_ARG,
  2453. #ifdef CK_XYZ
  2454.     "/protocol",        SND_PRO, CM_ARG,
  2455. #endif /* CK_XYZ */
  2456.     "/quiet",           SND_SHH, 0,
  2457.     "/recover",         SND_RES, 0,
  2458.     "/rename-to",       SND_REN, CM_ARG,
  2459.     "/since",           SND_AFT, CM_INV|CM_ARG,
  2460.     "/smaller-than",    SND_SMA, CM_ARG,
  2461.     "/starting-at",     SND_STA, CM_ARG,
  2462. #ifndef NOFRILLS
  2463.     "/subject",         SND_ASN, CM_ARG,
  2464. #endif /* NOFRILLS */
  2465.     "/text",            SND_TXT, 0
  2466. };
  2467. #define NMSNDTAB sizeof(msndtab)/sizeof(struct keytab)
  2468. static int nmsndtab = NMSNDTAB;
  2469. #endif /* NOMSEND */
  2470. #endif /* NOXFER */
  2471. /* CONNECT command switches */
  2472. #ifndef NOLOCAL
  2473. static struct keytab conntab[] = {
  2474. #ifdef XLIMITS
  2475.     "/idle-interval",   CONN_II, CM_ARG,
  2476.     "/idle-limit",      CONN_IL, CM_ARG,
  2477.     "/idle-string",     CONN_IS, CM_ARG,
  2478.     "/quietly",         CONN_NV, CM_INV
  2479. #else
  2480.     "/quietly",         CONN_NV, 0
  2481. #endif /* XLIMITS */
  2482. #ifdef XLIMITS
  2483. ,   "/time-limit",      CONN_TL, CM_ARG
  2484. #endif /* XLIMITS */
  2485. #ifdef CK_TRIGGER
  2486. ,   "/trigger",         CONN_TS, CM_ARG
  2487. #endif /* CK_TRIGGER */
  2488. };
  2489. #define NCONNTAB sizeof(conntab)/sizeof(struct keytab)
  2490. static int nconntab = NCONNTAB;
  2491. #endif /* NOLOCAL */
  2492. #ifndef NOXFER
  2493. static struct keytab stattab[] = { /* STATISTICS command switches */
  2494.     "/brief", 1, 0,
  2495.     "/verbose", 0, 0
  2496. };
  2497. #endif /* NOXFER */
  2498. #ifndef NOSPL
  2499. #ifdef COMMENT
  2500. struct mtab mactab[MAC_MAX] = { /* Preinitialized macro table */
  2501.     NULL, NULL, 0
  2502. };
  2503. #else
  2504. struct mtab *mactab; /* Dynamically allocated macro table */
  2505. #endif /* COMMENT */
  2506. int nmac = 0;
  2507. struct keytab mackey[MAC_MAX]; /* Macro names as command keywords */
  2508. #endif /* NOSPL */
  2509. #ifndef NOSPL
  2510. #ifdef  OS2
  2511. struct keytab beeptab[] = { /* Beep options */
  2512.     "error", BP_FAIL, 0,
  2513.     "information", BP_NOTE, 0,
  2514.     "warning", BP_WARN, 0
  2515. };
  2516. int nbeeptab = sizeof(beeptab)/sizeof(struct keytab);
  2517. /* CLEAR COMMMAND-SCREEN options */
  2518. #define CLR_C_ALL 0
  2519. #define CLR_C_BOL 1
  2520. #define CLR_C_BOS 2
  2521. #define CLR_C_EOL 3
  2522. #define CLR_C_EOS 4
  2523. #define CLR_C_LIN 5
  2524. #define CLR_C_SCR 6
  2525. struct keytab clrcmdtab[] = {
  2526.     "all",     CLR_C_ALL, 0,
  2527.     "bol",     CLR_C_BOL, 0,
  2528.     "bos",     CLR_C_BOS, 0,
  2529.     "eol",     CLR_C_EOL, 0,
  2530.     "eos",     CLR_C_EOS, 0,
  2531.     "line",    CLR_C_LIN, 0,
  2532.     "scrollback", CLR_C_SCR, 0
  2533. };
  2534. int nclrcmd = sizeof(clrcmdtab)/sizeof(struct keytab);
  2535. #endif /* OS2 */
  2536. #endif /* NOSPL */
  2537. #ifdef COMMENT
  2538. /* Not used at present */
  2539. static struct keytab pagetab[] = {
  2540.     "/more",   1, CM_INV,
  2541.     "/nopage", 0, 0,
  2542.     "/page",   1, 0
  2543. };
  2544. int npagetab = sizeof(pagetab)/sizeof(struct keytab);
  2545. #endif /* COMMENT */
  2546. #define TYP_NOP 0 /* /NOPAGE */
  2547. #define TYP_PAG 1 /* /PAGE */
  2548. #define TYP_HEA 2 /* /HEAD:n */
  2549. #define TYP_TAI 3 /* /TAIL:n */
  2550. #define TYP_PAT 4 /* /MATCH:pattern */
  2551. #define TYP_WID 5 /* /WIDTH:cols */
  2552. #define TYP_COU 6 /* /COUNT */
  2553. #define TYP_OUT 7 /* /OUTPUT:file */
  2554. #define TYP_PFX 8 /* /PREFIX:string */
  2555. static struct keytab typetab[] = {
  2556.     "/count",  TYP_COU, 0,
  2557.     "/head",   TYP_HEA, CM_ARG,
  2558.     "/match",  TYP_PAT, CM_ARG,
  2559. #ifdef CK_TTGWSIZ
  2560.     "/more",   TYP_PAG, CM_INV,
  2561.     "/nopage", TYP_NOP, 0,
  2562.     "/page",   TYP_PAG, 0,
  2563. #endif /* CK_TTGWSIZ */
  2564.     "/prefix", TYP_PFX, CM_ARG,
  2565.     "/tail",   TYP_TAI, CM_ARG,
  2566.     "/width",  TYP_WID, CM_ARG,
  2567.     "", 0, 0
  2568. };
  2569. int ntypetab = sizeof(typetab)/sizeof(struct keytab) - 1;
  2570. int typ_page = -1; /* TYPE /[NO]PAGE default */
  2571. int typ_wid  = -1;
  2572. #ifndef NOSPL
  2573. #define TRA_ALL 999 /* TRACE command */
  2574. #define TRA_ASG 0
  2575. #define TRA_CMD 1
  2576. int tra_asg = 0;
  2577. int tra_cmd = 0;
  2578. static struct keytab tracetab[] = { /* TRACE options */
  2579.     "all",            TRA_ALL, 0,
  2580.     "assignments",    TRA_ASG, 0,
  2581.     "command-level",  TRA_CMD, 0
  2582. };
  2583. static int ntracetab = sizeof(tracetab)/sizeof(struct keytab);
  2584. #endif /* NOSPL */
  2585. #ifndef NOSHOW
  2586. VOID
  2587. showtypopts() {
  2588.     printf(" TYPE ");
  2589.     if (typ_page > -1) {
  2590. prtopt(&optlines,typ_page ? "/PAGE" : "/NOPAGE");
  2591.     } else
  2592.       prtopt(&optlines,"(no options set)");
  2593.     if (typ_wid > -1) {
  2594. sprintf(tmpbuf,"/WIDTH:%d",typ_wid);
  2595. prtopt(&optlines,tmpbuf);
  2596.     }
  2597.     prtopt(&optlines,"");
  2598. }
  2599. #endif /* NOSHOW */
  2600. int
  2601. settypopts() { /* Set TYPE option defaults */
  2602.     int xp = -1;
  2603.     int c, getval;
  2604.     while (1) {
  2605. if ((y = cmswi(typetab,ntypetab,"Switch","",xxstring)) < 0) {
  2606.     if (y == -3)
  2607.       break;
  2608.     else
  2609.       return(y);
  2610. }
  2611. c = cmgbrk();
  2612. if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
  2613.     printf("?This switch does not take an argumentn");
  2614.     return(-9);
  2615. }
  2616. switch (y) {
  2617.   case TYP_NOP: xp = 0; break;
  2618.   case TYP_PAG: xp = 1; break;
  2619.   case TYP_WID:
  2620.     if (getval)
  2621.       if ((x = cmnum("Column at which to truncate",
  2622.      ckitoa(cmd_cols),10,&y,xxstring)) < 0)
  2623. return(x);
  2624.     typ_wid = y;
  2625.     break;
  2626.           default:
  2627.     printf("?Sorry, this option can not be setn");
  2628.     return(-9);
  2629. }
  2630.     }
  2631.     if ((x = cmcfm()) < 0) /* Get confirmation */
  2632.       return(x);
  2633.     if (xp > -1) typ_page = xp; /* Confirmed, save defaults */
  2634.     return(success = 1);
  2635. }
  2636. /* Forward declarations of functions local to this module */
  2637. _PROTOTYP (int doask,   ( int  ) );
  2638. _PROTOTYP (int dodef,   ( int  ) );
  2639. _PROTOTYP (int dodel,   ( void ) );
  2640. _PROTOTYP (int dodial,  ( int  ) );
  2641. _PROTOTYP (int doelse,  ( void ) );
  2642. _PROTOTYP (int dofor,   ( void ) );
  2643. _PROTOTYP (int doincr,  ( int  ) );
  2644. _PROTOTYP (int dopaus,  ( int  ) );
  2645. #ifndef NOPUSH
  2646. _PROTOTYP (int doping,  ( void ) );
  2647. _PROTOTYP (int doftp,   ( void ) );
  2648. #endif /* NOPUSH */
  2649. #ifndef NORENAME
  2650. #ifndef NOFRILLS
  2651. _PROTOTYP (int dorenam, ( void ) );
  2652. #endif /* NOFRILLS */
  2653. #endif /* NORENAME */
  2654. #ifdef ZCOPY
  2655. _PROTOTYP (int docopy, ( void ) );
  2656. #endif /* ZCOPY */
  2657. #ifdef CK_REXX
  2658. _PROTOTYP (int dorexx,  ( void ) );
  2659. #endif /* CK_REXX */
  2660. #ifdef TCPSOCKET
  2661. static struct keytab telcmd[] = {
  2662.     "abort", TN_ABORT, CM_INV, /* Emotionally toned word - don't show */
  2663.     "ao",    TN_AO,    0,
  2664.     "ayt",   TN_AYT,   0,
  2665.     "break", BREAK,    0,
  2666.     "cancel",TN_ABORT, 0,
  2667.     "ec",    TN_EC,    0,
  2668.     "el",    TN_EL,    0,
  2669.     "eof",   TN_EOF,   0,
  2670.     "eor",   TN_EOR,   0,
  2671.     "ga",    TN_GA,    0,
  2672.     "ip",    TN_IP,    0,
  2673.     "dmark", TN_DM,    0,
  2674.     "do",    DO,       0,
  2675.     "dont",  DONT,     0,
  2676.     "nop",   TN_NOP,   0,
  2677.     "sak",   TN_SAK,   CM_INV,
  2678.     "sb",    SB,       0,
  2679.     "se",    SE,       0,
  2680.     "susp",  TN_SUSP,  0,
  2681.     "will",  WILL,     0,
  2682.     "wont",  WONT,     0
  2683. };
  2684. static int ntelcmd = (sizeof(telcmd) / sizeof(struct keytab));
  2685. static struct keytab tnopts[] = {
  2686. #ifdef CK_AUTHENTICATION
  2687.     "auth",   TELOPT_AUTHENTICATION,   CM_INV,
  2688. #endif /* CK_AUTHENTICATION */
  2689.     "binary", TELOPT_BINARY, 0,
  2690.     "com-port-control", TELOPT_COM_PORT, CM_INV,
  2691.     "echo", TELOPT_ECHO, 0,
  2692. #ifdef CK_ENCRYPTION
  2693.     "encrypt", TELOPT_ENCRYPTION, CM_INV,
  2694. #endif /* CK_ENCRYPTION */
  2695. #ifdef IKS_OPTION
  2696.     "kermit", TELOPT_KERMIT, 0,
  2697. #endif /* IKS_OPTION */
  2698.     "lflow",  TELOPT_LFLOW, CM_INV,
  2699. #ifdef CK_NAWS
  2700.     "naws", TELOPT_NAWS, 0,
  2701. #endif /* CK_NAWS */
  2702. #ifdef CK_ENVIRONMENT
  2703.     "new-environment", TELOPT_NEWENVIRON,  CM_INV,
  2704. #endif /* CK_ENVIRONMENT */
  2705.     "pragma-heartbeat",TELOPT_PRAGMA_HEARTBEAT,  CM_INV,
  2706.     "pragma-logon",    TELOPT_PRAGMA_LOGON,  CM_INV,
  2707.     "pragma-sspi",     TELOPT_SSPI_LOGON,  CM_INV,
  2708.     "sak",   TELOPT_IBM_SAK, CM_INV,
  2709. #ifdef CK_SNDLOC
  2710.     "send-location",   TELOPT_SNDLOC,  CM_INV,
  2711. #endif /* CK_SNDLOC */
  2712.     "sga", TELOPT_SGA, 0,
  2713. #ifdef CK_SSL
  2714.     "start-tls",       TELOPT_START_TLS,  CM_INV,
  2715. #endif /* CK_SSL */
  2716.     "ttype", TELOPT_TTYPE, 0,
  2717. #ifdef CK_ENVIRONMENT
  2718.     "xdisplay-location", TELOPT_XDISPLOC, CM_INV,
  2719. #endif /* CK_ENVIRONMENT */
  2720.     "", 0, 0
  2721. };
  2722. static int ntnopts = (sizeof(tnopts) / sizeof(struct keytab)) - 1;
  2723. static struct keytab tnsbopts[] = {
  2724. #ifdef CK_NAWS
  2725.     "naws", TELOPT_NAWS, 0,
  2726. #endif /* CK_NAWS */
  2727.     "", 0, 0
  2728. };
  2729. static int ntnsbopts = (sizeof(tnsbopts) / sizeof(struct keytab)) - 1;
  2730. #ifndef NOPUSH
  2731. int
  2732. doftp() { /* FTP command */
  2733.     char *p; /* for now just runs the ftp program */
  2734.     int x;
  2735.     if (network) /* If we have a current connection */
  2736.       ckstrncpy(line,ttname,LINBUFSIZ); /* get the host name */
  2737.     else *line = ''; /* as default host */
  2738.     for (p = line; *p; p++) /* Remove ":service" from end. */
  2739.       if (*p == ':') { *p = ''; break; }
  2740.     if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0)
  2741.       return(x);
  2742.     if (nopush) {
  2743.         printf("?Sorry, FTP command disabledn");
  2744.         return(success = 0);
  2745.     }
  2746. /* Construct FTP command */
  2747. #ifdef VMS
  2748. #ifdef MULTINET /* TGV MultiNet */
  2749.     sprintf(line,"multinet ftp %s",s);
  2750. #else
  2751.     sprintf(line,"ftp %s",s); /* Other VMS TCP/IP's */
  2752. #endif /* MULTINET */
  2753. #else /* Not VMS */
  2754. #ifdef OS2ORUNIX
  2755.     sprintf(line,"%s %s",ftpapp,s);
  2756. #ifdef OS2
  2757.     p = line + strlen(ftpapp);
  2758.     while (p != line) {
  2759.         if (*p == '/') *p = '\';
  2760.         p--;
  2761.     }
  2762. #endif /* OS2 */
  2763. #else /* OS2ORUNIX */
  2764.     sprintf(line,"ftp %s",s);
  2765. #endif /* OS2ORUNIX */
  2766. #endif /* VMS */
  2767.     conres(); /* Make console normal  */
  2768. #ifdef DEC_TCPIP
  2769.     printf("n"); /* Prevent prompt-stomping */
  2770. #endif /* DEC_TCPIP */
  2771.     x = zshcmd(line);
  2772.     concb((char)escape);
  2773.     return(success = x);
  2774. }
  2775. int
  2776. doping() { /* PING command */
  2777.     char *p; /* just runs ping program */
  2778.     int x;
  2779.     if (network) /* If we have a current connection */
  2780.       ckstrncpy(line,ttname,LINBUFSIZ); /* get the host name */
  2781.     else *line = ''; /* as default host to be pinged. */
  2782.     for (p = line; *p; p++) /* Remove ":service" from end. */
  2783.       if (*p == ':') { *p = ''; break; }
  2784.     if ((x = cmtxt("IP host name or number", line, &s, xxstring)) < 0)
  2785.       return(x);
  2786.     if (nopush) {
  2787.         printf("?Sorry, PING command disabledn");
  2788.         return(success = 0);
  2789.     }
  2790.     /* Construct PING command */
  2791. #ifdef VMS
  2792. #ifdef MULTINET /* TGV MultiNet */
  2793.     sprintf(line,"multinet ping %s /num=1",s);
  2794. #else
  2795.     sprintf(line,"ping %s 56 1",s); /* Other VMS TCP/IP's */
  2796. #endif /* MULTINET */
  2797. #else /* Not VMS */
  2798.     sprintf(line,"ping %s",s);
  2799. #endif /* VMS */
  2800.     conres(); /* Make console normal  */
  2801. #ifdef DEC_TCPIP
  2802.     printf("n"); /* Prevent prompt-stomping */
  2803. #endif /* DEC_TCPIP */
  2804.     x = zshcmd(line);
  2805.     concb((char)escape);
  2806.     return(success = x);
  2807. }
  2808. #endif /* NOPUSH */
  2809. #endif /* TCPSOCKET */
  2810. #ifndef NOXFER
  2811. static char * asnbuf = NULL; /* As-name buffer pointer */
  2812. char sndxnam[] = { "_array_x_" }; /* (with replaceable x!) */
  2813. /*
  2814.   The new SEND command, replacing BSEND, CSEND, PSEND, etc etc.
  2815.   Call with cx = top-level keyword value.  Returns:
  2816.     < 0  On parse error.
  2817.     0    On other type of failure (e.g. requested operation not allowed).
  2818.     1    On success with sstate set to 's' so protocol will begin.
  2819. */
  2820. /*  D O X S E N D  --  Parse SEND and related commands with switches  */
  2821. int
  2822. doxsend(cx) int cx; {
  2823.     int c, i, n, wild, confirmed = 0; /* Workers */
  2824.     int x, y; /* of the world... */
  2825.     int getval = 0; /* Whether to get switch value */
  2826.     extern char * snd_move; /* Directory to move sent files to */
  2827.     extern char * snd_rename; /* What to rename sent files to */
  2828.     extern char * g_snd_move;
  2829.     extern char * g_snd_rename;
  2830.     extern char * filefile; /* File containing filenames to send */
  2831.     extern struct keytab pathtab[]; /* PATHNAMES option keywords */
  2832.     extern int npathtab; /* How many of them */
  2833.     extern int recursive; /* Recursive directory traversal */
  2834.     extern int rprintf; /* REMOTE PRINT flag */
  2835.     extern int fdispla; /* TRANSFER DISPLAY setting */
  2836.     extern int skipbup; /* Skip backup files when sending */
  2837.     struct stringint { /* Temporary array for switch values */
  2838. char * sval;
  2839. int ival;
  2840.     } pv[SND_MAX+1];
  2841.     struct FDB sf, sw, fl, cm; /* FDBs for each parse function */
  2842.     int mlist = 0; /* Flag for MSEND or MMOVE */
  2843.     char * m; /* For making help messages */
  2844.     extern struct keytab protos[]; /* File transfer protocols */
  2845.     extern int nprotos;
  2846.     extern char sndbefore[], sndafter[], *sndexcept[]; /* Selection criteria */
  2847.     extern char sndnbefore[], sndnafter[];
  2848.     extern long sndsmaller, sndlarger, calibrate;
  2849. #ifndef NOSPL
  2850.     int range[2]; /* Array range */
  2851.     char ** ap = NULL; /* Array pointer */
  2852.     int arrayx = -1; /* Array index */
  2853. #endif /* NOSPL */
  2854.     for (i = 0; i <= SND_MAX; i++) { /* Initialize switch values */
  2855. pv[i].sval = NULL; /* to null pointers */
  2856. pv[i].ival = -1; /* and -1 int values */
  2857.     }
  2858. #ifndef NOSPL
  2859.     range[0] = -1;
  2860.     range[1] = -1;
  2861.     sndxin = -1; /* Array index */
  2862. #endif /* NOSPL */
  2863.     sndarray = NULL; /* Array pointer */
  2864. #ifdef UNIXOROSK
  2865.     g_matchdot = matchdot; /* Match dot files */
  2866. #endif /* UNIXOROSK */
  2867.     g_recursive = recursive; /* Recursive sending */
  2868.     recursive = 0; /* Save global value, set local */
  2869.     debug(F101,"xsend entry fncnv","",fncnv);
  2870.     /* Preset switch values based on top-level command that called us */
  2871.     switch (cx) {
  2872.       case XXMSE: /* MSEND */
  2873. mlist = 1; break;
  2874.       case XXCSEN: /* CSEND */
  2875. pv[SND_CMD].ival = 1; break;
  2876.       case XXMMOVE: /* MMOVE */
  2877. mlist = 1;
  2878.       case XXMOVE: /* MOVE */
  2879. pv[SND_DEL].ival = 1; break;
  2880.       case XXRSEN: /* RESEND */
  2881. pv[SND_BIN].ival = 1; /* Implies /BINARY */
  2882. pv[SND_RES].ival = 1; break;
  2883.       case XXMAI: /* MAIL */
  2884. pv[SND_MAI].ival = 1; break;
  2885.     }
  2886.     /* Set up chained parse functions... */
  2887.     cmfdbi(&sw, /* First FDB - command switches */
  2888.    _CMKEY, /* fcode */
  2889.    "Filename, or switch", /* hlpmsg */
  2890.    "", /* default */
  2891.    "", /* addtl string data */
  2892. #ifdef NOMSEND
  2893.    nsndtab, /* addtl numeric data 1: tbl size */
  2894. #else
  2895.    mlist ? nmsndtab : nsndtab, /* addtl numeric data 1: tbl size */
  2896. #endif /* NOMSEND */
  2897.    4, /* addtl numeric data 2: 4 = cmswi */
  2898.    xxstring, /* Processing function */
  2899. #ifdef NOMSEND
  2900.    sndtab, /* Keyword table */
  2901. #else
  2902.    mlist ? msndtab : sndtab,
  2903. #endif /* NOMSEND */
  2904.    &sf /* Pointer to next FDB */
  2905.    );
  2906.     cmfdbi(&sf, /* 2nd FDB - file to send */
  2907.    _CMIFI, /* fcode */
  2908.    "File(s) to send", /* hlpmsg */
  2909.    "", /* default */
  2910.    "", /* addtl string data */
  2911.    0, /* addtl numeric data 1 */
  2912.    0, /* addtl numeric data 2 */
  2913.    xxstring,
  2914.    NULL,
  2915.    mlist ? &cm : &fl
  2916.    );
  2917.     cmfdbi(&fl, /* 3rd FDB - command to send from */
  2918.    _CMFLD, /* fcode */
  2919.    "Command", /* hlpmsg */
  2920.    "", /* default */
  2921.    "", /* addtl string data */
  2922.    0, /* addtl numeric data 1 */
  2923.    0, /* addtl numeric data 2 */
  2924.    xxstring,
  2925.    NULL,
  2926.    &cm
  2927.    );
  2928.     cmfdbi(&cm, /* 4th FDB - Confirmation */
  2929.    _CMCFM, /* fcode */
  2930.    "", /* hlpmsg */
  2931.    "", /* default */
  2932.    "", /* addtl string data */
  2933.    0, /* addtl numeric data 1 */
  2934.    0, /* addtl numeric data 2 */
  2935.    NULL,
  2936.    NULL,
  2937.    NULL
  2938.    );
  2939.     while (1) { /* Parse 0 or more switches */
  2940. x = cmfdb(&sw); /* Parse something */
  2941. debug(F101,"xsend cmfdb","",x);
  2942. if (x < 0) /* Error */
  2943.   goto xsendx; /* or reparse needed */
  2944. if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
  2945.   break;
  2946. /*
  2947.   They gave a switch, but let's see how they terminated it.
  2948.   If they ended it with : or =, then we must parse a value.
  2949.   If they ended it with anything else, then we must NOT parse a value.
  2950. */
  2951. c = cmgbrk(); /* Get break character */
  2952. getval = (c == ':' || c == '='); /* to see how they ended the switch */
  2953. if (getval && !(cmresult.kflags & CM_ARG)) {
  2954.     printf("?This switch does not take argumentsn");
  2955.     x = -9;
  2956.     goto xsendx;
  2957. }
  2958. if (!getval && (cmgkwflgs() & CM_ARG)) {
  2959.     printf("?This switch requires an argumentn");
  2960.     x = -9;
  2961.     goto xsendx;
  2962. }
  2963. n = cmresult.nresult; /* Numeric result = switch value */
  2964. debug(F101,"xsend switch","",n);
  2965. switch (n) { /* Process the switch */
  2966.   case SND_CMD: /* These take no args */
  2967.     if (nopush) {
  2968. printf("?Sorry, system command access is disabledn");
  2969. x = -9;
  2970. goto xsendx;
  2971.     }
  2972. #ifdef PIPESEND
  2973.     else if (sndfilter) {
  2974. printf(
  2975. "?Sorry, no SEND /COMMAND or CSEND when SEND FILTER selectedn");
  2976. x = -9;
  2977. goto xsendx;
  2978.     }
  2979. #endif /* PIPESEND */
  2980.     sw.hlpmsg = "Command, or switch"; /* Change help message */
  2981.     pv[n].ival = 1; /* Just set the flag */
  2982.     pv[SND_ARR].ival = 0;
  2983.     break;
  2984.   case SND_REC: /* /RECURSIVE */
  2985.     recursive = 2; /* Set the real variable */
  2986.     pv[SND_PTH].ival = PATH_REL; /* Give them relative pathnames */
  2987.     pv[n].ival = 1; /* Just set the flag */
  2988.     break;
  2989.   case SND_RES: /* /RECOVER (resend) */
  2990.     pv[SND_ARR].ival = 0;
  2991.     pv[SND_BIN].ival = 1; /* Implies /BINARY */
  2992.   case SND_NOB: /* /NOBACKUP */
  2993.   case SND_DEL: /* /DELETE */
  2994.   case SND_SHH: /* /QUIET */
  2995.     pv[n].ival = 1; /* Just set the flag */
  2996.     break;
  2997. #ifdef UNIXOROSK
  2998. /* Like recursive, these are set immediately because they affect cmifi() */
  2999.   case SND_DOT: /* /DOTFILES */
  3000.     matchdot = 1;
  3001.     break;
  3002.   case SND_NOD: /* /NODOTFILES */
  3003.     matchdot = 0;
  3004.     break;
  3005. #endif /* UNIXOROSK */
  3006.   /* File transfer modes - each undoes the others */
  3007.   case SND_BIN: /* Binary */
  3008.   case SND_TXT: /* Text */
  3009.   case SND_IMG: /* Image */
  3010.   case SND_LBL: /* Labeled */
  3011.     pv[SND_BIN].ival = 0;
  3012.     pv[SND_TXT].ival = 0;
  3013.     pv[SND_IMG].ival = 0;
  3014.     pv[SND_LBL].ival = 0;
  3015.     pv[n].ival = 1;
  3016.     break;
  3017.   case SND_EXC: /* Excludes */
  3018.     if (!getval) break;
  3019.     if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
  3020. if (x == -3) {
  3021.     printf("?Pattern requiredn");
  3022.     x = -9;
  3023. }
  3024. goto xsendx;
  3025.     }
  3026.     if (pv[n].sval) free(pv[n].sval);
  3027.     y = strlen(s);
  3028.     if (y > 256) {
  3029. printf("?Pattern too long - 256 maxn");
  3030. x = -9;
  3031. goto xsendx;
  3032.     }
  3033.     pv[n].sval = malloc(y+1);
  3034.     if (pv[n].sval) {
  3035. strcpy(pv[n].sval,s);
  3036. pv[n].ival = 1;
  3037.     }
  3038.     break;
  3039.   case SND_MOV: /* MOVE after */
  3040.   case SND_REN: /* RENAME after */
  3041.     if (!getval) break;
  3042.     if ((x = cmfld(n == SND_MOV ?
  3043.    "device and/or directory for source file after sending" :
  3044.    "new name for source file after sending",
  3045.    "",
  3046.    &s,
  3047.    n == SND_MOV ? xxstring : NULL
  3048.    )) < 0) {
  3049. if (x == -3) {
  3050.     printf("%sn", n == SND_MOV ?
  3051.    "?Destination required" :
  3052.    "?New name required"
  3053.    );
  3054.     x = -9;
  3055. }
  3056. goto xsendx;
  3057.     }
  3058.     if (pv[n].sval) free(pv[n].sval);
  3059.     s = brstrip(s);
  3060.     y = strlen(s);
  3061.     if (y > 0) {
  3062. pv[n].sval = malloc(y+1);
  3063. if (pv[n].sval) {
  3064.     strcpy(pv[n].sval,s);
  3065.     pv[n].ival = 1;
  3066. }
  3067.     }
  3068.     break;
  3069.   case SND_SMA: /* Smaller / larger than */
  3070.   case SND_LAR:
  3071.     if (!getval) break;
  3072.     if ((x = cmnum("Size in bytes","0",10,&y,xxstring)) < 0)
  3073.       goto xsendx;
  3074.     pv[n].ival = y;
  3075.     break;
  3076.   case SND_AFT: /* Send /AFTER:date-time */
  3077.   case SND_BEF: /* Send /BEFORE:date-time */
  3078.   case SND_NAF: /* Send /NOT-AFTER:date-time */
  3079.   case SND_NBE: /* Send /NOT-BEFORE:date-time */
  3080.     if (!getval) break;
  3081.     if ((x = cmdate("File date-time","",&s,0,xxstring)) < 0) {
  3082. if (x == -3) {
  3083.     printf("?Date-time requiredn");
  3084.     x = -9;
  3085. }
  3086. goto xsendx;
  3087.     }
  3088.     if (pv[n].sval) free(pv[n].sval);
  3089.     pv[n].sval = malloc((int)strlen(s)+1);
  3090.     if (pv[n].sval) {
  3091. strcpy(pv[n].sval,s);
  3092. pv[n].ival = 1;
  3093.     }
  3094.     break;
  3095.   case SND_MAI: /* Send as mail (= MAIL) */
  3096. #ifdef IKSD
  3097.     if (inserver && !ENABLED(en_mai)) {
  3098. printf("?Sorry, sending files as mail is disabledn");
  3099. return(-9);
  3100.     }
  3101. #endif /* IKSD */
  3102.     pv[n].ival = 1;
  3103.     if (!getval) break;
  3104.     if ((x = cmfld("e-mail address","",&s,xxstring)) < 0) {
  3105. if (x == -3) {
  3106.     printf("?address requiredn");
  3107.     x = -9;
  3108. }
  3109. goto xsendx;
  3110.     }
  3111.     s = brstrip(s);
  3112.     if (pv[n].sval) free(pv[n].sval);
  3113.     pv[n].sval = malloc((int)strlen(s)+1);
  3114.     if (pv[n].sval)
  3115.       strcpy(pv[n].sval,s);
  3116.     break;
  3117.   case SND_PRI: /* Send to be printed (REMOTE PRINT) */
  3118. #ifdef IKSD
  3119.     if (inserver && !ENABLED(en_mai)) {
  3120. printf("?Sorry, sending files for printing is disabledn");
  3121. return(-9);
  3122.     }
  3123. #endif /* IKSD */
  3124.     pv[n].ival = 1;
  3125.     if (!getval) break;
  3126.     if ((x = cmfld("Print options","",&s,xxstring)) < 0)
  3127.       if (x != -3) goto xsendx;
  3128.     s = brstrip(s);
  3129.     if (pv[n].sval) free(pv[n].sval);
  3130.     pv[n].sval = malloc((int)strlen(s)+1);
  3131.     if (pv[n].sval)
  3132.       strcpy(pv[n].sval,s);
  3133.     break;
  3134.   case SND_ASN: /* As-name */
  3135.     debug(F101,"xsend /as-name getval","",getval);
  3136.     if (!getval) break;
  3137.     if ((x = cmfld("Name to send under","",&s,NULL)) < 0) {
  3138. if (x == -3) {
  3139.     printf("?name requiredn");
  3140.     x = -9;
  3141. }
  3142. goto xsendx;
  3143.     }
  3144.     s = brstrip(s);
  3145.     if ((y = strlen(s)) > 0) {
  3146. if (pv[n].sval) free(pv[n].sval);
  3147. pv[n].sval = malloc(y+1);
  3148. if (pv[n].sval) {
  3149.     strcpy(pv[n].sval,s);
  3150.     pv[n].ival = 1;
  3151. }
  3152.     }
  3153.     break;
  3154.   case SND_STA: /* Starting position (= PSEND) */
  3155.     if (!getval) break;
  3156.     if ((x = cmnum("0-based position","0",10,&y,xxstring)) < 0)
  3157.       goto xsendx;
  3158.     pv[n].ival = y;
  3159.     break;
  3160.   case SND_PRO: /* Protocol to use */
  3161.     if (!getval) break;
  3162.     if ((x = cmkey(protos,nprotos,"File-transfer protocol","",
  3163.    xxstring)) < 0) {
  3164. if (x == -3) {
  3165.     printf("?name of protocol requiredn");
  3166.     x = -9;
  3167. }
  3168. goto xsendx;
  3169.     }
  3170.     pv[n].ival = x;
  3171.     break;
  3172. #ifdef PIPESEND
  3173.   case SND_FLT: /* Filter */
  3174.     debug(F101,"xsend /filter getval","",getval);
  3175.     if (!getval) break;
  3176.     if ((x = cmfld("Filter program to send through","",&s,NULL)) < 0) {
  3177. if (x == -3)
  3178.   s = "";
  3179. else
  3180.   goto xsendx;
  3181.     }
  3182.     s = brstrip(s);
  3183.     y = strlen(s);
  3184.     for (x = 0; x < y; x++) { /* Make sure they included "v(...)" */
  3185. if (s[x] != '\') continue;
  3186. if (s[x+1] == 'v') break;
  3187.     }
  3188.     if (x == y) {
  3189. printf(
  3190. "?Filter must contain a replacement variable for filename.n"
  3191.        );
  3192. x = -9;
  3193. goto xsendx;
  3194.     }
  3195.     pv[n].ival = 1;
  3196.     if (pv[n].sval) {
  3197. free(pv[n].sval);
  3198. pv[n].sval = NULL;
  3199.     }
  3200.     if ((y = strlen(s)) > 0) {
  3201. if (pv[n].sval = malloc(y+1))
  3202.   strcpy(pv[n].sval,s);
  3203.     }
  3204.     break;
  3205. #endif /* PIPESEND */
  3206.   case SND_PTH: /* Pathnames */
  3207.     if (!getval) {
  3208. pv[n].ival = PATH_REL;
  3209. break;
  3210.     }
  3211.     if ((x = cmkey(pathtab,npathtab,"","absolute",xxstring)) < 0)
  3212.       goto xsendx;
  3213.     pv[n].ival = x;
  3214.     break;
  3215.   case SND_NAM: /* Filenames */
  3216.     if (!getval) break;
  3217.     if ((x = cmkey(fntab,nfntab,"","converted",xxstring)) < 0)
  3218.       goto xsendx;
  3219.     debug(F101,"xsend /filenames","",x);
  3220.     pv[n].ival = x;
  3221.     break;
  3222. #ifdef CALIBRATE
  3223.           case SND_CAL: /* /CALIBRATE */
  3224.     if (getval) {
  3225. if ((x = cmnum("number of Kbytes to send",
  3226.    "1024",10,&y,xxstring)) < 0)
  3227.   goto xsendx;
  3228.     } else
  3229.       y = 1024;
  3230.     pv[n].ival = y;
  3231.     pv[SND_ARR].ival = 0;
  3232.     break;
  3233. #endif /* CALIBRATE */
  3234.   case SND_FIL: /* Name of file containing filnames */
  3235.     if (!getval) break;
  3236.     if ((x = cmifi("Name of file containing list of filenames",
  3237.        "",&s,&y,xxstring)) < 0) {
  3238. if (x == -3) {
  3239.     printf("?Filename requiredn");
  3240.     x = -9;
  3241. }
  3242. goto xsendx;
  3243.     } else if (y) {
  3244. printf("?Wildcards not allowedn");
  3245. x = -9;
  3246. goto xsendx;
  3247.     }
  3248.     if (pv[n].sval)
  3249.       free(pv[n].sval);
  3250.     if (s) if (*s) {
  3251. if (pv[n].sval = malloc((int)strlen(s)+1)) {
  3252.     strcpy(pv[n].sval,s);
  3253.     pv[n].ival = 1;
  3254.     pv[SND_ARR].ival = 0;
  3255. }
  3256.     }
  3257.     break;
  3258. #ifndef NOSPL
  3259.   case SND_ARR: /* SEND /ARRAY: */
  3260.     if (!getval) break;
  3261.     ap = NULL;
  3262.     if ((x = cmfld("Array name (a single letter will do)",
  3263.    "",
  3264.    &s,
  3265.    NULL
  3266.    )) < 0) {
  3267. if (x == -3)
  3268.   break;
  3269. else
  3270.   return(x);
  3271.     }
  3272.     if ((x = arraybounds(s,&(range[0]),&(range[1]))) < 0) {
  3273. printf("?Bad array: %sn",s);
  3274. return(-9);
  3275.     }
  3276.     if (!(ap = a_ptr[x])) {
  3277. printf("?No such array: %sn",s);
  3278. return(-9);
  3279.     }
  3280.     pv[n].ival = 1;
  3281.     pv[SND_CMD].ival = 0; /* Undo any conflicting ones... */
  3282.     pv[SND_RES].ival = 0;
  3283.     pv[SND_CAL].ival = 0;
  3284.     pv[SND_FIL].ival = 0;
  3285.     arrayx = x;
  3286.     break;
  3287. #endif /* NOSPL */
  3288.   default:
  3289.     printf("?Unexpected switch value - %dn",cmresult.nresult);
  3290.     x = -9;
  3291.     goto xsendx;
  3292. }
  3293.     }
  3294.     debug(F101,"xsend cmresult fcode","",cmresult.fcode);
  3295. #ifdef COMMENT
  3296.     /* List switch parsing results in debug log */
  3297.     for (i = 0; i <= SND_MAX; i++) {
  3298. sprintf(line,"xsend switch %02d",i);
  3299. debug(F111,line, pv[i].sval, pv[i].ival);
  3300.     }
  3301. #endif /* COMMENT */
  3302. /* Now we have all switches, plus maybe a filename or command, or nothing */
  3303. #ifdef PIPESEND
  3304.     if (protocol != PROTO_K && pv[SND_CMD].ival > 0) {
  3305. printf("?Sorry, %s works only with Kermit protocoln",
  3306.        (cx == XXCSEN) ? "CSEND" : "SEND /COMMAND");
  3307. x = -9;
  3308. goto xsendx;
  3309.     }
  3310.     if (pv[SND_RES].ival > 0 || /* /RECOVER */
  3311. pv[SND_STA].ival > 0) { /* or /STARTING */
  3312. if (sndfilter || pv[SND_FLT].ival > 0) {
  3313.     printf("?Sorry, no /RECOVER or /START if SEND FILTER selectedn");
  3314.     x = -9;
  3315.     goto xsendx;
  3316. }
  3317.     }
  3318. #endif /* PIPESEND */
  3319.     cmarg = "";
  3320.     cmarg2 = "";
  3321.     line[0] = NUL;
  3322.     s = line;
  3323.     wild = 0;
  3324.     switch (cmresult.fcode) { /* How did we get out of switch loop */
  3325.       case _CMIFI: /* Input filename */
  3326. ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Name */
  3327. if (pv[SND_ARR].ival > 0)
  3328.   cmarg2 = line;
  3329. else
  3330.   wild = cmresult.nresult; /* Wild flag */
  3331. break;
  3332.       case _CMFLD: /* Field */
  3333. /* Only allowed with /COMMAND and /ARRAY */
  3334. if (pv[SND_CMD].ival < 1 && pv[SND_ARR].ival < 1) {
  3335.     printf("?%s - "%s"n",
  3336.    iswild(cmresult.sresult) ?
  3337.    "No files match" : "File not found",
  3338.    cmresult.sresult
  3339.    );
  3340.     x = -9;
  3341.     goto xsendx;
  3342. }
  3343. ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
  3344. if (pv[SND_ARR].ival > 0)
  3345.   cmarg2 = line;
  3346. break;
  3347.       case _CMCFM: /* Confirmation */
  3348. /* s = ""; */
  3349. confirmed = 1;
  3350. break;
  3351.       default:
  3352. printf("?Unexpected function code: %dn",cmresult.fcode);
  3353. x = -9;
  3354. goto xsendx;
  3355.     }
  3356.     debug(F110,"xsend string",s,0);
  3357.     debug(F101,"xsend confirmed","",confirmed);
  3358.     /* Save and change protocol and transfer mode */
  3359.     /* Global values are restored in main parse loop */
  3360.     g_proto = protocol; /* Save current global protocol */
  3361.     g_urpsiz = urpsiz;
  3362.     g_spsizf = spsizf;
  3363.     g_spsiz = spsiz;
  3364.     g_spsizr = spsizr;
  3365.     g_spmax = spmax;
  3366.     g_wslotr = wslotr;
  3367.     g_prefixing = prefixing;
  3368.     g_fncact = fncact;
  3369.     g_fncnv = fncnv;
  3370.     g_fnspath = fnspath;
  3371.     g_fnrpath = fnrpath;
  3372.     if (pv[SND_PRO].ival > -1) { /* Change according to switch */
  3373. protocol = pv[SND_PRO].ival;
  3374.         if (ptab[protocol].rpktlen > -1) /* copied from initproto() */
  3375.             urpsiz = ptab[protocol].rpktlen;
  3376.         if (ptab[protocol].spktflg > -1)
  3377.             spsizf = ptab[protocol].spktflg;
  3378.         if (ptab[protocol].spktlen > -1) {
  3379.             spsiz = ptab[protocol].spktlen;
  3380.             if (spsizf)
  3381.       spsizr = spmax = spsiz;
  3382.         }
  3383.         if (ptab[protocol].winsize > -1)
  3384.             wslotr = ptab[protocol].winsize;
  3385.         if (ptab[protocol].prefix > -1)
  3386.             prefixing = ptab[protocol].prefix;
  3387.         if (ptab[protocol].fnca > -1)
  3388.             fncact  = ptab[protocol].fnca;
  3389.         if (ptab[protocol].fncn > -1)
  3390.             fncnv   = ptab[protocol].fncn;
  3391.         if (ptab[protocol].fnsp > -1)
  3392.             fnspath = ptab[protocol].fnsp;
  3393.         if (ptab[protocol].fnrp > -1)
  3394.             fnrpath = ptab[protocol].fnrp;
  3395.     }
  3396.     debug(F101,"xsend protocol","",protocol);
  3397.     if (pv[SND_NOB].ival > -1) { /* /NOBACKUP (skip backup file) */
  3398. g_skipbup = skipbup;
  3399. skipbup = 1;
  3400.     }
  3401.     if (pv[SND_REC].ival > 0) /* Recursive */
  3402.       recursive = 2;
  3403.     g_binary = binary; /* Save global transfer mode */
  3404. #ifdef PATTERNS
  3405.     g_patterns = patterns; /* Save FILE PATTERNS setting */
  3406. #endif /* PATTERNS */
  3407.     if (pv[SND_BIN].ival > 0) { /* Change according to switch */
  3408. /* If they said /BINARY they mean /BINARY */
  3409. #ifdef PATTERNS
  3410. patterns = 0; /* So no pattern-based switching */
  3411. #endif /* PATTERNS */
  3412. g_xfermode = xfermode; /* or automatic transfer mode */
  3413. xfermode = XMODE_M;
  3414. binary = XYFT_B;
  3415. debug(F101,"doxsend /BINARY xfermode","",xfermode);
  3416.     } else if (pv[SND_TXT].ival > 0) { /* Ditto for /TEXT */
  3417. #ifdef PATTERNS
  3418. patterns = 0;
  3419. #endif /* PATTERNS */
  3420. g_xfermode = xfermode;
  3421. xfermode = XMODE_M;
  3422. binary = XYFT_T;
  3423. debug(F101,"doxsend /TEXT xfermode","",xfermode);
  3424.     } else if (pv[SND_IMG].ival > 0) {
  3425. #ifdef VMS
  3426. binary = XYFT_I;
  3427. #else
  3428. binary = XYFT_B;
  3429. #endif /* VMS */
  3430.     }
  3431. #ifdef CK_LABELED
  3432.     else if (pv[SND_LBL].ival > 0) {
  3433. binary = XYFT_L;
  3434.     }
  3435. #endif /* CK_LABELED */
  3436.     debug(F101,"xsend binary","",binary);
  3437.     /* Check for legal combinations of switches, filenames, etc */
  3438. #ifdef PIPESEND
  3439.     if (pv[SND_CMD].ival > 0) { /* COMMAND - strip any braces */
  3440. debug(F110,"SEND /COMMAND before stripping",s,0);
  3441. s = brstrip(s);
  3442. debug(F110,"SEND /COMMAND after stripping",s,0);
  3443. if (!*s) {
  3444.     printf("?Sorry, a command to send from is requiredn");
  3445.     x = -9;
  3446.     goto xsendx;
  3447. }
  3448.     }
  3449. #endif /* PIPESEND */
  3450. /* Set up /MOVE and /RENAME */
  3451.     if (pv[SND_DEL].ival > 0 &&
  3452. (pv[SND_MOV].ival > 0 || pv[SND_REN].ival > 0)) {
  3453. printf("?Sorry, /DELETE conflicts with /MOVE or /RENAMEn");
  3454. x = -9;
  3455. goto xsendx;
  3456.     }
  3457. #ifdef CK_TMPDIR
  3458.     if (pv[SND_MOV].ival > 0) {
  3459. int len;
  3460. char * p = pv[SND_MOV].sval;
  3461. #ifdef CK_LOGIN
  3462. if (isguest) {
  3463.     printf("?Sorry, /MOVE-TO not available to guestsn");
  3464.     x = -9;
  3465.     goto xsendx;
  3466. }
  3467. #endif /* CK_LOGIN */
  3468. len = strlen(p);
  3469. if (!isdir(p)) { /* Check directory */
  3470. #ifdef CK_MKDIR
  3471.     char * s = NULL;
  3472.     s = (char *)malloc(len + 4);
  3473.     if (s) {
  3474. strcpy(s,p);
  3475. #ifdef datageneral
  3476. if (s[len-1] != ':') { s[len++] = ':'; s[len] = NUL; }
  3477. #else
  3478. if (s[len-1] != '/') { s[len++] = '/'; s[len] = NUL; }
  3479. #endif /* datageneral */
  3480. s[len++] = 'X';
  3481. s[len] = NUL;
  3482. x = zmkdir(s);
  3483. free(s);
  3484. if (x < 0) {
  3485.     printf("?Can't create "%s"n",p);
  3486.     x = -9;
  3487.     goto xsendx;
  3488. }
  3489.     }
  3490. #else
  3491.     printf("?Directory "%s" not foundn",p);
  3492.     x = -9;
  3493.     goto xsendx;
  3494. #endif /* CK_MKDIR */
  3495. }
  3496. makestr(&snd_move,p);
  3497.     }
  3498. #endif /* CK_TMPDIR */
  3499.     if (pv[SND_REN].ival > 0) { /* /RENAME */
  3500. char * p = pv[SND_REN].sval;
  3501. #ifdef CK_LOGIN
  3502. if (isguest) {
  3503.     printf("?Sorry, /RENAME-TO not available to guestsn");
  3504.     x = -9;
  3505.     goto xsendx;
  3506. }
  3507. #endif /* CK_LOGIN */
  3508. if (!p) p = "";
  3509. if (!*p) {
  3510.     printf("?New name required for /RENAMEn");
  3511.     x = -9;
  3512.     goto xsendx;
  3513. }
  3514. p = brstrip(p);
  3515. #ifndef NOSPL
  3516.     /* If name given is wild, rename string must contain variables */
  3517. if (wild) {
  3518.     char * s = tmpbuf;
  3519.     x = TMPBUFSIZ;
  3520.     zzstring(p,&s,&x);
  3521.     if (!strcmp(tmpbuf,p)) {
  3522. printf(
  3523.     "?/RENAME for file group must contain variables such as \v(filename)n"
  3524.        );
  3525. x = -9;
  3526. goto xsendx;
  3527.     }
  3528. }
  3529. #endif /* NOSPL */
  3530. makestr(&snd_rename,p);
  3531.     }
  3532. /* Handle /RECOVER and /START */
  3533. #ifdef CK_RESEND
  3534.     if (pv[SND_RES].ival > 0 && binary != XYFT_B
  3535. #ifdef PATTERNS
  3536. && !patterns
  3537. #else
  3538. #ifdef VMS
  3539. /* VMS sets text/binary automatically later when it opens the file */
  3540. && 0
  3541. #endif /* VMS */
  3542. #endif /* PATTERNS */
  3543. ) {
  3544. printf("?Sorry, /BINARY requiredn");
  3545. x = -9;
  3546. goto xsendx;
  3547.     }
  3548.     if (pv[SND_STA].ival > 0) { /* /START */
  3549. if (wild) {
  3550.     printf("?Sorry, wildcards not permitted with /STARTn");
  3551.     x = -9;
  3552.     goto xsendx;
  3553. }
  3554. if (sizeof(int) < 4) {
  3555.     printf("?Sorry, this command needs 32-bit integersn");
  3556.     x = -9;
  3557.     goto xsendx;
  3558. }
  3559. #ifdef CK_XYZ
  3560. if (protocol != PROTO_K) {
  3561.     printf("?Sorry, SEND /START works only with Kermit protocoln");
  3562.     x = -9;
  3563.     goto xsendx;
  3564. }
  3565. #endif /* CK_XYZ */
  3566.     }
  3567. #ifdef CK_XYZ
  3568.     if (pv[SND_RES].ival > 0) {
  3569. if (protocol != PROTO_K && protocol != PROTO_Z) {
  3570.     printf(
  3571.     "Sorry, /RECOVER is possible only with Kermit or ZMODEM protocoln"
  3572.    );
  3573.     x = -9;
  3574.     goto xsendx;
  3575. }
  3576.     }
  3577. #endif /* CK_XYZ */
  3578. #endif /* CK_RESEND */
  3579.     if (protocol == PROTO_K) {
  3580. if ((pv[SND_MAI].ival > 0 || /* MAIL */
  3581.      pv[SND_PRI].ival > 0 || /* PRINT */
  3582.      pv[SND_RES].ival > 0 /* RESEND */
  3583.      ) &&
  3584.     (!atdiso || !atcapr)) { /* Disposition attribute off? */
  3585.     printf("?Sorry, ATTRIBUTE DISPOSITION must be ONn");
  3586.     x = -9;
  3587.     goto xsendx;
  3588. }
  3589.     }
  3590. #ifdef CK_XYZ
  3591.     if (wild && (protocol == PROTO_X || protocol == PROTO_XC)) {
  3592. printf(
  3593. "Sorry, you can only send one file at a time with XMODEM protocoln"
  3594.        );
  3595. x = -9;
  3596. goto xsendx;
  3597.     }
  3598. #endif /* CK_XYZ */
  3599.     if (!confirmed) { /* CR not typed yet, get more fields */
  3600. char *m;
  3601. if (mlist) { /* MSEND or MMOVE */
  3602.     nfils = 0; /* We already have the first one */
  3603. #ifndef NOMSEND
  3604.     msfiles[nfils++] = line; /* Store pointer */
  3605.     lp = line + (int)strlen(line) + 1; /* Point past it */
  3606.     debug(F111,"xsend msend",msfiles[nfils-1],nfils-1);
  3607.     while (1) { /* Get more filenames */
  3608. char *p;
  3609. if ((x = cmifi("Names of files to send, separated by spaces",
  3610.        "", &s,&y,xxstring)) < 0) {
  3611.     if (x != -3)
  3612.       goto xsendx;
  3613.     if ((x = cmcfm()) < 0)
  3614.       goto xsendx;
  3615.     break;
  3616. }
  3617. msfiles[nfils++] = lp; /* Got one, count it, point to it, */
  3618. p = lp; /* remember pointer, */
  3619. while (*lp++ = *s++) /* and copy it into buffer */
  3620.   if (lp > (line + LINBUFSIZ)) { /* Avoid memory leak */
  3621.       printf("?MSEND list too longn");
  3622.       line[0] = NUL;
  3623.       x = -9;
  3624.       goto xsendx;
  3625.   }
  3626. debug(F111,"xsend msend",msfiles[nfils-1],nfils-1);
  3627. if (nfils == 1) fspec[0] = NUL; /* Take care of v(filespec) */
  3628. #ifdef ZFNQFP
  3629. zfnqfp(p,TMPBUFSIZ,tmpbuf);
  3630. p = tmpbuf;
  3631. #endif /* ZFNQFP */
  3632. if (((int)strlen(fspec) + (int)strlen(p) + 1) < fspeclen) {
  3633.     strcat(fspec,p);
  3634.     strcat(fspec," ");
  3635. } else
  3636. #ifdef COMMENT
  3637.   printf("WARNING - \v(filespec) buffer overflown");
  3638. #else
  3639.   debug(F101,"doxsend filespec buffer overflow","",0);
  3640. #endif /* COMMENT */
  3641.     }
  3642. #endif /* NOMSEND */
  3643. } else { /* Regular SEND */
  3644.     char *p; int y;
  3645.     nfils = -1;
  3646.     if (pv[SND_MAI].ival > 0)
  3647.       m = (pv[SND_MAI].sval) ?
  3648. "e-mail address (optional)" :
  3649.   "e-mail address (required)";
  3650.     else if (pv[SND_PRI].ival > 0)
  3651.       m = "printer options (optional)";
  3652.     else if (wild)
  3653.       m =
  3654. "nOptional as-name template containing replacement variables 
  3655. like \v(filename)";
  3656.     else
  3657.       m = "Optional name to send it with";
  3658.     if ((x = cmtxt(m,"",&p,NULL)) < 0)
  3659.       goto xsendx;
  3660.     if (!p) p = "";
  3661.     if (*p) { /* If some text was given... */
  3662. p = brstrip(p); /* Replace /AS-NAME: value if any */
  3663. if ((y = strlen(p)) > 0) {
  3664.     if (pv[SND_ASN].sval) free(pv[SND_ASN].sval);
  3665.     pv[SND_ASN].sval = malloc(y+1);
  3666.     if (pv[SND_ASN].sval) {
  3667. strcpy(pv[SND_ASN].sval,p);
  3668. pv[SND_ASN].ival = 1;
  3669.     }
  3670. }
  3671.     }
  3672. }
  3673.     }
  3674.     /* Set cmarg2 from as-name, however we got it. */
  3675.     if (pv[SND_ASN].ival > 0 && pv[SND_ASN].sval && !*cmarg2) {
  3676. int x;
  3677. x = strlen(line);
  3678. ckstrncpy(line+x+2,pv[SND_ASN].sval,LINBUFSIZ-x-1);
  3679. cmarg2 = line+x+2;
  3680. debug(F110,"doxsend cmarg2",cmarg2,0);
  3681.     }
  3682. #ifndef NOFRILLS
  3683.     if ((pv[SND_MAI].ival > 0) && (pv[SND_PRI].ival > 0)) {
  3684. printf("Sorry, /MAIL and /PRINT are conflicting optionsn");
  3685. x = -9;
  3686. goto xsendx;
  3687.     }
  3688.     n = 0; /* /MAIL or /PRINT? */
  3689.     if (pv[SND_MAI].ival > 0)
  3690.       n = SND_MAI;
  3691.     else if (pv[SND_PRI].ival > 0)
  3692.       n = SND_PRI;
  3693.     if (n) { /* Yes... */
  3694. #ifdef DEBUG
  3695. char * p;
  3696. if (n == SND_MAI)
  3697.   p = "/MAIL";
  3698. else
  3699.   p = "/PRINT";
  3700. debug(F111,"xsend",p,n);
  3701. #endif /* DEBUG */
  3702. #ifdef CK_XYZ
  3703. if (protocol != PROTO_K) {
  3704.     printf("Sorry, %s available only with Kermit protocoln",
  3705.    (n == SND_MAI) ? "/MAIL" : "/PRINT"
  3706.    );
  3707.     x = -9;
  3708.     goto xsendx;
  3709. }
  3710. #endif /* CK_XYZ */
  3711. debug(F101,"xsend print/mail wild","",wild);
  3712. *optbuf = NUL; /* Wipe out any old options */
  3713. s = pv[n].sval; /* mail address or print switch val */
  3714. if (!s) s = "";
  3715. debug(F110,"doxsend mail address or printer options",s,0);
  3716. if (n == SND_MAI && !*s) {
  3717.     printf("?E-mail address requiredn");
  3718.     x = -9;
  3719.     goto xsendx;
  3720. } else if ((int)strlen(s) > 94) { /* Ensure legal size */
  3721.     printf("?%s too longn",
  3722.    (n == SND_MAI) ?
  3723.    "E-mail address" :
  3724.    "Print option string"
  3725.    );
  3726.     x = -9;
  3727.     goto xsendx;
  3728. }
  3729. strcpy(optbuf,s); /* OK, copy to option buffer */
  3730. cmarg = line; /* File to send */
  3731. if (n == SND_MAI) {
  3732.     debug(F110,"xsend mailing",cmarg,0);
  3733.     debug(F110,"xsend address:",optbuf,0);
  3734.     rmailf = 1;
  3735. } else {
  3736.     debug(F110,"xsend printing",cmarg,0);
  3737.     debug(F110,"xsend options",optbuf,0);
  3738.     rprintf = 1;
  3739. }
  3740.     }
  3741. #endif /* NOFRILLS */
  3742. #ifdef CALIBRATE
  3743.     if (pv[SND_CAL].ival > 0) { /* Handle /CALIBRATE */
  3744. if (confirmed) {
  3745.     calibrate = pv[SND_CAL].ival * 1024L;
  3746.     sndsrc = -9;
  3747.     nfils = 1;
  3748.     wild = 0;
  3749. #ifndef NOMSEND
  3750.     addlist = 0;
  3751. #endif /* NOMSEND */
  3752.     strcpy(line,"CALIBRATION");
  3753.     s = cmarg = line;
  3754.     if (!cmarg2) cmarg2 = "";
  3755.     debug(F110,"doxsend cmarg2 calibrate",cmarg2,0);
  3756. } else if (line[0]) {
  3757.     calibrate = 0L;
  3758.     pv[SND_CAL].ival = 0L;
  3759. }
  3760.     }
  3761. #endif /* CALIBRATE */
  3762.     if (pv[SND_FIL].ival > 0) {
  3763. if (confirmed && !calibrate) {
  3764.     if (zopeni(ZMFILE,pv[SND_FIL].sval) < 1) {
  3765. debug(F110,"xsend can't open",pv[SND_FIL].sval,0);
  3766. printf("?Failure to open %sn",filefile);
  3767. x = -9;
  3768. goto xsendx;
  3769.     }
  3770.     makestr(&filefile,pv[SND_FIL].sval); /* Open, remember name */
  3771.     debug(F110,"xsend opened",filefile,0);
  3772.     wild = 1;
  3773. }
  3774.     }
  3775.     /* SEND alone... */
  3776. #ifndef NOSPL
  3777.     if (confirmed && pv[SND_ARR].ival > 0) {
  3778. if (!*cmarg2) {
  3779.     sndxnam[7] = (char)((arrayx == 1) ? 64 : arrayx + ARRAYBASE);
  3780.     cmarg2 = sndxnam;
  3781. }
  3782. cmarg = "";
  3783. goto sendend;
  3784.     }
  3785. #endif /* NOSPL */
  3786.     if (confirmed && !line[0] && !filefile && !calibrate) {
  3787. #ifndef NOMSEND
  3788. if (filehead) { /* OK if we have a SEND-LIST */
  3789.     nfils = filesinlist;
  3790.     sndsrc = nfils; /* Like MSEND */
  3791.     addlist = 1; /* But using a different list... */
  3792.     filenext = filehead;
  3793.     if (pv[SND_DEL].ival > 0) /* /DELETE given? */
  3794.       moving = 1;
  3795.     goto sendend;
  3796. }
  3797. #endif /* NOMSEND */
  3798. printf("?Filename required but not givenn");
  3799. x = -9;
  3800. goto xsendx;
  3801.     }
  3802.     /* Not send-list or array */
  3803. #ifndef NOMSEND
  3804.     addlist = 0; /* Don't use SEND-LIST. */
  3805.     filenext = NULL;
  3806. #endif /* NOMSEND */
  3807.     if (mlist) { /* MSEND or MMOVE */
  3808. #ifndef NOMSEND
  3809. cmlist = msfiles; /* List of files to send */
  3810. sndsrc = nfils;
  3811. cmarg2 = "";
  3812. sendstart = 0L;
  3813. #endif /* NOMSEND */
  3814. #ifdef PIPESEND
  3815. pipesend = 0;
  3816. #endif /* PIPESEND */
  3817.     } else if (filefile) { /* File contains list of filenames */
  3818. s = "";
  3819. cmarg = "";
  3820. cmarg2 = "";
  3821. line[0] = NUL;
  3822. nfils = 1;
  3823. sndsrc = 1;
  3824.     } else if (!calibrate &&  pv[SND_ARR].ival < 1) {
  3825. nfils = sndsrc = -1; /* Not MSEND, MMOVE, /LIST, or /ARRAY */
  3826. if (
  3827. #ifndef NOFRILLS
  3828.     !rmailf && !rprintf /* Not MAIL or PRINT */
  3829. #else
  3830.     1
  3831. #endif /* NOFRILLS */
  3832.     ) {
  3833.     int y = 1;
  3834.     if (!iswild(s))
  3835.       y = zchki(s);
  3836.     if (y < 0) {
  3837. printf("?Read access denied - "%s"n", s);
  3838. x = -9;
  3839. goto xsendx;
  3840.     }
  3841.     if (s != line) /* We might already have done this. */
  3842.       ckstrncpy(line,s,LINBUFSIZ); /* Copy of string just parsed. */
  3843.     else
  3844.       debug(F110,"doxsend line=s",line,0);
  3845.     cmarg = line; /* File to send */
  3846. }
  3847. zfnqfp(cmarg,fspeclen,fspec);
  3848.     }
  3849.     if (!mlist) { /* For all but MSEND... */
  3850. #ifdef PIPESEND
  3851. if (pv[SND_CMD].ival > 0) /* /COMMAND sets pipesend flag */
  3852.   pipesend = 1;
  3853. debug(F101,"xsend /COMMAND pipesend","",pipesend);
  3854. if (pipesend && filefile) {
  3855.     printf("?Invalid switch combinationn");
  3856.     x = -9;
  3857.     goto xsendx;
  3858. }
  3859. #endif /* PIPESEND */
  3860. #ifndef NOSPL
  3861.     /* If as-name given and filespec is wild, as-name must contain variables */
  3862. debug(F111,"doxsend cmarg2 wild",cmarg2,wild);
  3863. if (wild && *cmarg2) {
  3864.     char * s = tmpbuf;
  3865.     x = TMPBUFSIZ;
  3866.     zzstring(cmarg2,&s,&x);
  3867.     if (!strcmp(tmpbuf,cmarg2)) {
  3868. printf(
  3869.     "?As-name for file group must contain variables such as \v(filename)n"
  3870.        );
  3871. x = -9;
  3872. goto xsendx;
  3873.     }
  3874. }
  3875. #endif /* NOSPL */
  3876.     /* Strip braces from as-name */
  3877. debug(F110,"xsend cmarg2 before stripping",cmarg2,0);
  3878. cmarg2 = brstrip(cmarg2);
  3879. debug(F110,"xsend filename",cmarg,0);
  3880. debug(F110,"xsend as-name",cmarg2,0);
  3881.     /* Copy as-name to a safe place */
  3882. if (asnbuf) {
  3883.     free(asnbuf);
  3884.     asnbuf = NULL;
  3885. }
  3886. if ((y = strlen(cmarg2)) > 0) {
  3887.     asnbuf = (char *) malloc(y + 1);
  3888.     if (asnbuf) {
  3889. strcpy(asnbuf,cmarg2);
  3890. cmarg2 = asnbuf;
  3891.     } else cmarg2 = "";
  3892. }
  3893. #ifdef CK_RESEND
  3894. debug(F111,"xsend pv[SND_STA].ival","",pv[SND_STA].ival);
  3895. if (pv[SND_STA].ival > -1) { /* /START position */
  3896.     if (wild) {
  3897. printf("?/STARTING-AT may not be used with multiple files.n");
  3898. x = -9;
  3899. goto xsendx;
  3900.     } else
  3901.       sendstart = pv[SND_STA].ival;
  3902. } else
  3903.   sendstart = 0L;
  3904. debug(F110,"xsend /STARTING","",sendstart);
  3905. #endif /* CK_RESEND */
  3906.     }
  3907. sendend: /* Common successful exit */
  3908.     moving = 0;
  3909.     if (pv[SND_SHH].ival > 0) { /* SEND /QUIET... */
  3910. g_displa = fdispla;
  3911. fdispla = 0;
  3912. debug(F101,"xsend display","",fdispla);
  3913.     }
  3914. #ifndef NOSPL /* SEND /ARRAY... */
  3915.     if (pv[SND_ARR].ival > 0) {
  3916. if (!ap) { x = -2; goto xsendx; } /* (shouldn't happen) */
  3917. if (range[0] == -1) /* If low end of range not specified */
  3918.   range[0] = 1; /* default to 1 */
  3919. if (range[1] == -1) /* If high not specified */
  3920.   range[1] = a_dim[arrayx]; /* default to size of array */
  3921. if ((range[0] < 0) || /* Check range */
  3922.     (range[0] > a_dim[arrayx]) ||
  3923.     (range[1] < range[0]) ||
  3924.     (range[1] > a_dim[arrayx])) {
  3925.     printf("?Bad array range - [%d:%d]n",range[0],range[1]);
  3926.     x = -9;
  3927.     goto xsendx;
  3928. }
  3929. sndarray = ap; /* Array pointer */
  3930. sndxin = arrayx; /* Array index */
  3931. sndxlo = range[0]; /* Array range */
  3932. sndxhi = range[1];
  3933. sndxnam[7] = (char)((sndxin == 1) ? 64 : sndxin + ARRAYBASE);
  3934. #ifdef COMMENT
  3935. printf("SENDING FROM ARRAY: &%c[]...n", /* debugging */
  3936.        (sndxin == 1) ? 64 : sndxin + ARRAYBASE);
  3937. printf("Lo=%dnHi=%dn", sndxlo, sndxhi);
  3938. printf("cmarg=[%s]ncmarg2=[%s]n", cmarg, cmarg2);
  3939. while ((x = agnbyte()) > -1) {
  3940.     putchar((char)x);
  3941. }
  3942. return(1);
  3943. #endif /* COMMENT */
  3944.     }
  3945. #endif /* NOSPL */
  3946.     if (pv[SND_ARR].ival < 1) { /* File selection & disposition... */
  3947. if (pv[SND_DEL].ival > 0) /* /DELETE was specified */
  3948.   moving = 1;
  3949. debug(F110,"xsend /DELETE","",moving);
  3950. if (pv[SND_AFT].ival > 0) /* Copy SEND criteria */
  3951.   ckstrncpy(sndafter,pv[SND_AFT].sval,19);
  3952. if (pv[SND_BEF].ival > 0)
  3953.   ckstrncpy(sndbefore,pv[SND_BEF].sval,19);
  3954. if (pv[SND_NAF].ival > 0)
  3955.   ckstrncpy(sndnafter,pv[SND_NAF].sval,19);
  3956. if (pv[SND_NBE].ival > 0)
  3957.   ckstrncpy(sndnbefore,pv[SND_NBE].sval,19);
  3958. if (pv[SND_EXC].ival > 0)
  3959.   makelist(pv[SND_EXC].sval,sndexcept,8);
  3960. if (pv[SND_SMA].ival > -1)
  3961.   sndsmaller = pv[SND_SMA].ival;
  3962. if (pv[SND_LAR].ival > -1)
  3963.   sndlarger = pv[SND_LAR].ival;
  3964. if (pv[SND_NAM].ival > -1) {
  3965.     g_fncnv = fncnv; /* Save global value */
  3966.     fncnv = pv[SND_NAM].ival;
  3967.     debug(F101,"xsend fncnv","",fncnv);
  3968. }
  3969. if (pv[SND_PTH].ival > -1) {
  3970.     g_spath = fnspath; /* Save global values */
  3971.     fnspath = pv[SND_PTH].ival;
  3972. #ifndef NZLTOR
  3973.     if (fnspath != PATH_OFF) {
  3974. g_fncnv = fncnv; /* Bad bad... */
  3975. fncnv = XYFN_C;
  3976.     }
  3977. #endif /* NZLTOR */
  3978.     debug(F101,"xsend fnspath","",fnspath);
  3979.     debug(F101,"xsend fncnv","",fncnv);
  3980. }
  3981.     }
  3982. #ifdef PIPESEND
  3983.     if (pv[SND_FLT].ival > 0) {
  3984. g_sfilter = sndfilter;
  3985. if (!pv[SND_FLT].sval) {
  3986.     sndfilter = NULL;
  3987. } else {
  3988.     sndfilter = (char *) malloc((int) strlen(pv[SND_FLT].sval) + 1);
  3989.     if (sndfilter) strcpy(sndfilter,pv[SND_FLT].sval);
  3990. }
  3991.     }
  3992. #endif /* PIPESEND */
  3993. #ifdef CK_APC
  3994. /* MOVE not allowed in APCs */
  3995.     if (moving &&
  3996. (apcactive == APC_LOCAL || apcactive == APC_REMOTE)
  3997. && apcstatus != APC_UNCH)
  3998.       return(success = 0);
  3999. #endif /* CK_APC */
  4000. #ifdef IKS_OPTION
  4001.     if (!iks_wait(KERMIT_REQ_START,1)) {
  4002.         printf("?A Kermit Server is unavailable to process this command.n");
  4003.         printf("?Start a RECEIVE command to complement this command.n");
  4004.     }
  4005. #endif /* IKS_OPTION */
  4006. #ifdef IKSD
  4007. #ifdef CK_LOGIN
  4008.     if (moving && inserver && isguest) {
  4009.         printf("?File deletion not allowed for guests.n");
  4010. return(-9);
  4011.     }
  4012. #endif /* CK_LOGIN */
  4013. #endif /* IKSD */
  4014.     sstate = 's'; /* Set start state to SEND */
  4015.     sndcmd = 1;
  4016. #ifdef CK_RESEND
  4017.     if (pv[SND_RES].ival > 0) /* Send sendmode appropriately */
  4018.       sendmode = SM_RESEND;
  4019.     else if (pv[SND_STA].ival > 0)
  4020.       sendmode = SM_PSEND;
  4021.     else
  4022. #endif /* CK_RESEND */
  4023.     if (mlist)
  4024.       sendmode = SM_MSEND;
  4025.     else
  4026.       sendmode = SM_SEND;
  4027. #ifdef MAC
  4028.     what = W_SEND;
  4029.     scrcreate();
  4030. #endif /* MAC */
  4031.     if (local && pv[SND_SHH].ival != 0) { /* If in local mode, */
  4032. displa = 1; /* turn on file transfer display */
  4033.     }
  4034.     x = 0;
  4035.   xsendx: /* Common exit, including failure */
  4036.     debug(F101,"doxsend sndsrc","",sndsrc);
  4037.     for (i = 0; i <= SND_MAX; i++) { /* Free malloc'd memory */
  4038. if (pv[i].sval)
  4039.   free(pv[i].sval);
  4040.     }
  4041.     return(x);
  4042. }
  4043. #endif /* NOXFER */
  4044. #ifndef NOLOCAL
  4045. /*  D O X C O N N  --  CONNECT command parsing with switches */
  4046. #ifdef XLIMITS
  4047. #define XLIMORTRIGGER
  4048. #else
  4049. #ifdef CK_TRIGGER
  4050. #define XLIMORTRIGGER
  4051. #endif /* CK_TRIGGER */
  4052. #endif /*  XLIMITS */
  4053. #ifdef OS2 /* K95 only: */
  4054. extern int
  4055.   tt_idlesnd_tmo; /*   Idle interval */
  4056. int tt_idlelimit = 0; /*   Idle limit */
  4057. int tt_timelimit = 0; /*   Time limit, 0 = none */
  4058. extern char * /* Parse results - strings: */
  4059.   tt_idlesnd_str; /*   Idle string */
  4060. #endif /* OS2 */
  4061. #ifdef CK_TRIGGER
  4062. extern char *tt_trigger[];
  4063. extern CHAR *tt_trmatch[];
  4064. extern char *triggerval;
  4065. #endif /* CK_TRIGGER */
  4066. int
  4067. doxconn(cx) int cx; {
  4068.     int c, i, n; /* Workers */
  4069.     int x, y;
  4070.     int getval = 0; /* Whether to get switch value */
  4071.     struct stringint { /* Temporary array for switch values */
  4072. char * sval;
  4073. int ival;
  4074.     } pv[CONN_MAX+1];
  4075.     struct FDB sw, cm; /* FDBs for each parse function */
  4076. #ifdef CK_TRIGGER
  4077.     char *g_tt_trigger[TRIGGERS];
  4078. #endif /* CK_TRIGGER */
  4079. #ifdef OS2
  4080.     int g_tt_idlesnd_tmo, g_tt_timelimit; /* For saving and restoring */
  4081.     int g_tt_idlelimit;
  4082.     char * g_tt_idlesnd_str; /* global settings */
  4083.     g_tt_idlesnd_tmo = tt_idlesnd_tmo; /* Save global settings */
  4084.     g_tt_timelimit   = tt_timelimit;
  4085.     g_tt_idlelimit   = tt_idlelimit;
  4086.     g_tt_idlesnd_str = tt_idlesnd_str;
  4087. #endif /* OS2 */
  4088. #ifdef CK_TRIGGER
  4089.     if (!tt_trigger[0]) { /* First initialization */
  4090. for (i = 1; i < TRIGGERS; i++)
  4091.   tt_trigger[i] = NULL;
  4092.     }
  4093.     for (i = 0; i < TRIGGERS; i++)
  4094.       g_tt_trigger[i] = tt_trigger[i];
  4095.     if (triggerval) {
  4096. free(triggerval);
  4097. triggerval = NULL;
  4098.     }
  4099. #endif /* CK_TRIGGER */
  4100.     for (i = 0; i <= CONN_MAX; i++) { /* Initialize switch values */
  4101. pv[i].sval = NULL; /* to null pointers */
  4102. pv[i].ival = -1; /* and -1 int values */
  4103.     }
  4104.     if (cx == XXCQ) /* CQ == CONNECT /QUIETLY */
  4105.       pv[CONN_NV].ival = 1;
  4106.     /* Set up chained parse functions... */
  4107.     cmfdbi(&sw, /* First FDB - command switches */
  4108.    _CMKEY, /* fcode */
  4109.    "Switch", /* hlpmsg */
  4110.    "", /* default */
  4111.    "", /* addtl string data */
  4112.    nconntab, /* addtl numeric data 1: tbl size */
  4113.    4, /* addtl numeric data 2: 4 = cmswi */
  4114.    xxstring, /* Processing function */
  4115.    conntab, /* Keyword table */
  4116.    &cm /* Pointer to next FDB */
  4117.    );
  4118.     cmfdbi(&cm, /* 2nd FDB - Confirmation */
  4119.    _CMCFM, /* fcode */
  4120.    "", /* hlpmsg */
  4121.    "", /* default */
  4122.    "", /* addtl string data */
  4123.    0, /* addtl numeric data 1 */
  4124.    0, /* addtl numeric data 2 */
  4125.    NULL,
  4126.    NULL,
  4127.    NULL
  4128.    );
  4129.     while (1) { /* Parse 0 or more switches */
  4130. x = cmfdb(&sw); /* Parse switch or confirmation */
  4131. debug(F101,"doxconn cmfdb","",x);
  4132. if (x < 0) { /* Error */
  4133.     if (x == -9 || x == -2)
  4134.       printf("?No switches match - "%s"n",atmbuf);
  4135.     goto xconnx; /* or reparse needed */
  4136. }
  4137. if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
  4138.   break;
  4139. c = cmgbrk(); /* Get break character */
  4140. getval = (c == ':' || c == '='); /* to see how they ended the switch */
  4141. if (getval && !(cmresult.kflags & CM_ARG)) {
  4142.     printf("?This switch does not take argumentsn");
  4143.     x = -9;
  4144.     goto xconnx;
  4145. }
  4146. if (!getval && (cmgkwflgs() & CM_ARG)) {
  4147.     printf("?This switch requires an argumentn");
  4148.     return(-9);
  4149. }
  4150. n = cmresult.nresult; /* Numeric result = switch value */
  4151. debug(F101,"doxconn switch","",n);
  4152. switch (n) { /* Process the switch */
  4153.   case CONN_NV: /* Non-verbal */
  4154.     pv[n].ival = 1;
  4155.     break;
  4156. #ifdef XLIMITS
  4157.   case CONN_II: /* Idle-interval */
  4158.   case CONN_IL: /* Idle-limit */
  4159.   case CONN_TL: /* Time-limit */
  4160.     if (!getval) break;
  4161.     if ((x = cmnum("Seconds","0",10,&y,xxstring)) < 0)
  4162.       goto xconnx;
  4163.     pv[n].ival = y;
  4164.     break;
  4165.   case CONN_IS: /* Idle-string */
  4166. #endif /* XLIMITS */
  4167. #ifdef CK_TRIGGER
  4168.   case CONN_TS: /* Trigger-string */
  4169. #endif /* CK_TRIGGER */
  4170. #ifdef XLIMORTRIGGER
  4171.     if (!getval) break;
  4172.     if ((x = cmfld("String (enclose in braces if it contains spaces)",
  4173.    "",&s,xxstring)) < 0) {
  4174. if (x == -3) {
  4175.     printf("?String requiredn");
  4176.     x = -9;
  4177. }
  4178. goto xconnx;
  4179.     }
  4180.     if (n != CONN_TS)
  4181.       s = brstrip(s);
  4182.     if ((y = strlen(s)) > 0) {
  4183. if (pv[n].sval) free(pv[n].sval);
  4184. pv[n].sval = malloc(y+1);
  4185. if (pv[n].sval) {
  4186.     strcpy(pv[n].sval,s);
  4187.     pv[n].ival = 1;
  4188. }
  4189.     }
  4190.     break;
  4191. #endif /* XLIMORTRIGGER */
  4192.   default: