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

通讯/手机编程

开发平台:

Windows_Unix

  1. #include "ckcsym.h"
  2. #ifndef NOICP
  3. /*  C K U U S 7 --  "User Interface" for C-Kermit, part 7  */
  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.   This file created from parts of ckuus3.c, which became too big for
  14.   Mark Williams Coherent compiler to handle.
  15. */
  16. /*
  17.   Definitions here supersede those from system include files.
  18. */
  19. #include "ckcdeb.h" /* Debugging & compiler things */
  20. #include "ckcasc.h" /* ASCII character symbols */
  21. #include "ckcker.h" /* Kermit application definitions */
  22. #include "ckcxla.h" /* Character set translation */
  23. #include "ckcnet.h" /* Network symbols */
  24. #include "ckuusr.h" /* User interface symbols */
  25. #include "ckucmd.h"
  26. #ifdef VMS
  27. #ifndef TCPSOCKET
  28. #include <errno.h>
  29. #endif /* TCPSOCKET */
  30. #endif /* VMS */
  31. #ifdef OS2
  32. #ifndef NT
  33. #define INCL_NOPM
  34. #define INCL_VIO /* Needed for ckocon.h */
  35. #define INCL_DOSMODULEMGR
  36. #include <os2.h>
  37. #undef COMMENT
  38. #else /* NT */
  39. #define APIRET ULONG
  40. #include <windows.h>
  41. #include <tapi.h>
  42. #include "cknwin.h"
  43. #include "ckntap.h"
  44. #endif /* NT */
  45. #include "ckowin.h"
  46. #include "ckocon.h"
  47. #include "ckodir.h"
  48. #ifdef OS2MOUSE
  49. #include "ckokey.h"
  50. #endif /* OS2MOUSE */
  51. #ifdef KUI
  52. #include "ikui.h"
  53. #endif /* KUI */
  54. #ifdef putchar
  55. #undef putchar
  56. #endif /* putchar */
  57. #define putchar(x) conoc(x)
  58. extern int mskkeys;
  59. #endif /* OS2 */
  60. #ifdef CK_AUTHENTICATION
  61. #include "ckuath.h"
  62. #endif /* CK_AUTHENTICATION */
  63. #ifdef CK_SSL
  64. #include "ck_ssl.h"
  65. #endif /* CK_SSL */
  66. #ifdef STRATUS /* Stratus Computer, Inc.  VOS */
  67. #ifdef putchar
  68. #undef putchar
  69. #endif /* putchar */
  70. #define putchar(x) conoc(x)
  71. #ifdef getchar
  72. #undef getchar
  73. #endif /* getchar */
  74. #define getchar(x) coninc(0)
  75. #endif /* STRATUS */
  76. char * slmsg = NULL;
  77. static char * tmpslmsg = NULL;
  78. static int x, y = 0, z;
  79. static char *s;
  80. extern CHAR feol;
  81. extern int g_matchdot, saveask, hints;
  82. extern char * k_info_dir;
  83. #ifndef NOSPL
  84. extern int nmac;
  85. extern struct mtab *mactab;
  86. #endif /* NOSPL */
  87. #ifndef NOXFER
  88. #ifdef CK_SPEED
  89. extern short ctlp[]; /* Control-char prefixing table */
  90. #endif /* CK_SPEED */
  91. #ifdef PIPESEND
  92. extern char * sndfilter;
  93. extern char * rcvfilter;
  94. #endif /* PIPESEND */
  95. extern char * snd_move;
  96. extern char * snd_rename;
  97. extern char * g_snd_move;
  98. extern char * g_snd_rename;
  99. extern char * rcv_move;
  100. extern char * rcv_rename;
  101. extern char * g_rcv_move;
  102. extern char * g_rcv_rename;
  103. #ifdef PATTERNS
  104. extern char *binpatterns[], *txtpatterns[];
  105. extern int patterns;
  106. #endif /* PATTERNS */
  107. extern char * remdest;
  108. #ifdef CK_TMPDIR
  109. char * dldir = NULL;
  110. #endif /* CK_TMPDIR */
  111. extern struct ck_p ptab[];
  112. extern int protocol, remfile, rempipe, remappd, reliable, xreliable, fmask,
  113.   fncnv, frecl, maxrps, wslotr, bigsbsiz, bigrbsiz, urpsiz, rpsiz, spsiz,
  114.   bctr, npad, timef, timint, spsizr, spsizf, maxsps, spmax, nfils, displa,
  115.   atcapr, pkttim, rtimo, fncact, mypadn, fdispla, f_save, pktpaus, setreliable,
  116.   fnrpath, fnspath, atenci, atenco, atdati, atdato, atleni, atleno, atblki,
  117.   atblko, attypi, attypo, atsidi, atsido, atsysi, atsyso, atdisi, atdiso;
  118. extern int stathack;
  119. #ifdef STRATUS
  120. extern int atfrmi, atfrmo, atcrei, atcreo, atacti, atacto;
  121. #endif /* STRATUS */
  122. #ifdef CK_PERMS
  123. extern int atlpri, atlpro, atgpri, atgpro;
  124. #endif /* CK_PERMS */
  125. extern CHAR
  126.   sstate, eol, seol, stchr, mystch, mypadc, padch, ctlq, myctlq;
  127. #ifdef IKSD
  128. extern int inserver;
  129. #ifdef IKSDCONF
  130. extern int iksdcf;
  131. #endif /* IKSDCONF */
  132. #endif /* IKSD */
  133. extern char *cmarg, *cmarg2;
  134. #ifndef NOFRILLS
  135. extern char optbuf[]; /* Buffer for MAIL or PRINT options */
  136. extern int rprintf; /* REMOTE PRINT flag */
  137. #endif /* NOFRILLS */
  138. #endif /* NOXFER */
  139. #ifdef CK_TRIGGER
  140. extern char * tt_trigger[];
  141. #endif /* CK_TRIGGER */
  142. extern int tcs_transp;
  143. #ifdef PCTERM
  144. extern int tt_pcterm;
  145. #endif /* PCTERM */
  146. #ifdef NT
  147. extern int tt_vtnt;
  148. #endif /* NT */
  149. /* Note: gcc -Wall wants braces around each keyword table entry. */
  150. static struct keytab psltab[] = { /* SET LINE/PORT command options */
  151.     { "/connect", SL_CNX, 0 },
  152. #ifdef VMS
  153.     { "/noshare", SL_NSH, 0 },
  154. #endif /* VMS */
  155.     { "/server",  SL_SRV, 0 },
  156. #ifdef VMS
  157.     { "/share",   SL_SHR, 0 },
  158. #endif /* VMS */
  159.     { "", 0, 0 }
  160. };
  161. static int npsltab = sizeof(psltab)/sizeof(struct keytab) - 1;
  162. #ifdef NETCONN
  163. static struct keytab shtab[] = { /* SET HOST command options */
  164. #ifdef NETCMD
  165.     "/command",      SL_CMD,    CM_INV, /* (COMMAND is also a network type) */
  166. #endif /* NETCMD */
  167.     "/connect",      SL_CNX,    0,
  168.     "/network-type", SL_NET,    CM_ARG,
  169.     "/nowait",       SL_NOWAIT, 0,
  170. #ifndef NOSPL
  171.     "/password",     SL_PSW,    CM_ARG,
  172. #endif /* NOSPL */
  173. #ifdef NETCMD
  174.     "/pipe",         SL_CMD,    0,
  175. #endif /* NETCMD */
  176. #ifdef NETPTY
  177.     "/pty",          SL_PTY,    0,
  178. #endif /* NETPTY */
  179.     "/server",       SL_SRV,    0,
  180.     "/userid",       SL_UID,    CM_ARG,
  181.     "/wait",         SL_WAIT,   0,
  182.     "", 0, 0
  183. };
  184. static int nshtab = sizeof(shtab)/sizeof(struct keytab) - 1;
  185. static struct keytab shteltab[] = { /* TELNET command options */
  186. #ifdef CK_AUTHENTICATION
  187.     "/auth",         SL_AUTH, CM_ARG,
  188. #endif /* CK_AUTHENTICATION */
  189. #ifdef CK_ENCRYPTION
  190.     "/encrypt",      SL_ENC,  CM_ARG,
  191. #endif /* CK_ENCRYPTION */
  192.     "/nowait",       SL_NOWAIT, 0,
  193. #ifndef NOSPL
  194.     "/password",     SL_PSW, CM_ARG,
  195. #endif /* NOSPL */
  196.     "/userid",       SL_UID, CM_ARG,
  197.     "/wait",         SL_WAIT,   0,
  198.     "", 0 ,0
  199. };
  200. static int nshteltab = sizeof(shteltab)/sizeof(struct keytab) - 1;
  201. #ifdef RLOGCODE
  202. static struct keytab shrlgtab[] = { /* SET HOST RLOGIN command options */
  203. #ifdef CK_KERBEROS
  204. #ifdef CK_ENCRYPTION
  205.     "/encrypt",      SL_ENC, 0,
  206. #endif /* CK_ENCRYPTION */
  207.     "/k4",           SL_KRB4, CM_INV,
  208.     "/k5",           SL_KRB5, CM_INV,
  209.     "/kerberos4",    SL_KRB4, 0,
  210.     "/kerberos5",    SL_KRB5, 0,
  211.     "/kerberos_iv",  SL_KRB4, CM_INV,
  212.     "/kerberos_v",   SL_KRB5, CM_INV,
  213.     "/krb4",         SL_KRB4, CM_INV,
  214.     "/krb5",         SL_KRB5, CM_INV,
  215. #endif /* CK_KERBEROS */
  216.     "", 0 ,0
  217. };
  218. static int nshrlgtab = sizeof(shrlgtab)/sizeof(struct keytab)-1;
  219. #endif /* RLOGCODE */
  220. extern struct keytab netcmd[];
  221. extern int nnets;
  222. #ifndef NODIAL
  223. extern int dirline;
  224. extern int nnetdir; /* Network services directory */
  225. extern char *netdir[];
  226. _PROTOTYP( VOID ndreset, (void) );
  227. char *nh_p[MAXDNUMS + 1]; /* Network directory entry pointers */
  228. char *nh_p2[MAXDNUMS + 1]; /* Network directory entry nettype */
  229. char *nh_px[4][MAXDNUMS + 1]; /* Network-specific stuff... */
  230. #endif /* NODIAL */
  231. int nhcount = 0;
  232. int ndinited = 0;
  233. char * n_name = NULL; /* Network name pointer */
  234. static int oldplex = -1; /* Duplex holder around network */
  235. #endif /* NETCONN */
  236. _PROTOTYP(static int remtxt, (char **) );
  237. _PROTOTYP(VOID rmsg, (void) );
  238. _PROTOTYP(static int remcfm, (void) );
  239. extern int nopush;
  240. int mdmsav = -1; /* Save modem type around network */
  241. extern int isguest; /* Global flag for anonymous login */
  242. extern xx_strp xxstring;
  243. extern int success, binary, b_save, ckwarn, msgflg, quiet, cmask, pflag, local,
  244.   nettype, escape, mdmtyp, duplex, dfloc, network, cdtimo, autoflow, tnlm,
  245.   sosi, tlevel, lf_opts, backgrd, flow, debses, parity, ttnproto, ckxech,
  246.   x_ifnum, cmflgs, haveline, cxtype, cxflow[];
  247. extern char psave[]; /* For saving & restoring prompt */
  248. extern int sprmlen, rprmlen;
  249. #ifdef OS2
  250. static struct keytab strmkeytab[] = {
  251.     "clear",   0, 0,
  252.     "default", 1, 0
  253. };
  254. static int nstrmkeytab = sizeof(strmkeytab)/sizeof(struct keytab);
  255. static struct keytab strmswitab[] = {
  256.     "/literal", 0, 0
  257. };
  258. static int nstrmswitab = sizeof(strmswitab)/sizeof(struct keytab);
  259. static struct keytab normrev[] = {
  260.     "dark-display", 0, 0,
  261.     "light-display", 1, 0,
  262.     "normal",   0, 0,
  263.     "reverse",  1, 0
  264. };
  265. static struct keytab prnmtab[] = {
  266.     "auto", 1, 0,
  267.     "copy", 2, 0,
  268.     "off",  0, 0,
  269.     "on",   1, CM_INV, /* Compatibility with XPRINT version */
  270.     "transparent", 3, 0
  271. };
  272. static int nprnmtab = sizeof(prnmtab)/sizeof(struct keytab);
  273. extern int tt_diff_upd;
  274. #ifdef NT
  275. #define stricmp _stricmp
  276. extern int tt_attr_bug;
  277. #endif /* NT */
  278. extern int tt_rows[], tt_cols[];
  279. extern int tt_cols_usr;
  280. extern int tt_szchng[VNUM];
  281. int tt_modechg = TVC_ENA;
  282. extern struct _vtG G[4];
  283. extern int priority;
  284. extern bool send_c1;
  285. int send_c1_usr = FALSE;
  286. extern int sgrcolors;
  287. extern int marginbell, marginbellcol;
  288. extern int autoscroll, wy_autopage;
  289. extern int tt_sac;
  290. extern int dec_nrc, dec_lang, dec_kbd;
  291. #else /* OS2 */
  292. extern int tt_rows, tt_cols;
  293. #endif /*  OS2 */
  294. extern int tt_escape;
  295. extern long speed;
  296. extern char *dftty;
  297. extern char *tp, *lp; /* Temporary buffer & pointers */
  298. extern char ttname[];
  299. int tttapi = 0; /* is Line TAPI? */
  300. struct keytab * tapilinetab = NULL;
  301. struct keytab * _tapilinetab = NULL;
  302. int ntapiline = 0;
  303. #ifdef NETCONN /* Network items */
  304. #ifdef ANYX25
  305. extern int revcall, closgr, cudata, nx25;
  306. extern char udata[];
  307. extern struct keytab x25tab[];
  308. #ifndef IBMX25
  309. extern int npadx3;
  310. extern CHAR padparms[];
  311. extern struct keytab padx3tab[];
  312. #endif /* IBMX25 */
  313. #endif /* ANYX25 */
  314. #ifdef OS2
  315. #ifndef NT
  316. extern bool ttslip,ttppp;
  317. #endif /* NT */
  318. #endif /* OS2 */
  319. #ifdef NPIPE
  320. extern char pipename[];
  321. #endif /* NPIPE */
  322. #ifdef TCPSOCKET
  323. static struct keytab tcprawtab[] = { /* SET HOST options */
  324.     "/default",    NP_DEFAULT,    CM_INV,
  325. #ifdef CK_AUTHENTICATION
  326. #ifdef CK_KERBEROS
  327. #ifdef RLOGCODE
  328.     "/ek4login",    NP_EK4LOGIN,    0,
  329.     "/ek5login",    NP_EK5LOGIN,    0,
  330.     "/k4login",     NP_K4LOGIN,     0,
  331.     "/k5login",     NP_K5LOGIN,     0,
  332. #endif /* RLOGCODE */
  333. #endif /* CK_KERBEROS */
  334. #endif /* CK_AUTHENTICATION */
  335.     "/no-telnet-init", NP_NONE,   0,
  336.     "/none",       NP_NONE,   CM_INV,
  337.     "/raw-socket", NP_TCPRAW, 0,
  338. #ifdef RLOGCODE
  339.     "/rlogin",     NP_RLOGIN, 0,
  340. #endif /* RLOGCODE */
  341. #ifdef CK_SSL
  342.     "/ssl",        NP_SSL,    0,
  343.     "/ssl-telnet", NP_SSL_TELNET, 0,
  344. #endif /* CK_SSL */
  345.     "/telnet",     NP_TELNET, 0,
  346. #ifdef CK_SSL
  347.     "/tls",        NP_TLS,    0,
  348.     "/tls-telnet", NP_TLS_TELNET, 0,
  349. #endif /* CK_SSL */
  350.     "", 0, 0
  351. };
  352. static int ntcpraw = (sizeof(tcprawtab) / sizeof(struct keytab)) - 1;
  353. #ifdef RLOGCODE
  354. _PROTOTYP( int rlog_naws, (void) );
  355. #endif /* RLOGCODE */
  356. #endif /* TCPSOCKET */
  357. #ifdef SUPERLAT
  358. extern char slat_pwd[18];
  359. #endif /* SUPERLAT */
  360. #endif /* NETCONN */
  361. #ifdef TNCODE
  362. extern int tn_wait_flg;
  363. #endif /* TNCODE */
  364. #ifdef COMMENT
  365. #ifndef NOSETKEY
  366. extern KEY *keymap;
  367. #ifndef OS2
  368. #define mapkey(x) keymap[x]
  369. #endif /* OS2 */
  370. extern MACRO *macrotab;
  371. _PROTOTYP( VOID shostrdef, (CHAR *) );
  372. #ifndef NOKVERBS
  373. extern struct keytab kverbs[];
  374. extern int nkverbs;
  375. #endif /* NOKVERBS */
  376. #endif /* NOSETKEY */
  377. #else
  378. #ifndef NOSETKEY
  379. extern KEY *keymap;
  380. extern MACRO *macrotab;
  381. _PROTOTYP( VOID shostrdef, (CHAR *) );
  382. #ifndef NOKVERBS
  383. extern struct keytab kverbs[];
  384. extern int nkverbs;
  385. #endif /* NOKVERBS */
  386. #endif /* NOSETKEY */
  387. #endif /* COMMENT */
  388. #ifdef OS2 /* AUTODOWNLOAD parameters */
  389. extern int    adl_kmode, adl_zmode; /* Match Packet to signal download */
  390. extern char * adl_kstr; /* KERMIT Download String */
  391. extern char * adl_zstr; /* ZMODEM Download String */
  392. extern int adl_kc0, adl_zc0; /* Process ADL C0s in emulation */
  393. #endif /* OS2 */
  394. /* Keyword tables ... */
  395. extern struct keytab onoff[], rltab[];
  396. extern int nrlt;
  397. /* SET FILE parameters */
  398. static struct keytab filtab[] = {
  399. #ifndef NOXFER
  400. #ifdef PATTERNS
  401.     "binary-patterns",   XYFIBP, 0,
  402. #endif /* PATTERNS */
  403.     "bytesize",         XYFILS, 0,
  404. #ifndef NOCSETS
  405.     "character-set",    XYFILC, 0,
  406. #endif /* NOCSETS */
  407.     "collision",        XYFILX, 0,
  408.     "destination",      XYFILY, 0,
  409.     "display",          XYFILD, CM_INV,
  410. #ifdef CK_TMPDIR
  411.     "download-directory", XYFILG, 0,
  412. #endif /* CK_TMPDIR */
  413. #endif /* NOXFER */
  414.     "end-of-line",      XYFILA, 0,
  415.     "eol",              XYFILA, CM_INV,
  416. #ifdef CK_CTRLZ
  417.     "eof",              XYFILV, 0,
  418. #endif /* CK_CTRLZ */
  419.     "fastlookups",      9997,   CM_INV,
  420. #ifndef NOXFER
  421.     "incomplete",       XYFILI, 0,
  422. #ifdef CK_LABELED
  423.     "label",            XYFILL, 0,
  424. #endif /* CK_LABELED */
  425.     "names",            XYFILN, 0,
  426. #ifdef UNIX
  427.     "output",           XYFILH, 0,
  428. #endif /* UNIX */
  429. #ifdef PATTERNS
  430.     "patterns",         XYFIPA, 0,
  431. #endif /* PATTERNS */
  432. #ifdef VMS
  433.     "record-length",    XYFILR, 0,
  434. #endif /* VMS */
  435. #ifdef PATTERNS
  436.     "text-patterns",    XYFITP, 0,
  437. #endif /* PATTERNS */
  438. #endif /* NOXFER */
  439.     "type",             XYFILT, 0,
  440. #ifdef UNICODE
  441.     "ucs",              XYFILU, 0,
  442. #endif /* UNICODE */
  443. #ifndef NOXFER
  444.     "warning",          XYFILW, CM_INV
  445. #endif /* NOXFER */
  446. };
  447. static int nfilp = (sizeof(filtab) / sizeof(struct keytab));
  448. struct keytab pathtab[] = {
  449.     "absolute",  PATH_ABS,  0,
  450.     "none",      PATH_OFF,  CM_INV,
  451.     "off",       PATH_OFF,  0,
  452.     "on",        PATH_ABS,  CM_INV,
  453.     "relative",  PATH_REL,  0
  454. };
  455. int npathtab = (sizeof(pathtab) / sizeof(struct keytab));
  456. struct keytab rpathtab[] = {
  457.     "absolute",  PATH_ABS,  0,
  458.     "auto",      PATH_AUTO, 0,
  459.     "none",      PATH_OFF,  CM_INV,
  460.     "off",       PATH_OFF,  0,
  461.     "on",        PATH_ABS,  CM_INV,
  462.     "relative",  PATH_REL,  0
  463. };
  464. int nrpathtab = (sizeof(rpathtab) / sizeof(struct keytab));
  465. #ifdef CK_CTRLZ
  466. struct keytab eoftab[] = { /* EOF detection method */
  467.     "ctrl-z",          1, 0,
  468.     "length",          0, 0,
  469.     "noctrl-z",        0, CM_INV
  470. };
  471. #endif /* CK_CTRLZ */
  472. struct keytab fttab[] = { /* File types for SET FILE TYPE */
  473.     "ascii",     XYFT_T, CM_INV,
  474. #ifdef VMS
  475.     "b",         XYFT_B, CM_INV|CM_ABR,
  476. #endif /* VMS */
  477.     "binary",    XYFT_B, 0,
  478. #ifdef VMS
  479.     "block",     XYFT_I, CM_INV,
  480.     "image",     XYFT_I, 0,
  481. #endif /* VMS */
  482. #ifdef CK_LABELED
  483.     "labeled",   XYFT_L, 0,
  484. #endif /* CK_LABELED */
  485. #ifdef MAC
  486.     "macbinary", XYFT_M, 0,
  487. #endif /* MAC */
  488.     "text",      XYFT_T, 0
  489. };
  490. int nfttyp = (sizeof(fttab) / sizeof(struct keytab));
  491. static struct keytab rfttab[] = { /* File types for REMOTE SET FILE */
  492.     "ascii",     XYFT_T, CM_INV,
  493.     "binary",    XYFT_B, 0,
  494. #ifdef VMS
  495.     "labeled",   XYFT_L, 0,
  496. #else
  497. #ifdef OS2
  498.     "labeled",   XYFT_L, 0,
  499. #endif /* OS2 */
  500. #endif /* VMS */
  501.     "text",      XYFT_T, 0
  502. };
  503. static int nrfttyp = (sizeof(rfttab) / sizeof(struct keytab));
  504. #ifdef OS2ORUNIX
  505. #define ZOF_BLK  0
  506. #define ZOF_NBLK 1
  507. #define ZOF_BUF  2
  508. #define ZOF_NBUF 3
  509. static struct keytab zoftab[] = {
  510.     "blocking",    ZOF_BLK,  0,
  511.     "buffered",    ZOF_BUF,  0,
  512.     "nonblocking", ZOF_NBLK, 0,
  513.     "unbuffered",  ZOF_NBUF, 0
  514. };
  515. static int nzoftab = (sizeof(zoftab) / sizeof(struct keytab));
  516. #endif /* OS2ORUNIX */
  517. #ifdef CK_AUTHENTICATION
  518. extern int auth_type_user[];
  519. int sl_auth_type_user[AUTHTYPLSTSZ] = {AUTHTYPE_NULL, AUTHTYPE_NULL};
  520. int sl_auth_saved = 0;
  521. int sl_topt_a_su = 0;
  522. int sl_topt_a_s_saved = 0;
  523. int sl_topt_a_cm = 0;
  524. int sl_topt_a_c_saved = 0;
  525. #endif /* CK_AUTHENTICATION */
  526. #ifdef CK_ENCRYPTION
  527. extern int cx_type;
  528. int sl_cx_type = 0;
  529. int sl_cx_saved = 0;
  530. int sl_topt_e_su = 0;
  531. int sl_topt_e_sm = 0;
  532. int sl_topt_e_s_saved = 0;
  533. int sl_topt_e_cu = 0;
  534. int sl_topt_e_cm = 0;
  535. int sl_topt_e_c_saved = 0;
  536. #endif /* CK_ENCRYPTION */
  537. extern char uidbuf[];
  538. static int uidflag = 0;
  539. char sl_uidbuf[UIDBUFLEN] = { NUL, NUL };
  540. int  sl_uid_saved = 0;
  541. #ifdef TNCODE
  542. int  sl_tn_wait = 0;
  543. int  sl_tn_saved = 0;
  544. #endif /* TNCODE */
  545. extern int query; /* Global flag for QUERY active */
  546. #ifndef NOSPL
  547. #ifndef NOXFER
  548. static struct keytab vartyp[] = { /* Variable types for REMOTE QUERY */
  549.     "global",   (int) 'G', CM_INV,
  550.     "kermit",   (int) 'K', 0,
  551.     "system",   (int) 'S', 0,
  552.     "user",     (int) 'G', 0
  553. };
  554. static int nvartyp = (sizeof(vartyp) / sizeof(struct keytab));
  555. #endif /* NOXFER */
  556. #endif /* NOSPL */
  557. #ifdef CK_TIMERS
  558. static struct keytab timotab[] = { /* Timer types */
  559.     "dynamic", 1, 0,
  560.     "fixed",   0, 0
  561. };
  562. #endif /* CK_TIMERS */
  563. #ifdef DCMDBUF
  564. extern char *atxbuf, *atmbuf; /* Atom buffer */
  565. extern char *cmdbuf; /* Command buffer */
  566. extern char *line, *tmpbuf; /* Character buffers for anything */
  567. extern int *intime; /* INPUT TIMEOUT */
  568. #else  /* Not DCMDBUF ... */
  569. extern char atxbuf[], atmbuf[]; /* Atom buffer */
  570. extern char cmdbuf[]; /* Command buffer */
  571. extern char line[], tmpbuf[]; /* Character buffer for anything */
  572. extern int intime[];
  573. #endif /* DCMDBUF */
  574. #ifndef NOCSETS
  575. extern struct keytab fcstab[]; /* For SET FILE CHARACTER-SET */
  576. extern struct csinfo fcsinfo[]; /* File character set info. */
  577. extern struct keytab ttcstab[];
  578. extern int nfilc, fcharset, tcharset, ntermc, tcsr, tcsl;
  579. #ifdef CKOUNI
  580. extern int tt_utf8;
  581. #endif /* CKOUNI */
  582. #ifdef OS2
  583. _PROTOTYP( int os2setcp, (int) );
  584. _PROTOTYP( int os2getcp, (void) );
  585. _PROTOTYP( void os2debugoff, (void) );
  586. #endif /* OS2 */
  587. #endif /* NOCSETS */
  588. extern int cmdlvl; /* Overall command level */
  589. #ifndef NOSPL
  590. #ifdef DCMDBUF
  591. extern int *inpcas; /* INPUT CASE setting on cmd stack */
  592. #else
  593. extern int inpcas[];
  594. #endif /* DCMDBUF */
  595. #endif /* NOSPL */
  596. #ifdef CK_CURSES
  597. #ifndef VMS
  598. _PROTOTYP(int tgetent,(char *, char *));
  599. #else
  600. #ifdef __DECC
  601. _PROTOTYP(int tgetent,(char *, char *));
  602. #endif /* __DECC */
  603. #endif /* VMS */
  604. #endif /* CK_CURSES */
  605. #ifndef NOXMIT
  606. #define XMITF 0 /* SET TRANSMIT values */
  607. #define XMITL 1 /* (Local to this module) */
  608. #define XMITP 2
  609. #define XMITE 3
  610. #define XMITX 4
  611. #define XMITS 5
  612. #define XMITW 6
  613. #define XMITT 7
  614. #define XMBUFL 50
  615. extern int xmitf, xmitl, xmitp, xmitx, xmits, xmitw, xmitt;
  616. char xmitbuf[XMBUFL+1] = { NUL }; /* TRANSMIT eof string */
  617. struct keytab xmitab[] = { /* SET TRANSMIT */
  618.     "echo",     XMITX, 0,
  619.     "eof",      XMITE, 0,
  620.     "fill",     XMITF, 0,
  621.     "linefeed", XMITL, 0,
  622.     "locking-shift", XMITS, 0,
  623.     "pause",    XMITW, 0,
  624.     "prompt",   XMITP, 0,
  625.     "timeout",  XMITT, 0
  626. };
  627. int nxmit = (sizeof(xmitab) / sizeof(struct keytab));
  628. #endif /* NOXMIT */
  629. /* For SET FILE COLLISION */
  630. /* Some of the following may be possible for some C-Kermit implementations */
  631. /* but not others.  Those that are not possible for your implementation */
  632. /* should be ifdef'd out. */
  633. struct keytab colxtab[] = { /* SET FILE COLLISION options */
  634. #ifndef MAC
  635.     "append",    XYFX_A, 0,  /* append to old file */
  636. #endif /* MAC */
  637. #ifdef COMMENT
  638.     "ask",       XYFX_Q, 0,  /* ask what to do (not implemented) */
  639. #endif
  640.     "backup",    XYFX_B, 0,  /* rename old file */
  641. #ifndef MAC
  642.     /* This crashes Mac Kermit. */
  643.     "discard",   XYFX_D, 0,  /* don't accept new file */
  644.     "no-supersede", XYFX_D, CM_INV, /* ditto (MSK compatibility) */
  645. #endif /* MAC */
  646.     "overwrite", XYFX_X, 0,  /* overwrite the old file == file warning off */
  647.     "rename",    XYFX_R, 0   /* rename the incoming file == file warning on */
  648. #ifndef MAC
  649.     /* This crashes Mac Kermit. */
  650. ,   "update",    XYFX_U, 0  /* replace if newer */
  651. #endif /* MAC */
  652. };
  653. int ncolx = (sizeof(colxtab) / sizeof(struct keytab));
  654. static struct keytab rfiltab[] = { /* for REMOTE SET FILE */
  655. #ifndef NOCSETS
  656.     "character-set", XYFILC, 0,
  657. #endif /* NOCSETS */
  658.     "collision",     XYFILX, 0,
  659.     "incomplete",    XYFILI, 0,
  660.     "names",         XYFILN, 0,
  661.     "record-length", XYFILR, 0,
  662.     "type",          XYFILT, 0
  663. };
  664. int nrfilp = (sizeof(rfiltab) / sizeof(struct keytab));
  665. struct keytab eoltab[] = {    /* File eof delimiters */
  666.     "cr",        XYFA_C, 0,
  667.     "crlf",      XYFA_2, 0,
  668.     "lf",        XYFA_L, 0
  669. };
  670. static int neoltab = (sizeof(eoltab) / sizeof(struct keytab));
  671. struct keytab fntab[] = {    /* File naming */
  672.     "converted", XYFN_C, 0,
  673.     "literal",   XYFN_L, 0,
  674.     "standard",  XYFN_C, CM_INV
  675. };
  676. int nfntab = (sizeof(fntab) / sizeof(struct keytab));
  677. #ifndef NOLOCAL
  678. /* Terminal parameters table */
  679. static struct keytab trmtab[] = {
  680. #ifdef OS2
  681.     "answerback",    XYTANS, 0,
  682. #endif /* OS2 */
  683. #ifdef CK_APC
  684.     "apc",           XYTAPC, 0,
  685. #endif /* CK_APC */
  686. #ifdef OS2
  687.     "arrow-keys",    XYTARR, 0,
  688. #endif /* OS2 */
  689. #ifdef NT
  690.     "at",      XYTATTR, CM_INV|CM_ABR,
  691.     "att",      XYTATTR, CM_INV|CM_ABR,
  692.     "attr",      XYTATTR, CM_INV|CM_ABR,
  693.     "attr-bug",      XYTATTBUG, CM_INV,
  694. #endif /* NT */
  695. #ifdef OS2
  696.     "attribute",     XYTATTR, 0,
  697. #endif /* OS2 */
  698. #ifdef CK_APC
  699. #ifdef CK_AUTODL
  700.    "autodownload",   XYTAUTODL, 0,
  701. #endif /* CK_AUTODL */
  702. #endif /* CK_APC */
  703. #ifdef OS2
  704.     "autopage",      XYTAPAGE,  0,
  705.     "autoscroll",    XYTASCRL,  0,
  706.     "bell",          XYTBEL, CM_INV,
  707. #endif /* OS2 */
  708.     "bytesize",      XYTBYT, 0,
  709. #ifndef NOCSETS
  710. #ifndef KUI
  711. #ifdef OS2
  712.     "character-set", XYTCS,  CM_INV,
  713. #else /* OS2 */
  714.     "character-set", XYTCS,  0,
  715. #endif /* OS2 */
  716. #endif /* KUI */
  717. #endif /* NOCSETS */
  718. #ifdef OS2
  719.     "code-page",     XYTCPG, 0,
  720.     "color",         XYTCOL, 0,
  721.     "controls",      XYTCTRL, 0,
  722. #endif /* OS2 */
  723.     "cr-display",    XYTCRD, 0,
  724. #ifdef OS2
  725.     "cursor",        XYTCUR, 0,
  726. #endif /* OS2 */
  727.     "debug",         XYTDEB, 0,
  728. #ifdef OS2
  729.     "dg-unix-mode",     XYTUNX, 0,
  730. #endif /* OS2 */
  731.     "echo",          XYTEC,  0,
  732.     "escape-character", XYTESC, 0,
  733. #ifdef OS2
  734. #ifdef PCFONTS
  735.     "font",          XYTFON, 0,
  736. #endif /* PCFONTS */
  737. #endif /* OS2 */
  738.     "height",        XYTHIG, 0,
  739. #ifdef OS2
  740.     "idle-send",     XYTIDLE,0,
  741. #ifndef NOCSETS
  742.     "kbd-follows-gl/gr", XYTKBDGL, 0,
  743. #endif /* NOCSETS */
  744.     "key",           XYTKEY, 0,
  745.     "keyboard-mode", XYTKBMOD, 0,
  746.     "keypad-mode",   XYTKPD, 0,
  747. #endif /* OS2 */
  748. #ifndef NOCSETS
  749. #ifdef OS2
  750.     "local-character-set", XYTLCS,  0,
  751. #else
  752.     "local-character-set", XYTLCS,  CM_INV,
  753. #endif /* OS2 */
  754. #endif /* NOCSETS */
  755.     "locking-shift", XYTSO,  0,
  756. #ifdef OS2
  757.     "margin-bell",   XYTMBEL, 0,
  758. #endif /* OS2 */
  759. #ifdef OS2MOUSE
  760.     "mouse",         XYTMOU, CM_INV,
  761. #endif /* OS2MOUSE */
  762.     "newline-mode",  XYTNL,  0,
  763. #ifdef OS2
  764.     "output-pacing", XYTPAC, 0,
  765. #ifdef PCTERM
  766.     "pcterm",        XYTPCTERM, 0,
  767. #endif /* PCTERM */
  768. #endif /* OS2 */
  769. #ifdef OS2ORUNIX
  770.     "print",         XYTPRN, 0,
  771. #endif /* OS2ORUNIX */
  772. #ifndef NOCSETS
  773. #ifdef OS2
  774.     "remote-character-set", XYTRCS,  0,
  775. #else
  776.     "remote-character-set", XYTRCS,  CM_INV,
  777. #endif /* OS2 */
  778. #endif /* NOCSETS */
  779. #ifdef OS2
  780.     "roll-mode",     XYTROL, 0,
  781.     "s",             XYTUPD, CM_ABR|CM_INV,
  782.     "sc",            XYTUPD, CM_ABR|CM_INV,
  783.     "scr",           XYTUPD, CM_ABR|CM_INV,
  784.     "scree",         XYTUPD, CM_ABR|CM_INV,
  785.     "screen",        XYTUPD, CM_ABR|CM_INV,
  786.     "screen-",       XYTUPD, CM_ABR|CM_INV,
  787.     "screen-mode",   XYTSCNM,   0,
  788.     "screen-optimize", XYTOPTI, 0,
  789.     "screen-update", XYTUPD, 0,
  790.     "scrollback",    XYSCRS, 0,
  791.     "send-data",     XYTSEND, 0,
  792.     "send-end-of-block", XYTSEOB, 0,
  793.     "sgr-colors",    XYTSGRC, 0,
  794.     "sni-ch.code",   XYTSNICC, 0,
  795.     "sni-firmware-versions", XYTSNIFV, 0,
  796.     "sni-language",  XYTVTLNG, 0,
  797.     "sni-pagemode",  XYTSNIPM, CM_INV,
  798.     "sni-scrollmode",XYTSNISM, CM_INV,
  799.     "spacing-attribute-character", XYTSAC, CM_INV,
  800.     "statusline",    XYTSTAT, 0,
  801.     "transmit-timeout", XYTCTS, 0,
  802. #endif /* OS2 */
  803. #ifdef CK_TRIGGER
  804.     "trigger",       XYTRIGGER, 0,
  805. #endif /* CK_TRIGGER */
  806. #ifdef OS2
  807.     "type",          XYTTYP, 0,
  808. #else
  809.     "type",          XYTTYP, CM_INV,
  810. #endif /* OS2 */
  811. #ifndef NOCSETS
  812. #ifdef UNICODE
  813.     "unicode",       XYTUNI, CM_INV,
  814. #endif /* UNICODE */
  815. #endif /* NOCSETS */
  816. #ifdef OS2
  817.     "unix-mode",     XYTUNX, CM_INV,
  818. #ifdef NT
  819.     "video-change",  XYTVCH, 0,
  820. #endif /* NT */
  821.     "vt-language",   XYTVTLNG, 0,
  822.     "vt-nrc-mode",   XYTVTNRC, 0,
  823. #endif /* OS2 */
  824.     "width",         XYTWID, 0,
  825. #ifdef OS2
  826.     "wrap",          XYTWRP, 0,
  827. #endif /* OS2 */
  828.     "", 0, 0
  829. };
  830. int ntrm = (sizeof(trmtab) / sizeof(struct keytab)) - 1;
  831. #ifdef OS2
  832. struct keytab termctrl[] = {  /* SET TERM CONTROLS */
  833.     "7",  7, 0,
  834.     "8",  8, 0
  835. };
  836. int ntermctrl = (sizeof(termctrl) / sizeof(struct keytab));
  837. struct keytab rolltab[] = {   /* Set TERM Roll Options */
  838.     "insert",    TTR_INSERT, 0,
  839.     "off",       TTR_OVER,   CM_INV,
  840.     "on",        TTR_INSERT, CM_INV,
  841.     "overwrite", TTR_OVER,   0
  842. };
  843. int nroll = (sizeof(rolltab) / sizeof(struct keytab));
  844. #define TT_GR_ALL 4
  845. #define TT_GR_G0  0
  846. #define TT_GR_G1  1
  847. #define TT_GR_G2  2
  848. #define TT_GR_G3  3
  849. #define TT_GR_KBD 4
  850. struct keytab graphsettab[] = {  /* DEC VT Graphic Sets */
  851.     "all",   TT_GR_ALL, 0,
  852.     "g0",    TT_GR_G0,  0,
  853.     "g1",    TT_GR_G1,  0,
  854.     "g2",    TT_GR_G2,  0,
  855.     "g3",    TT_GR_G3,  0,
  856.     "keyboard", TT_GR_KBD, 0,
  857.     "", 0, 0
  858. };
  859. int ngraphset = (sizeof(graphsettab) / sizeof(struct keytab)) - 1;
  860. struct keytab adltab[] = { /* Autodownload Options */
  861.     "kermit",  TAD_K,   0,
  862.     "off", TAD_OFF,  0,
  863.     "on", TAD_ON, 0,
  864.     "zmodem",   TAD_Z,   0
  865. };
  866. int nadltab = (sizeof(adltab) / sizeof(struct keytab));
  867. struct keytab adlxtab[] = { /* Autodownload Options */
  868.     "c0-conflicts",     TAD_X_C0,       0,
  869.     "detection-method", TAD_X_DETECT,  0,
  870.     "string",  TAD_X_STR,   0
  871. };
  872. int nadlxtab = (sizeof(adlxtab) / sizeof(struct keytab));
  873. struct keytab adldtab[] = { /* Auto-dl Detection Methods */
  874.     "packet", ADL_PACK, 0,
  875.     "string", ADL_STR, 0
  876. };
  877. int nadldtab = (sizeof(adldtab) / sizeof(struct keytab));
  878. struct keytab adlc0tab[] = { /* Auto-dl Detection Methods */
  879.     "ignored-by-emulator", 0, 0,
  880.     "processed-by-emulator", 1, 0
  881. };
  882. int nadlc0tab = (sizeof(adlc0tab) / sizeof(struct keytab));
  883. struct keytab vtlangtab[] = {
  884.     "belgian",        VTL_BELGIAN , 0,
  885.     "british",        VTL_BRITISH , 0,
  886.     "canadian",       VTL_CANADIAN, 0,
  887.     "czech",          VTL_CZECH   , 0,
  888.     "danish",         VTL_DANISH  , 0,
  889.     "dutch",          VTL_DUTCH   , 0,
  890.     "finnish",        VTL_FINNISH , 0,
  891.     "french",         VTL_FRENCH  , 0,
  892.     "french-canadian",VTL_FR_CAN  , 0,
  893.     "german",         VTL_GERMAN  , 0,
  894.     "greek",          VTL_GREEK   , 0,
  895.     "hebrew",         VTL_HEBREW  , 0,
  896.     "hungarian",      VTL_HUNGARIA, 0,
  897.     "italian",        VTL_ITALIAN , 0,
  898.     "latin-american", VTL_LATIN_AM, 0,
  899.     "north-american", VTL_NORTH_AM, 0,
  900.     "norwegian",      VTL_NORWEGIA, 0,
  901.     "polish",         VTL_POLISH  , 0,
  902.     "portugese",      VTL_PORTUGES, 0,
  903.     "romanian",       VTL_ROMANIAN, 0,
  904.     "russian",        VTL_RUSSIAN , 0,
  905.     "scs",            VTL_SCS     , CM_INV,
  906.     "slovak",         VTL_SLOVAK  , 0,
  907.     "spanish",        VTL_SPANISH , 0,
  908.     "swedish",        VTL_SWEDISH , 0,
  909.     "swiss-french",   VTL_SW_FR   , 0,
  910.     "swiss-german",   VTL_SW_GR   , 0,
  911.     "turkish-f",      VTL_TURK_F  , CM_INV,
  912.     "turkish-q",      VTL_TURK_Q  , CM_INV
  913. };
  914. int nvtlangtab = (sizeof(vtlangtab) / sizeof(struct keytab));
  915. #endif /* OS2 */
  916. struct keytab crdtab[] = { /* Carriage-return display */
  917.     "crlf",        1, 0,
  918.     "normal",      0, 0
  919. };
  920. extern int tt_crd; /* Carriage-return display variable */
  921. #ifdef CK_APC
  922. extern int apcstatus, apcactive;
  923. static struct keytab apctab[] = { /* Terminal APC parameters */
  924.     "off",  APC_OFF,  0,
  925.     "on",  APC_ON,   0,
  926.     "unchecked", APC_UNCH, 0
  927. };
  928. #endif /* CK_APC */
  929. #endif /* NOLOCAL */
  930. extern int autodl;
  931. struct keytab beltab[] = { /* Terminal bell mode */
  932. #ifdef OS2
  933.     "audible", XYB_AUD,  0,
  934.     "none",    XYB_NONE, 0,
  935. #else
  936.     "audible", XYB_AUD,  CM_INV,
  937.     "none",    XYB_NONE, CM_INV,
  938. #endif /* OS2 */
  939. #ifdef OS2
  940.     "off",     XYB_NONE, CM_INV,
  941.     "on",      XYB_AUD,  CM_INV,
  942. #else
  943.     "off",     XYB_NONE, 0,
  944.     "on",      XYB_AUD,  0,
  945. #endif /* OS2 */
  946. #ifdef OS2
  947.     "visible", XYB_VIS,  0,
  948. #endif /* OS2 */
  949.     "", 0, 0
  950. };
  951. int nbeltab = sizeof(beltab)/sizeof(struct keytab) - 1;
  952. int tt_unicode = 1; /* Use Unicode if possible */
  953. #ifdef OS2
  954. /*
  955.   OS/2 serial communication devices.
  956. */
  957. struct keytab os2devtab[] = {
  958.     "1",    1, CM_INV, /* Invisible synonyms, like */
  959.     "2",    2, CM_INV, /* "set port 1" */
  960.     "3",    3, CM_INV,
  961.     "4",    4, CM_INV,
  962.     "5",    5, CM_INV,
  963.     "6",    6, CM_INV,
  964.     "7",    7, CM_INV,
  965.     "8",    8, CM_INV,
  966.     "com1", 1, 0, /* Real device names */
  967.     "com2", 2, 0,
  968.     "com3", 3, 0,
  969.     "com4", 4, 0,
  970.     "com5", 5, 0,
  971.     "com6", 6, 0,
  972.     "com7", 7, 0,
  973.     "com8", 8, 0
  974. #ifdef OS2ONLY
  975.    ,"slipcom1", 1, 0, /* For use with SLIP driver */
  976.     "slipcom2", 2, 0, /* shared access */
  977.     "slipcom3", 3, 0,
  978.     "slipcom4", 4, 0,
  979.     "slipcom5", 5, 0,
  980.     "slipcom6", 6, 0,
  981.     "slipcom7", 7, 0,
  982.     "slipcom8", 8, 0,
  983.     "pppcom1", 1, 0, /* For use with PPP driver */
  984.     "pppcom2", 2, 0, /* shared access */
  985.     "pppcom3", 3, 0,
  986.     "pppcom4", 4, 0,
  987.     "pppcom5", 5, 0,
  988.     "pppcom6", 6, 0,
  989.     "pppcom7", 7, 0,
  990.     "pppcom8", 8, 0
  991. #endif /* OS2ONLY */
  992. };
  993. int nos2dev = (sizeof(os2devtab) / sizeof(struct keytab));
  994. #ifdef OS2ONLY
  995. struct keytab os2ppptab[] = {
  996.     "0",    0, CM_INV,
  997.     "1",    1, CM_INV, /* Invisible synonyms, like */
  998.     "2",    2, CM_INV, /* "set port 1" */
  999.     "3",    3, CM_INV,
  1000.     "4",    4, CM_INV,
  1001.     "5",    5, CM_INV,
  1002.     "6",    6, CM_INV,
  1003.     "7",    7, CM_INV,
  1004.     "8",    8, CM_INV,
  1005.     "9",    9, CM_INV,
  1006.     "ppp0", 0, 0,
  1007.     "ppp1", 1, 0, /* For use with PPP driver */
  1008.     "ppp2", 2, 0, /* shared access */
  1009.     "ppp3", 3, 0,
  1010.     "ppp4", 4, 0,
  1011.     "ppp5", 5, 0,
  1012.     "ppp6", 6, 0,
  1013.     "ppp7", 7, 0,
  1014.     "ppp8", 8, 0,
  1015.     "ppp9", 9, 0
  1016. };
  1017. int nos2ppp = (sizeof(os2ppptab) / sizeof(struct keytab));
  1018. #endif /* OS2ONLY */
  1019. /*
  1020.   Terminal parameters that can be set by SET commands.
  1021.   Used by the ck?con.c terminal emulator code.
  1022.   For now, only used for #ifdef OS2.  Should add these for Macintosh.
  1023. */
  1024. int tt_arrow = TTK_NORM; /* Arrow key mode: normal (cursor) */
  1025. int tt_keypad = TTK_NORM; /* Keypad mode: normal (numeric) */
  1026. int tt_shift_keypad = 0;          /* Keypad Shift mode: Off */
  1027. int tt_wrap = 1; /* Terminal wrap, 1 = On */
  1028. int tt_type = TT_VT320; /* Terminal type, initially VT320 */
  1029. int tt_type_mode = TT_VT320;     /* Terminal type set by host command */
  1030. int tt_cursor = 0; /* Terminal cursor, 0 = Underline */
  1031. int tt_cursor_usr = 0; /* Users Terminal cursor type */
  1032. int tt_cursorena_usr = 1; /* Users Terminal cursor enabled */
  1033. int tt_answer = 0; /* Terminal answerback (disabled) */
  1034. int tt_scrsize[VNUM] = {512,512,512,1}; /* Terminal scrollback buffer size */
  1035. int tt_roll[VNUM] = {1,1,1,1}; /* Terminal roll (on) */
  1036. int tt_pacing = 0; /* Terminal output-pacing (none) */
  1037. int tt_inpacing = 0; /* Terminal input-pacing (none) */
  1038. int tt_ctstmo = 15; /* Terminal transmit-timeout */
  1039. int tt_codepage = -1; /* Terminal code-page */
  1040. int tt_update = 100; /* Terminal screen-update interval */
  1041. int tt_updmode = TTU_FAST; /* Terminal screen-update mode FAST */
  1042. extern int updmode;
  1043. int tt_font = TTF_ROM; /* Terminal screen font */
  1044. #ifndef KUI
  1045. int tt_status = 1; /* Terminal status line displayed */
  1046. int tt_status_usr = 1;
  1047. #else  /* KUI */
  1048. #ifdef K95G
  1049. int tt_status = 1; /* Terminal status line displayed */
  1050. int tt_status_usr = 1;
  1051. #else /* K95G */
  1052. int tt_status = 0; /* Terminal status line displayed */
  1053. int tt_status_usr = 0;
  1054. #endif /* K95G */
  1055. #endif /* KUI */
  1056. int tt_senddata = 0; /* Let host read terminal data */
  1057. extern int wy_blockend; /* Terminal Send Data EOB type */
  1058. int tt_hidattr = 1; /* Attributes are hidden */
  1059. int tt_idlesnd_tmo = 0; /* Idle Send Timeout, disabled */
  1060. char * tt_idlesnd_str = NULL; /* Idle Send String, none */
  1061. extern unsigned char colornormal, colorselect,
  1062. colorunderline, colorstatus, colorhelp, colorborder,
  1063. colorgraphic, colordebug, colorreverse;
  1064. extern int trueblink, trueunderline, truereverse;
  1065. extern int bgi, fgi;
  1066. extern int scrninitialized[];
  1067. struct keytab audibletab[] = { /* Terminal Bell Audible mode */
  1068.     "beep",          XYB_BEEP, 0, /* Values ORd with bell mode */
  1069.     "system-sounds", XYB_SYS, 0
  1070. };
  1071. int naudibletab = sizeof(audibletab)/sizeof(struct keytab);
  1072. struct keytab akmtab[] = { /* Arrow key mode */
  1073.     "application", TTK_APPL, 0,
  1074.     "cursor",      TTK_NORM, 0
  1075. };
  1076. struct keytab kpmtab[] = { /* Keypad mode */
  1077.     "application", TTK_APPL, 0,
  1078.     "numeric",     TTK_NORM, 0
  1079. };
  1080. struct keytab ttcolmodetab[] = {
  1081.     "current-color", 0, 0,
  1082.     "default-color",  1, 0
  1083. };
  1084. int ncolmode = sizeof(ttcolmodetab)/sizeof(struct keytab);
  1085. #define TTCOLNOR  0
  1086. #define TTCOLREV  1
  1087. #define TTCOLUND  2
  1088. #define TTCOLSTA  3
  1089. #define TTCOLHLP  4
  1090. #define TTCOLBOR  5
  1091. #define TTCOLSEL  6
  1092. #define TTCOLDEB  7
  1093. #define TTCOLGRP  8
  1094. #define TTCOLRES  10
  1095. #define TTCOLERA  11
  1096. struct keytab ttycoltab[] = { /* Terminal Screen coloring */
  1097.     "border",             TTCOLBOR, 0, /* Screen border color */
  1098.     "debug-terminal",     TTCOLDEB, 0, /* Debug color */
  1099.     "erase",              TTCOLERA, 0,          /* Erase mode */
  1100.     "graphic",            TTCOLGRP, 0,          /* Graphic Color */
  1101.     "help-text",          TTCOLHLP, 0, /* Help screens */
  1102.     "normal",             TTCOLNOR, CM_INV, /* Normal screen text */
  1103.     "reset-on-esc[0m",    TTCOLRES, 0,          /* Reset on ESC [ 0 m */
  1104.     "reverse-video",      TTCOLREV, 0,          /* Reverse video */
  1105.     "status-line",        TTCOLSTA, 0, /* Status line */
  1106.     "selection",          TTCOLSEL, 0, /* Selection color */
  1107.     "terminal-screen",    TTCOLNOR, 0, /* Better name than "normal" */
  1108.     "underlined-text",    TTCOLUND, 0     /* Underlined text */
  1109. };
  1110. int ncolors = (sizeof(ttycoltab) / sizeof(struct keytab));
  1111. #define TTATTNOR  0
  1112. #define TTATTBLI  1
  1113. #define TTATTREV  2
  1114. #define TTATTUND  3
  1115. #define TTATTPRO  4
  1116. #define TTATTBLD  5
  1117. #define TTATTDIM  6
  1118. #define TTATTINV  7
  1119. #define TTATTDONE 8
  1120. struct keytab ttyattrtab[] = {
  1121.     "blink",  TTATTBLI, 0,
  1122.     "protected",TTATTPRO, 0,
  1123.     "reverse", TTATTREV, 0,
  1124.     "underline",TTATTUND, 0
  1125. };
  1126. int nattrib = (sizeof(ttyattrtab) / sizeof(struct keytab));
  1127. struct keytab ttyprotab[] = {
  1128.     "bold",        TTATTBLD, 0,
  1129.     "dim",    TTATTDIM, 0,
  1130.     "done",    TTATTDONE, CM_INV,
  1131.     "invisible",   TTATTINV, 0,
  1132.     "normal",    TTATTNOR, 0,
  1133.     "reverse",    TTATTREV, 0,
  1134.     "underlined",  TTATTUND, 0
  1135. };
  1136. int nprotect = (sizeof(ttyprotab) / sizeof(struct keytab));
  1137. struct keytab ttyseobtab[] = {
  1138.     "crlf_etx",  1, 0,
  1139.     "us_cr",  0, 0
  1140. };
  1141. struct keytab ttyclrtab[] = { /* Colors */
  1142.     "black",       0, 0,
  1143.     "blue",        1, 0,
  1144.     "brown",       6, 0,
  1145.     "cyan",        3, 0,
  1146.     "darkgray",    8, CM_INV,
  1147.     "dgray",       8, 0,
  1148.     "green",       2, 0,
  1149.     "lblue",       9, CM_INV,
  1150.     "lcyan",      11, CM_INV,
  1151.     "lgray",       7, CM_INV,
  1152.     "lgreen",     10, CM_INV,
  1153.     "lightblue",   9, 0,
  1154.     "lightcyan",  11, 0,
  1155.     "lightgray",   7, 0,
  1156.     "lightgreen", 10, 0,
  1157.     "lightmagenta",13,0,
  1158.     "lightred",   12, 0,
  1159.     "lmagenta",   13, CM_INV,
  1160.     "lred",       12, CM_INV,
  1161.     "magenta",     5, 0,
  1162.     "red",         4, 0,
  1163.     "white",      15, 0,
  1164.     "yellow",     14, 0
  1165. };
  1166. int nclrs = (sizeof (ttyclrtab) / sizeof (struct keytab));
  1167. struct keytab ttycurtab[] = {
  1168.     "full",        TTC_BLOCK, 0,
  1169.     "half",        TTC_HALF,  0,
  1170.     "underline",   TTC_ULINE, 0
  1171. };
  1172. int ncursors = 3;
  1173. struct keytab ttyptab[] = {
  1174.     "aixterm",  TT_AIXTERM, 0,          /* IBM AIXterm */
  1175.     "ansi-bbs", TT_ANSI,    0, /* ANSI.SYS (BBS) */
  1176.     "at386",    TT_AT386,   0, /* Unixware ANSI */
  1177.     "avatar/0+",TT_ANSI,    0,          /* AVATAR/0+ */
  1178.     "ba80",     TT_BA80,    0,          /* Nixdorf BA80 */
  1179.     "be",       TT_BEOS,    CM_INV|CM_ABR,
  1180.     "beos-ansi",TT_BEOS,    CM_INV,     /* BeOS ANSI */
  1181.     "beterm",   TT_BEOS,    0,          /* BeOS Terminal (as of PR2 ) */
  1182.     "d200",     TT_DG200,   CM_INV|CM_ABR, /* Data General DASHER 200 */
  1183.     "d210",     TT_DG210,   CM_INV|CM_ABR, /* Data General DASHER 210 */
  1184.     "d217",     TT_DG217,   CM_INV|CM_ABR, /* Data General DASHER 217 */
  1185.     "dg200",    TT_DG200,   0, /* Data General DASHER 200 */
  1186.     "dg210",    TT_DG210,   0,          /* Data General DASHER 210 */
  1187.     "dg217",    TT_DG217,   0,          /* Data General DASHER 217 */
  1188.     "h1500",    TT_HZL1500, CM_INV,     /* Hazeltine 1500 */
  1189.     "h19",      TT_H19,     CM_INV, /* Heath-19 */
  1190.     "heath19",  TT_H19,     0, /* Heath-19 */
  1191.     "hft",      TT_HFT,     0,          /* IBM High Function Terminal */
  1192.     "hp2621a",  TT_HP2621,  0, /* HP 2621A */
  1193.     "hpterm",   TT_HPTERM,  0, /* HP TERM */
  1194.     "hz1500",   TT_HZL1500, 0,     /* Hazeltine 1500 */
  1195.     "ibm3151",  TT_IBM31,   CM_INV, /* IBM 3101-xx,3161 */
  1196.     "linux",    TT_LINUX,   0,          /* Linux */
  1197.     "qansi",    TT_QANSI,   0, /* QNX ANSI */
  1198.     "qnx",      TT_QNX,     0, /* QNX Console */
  1199.     "scoansi",  TT_SCOANSI, 0, /* SCO ANSI */
  1200.     "sni-97801",TT_97801, 0, /* SNI 97801 */
  1201. /*
  1202.   The idea of NONE is to let the console driver handle the escape sequences,
  1203.   which, in theory at least, would give not only ANSI emulation, but also any
  1204.   other kind of emulation that might be provided by alternative console
  1205.   drivers, if any existed.
  1206.   For this to work, ckocon.c would need to be modified to make higher-level
  1207.   calls, like VioWrtTTY(), DosWrite(), or (simply) write(), rather than
  1208.   VioWrt*Cell() and similar, and it would also have to give up its rollback
  1209.   feature, and its status line and help screens would also have to be
  1210.   forgotten or else done in an ANSI way.
  1211.   As matters stand, we already have perfectly good ANSI emulation built in,
  1212.   and there are no alternative console drivers available, so there is no point
  1213.   in having a terminal type of NONE, so it is commented out.  However, should
  1214.   you uncomment it, it will work like a "glass tty" -- no escape sequence
  1215.   interpretation at all; somewhat similar to debug mode, except without the
  1216.   debugging (no highlighting of control chars or escape sequences); help
  1217.   screens, status line, and rollback will still work.
  1218. */
  1219. #ifdef OS2PM
  1220. #ifdef COMMENT
  1221.     "tek4014", TT_TEK40, 0,
  1222. #endif /* COMMENT */
  1223. #endif /* OS2PM */
  1224.     "tty",     TT_NONE,  0,
  1225.     "tvi910+", TT_TVI910, 0,
  1226.     "tvi925",  TT_TVI925, 0,
  1227.     "tvi950",  TT_TVI950, 0,
  1228.     "vc404",   TT_VC4404, 0,
  1229.     "vc4404",  TT_VC4404, CM_INV,
  1230.     "vip7809", TT_VIP7809, 0,
  1231.     "vt100",   TT_VT100, 0,
  1232.     "vt102",   TT_VT102, 0,
  1233.     "vt220",   TT_VT220, 0,
  1234.     "vt220pc", TT_VT220PC, 0,
  1235.     "vt320",   TT_VT320, 0,
  1236.     "vt320pc", TT_VT320PC, 0,
  1237.     "vt52",    TT_VT52,  0,
  1238. #ifdef NT
  1239.     "vtnt",    TT_VTNT,  0,
  1240. #else /* NT */
  1241.     "vtnt",    TT_VTNT,  CM_INV,
  1242. #endif /* NT */
  1243.     "wy160",   TT_WY160, 0,
  1244.     "wy30",    TT_WY30,  0,
  1245.     "wy370",   TT_WY370, 0,
  1246.     "wy50",    TT_WY50,  0,
  1247.     "wy60",    TT_WY60,  0,
  1248.     "wyse30",  TT_WY30,  CM_INV,
  1249.     "wyse370", TT_WY370, CM_INV,
  1250.     "wyse50",  TT_WY50,  CM_INV,
  1251.     "wyse60",  TT_WY60,  CM_INV
  1252. };
  1253. int nttyp = (sizeof(ttyptab) / sizeof(struct keytab));
  1254. struct keytab ttkeytab[] = {
  1255.     "aixterm",  TT_AIXTERM, 0,          /* IBM AIXterm */
  1256.     "ansi-bbs",  TT_ANSI,    0, /* ANSI.SYS (BBS) */
  1257.     "at386",     TT_AT386,   0, /* Unixware ANSI */
  1258.     "avatar/0+", TT_ANSI,    0,         /* AVATAR/0+ */
  1259.     "ba80",      TT_BA80,    0,         /* Nixdorf BA80 */
  1260.     "be",        TT_BEOS,    CM_INV|CM_ABR,
  1261.     "beos-ansi", TT_BEOS,    CM_INV,    /* BeOS ANSI */
  1262.     "beterm",    TT_BEOS,    0,         /* BeOS Terminal (as of PR2) */
  1263.     "d200",      TT_DG200,   CM_INV|CM_ABR, /* Data General DASHER 200 */
  1264.     "d210",      TT_DG210,   CM_INV|CM_ABR, /* Data General DASHER 210 */
  1265.     "d217",      TT_DG217,   CM_INV|CM_ABR, /* Data General DASHER 217 */
  1266.     "dg200",     TT_DG200,   0, /* Data General DASHER 200 */
  1267.     "dg210",     TT_DG210,   0,     /* Data General DASHER 210 */
  1268.     "dg217",     TT_DG217,   0,     /* Data General DASHER 217 */
  1269.     "emacs",     TT_KBM_EMACS,   0,     /* Emacs mode */
  1270.     "h19",       TT_H19,     CM_INV, /* Heath-19 */
  1271.     "heath19",   TT_H19,     0, /* Heath-19 */
  1272.     "hebrew",    TT_KBM_HEBREW,   0,    /* Hebrew mode */
  1273.     "hft",       TT_HFT,     0,         /* IBM High Function Terminal */
  1274.     "hp2621a",   TT_HP2621,  0, /* HP 2621A */
  1275.     "hpterm",    TT_HPTERM,  0, /* HP TERM */
  1276.     "hz1500",    TT_HZL1500, 0,     /* Hazeltine 1500 */
  1277.     "ibm3151",   TT_IBM31,   CM_INV, /* IBM 3101-xx,3161 */
  1278.     "linux",     TT_LINUX,   0,         /* Linux */
  1279.     "qansi",     TT_QANSI,         0,   /* QNX ANSI */
  1280.     "qnx",       TT_QNX,           0,   /* QNX */
  1281.     "russian",   TT_KBM_RUSSIAN,   0,   /* Russian mode */
  1282.     "scoansi",   TT_SCOANSI, 0, /* SCO ANSI */
  1283.     "sni-97801", TT_97801, 0,           /* SNI 97801 */
  1284. #ifdef OS2PM
  1285. #ifdef COMMENT
  1286.     "tek4014", TT_TEK40, 0,
  1287. #endif /* COMMENT */
  1288. #endif /* OS2PM */
  1289.     "tty",     TT_NONE,  0,
  1290.     "tvi910+", TT_TVI910, 0,
  1291.     "tvi925",  TT_TVI925, 0,
  1292.     "tvi950",  TT_TVI950, 0,
  1293.     "vc404",   TT_VC4404, 0,
  1294.     "vc4404",  TT_VC4404, CM_INV,
  1295.     "vip7809", TT_VIP7809, 0,
  1296.     "vt100",   TT_VT100, 0,
  1297.     "vt102",   TT_VT102, 0,
  1298.     "vt220",   TT_VT220, 0,
  1299.     "vt220pc", TT_VT220PC, 0,
  1300.     "vt320",   TT_VT320, 0,
  1301.     "vt320pc", TT_VT320PC, 0,
  1302.     "vt52",    TT_VT52,  0,
  1303.     "vtnt",    TT_VTNT,  CM_INV,
  1304.     "wp",      TT_KBM_WP,   0, /* Word Perfect mode */
  1305.     "wy160",   TT_WY160,  0,
  1306.     "wy30",    TT_WY30,  0,
  1307.     "wy370",   TT_WY370, 0,
  1308.     "wy50",    TT_WY50,  0,
  1309.     "wy60",    TT_WY60,  0,
  1310.     "wyse30",  TT_WY30,  CM_INV,
  1311.     "wyse370", TT_WY370, CM_INV,
  1312.     "wyse50",  TT_WY50,  CM_INV,
  1313.     "wyse60",  TT_WY60,  CM_INV
  1314. };
  1315. int nttkey = (sizeof(ttkeytab) / sizeof(struct keytab));
  1316. struct keytab kbmodtab[] = {
  1317.     "normal",  KBM_EN, 0,
  1318.     "none",    KBM_EN, CM_INV,
  1319.     "emacs",   KBM_EM, 0,
  1320.     "english", KBM_EN, CM_INV,
  1321.     "hebrew",  KBM_HE, 0,
  1322.     "russian", KBM_RU, 0,
  1323.     "wp",      KBM_WP, 0
  1324. };
  1325. int nkbmodtab = (sizeof(kbmodtab) / sizeof(struct keytab));
  1326. struct keytab prtytab[] = { /* OS/2 Priority Levels */
  1327.     "foreground-server", XYP_SRV, 0,
  1328.     "idle",              XYP_IDLE, CM_INV,
  1329.     "regular",           XYP_REG, 0,
  1330.     "time-critical",     XYP_RTP, 0
  1331. };
  1332. int nprty = (sizeof(prtytab) / sizeof(struct keytab));
  1333. #endif /* OS2 */
  1334. #ifdef NT
  1335. struct keytab win95tab[] = { /* Win95 work-arounds */
  1336.     "8.3-filenames",         XYW8_3, 0,
  1337.     "alt-gr",       XYWAGR, 0,
  1338.     "keyboard-translation",  XYWKEY, 0,
  1339.     "lucida-substitutions",  XYWLUC, 0,
  1340.     "overlapped-io",         XYWOIO, 0,
  1341.     "popups",                XYWPOPUP, 0,
  1342.     "select-bug",            XYWSELECT, 0
  1343. };
  1344. int nwin95 = (sizeof(win95tab) / sizeof(struct keytab));
  1345. #endif /* NT */
  1346. #ifdef OS2MOUSE
  1347. extern int wideresult;
  1348. int tt_mouse = 1; /* Terminal mouse on/off */
  1349. struct keytab mousetab[] = { /* Mouse items */
  1350.     "activate", XYM_ON,    0,
  1351.     "button",   XYM_BUTTON, 0,
  1352.     "clear",    XYM_CLEAR, 0
  1353. };
  1354. int nmtab = (sizeof(mousetab)/sizeof(struct keytab));
  1355. struct keytab mousebuttontab[] = { /* event button */
  1356.     "one",           XYM_B1, CM_INV,
  1357.     "three",         XYM_B3, CM_INV,
  1358.     "two",           XYM_B2, CM_INV,
  1359.     "1",             XYM_B1, 0,
  1360.     "2",             XYM_B2, 0,
  1361.     "3",             XYM_B3, 0
  1362. };
  1363. int nmbtab = (sizeof(mousebuttontab) / sizeof(struct keytab));
  1364. struct keytab mousemodtab[] = { /* event button key modifier */
  1365.     "alt", XYM_ALT,   0,
  1366.     "alt-shift", XYM_SHIFT|XYM_ALT, 0,
  1367.     "ctrl", XYM_CTRL,  0,
  1368.     "ctrl-alt", XYM_CTRL|XYM_ALT, 0,
  1369.     "ctrl-alt-shift", XYM_CTRL|XYM_SHIFT|XYM_ALT, 0,
  1370.     "ctrl-shift", XYM_CTRL|XYM_SHIFT, 0,
  1371.     "none",   0, 0,
  1372.     "shift", XYM_SHIFT, 0
  1373. };
  1374. int nmmtab = (sizeof(mousemodtab) / sizeof(struct keytab));
  1375. struct keytab mclicktab[] = { /* event button click modifier */
  1376.     "click",        XYM_C1,  0,
  1377.     "drag",         XYM_DRAG, 0,
  1378.     "double-click", XYM_C2,  0
  1379. };
  1380. int nmctab = (sizeof(mclicktab) / sizeof(struct keytab));
  1381. #ifndef NOKVERBS
  1382. extern int nkverbs;
  1383. extern struct keytab kverbs[];
  1384. #endif /* NOKVERBS */
  1385. #endif /* OS2MOUSE */
  1386. /* #ifdef VMS */
  1387. struct keytab fbtab[] = { /* Binary record types for VMS */
  1388.     "fixed",     XYFT_B, 0, /* Fixed is normal for binary */
  1389.     "undefined", XYFT_U, 0 /* Undefined if they ask for it */
  1390. };
  1391. int nfbtyp = (sizeof(fbtab) / sizeof(struct keytab));
  1392. /* #endif */
  1393. #ifdef VMS
  1394. struct keytab lbltab[] = { /* Labeled File info */
  1395.     "acl",         LBL_ACL, 0,
  1396.     "backup-date", LBL_BCK, 0,
  1397.     "name",        LBL_NAM, 0,
  1398.     "owner",       LBL_OWN, 0,
  1399.     "path",        LBL_PTH, 0
  1400. };
  1401. int nlblp = (sizeof(lbltab) / sizeof(struct keytab));
  1402. #else
  1403. #ifdef OS2
  1404. struct keytab lbltab[] = { /* Labeled File info */
  1405.     "archive",   LBL_ARC, 0,
  1406.     "extended",  LBL_EXT, 0,
  1407.     "hidden",    LBL_HID, 0,
  1408.     "read-only", LBL_RO,  0,
  1409.     "system",    LBL_SYS, 0
  1410. };
  1411. int nlblp = (sizeof(lbltab) / sizeof(struct keytab));
  1412. #endif /* OS2 */
  1413. #endif /* VMS */
  1414. #ifdef CK_CURSES
  1415. #ifdef CK_PCT_BAR
  1416. static struct keytab fdftab[] = { /* SET FILE DISPLAY FULL options */
  1417.     "thermometer", 1, 0,
  1418.     "no-thermometer", 0, 0
  1419. };
  1420. extern int thermometer;
  1421. #endif /* CK_PCT_BAR */
  1422. #endif /* CK_CURSES */
  1423. static struct keytab fdtab[] = { /* SET FILE DISPLAY options */
  1424. #ifdef MAC /* Macintosh */
  1425.     "fullscreen", XYFD_R, 0, /* Full-screen but not curses */
  1426.     "none",   XYFD_N, 0,
  1427.     "off",    XYFD_N, CM_INV,
  1428.     "on",     XYFD_R, CM_INV,
  1429.     "quiet",  XYFD_N, CM_INV
  1430. #else /* Not Mac */
  1431.     "brief", XYFD_B, 0, /* Brief */
  1432.     "crt", XYFD_S, 0, /* CRT display */
  1433. #ifdef CK_CURSES
  1434. #ifdef COMMENT
  1435.     "curses",     XYFD_C, CM_INV, /* Full-screen, curses */
  1436. #endif /* COMMENT */
  1437.     "fullscreen", XYFD_C, 0, /* Full-screen, whatever the method */
  1438. #endif /* CK_CURSES */
  1439.     "none",   XYFD_N, 0, /* No display */
  1440.     "off",    XYFD_N, CM_INV, /* Ditto */
  1441.     "on",     XYFD_R, CM_INV, /* On = Serial */
  1442.     "quiet",  XYFD_N, CM_INV, /* No display */
  1443.     "serial", XYFD_R, 0 /* Serial */
  1444. #endif /* MAC */
  1445. };
  1446. int nfdtab = (sizeof(fdtab) / sizeof(struct keytab));
  1447. struct keytab rsrtab[] = { /* For REMOTE SET RECEIVE */
  1448.     "packet-length", XYLEN, 0,
  1449.     "timeout", XYTIMO, 0
  1450. };
  1451. int nrsrtab = (sizeof(rsrtab) / sizeof(struct keytab));
  1452. /* Send/Receive Parameters */
  1453. struct keytab srtab[] = {
  1454.     "backup", XYBUP, 0,
  1455. #ifndef NOCSETS
  1456.     "character-set-selection", XYCSET, 0,
  1457. #endif /* NOCSETS */
  1458.     "control-prefix", XYQCTL, 0,
  1459. #ifdef CKXXCHAR
  1460.     "double-character", XYDBL, 0,
  1461. #endif /* CKXXCHAR */
  1462.     "end-of-packet", XYEOL, 0,
  1463. #ifdef PIPESEND
  1464.     "filter", XYFLTR, 0,
  1465. #endif /* PIPESEND */
  1466. #ifdef CKXXCHAR
  1467.     "ignore-character", XYIGN, 0,
  1468. #endif /* CKXXCHAR */
  1469.     "move-to", XYMOVE, 0,
  1470.     "negotiation-string-max-length", XYINIL, CM_INV,
  1471.     "packet-length", XYLEN, 0,
  1472.     "pad-character", XYPADC, 0,
  1473.     "padding", XYNPAD, 0,
  1474.     "pathnames", XYFPATH, 0,
  1475.     "pause", XYPAUS, 0,
  1476.     "quote", XYQCTL, CM_INV, /* = CONTROL-PREFIX */
  1477.     "rename-to", XYRENAME, 0,
  1478.     "start-of-packet", XYMARK, 0,
  1479.     "timeout", XYTIMO, 0,
  1480. #ifdef VMS
  1481.     "version-numbers", 887, 0, /* VMS version numbers */
  1482. #endif /* VMS */
  1483.     "", 0, 0
  1484. };
  1485. int nsrtab = (sizeof(srtab) / sizeof(struct keytab)) - 1;
  1486. #ifdef UNICODE
  1487. #define UCS_BOM 1
  1488. #define UCS_BYT 2
  1489. static struct keytab ucstab[] = {
  1490.     "bom",        UCS_BOM, 0,
  1491.     "byte-order", UCS_BYT, 0,
  1492.     "", 0, 0
  1493. };
  1494. int nucstab = (sizeof(ucstab) / sizeof(struct keytab)) - 1;
  1495. static struct keytab botab[] = {
  1496.     "big-endian", 0, 0,
  1497.     "little-endian", 1, 0
  1498. };
  1499. static int nbotab = 2;
  1500. #endif /* UNICODE */
  1501. /* REMOTE SET */
  1502. struct keytab rmstab[] = {
  1503.     "attributes",  XYATTR, 0,
  1504.     "block-check", XYCHKT, 0,
  1505.     "file",        XYFILE, 0,
  1506.     "incomplete",  XYIFD,  CM_INV, /* REMOTE SET FILE INCOMPLETE preferred */
  1507.     "receive",     XYRECV, 0,
  1508.     "retry",       XYRETR, 0,
  1509.     "server",      XYSERV, 0,
  1510.     "transfer",    XYXFER, 0,
  1511.     "window",      XYWIND, 0,
  1512.     "xfer",        XYXFER, CM_INV
  1513. };
  1514. int nrms = (sizeof(rmstab) / sizeof(struct keytab));
  1515. struct keytab attrtab[] = {
  1516. #ifdef STRATUS
  1517.     "account",      AT_ACCT, 0,
  1518. #endif /* STRATUS */
  1519.     "all",           AT_XALL, 0,
  1520. #ifdef COMMENT
  1521.     "blocksize",     AT_BLKS, 0, /* (not used) */
  1522. #endif /* COMMENT */
  1523. #ifndef NOCSETS
  1524.     "character-set", AT_ENCO, 0,
  1525. #endif /* NOCSETS */
  1526. #ifdef STRATUS
  1527.     "creator",      AT_CREA, 0,
  1528. #endif /* STRATUS */
  1529.     "date",          AT_DATE, 0,
  1530.     "disposition",   AT_DISP, 0,
  1531.     "encoding",      AT_ENCO, CM_INV,
  1532. #ifdef STRATUS
  1533.     "format",      AT_RECF, 0,
  1534. #endif /* STRATUS */
  1535.     "length",        AT_LENK, 0,
  1536.     "off",           AT_ALLN, 0,
  1537.     "on",            AT_ALLY, 0,
  1538. #ifdef COMMENT
  1539.     "os-specific",   AT_SYSP, 0, /* (not used by UNIX or VMS) */
  1540. #endif /* COMMENT */
  1541. #ifdef CK_PERMS
  1542.     "protection",    AT_LPRO, 0,
  1543.     "permissions",   AT_LPRO, CM_INV,
  1544. #endif /* CK_PERMS */
  1545.     "system-id",     AT_SYSI, 0,
  1546.     "type",          AT_FTYP, 0
  1547. };
  1548. int natr = (sizeof(attrtab) / sizeof(struct keytab)); /* how many attributes */
  1549. #ifndef NOSPL
  1550. extern int indef, inecho, insilence, inbufsize, inautodl, inintr;
  1551. extern char * inpbuf, * inpbp;
  1552. #ifdef OS2
  1553. extern int interm;
  1554. #endif /* OS2 */
  1555. struct keytab inptab[] = { /* SET INPUT parameters */
  1556. #ifdef CK_AUTODL
  1557.     "autodownload",    IN_ADL, 0,
  1558. #endif /* CK_AUTODL */
  1559.     "buffer-length",   IN_BUF, 0,
  1560.     "cancellation",    IN_CAN, 0,
  1561.     "case",            IN_CAS, 0,
  1562.     "default-timeout", IN_DEF, CM_INV, /* There is no default timeout */
  1563.     "echo",            IN_ECH, 0,
  1564. #ifdef OS2
  1565.     "pacing",          IN_PAC, CM_INV,
  1566. #endif /* OS2 */
  1567.     "silence",         IN_SIL, 0,
  1568. #ifdef OS2
  1569.     "terminal",        IN_TRM, 0,
  1570. #endif /* OS2 */
  1571.     "timeout-action",  IN_TIM, 0
  1572. };
  1573. int ninp = (sizeof(inptab) / sizeof(struct keytab));
  1574. struct keytab intimt[] = { /* SET INPUT TIMEOUT parameters */
  1575.     "proceed", 0, 0, /* 0 = proceed */
  1576.     "quit",    1, 0 /* 1 = quit */
  1577. };
  1578. struct keytab incast[] = { /* SET INPUT CASE parameters */
  1579.     "ignore",  0, 0, /* 0 = ignore */
  1580.     "observe", 1, 0 /* 1 = observe */
  1581. };
  1582. #endif /* NOSPL */
  1583. struct keytab nabltab[] = { /* For any command that needs */
  1584.     "disabled", 0, 0,
  1585.     "enabled",  1, 0,
  1586.     "off",      0, CM_INV, /* these keywords... */
  1587.     "on",       1, CM_INV
  1588. };
  1589. int nnabltab = sizeof(nabltab) / sizeof(struct keytab);
  1590. #ifdef OS2
  1591. struct keytab tvctab[] = { /* SET TERM VIDEO-CHANGE */
  1592.     "disabled",   TVC_DIS, 0,
  1593.     "enabled",    TVC_ENA, 0
  1594. #ifdef NT
  1595.     ,"win95-safe", TVC_W95, 0
  1596. #endif /* NT */
  1597. };
  1598. int ntvctab = sizeof(tvctab) / sizeof(struct keytab);
  1599. struct keytab msktab[] = { /* SET MS-DOS KERMIT compatibilities */
  1600. #ifdef COMMENT
  1601.     "color", MSK_COLOR,  0,
  1602. #endif /* COMMENT */
  1603.     "keycodes", MSK_KEYS, 0
  1604. };
  1605. int nmsk = (sizeof(msktab) / sizeof(struct keytab));
  1606. struct keytab scrnupd[] = { /* SET TERMINAL SCREEN-UPDATE */
  1607.     "fast", TTU_FAST,  0,
  1608.     "smooth", TTU_SMOOTH, 0
  1609. };
  1610. int nscrnupd = (sizeof(scrnupd) / sizeof(struct keytab));
  1611. struct keytab termfont[] = { /* SET TERMINAL FONT */
  1612. #ifdef COMMENT
  1613.     "cp111", TTF_111, 0,
  1614.     "cp112", TTF_112, 0,
  1615.     "cp113", TTF_113, 0,
  1616. #endif /* COMMENT */
  1617.     "cp437", TTF_437, 0,
  1618.     "cp850", TTF_850, 0,
  1619. #ifdef COMMENT
  1620.     "cp851", TTF_851, 0,
  1621. #endif /* COMMENT */
  1622.     "cp852", TTF_852, 0,
  1623. #ifdef COMMENT
  1624.     "cp853", TTF_853, 0,
  1625.     "cp860", TTF_860, 0,
  1626.     "cp861", TTF_861, 0,
  1627. #endif /* COMMENT */
  1628.     "cp862", TTF_862, 0,
  1629. #ifdef COMMENT
  1630.     "cp863", TTF_863, 0,
  1631.     "cp864", TTF_864, 0,
  1632.     "cp865", TTF_865, 0,
  1633. #endif /* COMMENT */
  1634.     "cp866", TTF_866, 0,
  1635. #ifdef COMMENT
  1636.     "cp880", TTF_880, 0,
  1637.     "cp881", TTF_881, 0,
  1638.     "cp882", TTF_882, 0,
  1639.     "cp883", TTF_883, 0,
  1640.     "cp884", TTF_884, 0,
  1641.     "cp885", TTF_885, 0,
  1642. #endif /* COMMENT */
  1643.     "default", TTF_ROM, 0
  1644. };
  1645. int ntermfont = (sizeof(termfont) / sizeof(struct keytab));
  1646. struct keytab anbktab[] = { /* For any command that needs */
  1647.     "message", 2, 0, /* these keywords... */
  1648.     "off",     0, 0,
  1649.     "on",      1, 0,
  1650.     "unsafe-messag0", 99, CM_INV,
  1651.     "unsafe-message", 3,  CM_INV
  1652. };
  1653. int nansbk = (sizeof(anbktab) / sizeof(struct keytab));
  1654. int win95_popup = 1;
  1655. #ifdef NT
  1656. int win95altgr  = 0;
  1657. #ifdef KUI
  1658. int win95lucida = 0;
  1659. #else /* KUI */
  1660. int win95lucida = 1;
  1661. #endif /* KUI */
  1662. extern int win95selectbug;
  1663. extern int win95_8_3;
  1664. #ifdef COMMENT
  1665. extern CHAR (*xlr[MAXTCSETS+1][MAXFCSETS+1])(CHAR);
  1666. extern struct keytab tcstab[];
  1667. extern int ntcs;
  1668. #endif /* COMMENT */
  1669. extern int maxow, maxow_usr; owwait;    /* Overlapped I/O variables */
  1670. #endif /* NT */
  1671. #endif /* OS2 */
  1672. /* The following routines broken out of doprm() to give compilers a break. */
  1673. /*  S E T O N  --  Parse on/off (default on), set parameter to result  */
  1674. int
  1675. seton(prm) int *prm; {
  1676.     int x, y;
  1677.     if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  1678.     if ((x = cmcfm()) < 0) return(x);
  1679.     *prm = y;
  1680.     return(1);
  1681. }
  1682. /*  S E T O N A U T O --  Parse on/off/auto (default auto) & set result */
  1683. struct keytab onoffaut[] = {
  1684.     "auto", SET_AUTO, 0, /* 2 */
  1685.     "off",  SET_OFF,  0, /* 0 */
  1686.     "on",   SET_ON,   0 /* 1 */
  1687. };
  1688. int
  1689. setonaut(prm) int *prm; {
  1690.     int x, y;
  1691.     if ((y = cmkey(onoffaut,3,"","auto",xxstring)) < 0) return(y);
  1692.     if ((x = cmcfm()) < 0) return(x);
  1693.     *prm = y;
  1694.     return(1);
  1695. }
  1696. /*  S E T N U M  --  Set parameter to result of cmnum() parse.  */
  1697. /*
  1698.  Call with pointer to integer variable to be set,
  1699.    x = number from cnum parse, y = return code from cmnum,
  1700.    max = maximum value to accept, -1 if no maximum.
  1701.  Returns -9 on failure, after printing a message, or 1 on success.
  1702. */
  1703. int
  1704. setnum(prm,x,y,max) int x, y, *prm, max; {
  1705.     debug(F101,"setnum","",y);
  1706.     if (y == -3) {
  1707. printf("n?Value requiredn");
  1708. return(-9);
  1709.     }
  1710.     if (y == -2) {
  1711. printf("%s?Not a number: %sn",cmflgs == 1 ? "" : "n", atxbuf);
  1712. return(-9);
  1713.     }
  1714.     if (y < 0) return(y);
  1715.     if (max > -1 && x > max) {
  1716. printf("?Sorry, %d is the maximumn",max);
  1717. return(-9);
  1718.     }
  1719.     if ((y = cmcfm()) < 0) return(y);
  1720.     *prm = x;
  1721.     return(1);
  1722. }
  1723. /*  S E T C C  --  Set parameter var to an ASCII control character value.  */
  1724. /*
  1725.   Parses a number, or a literal control character, or a caret (^) followed
  1726.   by an ASCII character whose value is 63-95 or 97-122, then gets confirmation,
  1727.   then sets the parameter to the code value of the character given.  If there
  1728.   are any parse errors, they are returned, otherwise on success 1 is returned.
  1729. */
  1730. int
  1731. setcc(dflt,var) char *dflt; int *var; {
  1732.     int x, y;
  1733.     unsigned int c;
  1734.     char *hlpmsg = "Control character,n
  1735.  numeric ASCII value,n
  1736.  or in ^X notation,n
  1737.  or preceded by a backslash and entered literally";
  1738.     /* This is a hack to turn off complaints from expression evaluator. */
  1739.     x_ifnum = 1;
  1740.     y = cmnum(hlpmsg, dflt, 10, &x, xxstring); /* Parse a number */
  1741.     x_ifnum = 0;        /* Allow complaints again */
  1742.     if (y < 0) { /* Parse failed */
  1743. if (y != -2) /* Reparse needed or somesuch */
  1744.   return(y); /* Pass failure back up the chain */
  1745.     }
  1746.     /* Did they type a real control character? */
  1747.     for (c = strlen(atmbuf) - 1; c > 0; c--) /* Trim */
  1748.       if (atmbuf[c] == SP) atmbuf[c] = NUL;
  1749.     if (y < 0) { /* It was not a number */
  1750. if ((c = atmbuf[0]) && !atmbuf[1]) { /* Was it a literal Ctrl char? */
  1751.     if ((c > 037) && (c != 0177)) {
  1752. printf("n?Not a control character - %dn",c);
  1753. return(-9);
  1754.     } else {
  1755. if ((y = cmcfm()) < 0) /* Confirm */
  1756.   return(y);
  1757. *var = c; /* Set the variable */
  1758. return(1);
  1759.     }
  1760. } else if (atmbuf[0] == '^' && !atmbuf[2]) { /* Or ^X notation? */
  1761.     c = atmbuf[1];
  1762.     if (islower((char) c)) /* Uppercase lowercase letters */
  1763.       c = toupper(c);
  1764.     if (c > 62 && c < 96) { /* Check range */
  1765. if ((y = cmcfm()) < 0)
  1766.   return(y);
  1767. *var = ctl(c); /* OK */
  1768. return(1);
  1769.     } else {
  1770. printf("?Not a control character - %sn", atmbuf);
  1771. return(-9);
  1772.     }
  1773. } else { /* Something illegal was typed */
  1774.     printf("?Invalid - %sn", atmbuf);
  1775.     return(-9);
  1776. }
  1777.     }
  1778.     if ((x > 037) && (x != 0177)) { /* They typed a number */
  1779. printf("n?Not in ASCII control range - %dn",x);
  1780. return(-9);
  1781.     }
  1782.     if ((y = cmcfm()) < 0) /* In range, confirm */
  1783.       return(y);
  1784.     *var = x; /* Set variable */
  1785.     return(1);
  1786. }
  1787. #ifndef NOSPL /* The SORT command... */
  1788. static struct keytab srtswtab[] = { /* SORT command switches */
  1789.     "/case",    SRT_CAS, CM_ARG,
  1790.     "/key",     SRT_KEY, CM_ARG,
  1791.     "/numeric", SRT_NUM, 0,
  1792.     "/range",   SRT_RNG, CM_ARG,
  1793.     "/reverse", SRT_REV, 0
  1794. };
  1795. static int nsrtswtab = sizeof(srtswtab)/sizeof(struct keytab);
  1796. extern char **a_ptr[]; /* Array pointers */
  1797. extern int a_dim[]; /* Array dimensions */
  1798. int
  1799. dosort() { /* Do the SORT command */
  1800.     char c, *p = NULL, ** ap, ** xp = NULL;
  1801.     struct FDB sw, fl, cm;
  1802.     int hi, lo;
  1803.     int xn = 0, xr = -1, xk = -1, xc = -1, xs = 0;
  1804.     int getval = 0, range[2], confirmed = 0;
  1805.     cmfdbi(&sw, /* First FDB - command switches */
  1806.    _CMKEY, /* fcode */
  1807.    "Array name or switch",
  1808.    "", /* default */
  1809.    "", /* addtl string data */
  1810.    nsrtswtab, /* addtl numeric data 1: tbl size */
  1811.    4, /* addtl numeric data 2: 4 = cmswi */
  1812.    NULL, /* Processing function */
  1813.    srtswtab, /* Keyword table */
  1814.    &fl /* Pointer to next FDB */
  1815.    );
  1816.     cmfdbi(&fl, /* Anything that doesn't match */
  1817.    _CMFLD, /* fcode */
  1818.    "Array name", /* hlpmsg */
  1819.    "", /* default */
  1820.    "", /* addtl string data */
  1821.    0, /* addtl numeric data 1 */
  1822.    0, /* addtl numeric data 2 */
  1823.    NULL,
  1824.    NULL,
  1825.    &cm
  1826.    );
  1827.     cmfdbi(&cm, /* Or premature confirmation */
  1828.    _CMCFM, /* fcode */
  1829.    "", /* hlpmsg */
  1830.    "", /* default */
  1831.    "", /* addtl string data */
  1832.    0, /* addtl numeric data 1 */
  1833.    0, /* addtl numeric data 2 */
  1834.    NULL,
  1835.    NULL,
  1836.    NULL
  1837.    );
  1838.     range[0] = -1;
  1839.     range[1] = -1;
  1840.     while (1) { /* Parse 0 or more switches */
  1841. x = cmfdb(&sw);
  1842. if (x < 0)
  1843.   return(x);
  1844. if (cmresult.fcode != _CMKEY) /* Break out if not a switch */
  1845.   break;
  1846. c = cmgbrk();
  1847. getval = (c == ':' || c == '=');
  1848. if (getval && !(cmresult.kflags & CM_ARG)) {
  1849.     printf("?This switch does not take argumentsn");
  1850.     return(-9);
  1851. }
  1852. switch (cmresult.nresult) {
  1853.   case SRT_REV:
  1854.     xr = 1;
  1855.     break;
  1856.   case SRT_KEY:
  1857.     if (getval) {
  1858. if ((y = cmnum("Column for comparison (1-based)",
  1859.        "1",10,&x,xxstring)) < 0)
  1860.   return(y);
  1861. xk = x - 1;
  1862.     } else
  1863.       xk = 0;
  1864.     break;
  1865.   case SRT_CAS:
  1866.     if (getval) {
  1867. if ((y = cmkey(onoff,2,"","on",xxstring)) < 0)
  1868.   return(y);
  1869. xc = y;
  1870.     } else
  1871.       xc = 1;
  1872.     break;
  1873.   case SRT_RNG: /* /RANGE */
  1874.     if (getval) {
  1875. char buf[32];
  1876. char buf2[16];
  1877. int i;
  1878. char * p, * q;
  1879. if ((y = cmfld("low:high element","1",&s,NULL)) < 0)
  1880.   return(y);
  1881. s = brstrip(s);
  1882. ckstrncpy(buf,s,32);
  1883. p = buf;
  1884. for (i = 0; *p && i < 2; i++) { /* Get low and high */
  1885.     q = p; /* Start of this piece */
  1886.     while (*p) { /* Find end of this piece */
  1887. if (*p == ':') {
  1888.     *p = NUL;
  1889.     p++;
  1890.     break;
  1891. }
  1892. p++;
  1893.     }
  1894.     y = 15; /* Evaluate this piece */
  1895.     s = buf2;
  1896.     zzstring(q,&s,&y);
  1897.     s = evalx(buf2);
  1898.     if (s) if (*s) ckstrncpy(buf2,s,16);
  1899.     if (!rdigits(buf2)) {
  1900. printf("?Not numeric: %sn",buf2);
  1901. return(-9);
  1902.     }
  1903.     range[i] = atoi(buf2);
  1904. }
  1905.     }
  1906.     break;
  1907.   case SRT_NUM: /* /NUMERIC */
  1908.     xn = 1;
  1909.     break;
  1910.   default:
  1911.     return(-2);
  1912. }
  1913.     }
  1914.     switch (cmresult.fcode) {
  1915.       case _CMCFM:
  1916. confirmed = 1;
  1917. break;
  1918.       case _CMFLD:
  1919. ckstrncpy(line,cmresult.sresult,LINBUFSIZ); /* Safe copy of name */
  1920. s = line;
  1921. break;
  1922.       default:
  1923. printf("?Unexpected function code: %dn",cmresult.fcode);
  1924. return(-9);
  1925.     }
  1926.     if (confirmed) {
  1927. printf("?Array name requiredn");
  1928. return(-9);
  1929.     }
  1930.     sprintf(tmpbuf,"Second array to sort according to %s",s);
  1931.     debug(F101,"XXX 1","",0);
  1932.     if ((x = cmfld(tmpbuf,"",&p,NULL)) < 0)
  1933.       if (x != -3)
  1934. return(x);
  1935.     debug(F101,"XXX 2","",0);
  1936.     tmpbuf[0] = NUL;
  1937.     strcpy(tmpbuf,p);
  1938.     p = tmpbuf;
  1939.     if ((x = cmcfm()) < 0) /* Get confirmation */
  1940.       return(x);
  1941.     debug(F101,"XXX 3","",0);
  1942.     x = arraybounds(s,&lo,&hi); /* Get array index & bounds */
  1943.     if (x < 0) { /* Check */
  1944. printf("?Bad array name: %sn",s);
  1945. return(-9);
  1946.     }
  1947.     if (lo > -1) range[0] = lo; /* Set range */
  1948.     if (hi > -1) range[1] = hi;
  1949.     ap = a_ptr[x]; /* Get pointer to array element list */
  1950.     if (!ap) { /* Check */
  1951. printf("?Array not declared: %sn", s);
  1952. return(-9);
  1953.     }
  1954.     if (range[0] < 0) /* Starting element */
  1955.       range[0] = 1;
  1956.     if (range[1] < 0) /* Final element */
  1957.       range[1] = a_dim[x];
  1958.     if (range[1] > a_dim[x]) {
  1959. printf("?range %d:%d exceeds array dimension %dn",
  1960.        range[0],range[1],a_dim[x]
  1961.        );
  1962. return(-9);
  1963.     }
  1964.     ap += range[0];
  1965.     xs = range[1] - range[0] + 1; /* Number of elements to sort */
  1966.     if (xs < 1) { /* Check */
  1967. printf("?Bad range: %d:%dn",range[0],range[1]);
  1968. return(-9);
  1969.     }
  1970.     if (xk < 0) xk = 0; /* Key position */
  1971.     if (xr < 0) xr = 0; /* Reverse flag */
  1972.     if (xn) /* Numeric flag */
  1973.       xc = 2;
  1974.     else if (xc < 0) /* Not numeric */
  1975.       xc = inpcas[cmdlvl]; /* so alpha case option */
  1976.     if (*p) { /* Parallel array given? */
  1977. y = xarray(p); /* Yes, get its index. */
  1978. if (y < 0) {
  1979.     printf("?Bad array name: %sn", p);
  1980.     return(-9);
  1981. }
  1982. if (y != x) { /* If the 2 arrays are different  */
  1983.     xp = a_ptr[y]; /* Pointer to 2nd array element list */
  1984.     if (!xp) {
  1985. printf("?Array not declared: %sn", p);
  1986. return(-9);
  1987.     }
  1988.     if (a_dim[y] < range[1]) {
  1989. printf("?Array %s smaller than %sn", p, s);
  1990. return(-9);
  1991.     }
  1992.     xp += range[0]; /* Set base to same as 1st array */
  1993. }
  1994.     }
  1995.     debug(F101,"XXX xp","",xp);
  1996.     debug(F101,"XXX xc","",xc);
  1997.     sh_sort(ap,xp,xs,xk,xr,xc); /* Sort the array(s) */
  1998.     return(success = 1); /* Always succeeds */
  1999. }
  2000. #endif /* NOSPL */
  2001. static struct keytab purgtab[] = { /* PURGE command switches */
  2002.     "/after",        PU_AFT,  CM_ARG,
  2003.     "/ask",          PU_ASK,  0,
  2004.     "/before",       PU_BEF,  CM_ARG,
  2005.     "/delete",       PU_DELE, CM_INV,
  2006. #ifdef UNIXOROSK
  2007.     "/dotfiles",     PU_DOT,  0,
  2008. #endif /* UNIXOROSK */
  2009.     "/except",       PU_EXC,  CM_ARG,
  2010.     "/heading",      PU_HDG,  0,
  2011.     "/keep",         PU_KEEP, CM_ARG,
  2012.     "/larger-than",  PU_LAR,  CM_ARG,
  2013.     "/list",         PU_LIST, 0,
  2014.     "/log",          PU_LIST, CM_INV,
  2015.     "/noask",        PU_NASK, 0,
  2016.     "/nodelete",     PU_NODE, CM_INV,
  2017. #ifdef UNIXOROSK
  2018.     "/nodotfiles",   PU_NODOT,0,
  2019. #endif /* UNIXOROSK */
  2020.     "/noheading",    PU_NOH,  0,
  2021.     "/nol",          PU_NOLI, CM_INV|CM_ABR,
  2022.     "/nolist",       PU_NOLI, 0,
  2023.     "/nolog",        PU_NOLI, CM_INV,
  2024. #ifdef CK_TTGWSIZ
  2025.     "/nopage",       PU_NOPA, 0,
  2026. #endif /* CK_TTGWSIZ */
  2027.     "/not-after",    PU_NAF,  CM_ARG,
  2028.     "/not-before",   PU_NBF,  CM_ARG,
  2029.     "/not-since",    PU_NAF,  CM_INV|CM_ARG,
  2030. #ifdef CK_TTGWSIZ
  2031.     "/page",         PU_PAGE, 0,
  2032. #endif /* CK_TTGWSIZ */
  2033.     "/quiet",        PU_QUIE, CM_INV,
  2034. #ifdef RECURSIVE
  2035.     "/recursive",    PU_RECU, 0,
  2036. #endif /* RECURSIVE */
  2037.     "/since",        PU_AFT,  CM_ARG|CM_INV,
  2038.     "/simulate",     PU_NODE, 0,
  2039.     "/smaller-than", PU_SMA,  CM_ARG,
  2040.     "/verbose",      PU_VERB, CM_INV
  2041. };
  2042. static int npurgtab = sizeof(purgtab)/sizeof(struct keytab);
  2043. int
  2044. bkupnum(s,i) char * s; int *i; {
  2045.     int k = 0, pos = 0;
  2046.     char * p = NULL, *q;
  2047.     *i = pos;
  2048.     if (!s) s = "";
  2049.     if (!*s)
  2050.       return(-1);
  2051.     if ((k = strlen(s)) < 5)
  2052.       return(-1);
  2053.     if (s[k-1] != '~')
  2054.       return(-1);
  2055.     pos = k - 2;
  2056.     q = s + pos;
  2057.     while (q >= s && isdigit(*q)) {
  2058. p = q--;
  2059. pos--;
  2060.     }
  2061.     if (!p)
  2062.       return(-1);
  2063.     if (q < s+2)
  2064.       return(-1);
  2065.     if (*q != '~' || *(q-1) != '.')
  2066.       return(-1);
  2067.     pos--;
  2068.     *i = pos;
  2069.     debug(F111,"bkupnum",s+pos,pos);
  2070.     return(atoi(p));
  2071. }
  2072. #ifdef CKPURGE
  2073. /* Presently only for UNIX because we need direct access to the file array. */
  2074. /* Not needed for VMS anyway, because we don't make backup files there. */
  2075. #define MAXKEEP 32 /* Biggest /KEEP: value */
  2076. static int
  2077.   pu_keep = 0, pu_list = 0, pu_dot = 0, pu_ask = 0, pu_hdg = 0;
  2078. #ifdef CK_TTGWSIZ
  2079. static int pu_page = -1;
  2080. #else
  2081. static int pu_page = 0;
  2082. #endif /* CK_TTGWSIZ */
  2083. #ifndef NOSHOW
  2084. VOID
  2085. showpurgopts() { /* SHOW PURGE command options */
  2086.     int x = 0;
  2087.     extern int optlines;
  2088.     prtopt(&optlines,"PURGE");
  2089.     if (pu_ask > -1) {
  2090. x++;
  2091. prtopt(&optlines, pu_ask ? "/ASK" : "/NOASK");
  2092.     }
  2093. #ifdef UNIXOROSK
  2094.     if (pu_dot > -1) {
  2095. x++;
  2096. prtopt(&optlines, pu_dot ? "/DOTFILES" : "/NODOTFILES");
  2097.     }
  2098. #endif /* UNIXOROSK */
  2099.     if (pu_keep > -1) {
  2100. x++;
  2101. sprintf(tmpbuf, "%s:%d", "/KEEP", pu_keep);
  2102. prtopt(&optlines,tmpbuf);
  2103.     }
  2104.     if (pu_list > -1) {
  2105. x++;
  2106. prtopt(&optlines, pu_list ? "/LIST" : "/NOLIST");
  2107.     }
  2108.     if (pu_hdg > -1) {
  2109. x++;
  2110. prtopt(&optlines, pu_hdg ? "/HEADING" : "/NOHEADING");
  2111.     }
  2112. #ifdef CK_TTGWSIZ
  2113.     if (pu_page > -1) {
  2114. x++;
  2115. prtopt(&optlines, pu_page ? "/PAGE" : "/NOPAGE");
  2116.     }
  2117. #endif /* CK_TTGWSIZ */
  2118.     if (!x) prtopt(&optlines,"(no options set)");
  2119.     prtopt(&optlines,"");
  2120. }
  2121. #endif /* NOSHOW */
  2122. int
  2123. setpurgopts() { /* Set PURGE command options */
  2124.     int c, z, getval = 0;
  2125.     int
  2126.       x_keep  = -1, x_list = -1, x_page = -1,
  2127.       x_hdg   = -1, x_ask  = -1, x_dot  = -1;
  2128.     while (1) {
  2129. if ((y = cmswi(purgtab,npurgtab,"Switch","",xxstring)) < 0) {
  2130.     if (y == -3)
  2131.       break;
  2132.     else
  2133.       return(y);
  2134. }
  2135. c = cmgbrk();
  2136. if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
  2137.     printf("?This switch does not take an argumentn");
  2138.     return(-9);
  2139. }
  2140. if (!getval && (cmgkwflgs() & CM_ARG)) {
  2141.     printf("?This switch requires an argumentn");
  2142.     return(-9);
  2143. }
  2144. switch (y) {
  2145.   case PU_KEEP:
  2146.     z = 1;
  2147.     if (c == ':' || c == '=')
  2148.       if ((y = cmnum("How many backup files to keep",
  2149.      "1",10,&z,xxstring)) < 0)
  2150. return(y);
  2151.     if (z < 0 || z > MAXKEEP) {
  2152. printf("?Please specify a number between 0 and %dn",
  2153.        MAXKEEP
  2154.        );
  2155. return(-9);
  2156.     }
  2157.     x_keep = z;
  2158.     break;
  2159.   case PU_LIST:
  2160.   case PU_VERB:
  2161.     x_list = 1;
  2162.     break;
  2163.   case PU_QUIE:
  2164.   case PU_NOLI:
  2165.     x_list = 0;
  2166.     break;
  2167. #ifdef CK_TTGWSIZ
  2168.   case PU_PAGE:
  2169.     x_page = 1;
  2170.     break;
  2171.   case PU_NOPA:
  2172.     x_page = 0;
  2173.     break;
  2174. #endif /* CK_TTGWSIZ */
  2175.   case PU_HDG:
  2176.     x_hdg = 1;
  2177.     break;
  2178.   case PU_NOH:
  2179.     x_hdg = 0;
  2180.     break;
  2181.   case PU_ASK:
  2182.     x_ask = 1;
  2183.     break;
  2184.   case PU_NASK:
  2185.     x_ask = 0;
  2186.     break;
  2187. #ifdef UNIXOROSK
  2188.   case PU_DOT:
  2189.     x_dot = 1;
  2190.     break;
  2191.   case PU_NODOT:
  2192.     x_dot = 0;
  2193.     break;
  2194. #endif /* UNIXOROSK */
  2195.   default:
  2196.     printf("?This option can not be setn");
  2197.     return(-9);
  2198. }
  2199.     }
  2200.     if ((x = cmcfm()) < 0) /* Get confirmation */
  2201.       return(x);
  2202.     if (x_keep > -1) /* Set PURGE defaults. */
  2203.       pu_keep = x_keep;
  2204.     if (x_list > -1)
  2205.       pu_list = x_list;
  2206. #ifdef CK_TTGWSIZ
  2207.     if (x_page > -1)
  2208.       pu_page = x_page;
  2209. #endif /* CK_TTGWSIZ */
  2210.     if (x_hdg > -1)
  2211.       pu_hdg = x_hdg;
  2212.     if (x_ask > -1)
  2213.       pu_ask = x_ask;
  2214.     if (x_dot > -1)
  2215.       pu_dot = x_dot;
  2216.     return(success = 1);
  2217. }
  2218. int
  2219. dopurge() { /* Do the PURGE command */
  2220.     extern char ** mtchs;
  2221.     extern int xaskmore, cmd_rows, recursive;
  2222.     int simulate = 0, asking = 0;
  2223.     int listing = 0, paging = -1, lines = 0, deleting = 1, errors = 0;
  2224.     struct FDB sw, sf, cm;
  2225.     int g, i, j, k, m = 0, n, x, y, z, done = 0, count = 0, flags = 0;
  2226.     int tokeep = 0, getval = 0, havename = 0, confirmed = 0;
  2227.     int xx[MAXKEEP+1]; /* Array of numbers to keep */
  2228.     int min = -1;
  2229.     int x_hdg = 0, fs = 0, rc = 0;
  2230.     long minsize = -1L, maxsize = -1L;
  2231.     char namebuf[CKMAXPATH+4];
  2232.     char basebuf[CKMAXPATH+4];
  2233.     char
  2234.       * pu_aft = NULL,
  2235.       * pu_bef = NULL,
  2236.       * pu_naf = NULL,
  2237.       * pu_nbf = NULL,
  2238.       * pu_exc = NULL;
  2239.     char * pxlist[8]; /* Exception list */
  2240.     if (pu_keep > -1) /* Set PURGE defaults. */
  2241.       tokeep = pu_keep;
  2242.     if (pu_list > -1)
  2243.       listing = pu_list;
  2244. #ifdef CK_TTGWSIZ
  2245.     if (pu_page > -1)
  2246.       paging = pu_page;
  2247. #endif /* CK_TTGWSIZ */
  2248.     for (i = 0; i <= MAXKEEP; i++) /* Clear this number buffer */
  2249.       xx[i] = 0;
  2250.     for (i = 0; i < 8; i++) /* Initialize these... */
  2251.       pxlist[i] = NULL;
  2252.     g_matchdot = matchdot; /* Save these... */
  2253.     saveask = xaskmore;
  2254.     cmfdbi(&sw, /* 1st FDB - PURGE switches */
  2255.    _CMKEY, /* fcode */
  2256.    "Filename or switch", /* hlpmsg */
  2257.    "", /* default */
  2258.    "", /* addtl string data */
  2259.    npurgtab, /* addtl numeric data 1: tbl size */
  2260.    4, /* addtl numeric data 2: 4 = cmswi */
  2261.    xxstring, /* Processing function */
  2262.    purgtab, /* Keyword table */
  2263.    &sf /* Pointer to next FDB */
  2264.    );
  2265.     cmfdbi(&sf, /* 2nd FDB - filespec to purge */
  2266.    _CMIFI, /* fcode */
  2267.    "",
  2268.    "", /* default */
  2269.    "", /* addtl string data */
  2270.    0, /* addtl numeric data 1 */
  2271.    0, /* addtl numeric data 2 */
  2272.    xxstring,
  2273.    NULL,
  2274.    &cm
  2275.    );
  2276.     cmfdbi(&cm, /* Or premature confirmation */
  2277.    _CMCFM, /* fcode */
  2278.    "", /* hlpmsg */
  2279.    "", /* default */
  2280.    "", /* addtl string data */
  2281.    0, /* addtl numeric data 1 */
  2282.    0, /* addtl numeric data 2 */
  2283.    NULL,
  2284.    NULL,
  2285.    NULL
  2286.    );
  2287.     while (!havename && !confirmed) {
  2288. x = cmfdb(&sw); /* Parse something */
  2289. if (x < 0) { /* Error */
  2290.     rc = x;
  2291.     goto xpurge;
  2292. } else if (cmresult.fcode == _CMKEY) {
  2293.     char c;
  2294.     c = cmgbrk();
  2295.     if ((getval = (c == ':' || c == '=')) && !(cmgkwflgs() & CM_ARG)) {
  2296. printf("?This switch does not take an argumentn");
  2297. rc = -9;
  2298. goto xpurge;
  2299.     }
  2300.     if (!getval && (cmgkwflgs() & CM_ARG)) {
  2301. printf("?This switch requires an argumentn");
  2302. rc = -9;
  2303. goto xpurge;
  2304.     }
  2305.     switch (k = cmresult.nresult) {
  2306.       case PU_KEEP:
  2307. z = 1;
  2308. if (c == ':' || c == '=') {
  2309.     if ((y = cmnum("How many backup files to keep",
  2310.    "1",10,&z,xxstring)) < 0) {
  2311. rc = y;
  2312. goto xpurge;
  2313.     }
  2314. }
  2315. if (z < 0 || z > MAXKEEP) {
  2316.     printf("?Please specify a number between 0 and %dn",
  2317.    MAXKEEP
  2318.    );
  2319.     rc = -9;
  2320.     goto xpurge;
  2321. }
  2322. tokeep = z;
  2323. break;
  2324.       case PU_LIST:
  2325. listing = 1;
  2326. break;
  2327.       case PU_NOLI:
  2328. listing = 0;
  2329. break;
  2330. #ifdef CK_TTGWSIZ
  2331.       case PU_PAGE:
  2332. paging = 1;
  2333. break;
  2334.       case PU_NOPA:
  2335. paging = 0;
  2336. break;
  2337. #endif /* CK_TTGWSIZ */
  2338.       case PU_DELE:
  2339. deleting = 1;
  2340. break;
  2341.       case PU_NODE:
  2342. deleting = 0;
  2343. simulate = 1;
  2344. listing = 1;
  2345. break;
  2346.       case PU_ASK:
  2347. asking = 1;
  2348. break;
  2349.       case PU_NASK:
  2350. asking = 0;
  2351. break;
  2352.       case PU_AFT:
  2353.       case PU_BEF:
  2354.       case PU_NAF:
  2355.       case PU_NBF:
  2356. if ((x = cmdate("File-time","",&s,0,xxstring)) < 0) {
  2357.     if (x == -3) {
  2358. printf("?Date-time requiredn");
  2359. rc = -9;
  2360.     } else
  2361.       rc = x;
  2362.     goto xpurge;
  2363. }
  2364. fs++;
  2365. switch (k) {
  2366.   case PU_AFT: makestr(&pu_aft,s); break;
  2367.   case PU_BEF: makestr(&pu_bef,s); break;
  2368.   case PU_NAF: makestr(&pu_naf,s); break;
  2369.   case PU_NBF: makestr(&pu_nbf,s); break;
  2370. }
  2371. break;
  2372.       case PU_SMA:
  2373.       case PU_LAR:
  2374. if ((x = cmnum("File size in bytes","0",10,&y,xxstring)) < 0) {
  2375.     rc = x;
  2376.     goto xpurge;
  2377. }
  2378. fs++;
  2379. switch (cmresult.nresult) {
  2380.   case PU_SMA: minsize = y; break;
  2381.   case PU_LAR: maxsize = y; break;
  2382. }
  2383. break;
  2384.       case PU_DOT:
  2385. matchdot = 1;
  2386. break;
  2387.       case PU_NODOT:
  2388. matchdot = 0;
  2389. break;
  2390.       case PU_EXC:
  2391. if ((x = cmfld("Pattern","",&s,xxstring)) < 0) {
  2392.     if (x == -3) {
  2393. printf("?Pattern requiredn");
  2394. rc = -9;
  2395.     } else
  2396.       rc = x;
  2397.     goto xpurge;
  2398. }
  2399. fs++;
  2400. makestr(&pu_exc,s);
  2401. break;
  2402.       case PU_HDG:
  2403. x_hdg = 1;
  2404. break;
  2405. #ifdef RECURSIVE
  2406.       case PU_RECU: /* /RECURSIVE */
  2407. recursive = 2;
  2408. break;
  2409. #endif /* RECURSIVE */
  2410.       default:
  2411. printf("?Not implemented yet - "%s"n",atmbuf);
  2412. rc = -9;
  2413. goto xpurge;
  2414.     }
  2415. } else if (cmresult.fcode == _CMIFI) {
  2416.     havename = 1;
  2417. } else if (cmresult.fcode == _CMCFM) {
  2418.     confirmed = 1;
  2419. } else {
  2420.     rc = -2;
  2421.     goto xpurge;
  2422. }
  2423.     }
  2424.     if (havename) {
  2425. #ifdef CKREGEX
  2426. sprintf(line,"%s.~[1-9]*~",cmresult.sresult);
  2427. #else
  2428. sprintf(line,"%s.~*~",cmresult.sresult);
  2429. #endif /* CKREGEX */
  2430.     } else {
  2431. #ifdef CKREGEX
  2432. strcpy(line,"*.~[1-9]*~");
  2433. #else
  2434. strcpy(line,"*.~*~");
  2435. #endif /* CKREGEX */
  2436.     }
  2437.     if (!confirmed) {
  2438. if ((x = cmcfm()) < 0) {
  2439.     rc = x;
  2440.     goto xpurge;
  2441. }
  2442.     }
  2443.     /* Parse finished - now action */
  2444. #ifdef CK_LOGIN
  2445.     if (isguest) {
  2446. printf("?File deletion by guests not permitted.n");
  2447. rc = -9;
  2448. goto xpurge;
  2449.     }
  2450. #endif /* CK_LOGIN */
  2451. #ifdef CK_TTGWSIZ
  2452.     if (paging < 0) /* /[NO]PAGE not given */
  2453.       paging = xaskmore; /* so use prevailing */
  2454. #endif /* CK_TTGWSIZ */
  2455.     lines = 0;
  2456.     if (x_hdg > 0) {
  2457. printf("Purging %s, keeping %d...%sn",
  2458.        s,
  2459.        tokeep,
  2460.        simulate ? " (SIMULATION)" : "");
  2461. lines += 2;
  2462.     }
  2463.     flags = ZX_FILONLY;
  2464.     if (recursive) flags |= ZX_RECURSE;
  2465.     n = nzxpand(line,flags); /* Get list of backup files */
  2466.     if (tokeep < 1) { /* Deleting all of them... */
  2467. for (i = 0; i < n; i++) {
  2468.     if (fs) if (fileselect(mtchs[i],
  2469.    pu_aft,pu_bef,pu_naf,pu_nbf,
  2470.    minsize,maxsize,0,8,pxlist) < 1) {
  2471. if (listing > 0) {
  2472.     printf(" %s (SKIPPED)n",mtchs[i]);
  2473. #ifdef CK_TTGWSIZ
  2474.     if (paging)
  2475.       if (++lines > cmd_rows - 3) {
  2476.   if (!askmore()) goto xpurge; else lines = 0;
  2477.       }
  2478. #endif /* CK_TTGWSIZ */
  2479. }
  2480. continue;
  2481.     }
  2482.     if (asking) {
  2483. int x;
  2484. sprintf(tmpbuf," Delete %s? ",mtchs[i]);
  2485. x = getyesno(tmpbuf,1);
  2486. switch (x) {
  2487.   case 0: continue;
  2488.   case 1: break;
  2489.   case 2: goto xpurge;
  2490. }
  2491.     }
  2492.     x = deleting ? zdelet(mtchs[i]) : 0;
  2493.     if (x > -1) {
  2494. if (listing)
  2495.   printf(" %s (%s)n", mtchs[i],deleting ? "OK" : "SELECTED");
  2496. count++;
  2497.     } else {
  2498. errors++;
  2499. if (listing)
  2500.   printf(" %s (FAILED)n", mtchs[i]);
  2501.     }
  2502. #ifdef CK_TTGWSIZ
  2503.     if (listing && paging)
  2504.       if (++lines > cmd_rows - 3) {
  2505.   if (!askmore()) goto xpurge; else lines = 0;
  2506.       }
  2507. #endif /* CK_TTGWSIZ */
  2508. }
  2509. goto xpurge;
  2510.     }
  2511.     if (n < tokeep) { /* Not deleting any */
  2512. count = 0;
  2513. if (listing)
  2514.   printf(" Matches = %d: Not enough to purge.n");
  2515. goto xpurge;
  2516.     }
  2517.     /* General case - delete some but not others */
  2518.     sh_sort(mtchs,NULL,n,0,0,filecase); /* Alphabetize the list (ESSENTIAL) */
  2519.     g = 0; /* Start of current group */
  2520.     for (i = 0; i < n; i++) { /* Go thru sorted file list */
  2521. x = znext(namebuf); /* Get next file */
  2522. if (x < 1 || !namebuf[0] || i == n - 1) /* No more? */
  2523.   done = 1; /* NOTE: 'done' must be 0 or 1 only */
  2524. if (fs) if (fileselect(namebuf,
  2525.        pu_aft,pu_bef,pu_naf,pu_nbf,
  2526.        minsize,maxsize,0,8,pxlist) < 1) {
  2527.     if (listing > 0) {
  2528. printf(" %s (SKIPPED)n",namebuf);
  2529. if (++lines > cmd_rows - 3)
  2530.   if (!askmore()) goto xpurge; else lines = 0;
  2531.     }
  2532.     continue;
  2533. }
  2534. if (x > 0)
  2535.   if ((m = bkupnum(namebuf,&z)) < 0) /* This file's backup number. */
  2536.     continue;
  2537. for (j = 0; j < tokeep; j++) { /* Insert in list. */
  2538.     if (m > xx[j]) {
  2539. for (k = tokeep - 1; k > j; k--)
  2540.   xx[k] = xx[k-1];
  2541. xx[j] = m;
  2542. break;
  2543.     }
  2544. }
  2545. /* New group? */
  2546. if (done || (i > 0 && ckstrcmp(namebuf,basebuf,z,1))) {
  2547.     if (i + done - g > tokeep) { /* Do we have enough to purge? */
  2548. min = xx[tokeep-1]; /* Yes, lowest backup number to keep */
  2549. debug(F111,"dopurge group",basebuf,min);
  2550. for (j = g; j < i + done; j++) { /* Go through this group */
  2551.     x = bkupnum(mtchs[j],&z);    /* Get file backup number */
  2552.     if (x > 0 && x < min) {      /* Below minimum? */
  2553. x = deleting ? zdelet(mtchs[j]) : 0;
  2554. if (x < 0) errors++;
  2555. if (listing)
  2556.   printf(" %s (%s)n",
  2557.  mtchs[j],
  2558.  ((x < 0) ? "ERROR" :
  2559.   (deleting ? "DELETED" : "SELECTED"))
  2560.  );
  2561. count++;
  2562.     } else if (listing) /* Not below minimum - keep this one */
  2563.       printf(" %s (KEPT)n",mtchs[j]);
  2564. #ifdef CK_TTGWSIZ
  2565.     if (listing && paging)
  2566.       if (++lines > cmd_rows - 3) {
  2567.   if (!askmore()) goto xpurge; else lines = 0;
  2568.       }
  2569. #endif /* CK_TTGWSIZ */
  2570. }
  2571.     } else if (listing && paging) { /* Not enough to purge */
  2572. printf(" %s.~*~ (KEPT)n",basebuf);
  2573. #ifdef CK_TTGWSIZ
  2574. if (++lines > cmd_rows - 3) {
  2575.     if (!askmore()) goto xpurge; else lines = 0;
  2576. }
  2577. #endif /* CK_TTGWSIZ */
  2578.     }
  2579.     for (j = 0; j < tokeep; j++) /* Clear the backup number list */
  2580.       xx[j] = 0;
  2581.     g = i; /* Reset the group pointer */
  2582. }
  2583. if (done) /* No more files, done. */
  2584.   break;
  2585. strncpy(basebuf,namebuf,z); /* Set basename of this file */
  2586. basebuf[z] = NUL;
  2587.     }
  2588.   xpurge: /* Common exit point */
  2589.     if (g_matchdot > -1) {
  2590. matchdot = g_matchdot; /* Restore these... */
  2591. g_matchdot = -1;
  2592.     }
  2593. #ifdef CK_TTGWSIZ
  2594.     if (saveask > -1) {
  2595. xaskmore = saveask;
  2596. saveask = -1;
  2597.     }
  2598. #endif /* CK_TTGWSIZ */
  2599.     if (rc < 0) return(rc); /* Parse error */
  2600.     if (x_hdg)
  2601.       printf("Files purged: %d%sn",
  2602.      count,
  2603.      deleting ? "" : " (not really)"
  2604.      );
  2605.     return(success = count > 0 ? 1 : (errors > 0) ? 0 : 1);
  2606. }
  2607. #endif /* CKPURGE */
  2608. #ifndef NOXFER
  2609. #ifndef NOLOCAL
  2610. int
  2611. doxdis() {
  2612.     extern int nolocal;
  2613.     int x, y = 0, z;
  2614. #ifdef COMMENT
  2615.     char *s;
  2616. #endif /* COMMENT */
  2617.     if ((x = cmkey(fdtab,nfdtab,"file transfer display style","",
  2618.    xxstring)) < 0)
  2619.       return(x);
  2620. #ifdef CK_PCT_BAR
  2621.     if ((y = cmkey(fdftab,2,"","thermometer",xxstring)) < 0)
  2622.       return(y);
  2623. #endif /* CK_PCT_BAR */
  2624.     if ((z = cmcfm()) < 0) return(z);
  2625. #ifdef CK_CURSES
  2626.     if (x == XYFD_C) { /* FULLSCREEN */
  2627. #ifdef COMMENT
  2628. #ifndef MYCURSES
  2629. extern char * trmbuf; /* Real curses */
  2630. int z;
  2631. #endif /* MYCURSES */
  2632. #endif /* COMMENT */
  2633.         if (nolocal) /* Nothing to do in this case */
  2634.             return(success = 1);
  2635. #ifdef COMMENT
  2636. #ifndef MYCURSES
  2637. #ifndef VMS
  2638. s = getenv("TERM");
  2639.         debug(F110,"doxdis TERM",s,0);
  2640. if (!s) s = "";
  2641. fxdinit(x);
  2642. if (*s && trmbuf) { /* Don't call tgetent */
  2643.     z = tgetent(trmbuf,s); /* if trmbuf not allocated */
  2644.     debug(F111,"doxdis tgetent",s,z);
  2645. } else {
  2646.     z = 0;
  2647.     debug(F110,"doxdis tgetent skipped",s,0);
  2648. }
  2649. if (z < 1) {
  2650.     printf("Sorry, terminal type unknown: "%s"n",s);
  2651.     return(success = 0);
  2652. }
  2653. #endif /* VMS */
  2654. #endif /* MYCURSES */
  2655. #else
  2656. fxdinit(x);
  2657. #endif /* COMMENT */
  2658. #ifdef CK_PCT_BAR
  2659. thermometer = y;
  2660. #endif /* CK_PCT_BAR */
  2661. line[0] = ''; /* (What's this for?) */
  2662.     }
  2663. #endif /* CK_CURSES */
  2664.     fdispla = x; /* It's OK. */
  2665.     return(success = 1);
  2666. }
  2667. #endif /* NOLOCAL */
  2668. #endif /* NOXFER */
  2669. int
  2670. setfil(rmsflg) int rmsflg; {
  2671. #ifndef NOXFER
  2672.     if (rmsflg) {
  2673. if ((y = cmkey(rfiltab,nrfilp,"Remote file parameter","",
  2674.        xxstring)) < 0) {
  2675.     if (y == -3) {
  2676. printf("?Remote file parameter requiredn");
  2677. return(-9);
  2678.     } else return(y);
  2679. }
  2680.     } else {
  2681. #endif /* NOXFER */
  2682. if ((y = cmkey(filtab,nfilp,"File parameter","",xxstring)) < 0)
  2683.   return(y);
  2684. #ifndef NOXFER
  2685.     }
  2686. #endif /* NOXFER */
  2687.     switch (y) {
  2688. #ifdef COMMENT /* Not needed */
  2689.       case XYFILB: /* Blocksize */
  2690. if ((y = cmnum("file block size",ckitoa(DBLKSIZ),10,&z,xxstring)) < 0)
  2691.   return(y);
  2692. if ((x = cmcfm()) < 0) return(x);
  2693. if (rmsflg) {
  2694.     sstate = setgen('S', "311", ckitoa(z), "");
  2695.     return((int) sstate);
  2696. } else {
  2697.     fblksiz = z;
  2698.     return(success = 1);
  2699. }
  2700. #endif /* COMMENT */
  2701. #ifndef NOXFER
  2702.       case XYFILS: /* Byte size */
  2703. if ((y = cmnum("file byte size (7 or 8)","8",10,&z,xxstring)) < 0)
  2704.   return(y);
  2705. if (z != 7 && z != 8) {
  2706.     printf("n?The choices are 7 and 8n");
  2707.     return(0);
  2708. }
  2709. if ((y = cmcfm()) < 0) return(y);
  2710. if (z == 7) fmask = 0177;
  2711. else if (z == 8) fmask = 0377;
  2712. return(success = 1);
  2713. #ifndef NOCSETS
  2714.       case XYFILC: { /* Character set */
  2715.   char * csetname = NULL;
  2716.   extern int
  2717.     r_cset, s_cset, afcset[]; /* SEND CHARACTER-SET AUTO or MANUAL */
  2718.   struct FDB kw, fl;
  2719.   cmfdbi(&kw, /* First FDB - command switches */
  2720.  _CMKEY, /* fcode */
  2721.  rmsflg ? "server character-set name" : "",  /* help */
  2722.  "", /* default */
  2723.  "", /* addtl string data */
  2724.  nfilc, /* addtl numeric data 1: tbl size */
  2725.  0, /* addtl numeric data 2: 0 = keyword */
  2726.  xxstring, /* Processing function */
  2727.  fcstab, /* Keyword table */
  2728.  rmsflg ? &fl : NULL /* Pointer to next FDB */
  2729.    );
  2730.   cmfdbi(&fl, /* Anything that doesn't match */
  2731.  _CMFLD, /* fcode */
  2732.  "", /* hlpmsg */
  2733.  "", /* default */
  2734.  "", /* addtl string data */
  2735.  0, /* addtl numeric data 1 */
  2736.  0, /* addtl numeric data 2 */
  2737.  xxstring,
  2738.  NULL,
  2739.  NULL
  2740.  );
  2741.   if ((x = cmfdb(&kw)) < 0)
  2742.     return(x);
  2743.   if (cmresult.fcode == _CMKEY) {
  2744.       x = cmresult.nresult;
  2745.       csetname = fcsinfo[x].keyword;
  2746.   } else {
  2747.       ckstrncpy(line,cmresult.sresult,LINBUFSIZ);
  2748.       csetname = line;
  2749.   }
  2750.   if ((z = cmcfm()) < 0) return(z);
  2751.   if (rmsflg) {
  2752.       sstate = setgen('S', "320", csetname, "");
  2753.       return((int) sstate);
  2754.   }
  2755.   fcharset = x;
  2756.   if (s_cset == XMODE_A) /* If SEND CHARACTER-SET is AUTO */
  2757.     if (x > -1 && x <= MAXFCSETS)
  2758.       if (afcset[x] > -1 && afcset[x] <= MAXTCSETS)
  2759. tcharset = afcset[x]; /* Pick corresponding xfer charset */
  2760.   setxlatype(tcharset,fcharset); /* Translation type */
  2761.   /* If I say SET FILE CHARACTER-SET blah, I want to be blah! */
  2762.   r_cset = XMODE_M; /* Don't switch incoming set! */
  2763.   return(success = 1);
  2764.       }
  2765. #endif /* NOCSETS */
  2766. #ifndef NOLOCAL
  2767.       case XYFILD: /* Display */
  2768. return(doxdis());
  2769. #endif /* NOLOCAL */
  2770. #endif /* NOXFER */
  2771.       case XYFILA: /* End-of-line */
  2772. #ifdef NLCHAR
  2773. s = "";
  2774. if (NLCHAR == 015)
  2775.   s = "cr";
  2776. else if (NLCHAR == 012)
  2777.   s = "lf";
  2778. if ((x = cmkey(eoltab, neoltab,
  2779.        "local text-file line terminator",s,xxstring)) < 0)
  2780.   return(x);
  2781. #else
  2782. if ((x = cmkey(eoltab, neoltab,
  2783.        "local text-file line terminator","crlf",xxstring)) < 0)
  2784.   return(x);
  2785. #endif /* NLCHAR */
  2786. if ((z = cmcfm()) < 0) return(z);
  2787. feol = (CHAR) x;
  2788. return(success = 1);
  2789. #ifndef NOXFER
  2790.       case XYFILN: /* Names */
  2791. if ((x = cmkey(fntab,nfntab,"how to handle filenames","converted",
  2792.        xxstring)) < 0)
  2793.   return(x);
  2794. if ((z = cmcfm()) < 0) return(z);
  2795. if (rmsflg) {
  2796.     sstate = setgen('S', "301", ckitoa(1 - x), "");
  2797.     return((int) sstate);
  2798. } else {
  2799.     ptab[protocol].fncn = x; /* Set structure */
  2800.     fncnv = x; /* Set variable */
  2801.     f_save = x; /* Set and set "permanent" variable */
  2802.     return(success = 1);
  2803. }
  2804.       case XYFILR: /* Record length */
  2805. if ((y = cmnum("file record length",
  2806.        ckitoa(DLRECL),10,&z,xxstring)) < 0)
  2807.   return(y);
  2808. if ((x = cmcfm()) < 0) return(x);
  2809. if (rmsflg) {
  2810.     sstate = setgen('S', "312", ckitoa(z), "");
  2811.     return((int) sstate);
  2812. } else {
  2813.     frecl = z;
  2814.     return(success = 1);
  2815. }
  2816. #ifdef COMMENT
  2817.       case XYFILO: /* Organization */
  2818. if ((x = cmkey(forgtab,nforg,"file organization","sequential",
  2819.        xxstring)) < 0)
  2820.   return(x);
  2821. if ((y = cmcfm()) < 0) return(y);
  2822. if (rmsflg) {
  2823.     sstate = setgen('S', "314", ckitoa(x), "");
  2824.     return((int) sstate);
  2825. } else {
  2826.     forg = x;
  2827.     return(success = 1);
  2828. }
  2829. #endif /* COMMENT */
  2830. #ifdef COMMENT /* Not needed */
  2831.       case XYFILF: /* Format */
  2832. if ((x = cmkey(frectab,nfrec,"file record format","stream",
  2833.        xxstring)) < 0)
  2834.   return(x);
  2835. if ((y = cmcfm()) < 0) return(y);
  2836. if (rmsflg) {
  2837.     sstate = setgen('S', "313", ckitoa(x), "");
  2838.     return((int) sstate);
  2839. } else {
  2840.     frecfm = x;
  2841.     return(success = 1);
  2842. }
  2843. #endif /* COMMENT */
  2844. #ifdef COMMENT
  2845.       case XYFILP: /* Printer carriage control */
  2846. if ((x = cmkey(fcctab,nfcc,"file carriage control","newline",
  2847.        xxstring)) < 0)
  2848.   return(x);
  2849. if ((y = cmcfm()) < 0) return(y);
  2850. if (rmsflg) {
  2851.     sstate = setgen('S', "315", ckitoa(x), "");
  2852.     return((int) sstate);
  2853. } else {
  2854.     fcctrl = x;
  2855.     return(success = 1);
  2856. }
  2857. #endif /* COMMENT */
  2858. #endif /* NOXFER */
  2859.       case XYFILT: /* Type */
  2860. if ((x = cmkey(rmsflg ? rfttab  : fttab,
  2861.        rmsflg ? nrfttyp : nfttyp,
  2862.        "type of file transfer","text",xxstring)) < 0)
  2863.   return(x);
  2864. #ifdef VMS
  2865.         /* Allow VMS users to choose record format for binary files */
  2866.         if ((x == XYFT_B) && (rmsflg == 0)) {
  2867.     if ((x = cmkey(fbtab,nfbtyp,"VMS record format","fixed",
  2868.    xxstring)) < 0)
  2869.       return(x);
  2870. }
  2871. #endif /* VMS */
  2872. if ((y = cmcfm()) < 0) return(y);
  2873. binary = x;
  2874. b_save = x;
  2875. #ifdef MAC
  2876. (void) mac_setfildflg(binary);
  2877. #endif /* MAC */
  2878. #ifndef NOXFER
  2879. if (rmsflg) {
  2880.     /* Allow for LABELED in VMS & OS/2 */
  2881.     sstate = setgen('S', "300", ckitoa(x), "");
  2882.     return((int) sstate);
  2883. } else {
  2884. #endif /* NOXFER */
  2885.     return(success = 1);
  2886. #ifndef NOXFER
  2887. }
  2888. #endif /* NOXFER */
  2889. #ifndef NOXFER
  2890.       case XYFILX: /* Collision Action */
  2891. if ((x = cmkey(colxtab,ncolx,"Filename collision action","backup",
  2892.        xxstring)) < 0)
  2893.   return(x);
  2894. if ((y = cmcfm()) < 0) return(y);
  2895. #ifdef CK_LOGIN
  2896. if (isguest) {
  2897.     /* Don't let guests change existing files */
  2898.     printf("?This command not valid for guestsn");
  2899.     return(-9);
  2900. }
  2901. #endif /* CK_LOGIN */
  2902. fncact = x;
  2903. ptab[protocol].fnca = x;
  2904. if (rmsflg) {
  2905.     sstate = setgen('S', "302", ckitoa(fncact), "");
  2906.     return((int) sstate);
  2907. } else {
  2908.     if (fncact == XYFX_R) ckwarn = 1; /* FILE WARNING implications */
  2909.     if (fncact == XYFX_X) ckwarn = 0; /* ... */
  2910.     return(success = 1);
  2911. }
  2912.       case XYFILW: /* Warning/Write-Protect */
  2913. if ((x = seton(&ckwarn)) < 0) return(x);
  2914. if (ckwarn)
  2915.   fncact = XYFX_R;
  2916. else
  2917.   fncact = XYFX_X;
  2918. return(success = 1);
  2919. #ifdef CK_LABELED
  2920.       case XYFILL: /* LABELED FILE parameters */
  2921. if ((x = cmkey(lbltab,nlblp,"Labeled file feature","",
  2922.        xxstring)) < 0)
  2923.   return(x);
  2924. if ((success = seton(&y)) < 0)
  2925.   return(success);
  2926. if (y) /* Set or reset the selected bit */
  2927.   lf_opts |= x; /* in the options bitmask. */
  2928. else
  2929.   lf_opts &= ~x;
  2930. return(success);
  2931. #endif /* CK_LABELED */
  2932.       case XYFILI: { /* INCOMPLETE */
  2933.   extern struct keytab ifdatab[];
  2934.   extern int keep;
  2935.   if ((y = cmkey(ifdatab,3,"","auto",xxstring)) < 0) return(y);
  2936.   if ((x = cmcfm()) < 0) return(x);
  2937.   if (rmsflg) {
  2938.       sstate = setgen('S',
  2939.       "310",
  2940.       y == 0 ? "0" : (y == 1 ? "1" : "2"),
  2941.       ""
  2942.       );
  2943.       return((int) sstate);
  2944.   } else {
  2945.       keep = y;
  2946.       return(success = 1);
  2947.   }
  2948.       }
  2949. #ifdef CK_TMPDIR
  2950.       case XYFILG: { /* Download directory */
  2951.   int x;
  2952.   char *s;
  2953. #ifdef ZFNQFP
  2954.   struct zfnfp * fnp;
  2955. #endif /* ZFNQFP */
  2956. #ifdef MAC
  2957.   char temp[34];
  2958. #endif /* MAC */
  2959. #ifdef GEMDOS
  2960.   if ((x = cmdir("Name of local directory, or carriage return",
  2961.  "",&s,
  2962.  NULL)) < 0 ) {
  2963.       if (x != -3)
  2964. return(x);
  2965.   }
  2966. #else
  2967. #ifdef OS2
  2968.   if ((x = cmdir("Name of PC disk and/or directory,n
  2969.        or press the Enter key to use current directory",
  2970.  "",&s,xxstring)) < 0 ) {
  2971.       if (x != -3)
  2972. return(x);
  2973.   }
  2974. #else
  2975. #ifdef MAC
  2976.   x = ckstrncpy(temp,homdir,32);
  2977.   if (x > 0) if (temp[x-1] != ':') { temp[x] = ':'; temp[x+1] = NUL; }
  2978.   if ((x = cmtxt("Name of Macintosh volume and/or folder,n
  2979.  or press the Return key for the desktop on the boot disk",
  2980.  temp,&s, xxstring)) < 0 )
  2981.     return(x);
  2982. #else
  2983.   if ((x = cmdir("Name of local directory, or carriage return",
  2984.  "", &s, xxstring)) < 0 ) {
  2985.       if (x != -3)
  2986. return(x);
  2987.   }
  2988. #endif /* MAC */
  2989. #endif /* OS2 */
  2990. #endif /* GEMDOS */
  2991.   debug(F110,"download dir",s,0);
  2992. #ifndef MAC
  2993.   if (x == 2) {
  2994.       printf("?Wildcards not allowed in directory namen");
  2995.       return(-9);
  2996.   }
  2997. #endif /* MAC */
  2998. #ifdef ZFNQFP
  2999.   if ((fnp = zfnqfp(s,TMPBUFSIZ - 1,tmpbuf))) {
  3000.       if (fnp->fpath)
  3001. if ((int) strlen(fnp->fpath) > 0)
  3002.   s = fnp->fpath;
  3003.   }
  3004.   debug(F110,"download zfnqfp",s,0);
  3005. #endif /* ZFNQFP */
  3006.   strcpy(line,s); /* Make a safe copy */
  3007.   s = line;
  3008. #ifndef MAC
  3009.   if ((x = cmcfm()) < 0) /* Get confirmation */
  3010.     return(x);
  3011. #endif /* MAC */
  3012. #ifdef CK_LOGIN
  3013. if (isguest) {
  3014.     /* Don't let guests change existing files */
  3015.     printf("?This command not valid for guestsn");
  3016.     return(-9);
  3017. }
  3018. #endif /* CK_LOGIN */
  3019.   x = strlen(line);
  3020. #ifdef datageneral
  3021.   if (line[x-1] == ':') /* homdir ends in colon, */
  3022.     line[x-1] = NUL; /* and "dir" doesn't like that... */
  3023. #endif /* datageneral */
  3024.           makestr(&dldir,line);
  3025.   return(success = (dldir != NULL));
  3026.       }
  3027. #endif /* CK_TMPDIR */
  3028.       case XYFILY:
  3029. return(setdest());
  3030. #endif /* NOXFER */
  3031. #ifdef CK_CTRLZ
  3032.       case XYFILV: { /* EOF */
  3033.   extern int eofmethod;
  3034.   if ((x = cmkey(eoftab,3,"end-of-file detection method","",
  3035.  xxstring)) < 0)
  3036.     return(x);
  3037.   if ((y = cmcfm()) < 0)
  3038.     return(y);
  3039.   eofmethod = x;
  3040.   return(success = 1);
  3041.       }
  3042. #endif /* CK_CTRLZ */
  3043. #ifndef NOXFER
  3044. #ifdef UNIX
  3045.       case XYFILH: { /* OUTPUT */
  3046.   extern int zofbuffer, zobufsize, zofblock;
  3047. #ifdef DYNAMIC
  3048.   extern char * zoutbuffer;
  3049. #endif /* DYNAMIC */
  3050.   if ((x = cmkey(zoftab,nzoftab,"output file writing method","",
  3051.  xxstring)) < 0)
  3052.     return(x);
  3053.   if (x == ZOF_BUF || x == ZOF_NBUF) {
  3054.       if ((y = cmnum("output buffer size","32768",10,&z,xxstring)) < 0)
  3055. return(y);
  3056.       if (z < 1) {
  3057.   printf("?Bad size - %dn", z);
  3058.   return(-9);
  3059.       }
  3060.   }
  3061.   if ((y = cmcfm()) < 0) return(y);
  3062.   switch (x) {
  3063.     case ZOF_BUF:
  3064.     case ZOF_NBUF:
  3065.       zofbuffer = (x == ZOF_BUF);
  3066.       zobufsize = z;
  3067.       break;
  3068.     case ZOF_BLK:
  3069.     case ZOF_NBLK:
  3070.       zofblock = (x == ZOF_BLK);
  3071.       break;
  3072.   }
  3073. #ifdef DYNAMIC
  3074.   if (zoutbuffer) free(zoutbuffer);
  3075.   if (!(zoutbuffer = (char *)malloc(z))) {
  3076.       printf("MEMORY ALLOCATION ERROR - FATALn");
  3077.       doexit(BAD_EXIT,-1);
  3078.   } else
  3079.     zobufsize = z;
  3080. #else
  3081.   if (z <= OBUFSIZE) {
  3082.       zobufsize = z;
  3083.   } else {
  3084.       printf("?Sorry, %d is too big - %d is the maximumn",z,OBUFSIZE);
  3085.       return(-9);
  3086.   }
  3087. #endif /* DYNAMIC */
  3088.   return(success = 1);
  3089.       }
  3090. #endif /* UNIX */
  3091. #ifdef PATTERNS
  3092.       case XYFIBP: /* BINARY-PATTERN */
  3093.       case XYFITP: { /* TEXT-PATTERN */
  3094.   char * tmp[FTPATTERNS];
  3095.   int i, n = 0;
  3096.   while (n < FTPATTERNS) {
  3097.       tmp[n] = NULL;
  3098.       if ((x = cmfld("Pattern","",&s,xxstring)) < 0)
  3099. break;
  3100.       strcpy(line,s);
  3101.       s = brstrip(line);
  3102.       makestr(&(tmp[n++]),s);
  3103.   }
  3104.   if (x == -3) x = cmcfm();
  3105.   for (i = 0; i <= n; i++) {
  3106.       if (x > -1) {
  3107.   if (y == XYFIBP)
  3108.     makestr(&(binpatterns[i]),tmp[i]);
  3109.   else
  3110.     makestr(&(txtpatterns[i]),tmp[i]);
  3111.       }
  3112.       free(tmp[i]);
  3113.   }
  3114.   if (y == XYFIBP) /* Null-terminate the list */
  3115.     makestr(&(binpatterns[i]),NULL);
  3116.   else
  3117.     makestr(&(txtpatterns[i]),NULL);
  3118.   return(x);
  3119.       }
  3120.       case XYFIPA: /* PATTERNS */
  3121. if ((x = setonaut(&patterns)) < 0)
  3122.   return(x);
  3123. return(success = 1);
  3124. #endif /* PATTERNS */
  3125. #endif /* NOXFER */
  3126. #ifdef UNICODE
  3127.       case XYFILU: { /* UCS */
  3128.   extern int ucsorder, ucsbom, byteorder;
  3129.   if ((x = cmkey(ucstab,nucstab,"","",xxstring)) < 0)
  3130.     return(x);
  3131.   switch (x) {
  3132.     case UCS_BYT:
  3133.       if ((y = cmkey(botab,nbotab,
  3134.      "Byte order",
  3135.      byteorder ? "little-endian" : "big-endian",
  3136.      xxstring
  3137.      )
  3138.    ) < 0)
  3139. return(y);
  3140.       if ((x = cmcfm()) < 0)
  3141. return(x);
  3142.       ucsorder = y;
  3143.       return(success = 1);
  3144.     case UCS_BOM:
  3145.       if ((y = cmkey(onoff,2,"","on",xxstring)) < 0)
  3146. return(y);
  3147.       if ((x = cmcfm()) < 0)
  3148. return(x);
  3149.       ucsbom = y;
  3150.       return(success = 1);
  3151.     default:
  3152.       return(-2);
  3153.   }
  3154.       }
  3155. #endif /* UNICODE */
  3156.       case 9997: /* FASTLOOKUPS */
  3157. return(success = seton(&stathack));
  3158.       default:
  3159. printf("?unexpected file parametern");
  3160. return(-2);
  3161.     }
  3162. }
  3163. #ifndef NOLOCAL
  3164. #ifdef OS2
  3165. /* MS-DOS KERMIT compatibility modes */
  3166. int
  3167. setmsk() {
  3168.     if ((y = cmkey(msktab,nmsk,"MS-DOS Kermit compatibility mode",
  3169.                     "keycodes",xxstring)) < 0) return(y);
  3170.     switch ( y ) {
  3171. #ifdef COMMENT
  3172.       case MSK_COLOR:
  3173.         return(seton(&mskcolors));
  3174. #endif /* COMMENT */
  3175.       case MSK_KEYS:
  3176. return(seton(&mskkeys));
  3177.       default: /* Shouldn't get here. */
  3178.         return(-2);
  3179.     }
  3180. }
  3181. #endif /* OS2 */
  3182. int
  3183. settrmtyp() {
  3184. #ifdef OS2
  3185. #ifdef TNCODE
  3186.     extern int ttnum;  /* Last Telnet Terminal Type sent */
  3187.     extern int ttnumend;  /* Has end of list been found */
  3188. #endif /* TNCODE */
  3189.     if ((x = cmkey(ttyptab,nttyp,"","vt320",xxstring)) < 0)
  3190.       return(x);
  3191.     if ((y = cmcfm()) < 0)
  3192.       return(y);
  3193.     settermtype(x,1);
  3194. #ifdef TNCODE
  3195.     /* So we send the correct terminal name to the host if it asks for it */
  3196.     ttnum = -1; /* Last Telnet Terminal Type sent */
  3197.     ttnumend = 0; /* end of list not found */
  3198. #endif /* TNCODE */
  3199.     return(success = 1);
  3200. #else  /* Not OS2 */
  3201.     printf(
  3202. "n Sorry, this version of C-Kermit does not support the SET TERMINAL TYPEn");
  3203.     printf(
  3204. " command.  Type "help set terminal" for further information.n");
  3205. #endif /* OS2 */
  3206.     return(success = 0);
  3207. }
  3208. int
  3209. settrm() {
  3210.     int i = 0;
  3211. #ifdef OS2
  3212.     extern int colorreset, user_erasemode;
  3213. #endif /* OS2 */
  3214.     if ((y = cmkey(trmtab,ntrm,"", "",xxstring)) < 0) return(y);
  3215. #ifdef MAC
  3216.     printf("n?Sorry, not implemented yet.  Please use the Settings menu.n");
  3217.     return(-9);
  3218. #else
  3219. #ifdef IKSD
  3220.     if (inserver) {
  3221. if ((y = cmcfm()) < 0) return(y);
  3222.         printf("?Sorry, command disabled.rn");
  3223.         return(success = 0);
  3224.     }
  3225. #endif /* IKSD */
  3226.     switch (y) {
  3227.       case XYTBYT: /* SET TERMINAL BYTESIZE */
  3228. if ((y = cmnum("bytesize for terminal connection","8",10,&x,
  3229.        xxstring)) < 0)
  3230.   return(y);
  3231. if (x != 7 && x != 8) {
  3232.     printf("n?The choices are 7 and 8n");
  3233.     return(success = 0);
  3234. }
  3235. if ((y = cmcfm()) < 0) return(y);
  3236. if (x == 7) cmask = 0177;
  3237. else if (x == 8) {
  3238.     cmask = 0377;
  3239.     parity = 0;
  3240. }
  3241. #ifdef OS2
  3242. if (IS97801(tt_type_mode))
  3243.   SNI_bitmode(x);
  3244. #endif /* OS2 */
  3245.         return(success = 1);
  3246.       case XYTSO: /* SET TERMINAL LOCKING-SHIFT */
  3247. return(seton(&sosi));
  3248.       case XYTNL: /* SET TERMINAL NEWLINE-MODE */
  3249. return(seton(&tnlm));
  3250. #ifdef OS2
  3251.       case XYTCOL:
  3252. if ((x = cmkey(ttycoltab,ncolors,"","terminal",xxstring)) < 0)
  3253.   return(x);
  3254. else if (x == TTCOLRES) {
  3255.     if ((y = cmkey(ttcolmodetab,ncolmode,
  3256.    "","default-color",xxstring)) < 0)
  3257.       return(y);
  3258.     if ((z = cmcfm()) < 0)
  3259.       return(z);
  3260.     colorreset = y;
  3261.     return(success = 1);
  3262. } else if (x == TTCOLERA) {
  3263.     if ((y = cmkey(ttcolmodetab,ncolmode,"",
  3264.    "current-color",xxstring)) < 0)
  3265.       return(y);
  3266.     if ((z = cmcfm()) < 0)
  3267.       return(z);
  3268.     user_erasemode = y;
  3269.     return(success=1);
  3270. } else { /* No parse error */
  3271.     int fg = 0, bg = 0;
  3272.     fg = cmkey(ttyclrtab, nclrs,
  3273.        (x == TTCOLBOR ?
  3274. "color for screen border" :
  3275. "foreground color and then background color"),
  3276.        "lgray", xxstring);
  3277.     if (fg < 0)
  3278.       return(fg);
  3279.     if (x != TTCOLBOR) {
  3280. if ((bg = cmkey(ttyclrtab,nclrs,
  3281. "background color","blue",xxstring)) < 0)
  3282.   return(bg);
  3283.     }
  3284.     if ((y = cmcfm()) < 0)
  3285.       return(y);
  3286.     switch (x) {
  3287.       case TTCOLNOR:
  3288. colornormal = fg | bg << 4;
  3289. fgi = fg & 0x08;
  3290. bgi = bg & 0x08;
  3291. break;
  3292.       case TTCOLREV:
  3293. colorreverse = fg | bg << 4;
  3294. break;
  3295.       case TTCOLUND:
  3296. colorunderline = fg | bg << 4;
  3297. break;
  3298.       case TTCOLGRP:
  3299. colorgraphic = fg | bg << 4;
  3300. break;
  3301.       case TTCOLDEB:
  3302. colordebug = fg | bg << 4;
  3303. break;
  3304.       case TTCOLSTA:
  3305. colorstatus = fg | bg << 4;
  3306. break;
  3307.       case TTCOLHLP:
  3308. colorhelp = fg | bg << 4;
  3309. break;
  3310.       case TTCOLBOR:
  3311. colorborder = fg;
  3312. break;
  3313.       case TTCOLSEL:
  3314. colorselect = fg | bg << 4;
  3315. break;
  3316.       default:
  3317. printf("%s - invalidn",cmdbuf);
  3318. return(-9);
  3319. break;
  3320.     }
  3321.     scrninitialized[VTERM] = 0;
  3322.     VscrnInit(VTERM);
  3323. }
  3324. return(success = 1);
  3325.       case XYTCUR: { /* SET TERMINAL CURSOR */
  3326.   extern int cursorena[];
  3327.           extern int cursoron[] ;       /* Cursor state on/off       */
  3328.   if ((x = cmkey(ttycurtab,ncursors,"","underline",xxstring)) < 0)
  3329.     return(x);
  3330.   if ((z = cmkey(onoff,2,"","on",xxstring)) < 0)
  3331.     return(z);
  3332.   if ((y = cmcfm()) < 0) return(y);
  3333.   tt_cursor = tt_cursor_usr = x;
  3334.   cursorena[VTERM] = tt_cursorena_usr = z;/* turn cursor on/off */
  3335.           cursoron[VTERM] = FALSE; /* Force newcursor to restore the cursor */
  3336.   return(success = 1);
  3337.       }
  3338. #endif /* OS2 */
  3339.       case XYTTYP: /* SET TERMINAL TYPE */
  3340. return(settrmtyp());
  3341. #ifdef OS2
  3342.       case XYTARR: /* SET TERMINAL ARROW-KEYS */
  3343. if ((x = cmkey(akmtab,2,"","",xxstring)) < 0) return(x);
  3344. if ((y = cmcfm()) < 0) return(y);
  3345. tt_arrow = x; /* TTK_NORM / TTK_APPL; see ckuusr.h */
  3346. return(success = 1);
  3347.       case XYTKPD: /* SET TERMINAL KEYPAD-MODE */
  3348. if ((x = cmkey(kpmtab,2,"","",xxstring)) < 0) return(x);
  3349. if ((y = cmcfm()) < 0) return(y);
  3350. tt_keypad = x; /* TTK_NORM / TTK_APPL; see ckuusr.h */
  3351. return(success = 1);
  3352.       case XYTUNX: { /* SET TERM UNIX-MODE (DG) */
  3353.         extern int dgunix,dgunix_usr;
  3354. x = seton(&dgunix);
  3355. dgunix_usr = dgunix;
  3356. return(x);
  3357.       }
  3358.       case XYTKBMOD: { /* SET TERM KEYBOARD MODE */
  3359.   extern int tt_kb_mode;
  3360.   if ((x = cmkey(kbmodtab,
  3361.  nkbmodtab,
  3362.  "normal",
  3363.  "special keyboard mode for terminal emulation",
  3364.  xxstring)
  3365.        ) < 0)
  3366.     return(x);
  3367.   if ((y = cmcfm()) < 0) return(y);
  3368.   tt_kb_mode = x;
  3369.   return(success = 1);
  3370.       }
  3371.       case XYTWRP: /* SET TERMINAL WRAP */
  3372. return(seton(&tt_wrap));
  3373.       case XYSCRS:
  3374. if ((y = cmnum("CONNECT scrollback buffer size, lines","2000",10,&x,
  3375.        xxstring)) < 0)
  3376.   return(y);
  3377. /* The max number of lines is the RAM  */
  3378. /* we can actually dedicate to a       */
  3379. /* scrollback buffer given the maximum */
  3380. /* process memory space of 512MB       */
  3381. if (x < 256 || x > 2000000L) {
  3382.     printf("n?The size must be between 256 and 2,000,000.n");
  3383.     return(success = 0);
  3384.   }
  3385. if ((y = cmcfm()) < 0) return(y);
  3386. tt_scrsize[VTERM] = x;
  3387. VscrnInit(VTERM);
  3388. return(success = 1);
  3389. #endif /* OS2 */
  3390. #ifndef NOCSETS
  3391. #ifndef KUI
  3392.       case XYTCS: /* SET TERMINAL CHARACTER-SET */
  3393.   /* set terminal character-set <remote> <local> */
  3394. if ((x = cmkey(
  3395. #ifdef CKOUNI
  3396.                        txrtab,ntxrtab,
  3397. #else  /* CKOUNI */
  3398.                        ttcstab,ntermc,
  3399. #endif /* CKOUNI */
  3400.        "remote terminal character-set","",xxstring)) < 0)
  3401.   return(x);
  3402. if (
  3403. #ifdef CKOUNI
  3404.             x == TX_TRANSP
  3405. #else  /* CKOUNI */
  3406.             x == FC_TRANSP
  3407. #endif /* CKOUNI */
  3408.            ) { /* TRANSPARENT? */
  3409.     if ((x = cmcfm()) < 0) return(x); /* Confirm the command */
  3410. #ifdef CKOUNI
  3411.             tt_utf8 = 0; /* Turn off the UTF8 flag */
  3412.     tcsr = tcsl = TX_ASCII; /* Make them both the same */
  3413. #else /* CKOUNI */
  3414.     tcsr = tcsl = FC_USASCII;
  3415. #endif /* CKOUNI */
  3416.     tcs_transp = 1;
  3417. #ifdef OS2
  3418. #ifdef UNICODE
  3419.             dec_kbd = tcsr = tcsl = TX_TRANSP;
  3420. #else /* UNICODE */
  3421.     y = os2getcp(); /* Default is current code page */
  3422.     switch (y) {
  3423.       case 437: tcsr = tcsl = FC_CP437; break;
  3424.       case 850: tcsr = tcsl = FC_CP850; break;
  3425.       case 852: tcsr = tcsl = FC_CP852; break;
  3426.       case 862: tcsr = tcsl = FC_CP862; break;
  3427.       case 866: tcsr = tcsl = FC_CP866; break;
  3428.     }
  3429. #endif /* UNICODE */
  3430. #ifdef UNICODE
  3431.     if (!cs_is_nrc(tcsl)) {
  3432. G[0].def_designation = G[0].designation = TX_ASCII;
  3433. G[0].init = TRUE;
  3434. G[0].def_c1 = G[0].c1 = FALSE;
  3435. G[0].size = cs94;
  3436. G[0].national = FALSE;
  3437.                 dec_nrc = TX_ASCII;
  3438.     } else
  3439.       dec_nrc = tcsl;
  3440.     for (i = cs_is_nrc(tcsl) ? 0 : 1; i < 4; i++) {
  3441. G[i].def_designation = G[i].designation = tcsl;
  3442. G[i].init = TRUE;
  3443. G[i].def_c1 = G[i].c1 = FALSE;
  3444. switch (cs_size(G[i].designation)) { /* 94, 96, or 128 */
  3445. case 128:
  3446. case 96:
  3447.     G[i].size = G[i].def_size = cs96;
  3448.     break;
  3449. case 94:
  3450.     G[i].size = G[i].def_size = cs94;
  3451.     break;
  3452. default:
  3453.     G[i].size = G[i].def_size = csmb;
  3454.     break;
  3455. }
  3456. G[i].national = cs_is_nrc(x);
  3457.     }
  3458. #else /* UNICODE */
  3459.     for (i = 0; i < 4; i++) {
  3460. G[i].def_designation = G[i].designation = FC_TRANSP;
  3461. G[i].init = FALSE;
  3462. G[i].size = G[i].def_size = cs96;
  3463. G[i].c1 = G[i].def_c1 = FALSE;
  3464. G[i].national = FALSE;
  3465. G[i].rtoi = NULL;
  3466. G[i].itol = NULL;
  3467. G[i].ltoi = NULL;
  3468. G[i].itor = NULL;
  3469.             }
  3470. #endif /* UNICODE */
  3471. #endif /* OS2 */
  3472.     return(success = 1);
  3473. }
  3474. tcs_transp = 0;
  3475. #ifdef CKOUNI
  3476. if (x == TX_UTF8) {
  3477.     if ((x = cmcfm()) < 0) /* Confirm the command */
  3478.       return(x);
  3479.     tt_utf8 = 1; /* Turn this on if we are UTF8 */
  3480.     return(success = 1);
  3481. }
  3482. #endif /* CKOUNI */
  3483. /* Not transparent or UTF8, so get local set to translate it into */
  3484. s = "";
  3485. #ifdef OS2
  3486.   y = os2getcp(); /* Default is current code page */
  3487. switch (y) {
  3488.   case 437: s = "cp437"; break;
  3489.   case 850: s = "cp850"; break;
  3490.   case 852: s = "cp852"; break;
  3491.   case 857: s = "cp857"; break;
  3492.   case 858: s = "cp858"; break;
  3493.   case 862: s = "cp862"; break;
  3494.   case 866: s = "cp866"; break;
  3495.   case 869: s = "cp869"; break;
  3496.   case 1250: s = "cp1250"; break;
  3497.   case 1251: s = "cp1251"; break;
  3498.   case 1252: s = "cp1252"; break;
  3499.   case 1253: s = "cp1253"; break;
  3500.   case 1254: s = "cp1254"; break;
  3501.   case 1255: s = "cp1255"; break;
  3502.   case 1256: s = "cp1256"; break;
  3503.   case 1257: s = "cp1257"; break;
  3504.   case 1258: s = "cp1258"; break;
  3505. }
  3506. #ifdef OS2ONLY
  3507. /*
  3508.    If the user has loaded a font with SET TERMINAL FONT then we want
  3509.    to change the default code page to the font that was loaded.
  3510. */
  3511. if (tt_font != TTF_ROM) {
  3512.     for (y = 0; y < ntermfont; y++ ) {
  3513. if (termfont[y].kwval == tt_font) {
  3514.     s = termfont[y].kwd;
  3515.     break;
  3516. }
  3517.     }
  3518. }
  3519. #endif /* OS2ONLY */
  3520. #else  /* Not K95... */
  3521. s = fcsinfo[fcharset].keyword;
  3522. #endif /* OS2 */
  3523. if ((y = cmkey(
  3524. #ifdef CKOUNI
  3525.                        txrtab,ntxrtab,
  3526. #else /* CKOUNI */
  3527.                        ttcstab,ntermc,
  3528. #endif /* CKOUNI */
  3529.        "local character-set",s,xxstring)) < 0)
  3530.   return(y);
  3531. #ifdef UNICODE
  3532.           if (y == TX_UTF8) {
  3533.               printf("?UTF8 may not be used as a local character set.rn");
  3534.               return(-9);
  3535.           }
  3536. #endif /* UNICODE */
  3537. #ifdef OS2
  3538. if ((z = cmkey(graphsettab,ngraphset,
  3539.        "DEC VT intermediate graphic set","all",xxstring)) < 0)
  3540.   return(z);
  3541. {
  3542.     int eol;
  3543.     if ((eol = cmcfm()) < 0)
  3544.       return(eol); /* Confirm the command */
  3545. }
  3546. tcsr = x; /* Remote character set */
  3547. tcsl = y; /* Local character set */
  3548. #ifdef CKOUNI
  3549.         tt_utf8 = 0; /* Turn off UTF8 flag */
  3550. #endif /* CKOUNI */
  3551. if (z == TT_GR_ALL) {
  3552.     int i;
  3553. #ifdef UNICODE
  3554.             dec_kbd = x;
  3555. #endif /* UNICODE */
  3556.     for (i = 0; i < 4; i++) {
  3557. G[i].def_designation = G[i].designation = x;
  3558. G[i].init = TRUE;
  3559. switch (cs_size(x)) { /* 94, 96, or 128 */
  3560.   case 128:
  3561.   case 96:
  3562.     G[i].size = G[i].def_size = cs96;
  3563.     break;
  3564.   case 94:
  3565.     G[i].size = G[i].def_size = cs94;
  3566.     break;
  3567.   default:
  3568.     G[i].size = G[i].def_size = csmb;
  3569.     break;
  3570. }
  3571. G[i].c1 = G[i].def_c1 = x != tcsl && cs_is_std(x);
  3572. G[i].national = cs_is_nrc(x);
  3573.             }
  3574.     if (!cs_is_nrc(x)) {
  3575. G[0].designation = G[0].def_designation = FC_USASCII;
  3576. G[0].size = G[0].def_size = cs94;
  3577.             }
  3578. #ifdef UNICODE
  3579.         } else if (z == TT_GR_KBD) {    /* Keyboard only */
  3580.             dec_kbd = x;
  3581. #endif /* UNICODE */
  3582.         } else { /* Specific Gn */
  3583.     G[z].def_designation = G[z].designation = x;
  3584.     G[z].init = TRUE;
  3585.     switch (cs_size(x)) { /* 94, 96, or 128 */
  3586.       case 128:
  3587.       case 96:
  3588. G[i].size = G[i].def_size = cs96;
  3589. break;
  3590.       case 94:
  3591. G[i].size = G[i].def_size = cs94;
  3592. break;
  3593.       default:
  3594. G[i].size = G[i].def_size = csmb;
  3595. break;
  3596.     }
  3597.     G[i].c1 = G[i].def_c1 = x != tcsl && cs_is_std(x);
  3598.     G[i].national = cs_is_nrc(x);
  3599.         }
  3600. #else /* not OS2 */
  3601. if ((z = cmcfm()) < 0) return(z); /* Confirm the command */
  3602. tcsr = x; /* Remote character set */
  3603. tcsl = y; /* Local character set */
  3604. #endif /* OS2 */
  3605. return(success = 1);
  3606. #endif /* UNICODE */
  3607. #endif /* NOCSETS */
  3608. #ifndef NOCSETS
  3609.       case XYTLCS: /* SET TERMINAL LOCAL-CHARACTER-SET */
  3610. /* set terminal character-set <local> */
  3611. s = "";
  3612. #ifdef OS2
  3613.   y = os2getcp(); /* Default is current code page */
  3614. switch (y) {
  3615.   case 437: s = "cp437"; break;
  3616.   case 850: s = "cp850"; break;
  3617.   case 852: s = "cp852"; break;
  3618.   case 857: s = "cp857"; break;
  3619.   case 858: s = "cp858"; break;
  3620.   case 862: s = "cp862"; break;
  3621.   case 866: s = "cp866"; break;
  3622.   case 869: s = "cp869"; break;
  3623.   case 1250: s = "cp1250"; break;
  3624.   case 1251: s = "cp1251"; break;
  3625.   case 1252: s = "cp1252"; break;
  3626.   case 1253: s = "cp1253"; break;
  3627.   case 1254: s = "cp1254"; break;
  3628.   case 1255: s = "cp1255"; break;
  3629.   case 1256: s = "cp1256"; break;
  3630.   case 1257: s = "cp1257"; break;
  3631.   case 1258: s = "cp1258"; break;
  3632. }
  3633. #ifdef OS2ONLY
  3634. /*
  3635.    If the user has loaded a font with SET TERMINAL FONT then we want
  3636.    to change the default code page to the font that was loaded.
  3637. */
  3638. if (tt_font != TTF_ROM) {
  3639.     for (y = 0; y < ntermfont; y++ ) {
  3640. if (termfont[y].kwval == tt_font) {
  3641.     s = termfont[y].kwd;
  3642.     break;
  3643. }
  3644.     }
  3645. }
  3646. #endif /* OS2ONLY */
  3647. #else /* OS2 */
  3648. /* Make current file char set */
  3649. for (y = 0; y <= nfilc; y++) /* be the default... */
  3650.   if (fcstab[y].kwval == fcharset) {
  3651.       s = fcstab[y].kwd;
  3652.       break;
  3653.   }
  3654. #endif /* OS2 */
  3655. if ((y = cmkey(
  3656. #ifdef CKOUNI
  3657.                        txrtab,ntxrtab,
  3658. #else /* CKOUNI */
  3659.                        fcstab,nfilc,
  3660. #endif /* CKOUNI */
  3661.        "local character-set",s,xxstring)) < 0)
  3662.   return(y);
  3663. #ifdef UNICODE
  3664.           if (y == TX_UTF8) {
  3665.               printf("?UTF8 may not be used as a local character set.rn");
  3666.               return(-9);
  3667.           }
  3668. #endif /* UNICODE */
  3669. #ifdef OS2
  3670.         if ((z = cmcfm()) < 0) return(z); /* Confirm the command */
  3671. tcsl = y; /* Local character set */
  3672. {
  3673.     int i;
  3674.     for (i = 0; i < 4; i++) {
  3675. G[i].init = TRUE;
  3676. x = G[i].designation;
  3677. G[i].c1 = (x != tcsl) && cs_is_std(x);
  3678. x = G[i].def_designation;
  3679. G[i].def_c1 = (x != tcsl) && cs_is_std(x);
  3680.             }
  3681.         }
  3682. #else /* not OS2 */
  3683. if ((z = cmcfm()) < 0) return(z); /* Confirm the command */
  3684. tcsl = y; /* Local character set */
  3685. #endif /* OS2 */
  3686. return(success = 1);
  3687. #endif /* NOCSETS */
  3688. #ifndef NOCSETS
  3689. #ifdef UNICODE
  3690.       case XYTUNI: /* SET TERMINAL UNICODE */
  3691. return(seton(&tt_unicode));
  3692. #endif /* UNICODE */
  3693.       case XYTRCS: /* SET TERMINAL REMOTE-CHARACTER-SET */
  3694. /* set terminal character-set <remote> <Graphic-set> */
  3695. if ((x = cmkey(
  3696. #ifdef CKOUNI
  3697.                 txrtab, ntxrtab,
  3698. #else /* CKOUNI */
  3699.                 ttcstab,ntermc,
  3700. #endif /* CKOUNI */
  3701.        "remote terminal character-set","",xxstring)) < 0)
  3702.   return(x);
  3703. /* KUI can't have a Transparent Character Set */
  3704. #ifdef UNICODE
  3705. if (x == TX_TRANSP)
  3706. #else /* UNICODE */
  3707. if (x == FC_TRANSP)
  3708. #endif /* UNICODE */
  3709.   { /* TRANSPARENT? */
  3710.       if ((x = cmcfm()) < 0) /* Confirm the command */
  3711. return(x);
  3712. #ifndef OS2
  3713.       tcsr = tcsl; /* Make both sets the same */
  3714. #else
  3715. #ifdef CKOUNI
  3716.               tt_utf8 = 0; /* Turn off UTF8 flag */
  3717.               tcsr = tcsl = dec_kbd = TX_TRANSP; /* No translation */
  3718.       if (!cs_is_nrc(tcsl)) {
  3719.   G[0].def_designation = G[i].designation = TX_ASCII;
  3720.   G[0].init = TRUE;
  3721.   G[0].def_c1 = G[i].c1 = FALSE;
  3722.   G[0].size = cs94;
  3723.   G[0].national = FALSE;
  3724.       }
  3725.       for (i = cs_is_nrc(tcsl) ? 0 : 1; i < 4; i++) {
  3726.   G[i].def_designation = G[i].designation = tcsl;
  3727.   G[i].init = TRUE;
  3728.   G[i].def_c1 = G[i].c1 = FALSE;
  3729.   switch (cs_size(G[i].designation)) { /* 94, 96, or 128 */
  3730.     case 128:
  3731.     case 96:
  3732.       G[i].size = G[i].def_size = cs96;
  3733.       break;
  3734.     case 94:
  3735.       G[i].size = G[i].def_size = cs94;
  3736.       break;
  3737.     default:
  3738.       G[i].size = G[i].def_size = csmb;
  3739.       break;
  3740.   }
  3741.   G[i].national = cs_is_nrc(x);
  3742.       }
  3743. #else /* CKOUNI */
  3744.       tcsr = tcsl; /* Make both sets the same */
  3745.       for (i = 0; i < 4; i++) {
  3746.   G[i].def_designation = G[i].designation = FC_TRANSP;
  3747.   G[i].init = FALSE;
  3748.   G[i].size = G[i].def_size = cs96;
  3749.   G[i].c1 = G[i].def_c1 = FALSE;
  3750.   G[i].rtoi = NULL;
  3751.   G[i].itol = NULL;
  3752.   G[i].ltoi = NULL;
  3753.   G[i].itor = NULL;
  3754.   G[i].national = FALSE;
  3755.       }
  3756. #endif /* CKOUNI */
  3757. #endif /* OS2 */
  3758.       return(success = 1);
  3759.   }
  3760. #ifdef CKOUNI
  3761. if (x == TX_UTF8) {
  3762.     if ((x = cmcfm()) < 0) return(x); /* Confirm the command */
  3763.     tt_utf8 = 1; /* Turn it on if we are UTF8 */
  3764.     return(success = 1);
  3765. }
  3766. #endif /* CKOUNI */
  3767. #ifdef OS2
  3768. if ((z = cmkey(graphsettab,ngraphset,
  3769.        "DEC VT intermediate graphic set","all",xxstring)) < 0)
  3770.   return(z);
  3771. {
  3772.     int eol;
  3773.     if ((eol = cmcfm()) < 0) /* Confirm the command */
  3774.       return(eol);
  3775. }
  3776. tcsr = x; /* Remote character set */
  3777. #ifdef CKOUNI
  3778. tt_utf8 = 0; /* Turn off UTF8 flag */
  3779. #endif /* CKOUNI */
  3780. if (z == TT_GR_ALL) {
  3781.     int i;
  3782. #ifdef UNICODE
  3783.             dec_kbd = x;
  3784. #endif /* UNICODE */
  3785.     for (i = 0; i < 4; i++) {
  3786. G[i].def_designation = G[i].designation = x;
  3787. G[i].init = TRUE;
  3788. switch (cs_size(x)) { /* 94, 96, or 128 */
  3789.   case 128:
  3790.   case 96:
  3791.     G[i].size = G[i].def_size = cs96;
  3792.     break;
  3793.   case 94:
  3794.     G[i].size = G[i].def_size = cs94;
  3795.     break;
  3796.   default:
  3797.     G[i].size = G[i].def_size = csmb;
  3798.     break;
  3799. }
  3800. G[i].c1 = G[i].def_c1 = x != tcsl && cs_is_std(x);
  3801. G[i].national = cs_is_nrc(x);
  3802.             }
  3803.     if (!cs_is_nrc(x)) {
  3804. G[0].designation = G[0].def_designation = FC_USASCII;
  3805. G[0].size = G[0].def_size = cs94;
  3806.             }
  3807. #ifdef UNICODE
  3808.         } else if (z == TT_GR_KBD) {    /* Keyboard only */
  3809.             dec_kbd = x;
  3810. #endif /* UNICODE */
  3811.         } else { /* Specific Gn */
  3812.     G[z].def_designation = G[z].designation = x;
  3813.     G[z].init = TRUE;
  3814.     switch (cs_size(x)) { /* 94, 96, or 128 */
  3815.       case 128:
  3816.       case 96:
  3817. G[i].size = G[i].def_size = cs96;
  3818. break;
  3819.       case 94:
  3820. G[i].size = G[i].def_size = cs94;
  3821. break;
  3822.       default:
  3823. G[i].size = G[i].def_size = csmb;
  3824. break;
  3825.     }
  3826.     G[z].c1 = G[z].def_c1 = x != tcsl && cs_is_std(x);
  3827.     G[z].national = cs_is_nrc(x);
  3828.         }
  3829. #else /* not OS2 */
  3830. if ((z = cmcfm()) < 0) return(z); /* Confirm the command */
  3831. tcsr = x; /* Remote character set */
  3832. #endif /* OS2 */
  3833. return(success = 1);
  3834. #endif /* NOCSETS */
  3835.       case XYTEC: /* SET TERMINAL ECHO */
  3836. if ((x = cmkey(rltab,nrlt,"which side echos during CONNECT",
  3837.        "remote", xxstring)) < 0) return(x);
  3838. if ((y = cmcfm()) < 0) return(y);
  3839. duplex = x;
  3840. return(success = 1);
  3841.       case XYTESC: /* SET TERM ESC */
  3842. if ((x = cmkey(nabltab,nnabltab,"","enabled",xxstring)) < 0)
  3843.   return(x);
  3844. if ((y = cmcfm()) < 0) return(y);
  3845. tt_escape = x;
  3846. return(1);
  3847.       case XYTCRD: /* SET TERMINAL CR-DISPLAY */
  3848. if ((x = cmkey(crdtab,2,"", "normal", xxstring)) < 0) return(x);
  3849. if ((y = cmcfm()) < 0) return(y);
  3850. tt_crd = x;
  3851. return(success = 1);
  3852. #ifdef OS2
  3853.       case XYTANS: { /* SET TERMINAL ANSWERBACK */
  3854. /*
  3855.   NOTE: We let them enable and disable the answerback sequence, but we
  3856.   do NOT let them change it, and we definitely do not let the host set it.
  3857.   This is a security feature.
  3858.   As of 1.1.8 we allow the SET TERM ANSWERBACK MESSAGE <string> to be
  3859.   used just as MS-DOS Kermit does.  C0 and C1 controls as well as DEL
  3860.   are not allowed to be used as characters.  They are translated to
  3861.   underscore.  This may not be set by APC.
  3862. */
  3863.   if ((x = cmkey(anbktab,nansbk,"", "off", xxstring)) < 0)
  3864.     return(x);
  3865.   if (x < 2) {
  3866.       if ((y = cmcfm()) < 0)
  3867. return(y);
  3868.       tt_answer = x;
  3869.       return(success = 1);
  3870.   } else if ( x == 2 || x == 3) {
  3871.       int len = 0;
  3872.       extern int safeanswerbk;
  3873.       extern char useranswerbk[];
  3874.       if ((y = cmtxt("Answerback extension","",&s,xxstring)) < 0)
  3875. return(y);
  3876.       if (apcactive == APC_LOCAL ||
  3877.   (apcactive == APC_REMOTE && apcstatus != APC_UNCH))
  3878. return(success = 0);
  3879.       len = strlen(s);
  3880.       if (x == 2) {
  3881.   /* Safe Answerback's don't have C0/C1 chars */
  3882.   for (z = 0; z < len; z++) {
  3883.       if ((s[z] & 0x7F) <= SP || (s[z] & 0x7F) == DEL)
  3884. useranswerbk[z] = '_';
  3885.       else
  3886. useranswerbk[z] = s[z];
  3887.   }
  3888.   useranswerbk[z] = '';
  3889.   safeanswerbk = 1 ; /* TRUE */
  3890.       } else {
  3891.   ckstrncpy(useranswerbk,s,60); /* (see ckocon.c) */
  3892.   safeanswerbk = 0; /* FALSE */
  3893.       }
  3894.       updanswerbk();
  3895.       return(success = 1);
  3896.   } else
  3897.     return(success = 0);
  3898.       }
  3899. #endif /* OS2 */
  3900. #ifdef CK_APC
  3901.       case XYTAPC:
  3902. if ((y = cmkey(apctab,3,"application program command execution","",
  3903.        xxstring)) < 0)
  3904.   return(y);
  3905. if ((x = cmcfm()) < 0)
  3906.   return(x);
  3907. if (apcactive == APC_LOCAL ||
  3908.     (apcactive == APC_REMOTE && apcstatus != APC_UNCH))
  3909.   return(success = 0);
  3910. apcstatus = y;
  3911. return(success = 1);
  3912. #ifdef CK_AUTODL
  3913.       case XYTAUTODL: /* AUTODOWNLOAD */
  3914. #ifndef OS2
  3915. x = seton(&autodl); /* For C-Kermit: ON, OFF, AUTO */
  3916. if (x > 0)
  3917.   success = 1;
  3918. return(x);
  3919. #else /* OS2 */
  3920. if ((y = cmkey(adltab,nadltab,"Auto-download options","",
  3921.        xxstring)) < 0)
  3922.   return(y);
  3923. switch (y) {
  3924.   case TAD_ON:
  3925.   case TAD_OFF:
  3926.     if ((x = cmcfm()) < 0)
  3927.       return(x);
  3928.     autodl = y;
  3929.     break;
  3930.   case TAD_K:
  3931.     if ((y = cmkey(adlxtab,nadlxtab,"","", xxstring)) < 0)
  3932.       return(y);
  3933.     switch (y) {
  3934.       case TAD_X_C0:
  3935. if ((y = cmkey(adlc0tab,nadlc0tab,"",
  3936.        "processed-by-emulator",xxstring)) < 0)
  3937.   return(y);
  3938. if ((x = cmcfm()) < 0)
  3939.   return(x);
  3940. adl_kc0 = y;
  3941. break;
  3942.       case TAD_X_DETECT:
  3943. if ((y = cmkey(adldtab,nadldtab,"","packet",xxstring)) < 0)
  3944.   return(y);
  3945. if ((x = cmcfm()) < 0)
  3946.   return(x);
  3947. adl_kmode = y;
  3948. break;
  3949.       case TAD_X_STR:
  3950. if ((y = cmtxt("Kermit start string","KERMIT READY TO SEND...",
  3951.        &s,xxstring)) < 0)
  3952.   return(y);
  3953. free(adl_kstr);
  3954. adl_kstr = strdup(s);
  3955. break;
  3956.     }
  3957.     break;
  3958.   case TAD_Z:
  3959.     if ((y = cmkey(adlxtab,nadlxtab,"","",xxstring)) < 0)
  3960.       return(y);
  3961.     switch (y) {
  3962.       case TAD_X_C0:
  3963. if ((y = cmkey(adlc0tab,nadlc0tab,"",
  3964.        "processed-by-emulator",xxstring)) < 0)
  3965.   return(y);
  3966. if ((x = cmcfm()) < 0)
  3967.   return(x);
  3968. adl_zc0 = y;
  3969. break;
  3970.       case TAD_X_DETECT:
  3971. if ((y = cmkey(adldtab,nadldtab,"","packet",xxstring)) < 0)
  3972.   return(y);
  3973. if ((x = cmcfm()) < 0)
  3974.   return(x);
  3975. adl_zmode = y;
  3976. break;
  3977.       case TAD_X_STR:
  3978. if ((y = cmtxt("","rz\{13}",&s,xxstring)) < 0)
  3979.   return(y);
  3980. free(adl_zstr);
  3981. adl_zstr = strdup(s);
  3982. break;
  3983.     }
  3984.     break;
  3985. }
  3986. return(success = 1);
  3987. #endif /* OS2 */
  3988. #endif /* CK_AUTODL */
  3989. #endif /* CK_APC */
  3990. #ifdef OS2
  3991.       case XYTBEL:
  3992.         return(success = setbell());
  3993.       case XYTMBEL: /* MARGIN-BELL */
  3994. if ((y = cmkey(onoff,2,"","on",xxstring)) < 0) return(y);
  3995. if (y) { /* ON */
  3996.     if ((z = cmnum("Column at which to set margin bell",
  3997.    "72",10,&x,xxstring)) < 0)
  3998.       return(z);
  3999. }
  4000. if ((z = cmcfm()) < 0) return(z);
  4001. marginbell = y;
  4002. marginbellcol = x;
  4003. return(success = 1);
  4004.       case XYTIDLE: /* IDLE-SEND */
  4005. if ((z = cmnum("seconds of idle time to wait, or 0 to disable",
  4006.        "0",10,&x,xxstring)) < 0)
  4007.   return(z);
  4008. if ((y = cmtxt("string to send, may contain kverbs and variables",
  4009.        "\v(newline)",&s,xxstring)) < 0)
  4010.   return(y);
  4011. tt_idlesnd_tmo = x;
  4012. if (tt_idlesnd_str) {
  4013.     free(tt_idlesnd_str);
  4014.     tt_idlesnd_str = NULL;
  4015. }
  4016. s = brstrip(s);
  4017. tt_idlesnd_str = strdup(s);
  4018. puterror(VTERM);
  4019. return(success = 1);
  4020. #endif /* OS2 */
  4021.       case XYTDEB: /* TERMINAL DEBUG */
  4022. x = debses; /* What it was before */
  4023. y = seton(&debses); /* Go parse ON or OFF */
  4024. #ifdef OS2
  4025. if (y > 0) /* Command succeeded? */
  4026.   if ((x != 0) && (debses == 0)) /* It was on and we turned it off? */
  4027.     os2debugoff(); /* Fix OS/2 coloration */
  4028. #endif /* OS2 */
  4029. return(y);
  4030. #ifdef OS2
  4031.       case XYTASCRL:                    /* SET TERMINAL AUTOSCROLL */
  4032.           y = seton(&autoscroll);
  4033.           return(y);
  4034.       case XYTAPAGE:                    /* SET TERMINAL AUTOPAGE */
  4035.           y = seton(&wy_autopage);
  4036.           return(y);
  4037.       case XYTROL: /* SET TERMINAL ROLL */
  4038.         if ((y = cmkey(rolltab,nroll,"scrollback mode","insert",xxstring))<0)
  4039.             return(y);
  4040.         if ((x = cmcfm()) < 0) return(x);
  4041.         tt_roll[VTERM] = y;
  4042. return(success = 1);
  4043.       case XYTCTS: /* SET TERMINAL TRANSMIT-TIMEOUT */
  4044. y = cmnum("Maximum seconds to allow CTS off during CONNECT",
  4045.   "5",10,&x,xxstring);
  4046. return(setnum(&tt_ctstmo,x,y,10000));
  4047.       case XYTCPG: { /* SET TERMINAL CODE-PAGE */
  4048.         int i;
  4049. int cp = -1;
  4050. y = cmnum("PC code page to use during terminal emulation",
  4051.   "850",10,&x,xxstring);
  4052. if ((x = setnum(&cp,x,y,11000)) < 0) return(x);
  4053. if (os2setcp(cp) != 1) {
  4054. #ifdef NT
  4055.     if (isWin95())
  4056.       printf(
  4057.  "Sorry, Windows 95 does not support code page switchingn");
  4058.     else
  4059. #endif /* NT */
  4060.       printf(
  4061.  "Sorry, %d is not a valid code page for this system.n",cp);
  4062.     return(-9);
  4063. }
  4064.     /* Force the terminal character-sets conversions to be updated */
  4065. for ( i = 0; i < 4; i++ )
  4066.   G[i].init = TRUE;
  4067. return(1);
  4068.     }
  4069.       case XYTPAC: /* SET TERMINAL OUTPUT-PACING */
  4070. y = cmnum(
  4071.    "Pause between sending each character during CONNECT, milliseconds",
  4072.   "-1",10,&x,xxstring);
  4073. return(setnum(&tt_pacing,x,y,10000));
  4074. #ifdef OS2MOUSE
  4075.       case XYTMOU: { /* SET TERMINAL MOUSE */
  4076.   int old_mou = tt_mouse;
  4077.   if ((x = seton(&tt_mouse)) < 0)
  4078.     return(x);
  4079.   if (tt_mouse != old_mou)
  4080.     if (tt_mouse)
  4081.       os2_mouseon();
  4082.     else
  4083.       os2_mouseoff();
  4084.   return(1);
  4085.       }
  4086. #endif /* OS2MOUSE */
  4087. #endif /* OS2 */
  4088.       case XYTWID: {
  4089.   if ((y = cmnum(
  4090. #ifdef OS2
  4091.  "number of columns in display window during CONNECT",
  4092. #else
  4093.  "number of columns on your screen",
  4094. #endif /* OS2 */
  4095.  "80",10,&x,xxstring)) < 0)
  4096.             return(y);
  4097.           if ((y = cmcfm()) < 0) return(y);
  4098. #ifdef OS2
  4099.   if (x % 2) {
  4100.       printf("n?The width must be an even valuen.");
  4101.       return(success = 0);
  4102.   }
  4103.   if ( IsOS2FullScreen() ) {
  4104.       if ( x != 40 && x != 80 && x != 132 ) {
  4105.   printf("n?The width must be 40, 80,");
  4106. #ifdef NT
  4107.   printf(" or 132 under Windows 95.n.");
  4108. #else /* NT */
  4109.   printf(" or 132 in a Full Screen session.n.");
  4110. #endif /* NT */
  4111.   return(success = 0);
  4112.       }
  4113.   } else {
  4114.       if ( !IsWARPed() && x != 80 ) {
  4115.   printf("n?OS/2 version is pre-WARP: the width must equal ");
  4116.   printf("80 in a Windowed Sessionn.");
  4117.   return(success = 0);
  4118.                 }
  4119.       if (x < 20 || x > MAXTERMCOL ) {
  4120.   printf(
  4121.     "n?The width must be between 20 and %dn.",MAXTERMCOL);
  4122.   return(success = 0);