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

通讯/手机编程

开发平台:

Windows_Unix

  1. int
  2. addmac(nam,def) char *nam, *def; { /* Add a macro to the macro table */
  3.     int i, x, y, z, namlen, deflen;
  4.     char * p = NULL, c;
  5.     extern int tra_asg; int tra_tmp;
  6.     if (!nam) return(-1);
  7.     namlen = (int)strlen(nam); /* Get argument lengths */
  8.     tra_tmp = tra_asg;
  9.     debug(F111,"addmac nam",nam,namlen);
  10.     if (!def) { /* Watch out for null pointer */
  11. deflen = 0;
  12. debug(F111,"addmac def","(null pointer)",deflen);
  13.     } else {
  14. deflen = (int)strlen(def);
  15. debug(F111,"addmac def",def,deflen);
  16.     }
  17.     if (deflen < 0) return(-1); /* strlen() failure, fail. */
  18.     if (namlen < 1) return(-1); /* No name given, fail. */
  19.     if (*nam == CMDQ) nam++; /* Backslash quote? */
  20.     if (*nam == '%') { /* Yes, if it's a variable name, */
  21. tra_asg = 0;
  22. delmac(nam); /* Delete any old value. */
  23. tra_asg = tra_tmp;
  24. if (!(c = *(nam + 1))) return(-1); /* Variable name letter or digit */
  25. if (deflen < 1) { /* Null definition */
  26.     p = NULL; /* Better not malloc or strcpy! */
  27. } else { /* A substantial definition */
  28.     p = malloc(deflen + 1); /* Allocate space for it */
  29.     if (!p) {
  30. printf("?addmac malloc error 2n");
  31. return(-1);
  32.     } else strcpy(p,def); /* Copy definition into new space */
  33. }
  34. /* Now p points to the definition, or is a null pointer */
  35. if (c >= '0' && c <= '9') { /* Digit variable */
  36.     if (maclvl < 0) { /* Are we calling or in a macro? */
  37. g_var[c] = p; /* No, it's a global "top level" one */
  38. debug(F101,"addmac numeric global maclvl","",maclvl);
  39. makestr(&(toparg[c - '0']),p);
  40.     } else { /* Yes, it's a macro argument */
  41. m_arg[maclvl][c - '0'] = p; /* Assign the value */
  42. debug(F101,"addmac macro arg maclvl","",maclvl);
  43. makestr(&(m_xarg[maclvl][c - '0']),p); /* And a copy here */
  44.     }
  45. } else { /* It's a global variable */
  46.     if (c < 33 || c > GVARS) return(-1);
  47.     if (isupper(c)) c = (char) tolower(c);
  48.     g_var[c] = p; /* Put pointer in global-var table */
  49.     debug(F100,"addmac global","",0);
  50. }
  51. if (tra_asg) traceval(nam,p);
  52. return(0);
  53.     } else if (*nam == '&') { /* An array reference? */
  54. char **q;
  55. debug(F110,"addmac array",nam,0);
  56. if ((y = arraynam(nam,&x,&z)) < 0) /* If syntax is bad */
  57.   return(-1); /* return -1. */
  58. if (chkarray(x,z) < 0) /* If array not declared or */
  59.   return(-2); /* subscript out of range, ret -2 */
  60. tra_asg = 0;
  61. delmac(nam); /* Delete any old value. */
  62. tra_asg = tra_tmp;
  63. x -= ARRAYBASE; /* Convert name letter to index. */
  64. if ((q = a_ptr[x]) == NULL) /* If array not declared, */
  65.   return(-3); /* return -3. */
  66. if (deflen > 0) {
  67.     if ((p = malloc(deflen+1)) == NULL) { /* Allocate space */
  68. printf("addmac macro error 7: %sn",nam);
  69. return(-4); /* for new def, return -4 on fail. */
  70.     }
  71.     strcpy(p,def); /* Copy definition into new space. */
  72. } else p = NULL;
  73. q[z] = p; /* Store pointer to it. */
  74. debug(F110,"addmac array val",p,0);
  75. if (tra_asg) traceval(nam,p);
  76. return(0); /* Done. */
  77.     }
  78.     debug(F110,"addmac macro def",nam,0);
  79. /* Not a macro argument or a variable, so it's a macro definition */
  80.     y = isaa(nam); /* If it's not an associative array */
  81.     debug(F111,"addmac isaa",nam,y);
  82.     x = y ? mxxlook(mactab,nam,nmac) : mxlook(mactab,nam,nmac);
  83.     if (x > -1) {
  84. tra_asg = 0;
  85. delmac(nam); /* If it's there, delete it. */
  86. tra_asg = tra_tmp;
  87.     }
  88.     if (deflen < 1) {
  89. if (tra_asg) traceval(nam,p);
  90. return(0);
  91.     }
  92.     debug(F111,"addmac table size",nam,nmac);
  93.     for (y = 0; /* Find the alphabetical slot */
  94.  y < MAC_MAX && mactab[y].kwd != NULL && strcmp(nam,mactab[y].kwd) > 0;
  95.  y++);
  96.     if (y == MAC_MAX) { /* No more room. */
  97. debug(F101,"addmac table overflow","",y);
  98. printf("?Macro table overflown");
  99. return(-1);
  100.     } else debug(F111,"addmac position",nam,y);
  101.     if (mactab[y].kwd != NULL) { /* Must insert */
  102. for (i = nmac; i > y; i--) { /* Move the rest down one slot */
  103.     mactab[i].kwd = mactab[i-1].kwd;
  104.     mactab[i].mval = mactab[i-1].mval;
  105.     mactab[i].flgs = mactab[i-1].flgs;
  106. }
  107.     }
  108.     p = malloc(namlen + 1); /* Allocate space for name */
  109.     if (!p) {
  110. printf("?addmac malloc error 3: %sn",nam);
  111. return(-1);
  112.     }
  113.     strcpy(p,nam); /* Copy name into new space */
  114.     mactab[y].kwd = p; /* Add pointer to table */
  115.     if (deflen > 0) { /* Same deal for definition */
  116. p = malloc(deflen + 1); /* but watch out for null pointer */
  117. if (p == NULL) {
  118.     printf("?addmac malloc error 5: %sn", nam);
  119.     if (mactab[y].kwd) {
  120. free(mactab[y].kwd);
  121. mactab[y].kwd = NULL;
  122.     }
  123.     return(-1);
  124. } else strcpy(p,def); /* Copy the definition */
  125.     } else p = NULL;
  126.     mactab[y].mval = p;
  127.     mactab[y].flgs = 0;
  128.     nmac++; /* Count this macro */
  129.     if (tra_asg) traceval(nam,p);
  130.     return(y);
  131. }
  132. int
  133. xdelmac(x) int x; { /* Delete a macro given its index */
  134.     int i;
  135.     extern int tra_asg;
  136.     if (x < 0) return(x);
  137.     if (tra_asg)
  138.       traceval(mactab[x].kwd,NULL);
  139.     if (mactab[x].kwd) { /* Free the storage for the name */
  140. free(mactab[x].kwd);
  141. mactab[x].kwd = NULL;
  142.     }
  143.     if (mactab[x].mval) { /* and for the definition */
  144. free(mactab[x].mval);
  145. mactab[x].mval = NULL;
  146.     }
  147.     for (i = x; i < nmac; i++) { /* Now move up the others. */
  148. mactab[i].kwd = mactab[i+1].kwd;
  149. mactab[i].mval = mactab[i+1].mval;
  150. mactab[i].flgs = mactab[i+1].flgs;
  151.     }
  152.     nmac--; /* One less macro */
  153.     mactab[nmac].kwd = NULL; /* Delete last item from table */
  154.     mactab[nmac].mval = NULL;
  155.     mactab[nmac].flgs = 0;
  156.     return(0);
  157. }
  158. int
  159. delmac(nam) char *nam; { /* Delete the named macro */
  160.     int x, z;
  161.     char *p, c;
  162.     extern int tra_asg;
  163.     if (!nam) return(0); /* Watch out for null pointer */
  164.     debug(F110,"delmac nam",nam,0);
  165.     if (*nam == CMDQ) nam++;
  166.     if (*nam == '%') { /* If it's a variable name */
  167. if (!(c = *(nam+1))) return(0); /* Get variable name letter or digit */
  168. p = (char *)0; /* Initialize value pointer */
  169. if (maclvl > -1 && c >= '0' && c <= '9') { /* Digit? */
  170.     p = m_arg[maclvl][c - '0']; /* Get pointer from macro-arg table */
  171.     m_arg[maclvl][c - '0'] = NULL; /* Zero the table pointer */
  172. } else { /* It's a global variable */
  173.     if (c < 33 || c > GVARS) return(0);
  174.     p = g_var[c]; /* Get pointer from global-var table */
  175.     g_var[c] = NULL; /* Zero the table entry */
  176. }
  177. if (p) {
  178.     debug(F110,"delmac def",p,0);
  179.     free(p); /* Free the storage */
  180.     p = NULL;
  181. } else debug(F110,"delmac def","(null pointer)",0);
  182. if (tra_asg) traceval(nam,NULL);
  183. return(0);
  184.     }
  185.     if (*nam == '&') { /* An array reference? */
  186. char **q;
  187. if (arraynam(nam,&x,&z) < 0) /* If syntax is bad */
  188.   return(-1); /* return -1. */
  189. x -= ARRAYBASE; /* Convert name to number. */
  190. if ((q = a_ptr[x]) == NULL) /* If array not declared, */
  191.   return(-2); /* return -2. */
  192. if (z > a_dim[x]) /* If subscript out of range, */
  193.   return(-3); /* return -3. */
  194. if (q[z]) { /* If there is an old value, */
  195.     debug(F110,"delmac def",q[z],0);
  196.     if (x != 0) /* Macro arg vector is just a copy */
  197.       free(q[z]); /* Others are real so free them */
  198.     q[z] = NULL;
  199.     if (tra_asg) traceval(nam,NULL);
  200. } else debug(F110,"delmac def","(null pointer)",0);
  201.     }
  202.    /* Not a variable or an array, so it must be a macro. */
  203.     z = isaa(nam);
  204.     debug(F111,"delmac isaa",nam,z);
  205.     x = z ? mxxlook(mactab,nam,nmac) : mlook(mactab,nam,nmac);
  206.     if (x < 0) {
  207. debug(F111,"delmac mlook",nam,x);
  208. return(x);
  209.     }
  210.     return(xdelmac(x));
  211. }
  212. VOID
  213. initmac() { /* Init macro & variable tables */
  214.     int i, j, x;
  215.     nmac = 0; /* No macros */
  216.     for (i = 0; i < MAC_MAX; i++) { /* Initialize the macro table */
  217. mactab[i].kwd = NULL;
  218. mactab[i].mval = NULL;
  219. mactab[i].flgs = 0;
  220.     }
  221.     x = (MAXARGLIST + 1) * sizeof(char **);
  222.     for (i = 0; i < MACLEVEL; i++) { /* Init the macro argument tables */
  223. m_xarg[i] = (char **) malloc(x);
  224. mrval[i] = NULL; /* Macro return value */
  225. /* Pointer to entire argument vector, level i, for &_[] array */
  226. for (j = 0; j <= MAXARGLIST; j++) { /* Macro argument list */
  227.     if (j < 10) /* For the %0..%9 variables */
  228.       m_arg[i][j] = NULL; /* Pointer to arg j, level i. */
  229.     if (m_xarg[i]) /* For &_[] - all args. */
  230.       m_xarg[i][j] = NULL;
  231. }
  232.     }
  233.     for (i = 0; i < GVARS; i++) { /* And the global variables table */
  234. g_var[i] = NULL;
  235.     }
  236.     /* And the table of arrays */
  237.     for (i = 0; i < (int) 'z' - ARRAYBASE + 1; i++) {
  238. a_ptr[i] = (char **) NULL; /* Null pointer for each */
  239. a_dim[i] = 0; /* and a dimension of zero */
  240. for (j = 0; j < CMDSTKL; j++) {
  241.     aa_ptr[j][i] = (char **) NULL;
  242.     aa_dim[j][i] = 0;
  243. }
  244.     }
  245. }
  246. int
  247. popclvl() { /* Pop command level, return cmdlvl */
  248.     extern int tra_cmd;
  249.     struct localvar * v;
  250.     int i;
  251.     debug(F101,"popclvl cmdlvl","",cmdlvl);
  252.     if (cmdlvl > 0) {
  253. if (v = localhead[cmdlvl]) { /* Did we save any variables? */
  254.     while (v) { /* Yes */
  255. if (v->lv_value) /* Copy old ones back */
  256.   addmac(v->lv_name,v->lv_value);
  257. else
  258.   delmac(v->lv_name);
  259. v = v->lv_next;
  260.     }
  261.     freelocal(cmdlvl); /* Free local storage */
  262. }
  263. /* Automatic arrays do not use the localhead list */
  264. for (i = 0; i < 28; i++) { /* Free any local arrays */
  265.     if (aa_ptr[cmdlvl][i]) { /* Does this one exist? */
  266. dclarray((char)(i+ARRAYBASE),0); /* Destroy global one */
  267. a_ptr[i] = aa_ptr[cmdlvl][i];
  268. a_dim[i] = aa_dim[cmdlvl][i];
  269. aa_ptr[cmdlvl][i] = (char **)NULL;
  270. aa_dim[cmdlvl][i] = 0;
  271.     } else if (aa_dim[cmdlvl][i] == -23) { /* Secret code */
  272. dclarray((char)(i+ARRAYBASE),0); /* (see pusharray()) */
  273. aa_ptr[cmdlvl][i] = (char **)NULL;
  274. aa_dim[cmdlvl][i] = 0;
  275.     }
  276.     /* Otherwise do nothing - it is a local array that was declared */
  277.     /* at a level above this one so leave it alone. */
  278. }
  279.     }
  280.     if (cmdlvl < 1) { /* If we're already at top level */
  281. cmdlvl = 0; /* just make sure all the */
  282. tlevel = -1; /* stack pointers are set right */
  283. maclvl = -1; /* and return */
  284.     } else if (cmdstk[cmdlvl].src == CMD_TF) { /* Reading from TAKE file? */
  285. debug(F101,"popclvl tlevel","",tlevel);
  286. if (tlevel > -1) { /* Yes, */
  287.     fclose(tfile[tlevel]); /* close it */
  288.     if (tfnam[tlevel]) { /* free storage for name */
  289. free(tfnam[tlevel]);
  290. tfnam[tlevel] = NULL;
  291.     }
  292.     tlevel--; /* and pop take level */
  293.     cmdlvl--; /* and command level */
  294.     quiet = xquiet[cmdlvl];
  295. } else tlevel = -1;
  296.     } else if (cmdstk[cmdlvl].src == CMD_MD) { /* In a macro? */
  297. debug(F101,"popclvl maclvl","",maclvl);
  298. if (maclvl > -1) { /* Yes, */
  299. #ifdef COMMENT
  300.     int i;
  301.     char **q;
  302. #endif /* COMMENT */
  303.     macp[maclvl] = ""; /* set macro pointer to null string */
  304.     *cmdbuf = ''; /* clear the command buffer */
  305.     if ((maclvl > 0) && /* 2 May 1999 */
  306. (m_arg[maclvl-1][0]) &&
  307. (!strncmp(m_arg[maclvl-1][0],"_xif",4) ||
  308.  !strncmp(m_arg[maclvl-1][0],"_for",4) ||
  309.  !strncmp(m_arg[maclvl-1][0],"_swi",4) ||
  310.  !strncmp(m_arg[maclvl-1][0],"_whi",4)) &&
  311. mrval[maclvl+1]) {
  312. makestr(&(mrval[maclvl-1]),mrval[maclvl+1]);
  313.     }
  314.     if (maclvl+1 < MACLEVEL) {
  315. if (mrval[maclvl+1]) { /* Free any deeper return values. */
  316.     free(mrval[maclvl+1]);
  317.     mrval[maclvl+1] = NULL;
  318. }
  319.     }
  320.     maclvl--; /* Pop macro level */
  321.     cmdlvl--; /* and command level */
  322.     debug(F101,"popclvl mac new maclvl","",maclvl);
  323.     debug(F111,"popclvl mac mrval[maclvl+1]",mrval[maclvl+2],maclvl+1);
  324.     quiet = xquiet[cmdlvl];
  325. #ifdef COMMENT
  326.     q = a_ptr[0];
  327.     debug(F101,"popclvl mac 7","",maclvl);
  328.     if (maclvl > -1)
  329.       for (i = 0; i < 10; i++) /* Restore previous arg vector */
  330. q[i] = m_arg[maclvl][i];
  331. #else
  332.     if (maclvl > -1) {
  333. a_ptr[0] = m_xarg[maclvl];
  334. a_dim[0] = n_xarg[maclvl];
  335.     } else {
  336. a_ptr[0] = topxarg;;
  337. a_dim[0] = topargc;
  338.     }
  339. #endif /* COMMENT */
  340. } else maclvl = -1;
  341.     }
  342. #ifndef MAC
  343.     if (cmdlvl < 1) { /* If back at top level */
  344. setint();
  345. concb((char)escape); /* Go into cbreak mode */
  346.     }
  347. #endif /* MAC */
  348.     if (tra_cmd && cmdlvl > 0) {
  349. if (cmdstk[cmdlvl].src == CMD_TF) {
  350.     printf("[%d] -F: "%s"n",cmdlvl,tfnam[cmdstk[cmdlvl].lvl]);
  351. } else if (cmdstk[cmdlvl].src == CMD_MD) {
  352.     char * m;
  353.     m = m_arg[cmdstk[cmdlvl].lvl][0]; /* Name of this macro */
  354.     printf("[%d] -M: "%s"n",cmdlvl,m);
  355. }
  356.     }
  357.     return(cmdlvl < 1 ? 0 : cmdlvl); /* Return command level */
  358. }
  359. #else /* No script programming language */
  360. int popclvl() { /* Just close current take file. */
  361.     if (tlevel > -1) { /* if any... */
  362. if (tfnam[tlevel]) {
  363.     free(tfnam[tlevel]);
  364.     tfnam[tlevel] = NULL;
  365. }
  366. fclose(tfile[tlevel--]);
  367.     }
  368.     if (tlevel == -1) { /* And if back at top level */
  369. setint();
  370.         concb((char)escape); /* and go back into cbreak mode. */
  371.     }
  372.     return(tlevel + 1);
  373. }
  374. #endif /* NOSPL */
  375. /* STOP - get back to C-Kermit prompt, no matter where from. */
  376. int
  377. dostop() {
  378.     while (popclvl()) ; /* Pop all macros & take files */
  379. #ifndef NOSPL
  380.     while (cmpop() > -1); /* And all recursive cmd pkg invocations */
  381. #endif /* NOSPL */
  382.     cmini(ckxech); /* Clear the command buffer. */
  383.     return(0);
  384. }
  385. /* Close the given log */
  386. int
  387. doclslog(x) int x; {
  388.     int y;
  389.     switch (x) {
  390. #ifdef DEBUG
  391.       case LOGD:
  392. if (deblog <= 0) {
  393.     printf("?Debugging log wasn't openn");
  394.     return(0);
  395. }
  396. debug(F100,"Debug Log Closed","",0L);
  397. *debfil = '';
  398. deblog = 0;
  399. return(zclose(ZDFILE));
  400. #endif /* DEBUG */
  401. #ifndef NOXFER
  402.       case LOGP:
  403. if (pktlog <= 0) {
  404.     printf("?Packet log wasn't openn");
  405.     return(0);
  406. }
  407. *pktfil = '';
  408. pktlog = 0;
  409. return(zclose(ZPFILE));
  410. #endif /* NOXFER */
  411. #ifndef NOLOCAL
  412.       case LOGS:
  413. if (seslog <= 0) {
  414.     printf("?Session log wasn't openn");
  415.     return(0);
  416. }
  417. *sesfil = '';
  418. seslog = 0;
  419. return(zclose(ZSFILE));
  420. #endif /* NOLOCAL */
  421. #ifdef TLOG
  422.       case LOGT:
  423. if (tralog <= 0) {
  424.     if (msgflg) printf("?Transaction log wasn't openn");
  425.     return(0);
  426. }
  427. tlog(F100,"Transaction Log Closed","",0L);
  428. *trafil = '';
  429. tralog = 0;
  430. return(zclose(ZTFILE));
  431. #endif /* TLOG */
  432. #ifdef CKLOGDIAL
  433.       case LOGM:
  434. if (dialog <= 0) {
  435.     if (msgflg) printf("?Connection log wasn't openn");
  436.     return(0);
  437. }
  438. *diafil = '';
  439. dialog = 0;
  440. return(zclose(ZDIFIL));
  441. #endif /* CKLOGDIAL */
  442. #ifndef NOSPL
  443.       case LOGW: /* WRITE file */
  444.       case LOGR: /* READ file */
  445. y = (x == LOGR) ? ZRFILE : ZWFILE;
  446. if (chkfn(y) < 1) /* If no file to close */
  447.   return(1); /* succeed silently. */
  448. return(zclose(y)); /* Otherwise, close the file. */
  449. #endif /* NOSPL */
  450.       default:
  451. printf("n?Unexpected log designator - %dn", x);
  452. return(0);
  453.     }
  454. }
  455. static int slc = 0; /* Screen line count */
  456. char *
  457. showoff(x) int x; {
  458.     return(x ? "on" : "off");
  459. }
  460. char *
  461. showooa(x) int x; {
  462.     switch (x) {
  463.       case SET_OFF:  return("off");
  464.       case SET_ON:   return("on");
  465.       case SET_AUTO: return("automatic");
  466.       default:       return("(unknown)");
  467.     }
  468. }
  469. #ifdef GEMDOS
  470. isxdigit(c) int c; {
  471.     return(isdigit(c) ||
  472.    (c >= 'a' && c <= 'f') ||
  473.    (c >= 'A' && c <= 'F'));
  474. }
  475. #endif /* GEMDOS */
  476. #ifndef NOSETKEY
  477. #ifdef OS2
  478. static struct keytab shokeytab[] = { /* SHOW KEY modes */
  479.     "all",    1, 0,
  480.     "one",    0, 0
  481. };
  482. static int nshokey = (sizeof(shokeytab) / sizeof(struct keytab));
  483. #define SHKEYDEF TT_MAX+5
  484. struct keytab shokeymtab[] = {
  485.     "aixterm",   TT_AIXTERM, 0,         /* IBM AIXterm */
  486.     "ansi-bbs",  TT_ANSI,    0, /* ANSI.SYS (BBS) */
  487.     "at386",     TT_AT386,   0, /* Unixware ANSI */
  488.     "avatar/0+", TT_ANSI,    0,         /* AVATAR/0+ */
  489.     "ba80",      TT_BA80,    0,         /* Nixdorf BA80 */
  490.     "be",        TT_BEOS,    CM_INV|CM_ABR,
  491.     "beos-ansi", TT_BEOS,    CM_INV,    /* BeOS ANSI */
  492.     "beterm",    TT_BEOS,    0,         /* BeOS Console */
  493.     "d200",     TT_DG200,   CM_INV|CM_ABR, /* Data General DASHER 200 */
  494.     "d210",     TT_DG210,   CM_INV|CM_ABR, /* Data General DASHER 210 */
  495.     "d217",     TT_DG217,   CM_INV|CM_ABR, /* Data General DASHER 217 */
  496.     "default",   SHKEYDEF,   0,
  497.     "dg200",     TT_DG200,   0, /* Data General DASHER 200 */
  498.     "dg210",     TT_DG210,   0,     /* Data General DASHER 210 */
  499.     "dg217",     TT_DG217,   0,     /* Data General DASHER 217 */
  500.     "emacs",     TT_KBM_EMACS,   0,     /* Emacs mode */
  501.     "h19",       TT_H19,     CM_INV, /* Heath-19 */
  502.     "heath19",   TT_H19,     0, /* Heath-19 */
  503.     "hebrew",    TT_KBM_HEBREW, 0,      /* Hebrew mode */
  504.     "hft",       TT_HFT,     0,         /* IBM HFT */
  505.     "hp2621a",   TT_HP2621,  0, /* HP 2621A */
  506.     "hpterm",    TT_HPTERM,  0, /* HP TERM */
  507.     "hz1500",    TT_HZL1500, 0,     /* Hazeltine 1500 */
  508.     "ibm3151",   TT_IBM31,   CM_INV,    /* IBM 3101-xx,3161 */
  509.     "linux",     TT_LINUX,   0,         /* Linux */
  510.     "qansi",     TT_QANSI,   0,         /* QNX ANSI */
  511.     "qnx",       TT_QNX,     0,         /* QNX */
  512.     "russian",   TT_KBM_RUSSIAN, 0,     /* Russian mode */
  513.     "scoansi",   TT_SCOANSI, 0, /* SCO ANSI */
  514.     "sni-97801", TT_97801,   0,         /* Sinix 97801 */
  515. #ifdef OS2PM
  516. #ifdef COMMENT
  517.     "tek4014", TT_TEK40, 0,
  518. #endif /* COMMENT */
  519. #endif /* OS2PM */
  520.     "tty",     TT_NONE,  0,
  521.     "tvi910+", TT_TVI910, 0,
  522.     "tvi925",  TT_TVI925, 0,
  523.     "tvi950",  TT_TVI950, 0,
  524.     "vc404",   TT_VC4404, 0,
  525.     "vc4404",  TT_VC4404, CM_INV,
  526.     "vip7809", TT_VIP7809, 0,
  527.     "vt100",   TT_VT100, 0,
  528.     "vt102",   TT_VT102, 0,
  529.     "vt220",   TT_VT220, 0,
  530.     "vt220pc", TT_VT220PC, 0,
  531.     "vt320",   TT_VT320, 0,
  532.     "vt320pc", TT_VT320PC, 0,
  533.     "vt52",    TT_VT52,  0,
  534.     "wp",      TT_KBM_WP, 0,
  535.     "wy160",   TT_WY160,  0,
  536.     "wy30",    TT_WY30,  0,
  537.     "wy370",   TT_WY370, 0,
  538.     "wy50",    TT_WY50,  0,
  539.     "wy60",    TT_WY60,  0,
  540.     "wyse30",  TT_WY30,  CM_INV,
  541.     "wyse370", TT_WY370, CM_INV,
  542.     "wyse50",  TT_WY50,  CM_INV,
  543.     "wyse60",  TT_WY60,  CM_INV
  544. };
  545. int nshokeym = (sizeof(shokeymtab) / sizeof(struct keytab));
  546. #endif /* OS2 */
  547. VOID
  548. #ifdef OS2
  549. shokeycode(c,m) int c, m;
  550. #else
  551. shokeycode(c) int c;
  552. #endif
  553. /* shokeycode */ {
  554.     KEY ch;
  555.     CHAR *s;
  556. #ifdef OS2
  557.     int i;
  558.     con_event km;
  559. #else /* OS2 */
  560.     int km;
  561. #endif /* OS2 */
  562. #ifdef OS2
  563.     extern int mskkeys;
  564.     char * mstr = "";
  565.     if (c >= KMSIZE) {
  566. bleep(BP_FAIL);
  567. return;
  568.     }
  569. #else /* OS2 */
  570.     printf(" Key code \%d => ", c);
  571. #endif /* OS2 */
  572. #ifndef OS2
  573.     km = mapkey(c);
  574. #ifndef NOKVERBS
  575.     if (IS_KVERB(km)) { /* Kverb? */
  576. int i, kv;
  577. kv = km & ~(F_KVERB);
  578. printf("Verb: ");
  579. for (i = 0; i < nkverbs; i++)
  580.   if (kverbs[i].kwval == kv) {
  581.       printf("\K%s",kverbs[i].kwd);
  582.       break;
  583.   }
  584. printf("n");
  585.     } else
  586. #endif /* NOKVERBS */
  587.       if (IS_CSI(km)) {
  588.   int xkm = km & 0xFF;
  589.   if (xkm <= 32 || xkm >= 127)
  590.     printf("String: \{27}[\{%d}n",xkm);
  591.   else
  592.     printf("String: \{27}[%cn",xkm);
  593.       } else if (IS_ESC(km)) {
  594.   int xkm = km & 0xFF;
  595.   if (xkm <= 32 || xkm >= 127)
  596.     printf("String: \{27}\{%d}n",xkm);
  597.   else
  598.     printf("String: \{27}%cn",xkm);
  599.       } else if (macrotab[c]) { /* See if there's a macro */
  600.   printf("String: "); /* If so, display its definition */
  601.   s = macrotab[c];
  602.   shostrdef(s);
  603.   printf("n");
  604. #ifndef NOKVERBS
  605.     } else if (km >= 0x100) { /* This means "undefined" */
  606. printf("Undefinedn");
  607. #endif /* NOKVERBS */
  608.     } else { /* No macro, show single character */
  609. printf("Character: ");
  610. ch = km;
  611. if (ch < 32 || ch == 127
  612. #ifdef OS2
  613.     || ch > 255
  614. #endif /* OS2 */
  615. #ifndef NEXT
  616. #ifndef AUX
  617. #ifndef XENIX
  618. #ifndef OS2
  619.     || (ch > 127 && ch < 160)
  620. #endif /* OS2 */
  621. #endif /* XENIX */
  622. #endif /* AUX */
  623. #endif /* NEXT */
  624.     )
  625. /*
  626.   These used to be %d, but gcc 1.93 & later complain about type mismatches.
  627.   %u is supposed to be totally portable.
  628. */
  629.   printf("\%u",(unsigned int) ch);
  630. else printf("%c \%u",(CHAR) (ch & 0xff),(unsigned int) ch);
  631. if (ch == (KEY) c)
  632.   printf(" (self, no translation)n");
  633. else
  634.   printf("n");
  635.     }
  636. #else /* OS2 */
  637.     if (m < 0) {
  638.         km = mapkey(c);
  639.         mstr = "default";
  640.     } else {
  641.         km = maptermkey(c,m);
  642.         for (i = 0; i < nshokeym; i++) {
  643.             if (m == shokeymtab[i].kwval) {
  644.                 mstr = shokeymtab[i].kwd;
  645.                 break;
  646.             }
  647.         }
  648.     }
  649.     s = keyname(c);
  650.     debug(F111,"shokeycode mstr",mstr,m);
  651.     debug(F111,"shokeycode keyname",s,c);
  652.     printf(" %sKey code \%d %s (%s) => ",
  653.             mskkeys ? "mskermit " : "",
  654.             mskkeys ? cktomsk(c) : c,
  655.     s == NULL ? "" : s, mstr);
  656.     switch (km.type) {
  657. #ifndef NOKVERBS
  658.       case kverb: {
  659.   int i, kv;
  660.   kv = km.kverb.id & ~(F_KVERB);
  661.   printf("Verb: ");
  662.   for (i = 0; i < nkverbs; i++) {
  663.       if (kverbs[i].kwval == kv) {
  664.   printf("\K%s",kverbs[i].kwd);
  665.   break;
  666.       }
  667.   }
  668.   printf("n");
  669.   break;
  670.       }
  671. #endif /* NOKVERBS */
  672.       case csi: {
  673.   int xkm = km.csi.key & 0xFF;
  674.   if (xkm <= 32 || xkm >= 127)
  675.     printf("String: \{27}[\{%d}n",xkm);
  676.   else
  677.     printf("String: \{27}[%cn",xkm);
  678.   break;
  679.       }
  680.       case esc: {
  681.   int xkm = km.esc.key & 0xFF;
  682.   if (xkm <= 32 || xkm >= 127)
  683.     printf("String: \{%d}\{%d}n",ISDG200(tt_type)?30:27,xkm);
  684.   else
  685.     printf("String: \{%d}%cn",ISDG200(tt_type)?30:27,xkm);
  686.   break;
  687.       }
  688.       case macro: {
  689.   printf("String: "); /* Macro, display its definition */
  690.   shostrdef(km.macro.string);
  691.   printf("n");
  692.   break;
  693.       }
  694.       case literal: {
  695.           printf("Literal string: "); /* Literal, display its definition */
  696.           shostrdef(km.literal.string);
  697.           printf("n");
  698.           break;
  699.       }
  700.       case error: {
  701.   if (c >= 0x100) {
  702.       printf("Undefinedn");
  703.   } else {
  704.       printf("Character: ");
  705.       ch = c;
  706.       if (ch < 32 || ch == 127 || ch > 255
  707. #ifndef NEXT
  708. #ifndef AUX
  709. #ifndef XENIX
  710. #ifndef OS2
  711.    || (ch > 127 && ch < 160)
  712. #endif /* OS2 */
  713. #endif /* XENIX */
  714. #endif /* AUX */
  715. #endif /* NEXT */
  716.    )
  717. /*
  718.   These used to be %d, but gcc 1.93 & later complain about type mismatches.
  719.   %u is supposed to be totally portable.
  720. */
  721.   printf("\%u",(unsigned int) ch);
  722.       else printf("%c \%u",(CHAR) (ch & 0xff),(unsigned int) ch);
  723.       printf(" (self, no translation)n");
  724.   }
  725.   break;
  726.       }
  727.       case key: {
  728.   printf("Character: ");
  729.   ch = km.key.scancode;
  730.   if (ch < 32 || ch == 127 || ch > 255
  731. #ifndef NEXT
  732. #ifndef AUX
  733. #ifndef XENIX
  734. #ifndef OS2
  735.       || (ch > 127 && ch < 160)
  736. #else
  737.                || (ch > 127)
  738. #endif /* OS2 */
  739. #endif /* XENIX */
  740. #endif /* AUX */
  741. #endif /* NEXT */
  742.       )
  743. /*
  744.   These used to be %d, but gcc 1.93 & later complain about type mismatches.
  745.   %u is supposed to be totally portable.
  746. */
  747.     printf("\%u",(unsigned int) ch);
  748.   else printf("%c \%u",(CHAR) (ch & 0xff),(unsigned int) ch);
  749.   if (ch == (KEY) c)
  750.     printf(" (self, no translation)n");
  751.   else
  752.     printf("n");
  753.   break;
  754.       }
  755.     }
  756. #endif /* OS2 */
  757. }
  758. #endif /* NOSETKEY */
  759. VOID
  760. shostrdef(s) CHAR * s; {
  761.     CHAR ch;
  762.     while (ch = *s++) {
  763. if (ch < 32 || ch == 127 || ch == 255
  764. /*
  765.   Systems whose native character sets have graphic characters in C1...
  766. */
  767. #ifndef NEXT /* NeXT */
  768. #ifndef AUX /* Macintosh */
  769. #ifndef XENIX /* IBM PC */
  770. #ifdef OS2
  771. /*
  772.   It doesn't matter whether the local host can display 8-bit characters
  773.   or not, they are not portable among character-sets and fonts.  Who
  774.   knows what is going to be displayed
  775. */
  776.     || (ch > 127)
  777. #else /* OS2 */
  778.     || (ch > 127 && ch < 160)
  779. #endif /* OS2 */
  780. #endif /* XENIX */
  781. #endif /* AUX */
  782. #endif /* NEXT */
  783.     )
  784.   printf("\{%d}",ch); /* Display control characters */
  785. else putchar((char) ch); /* in backslash notation */
  786.     }
  787. }
  788. #define xxdiff(v,sys) strncmp(v,sys,strlen(sys))
  789. #ifndef NOSHOW
  790. VOID
  791. shover() {
  792. #ifdef OS2
  793.     extern char ckxsystem[];
  794. #endif /* OS2 */
  795.     extern long xvernum;
  796.     extern char *ck_patch, * cklibv;
  797.     printf("nVersions:n %sn",versio);
  798.     printf(" Numeric: %ldn",vernum);
  799. #ifdef OS2
  800.     printf(" Operating System: %sn", ckxsystem);
  801. #else /* OS2 */
  802.     printf(" Built for: %sn", ckxsys);
  803. #ifdef CK_UTSNAME
  804.     if (unm_nam[0])
  805.       printf(" Running on: %s %s %s %sn", unm_nam,unm_ver,unm_rel,unm_mch);
  806. #endif /* CK_UTSNAME */
  807.     printf(" Patches: %sn", *ck_patch ? ck_patch : "(none)");
  808. #endif /* OS2 */
  809.     if (xxdiff(ckxv,ckxsys))
  810.       printf(" %s for%sn",ckxv,ckxsys);
  811.     else
  812.       printf(" %sn",ckxv);
  813.     if (xxdiff(ckzv,ckzsys))
  814.       printf(" %s for%sn",ckzv,ckzsys);
  815.     else
  816.       printf(" %sn",ckzv);
  817.     printf(" %sn",cklibv);
  818.     printf(" %sn",protv);
  819.     printf(" %sn",fnsv);
  820.     printf(" %sn %sn",cmdv,userv);
  821. #ifndef NOCSETS
  822.     printf(" %sn",xlav);
  823. #endif /* NOCSETS */
  824. #ifndef MAC
  825. #ifndef NOLOCAL
  826.     printf(" %sn",connv);
  827. #endif /* NOLOCAL */
  828. #endif /* MAC */
  829. #ifndef NODIAL
  830.     printf(" %sn",dialv);
  831. #endif /* NODIAL */
  832. #ifndef NOSCRIPT
  833.     printf(" %sn",loginv);
  834. #endif /* NOSCRIPT */
  835. #ifdef NETCONN
  836.     printf(" %sn",cknetv);
  837. #ifdef OS2
  838.     printf(" %sn",ckonetv);
  839. #ifdef CK_NETBIOS
  840.     printf(" %sn",ckonbiv);
  841. #endif /* CK_NETBIOS */
  842. #endif /* OS2 */
  843. #endif /* NETCONN */
  844. #ifdef TNCODE
  845.     printf(" %sn",cktelv);
  846. #endif /* TNCODE */
  847. #ifdef OS2
  848. #ifdef OS2MOUSE
  849.     printf(" %sn",ckomouv);
  850. #endif /* OS2MOUSE */
  851. #endif /* OS2 */
  852. #ifdef CK_AUTHENTICATION
  853.     printf(" %sn",ckathv);
  854. #endif /* CK_AUTHENTICATION */
  855. #ifdef CK_ENCRYPTION
  856. #ifdef CRYPT_DLL
  857.     printf(" %sn",ck_crypt_dll_version());
  858. #else /* CRYPT_DLL */
  859.     printf(" %sn",ckcrpv);
  860. #endif /* CRYPT_DLL */
  861. #endif /* CK_ENCRYPTION */
  862. #ifdef CK_SSL
  863.     printf(" %sn",cksslv);
  864. #endif /* CK_SSL */
  865.     printf("n");
  866. }
  867. #ifdef CK_LABELED
  868. VOID
  869. sholbl() {
  870. #ifdef VMS
  871.     printf("VMS Labeled File Features:n");
  872.     printf(" acl %s (ACL info %s)n",
  873.    showoff(lf_opts & LBL_ACL),
  874.    lf_opts & LBL_ACL ? "preserved" : "discarded");
  875.     printf(" backup-date %s (backup date/time %s)n",
  876.    showoff(lf_opts & LBL_BCK),
  877.    lf_opts & LBL_BCK ? "preserved" : "discarded");
  878.     printf(" name %s (original filename %s)n",
  879.    showoff(lf_opts & LBL_NAM),
  880.    lf_opts & LBL_NAM ? "preserved" : "discarded");
  881.     printf(" owner %s (original file owner id %s)n",
  882.    showoff(lf_opts & LBL_OWN),
  883.    lf_opts & LBL_OWN ? "preserved" : "discarded");
  884.     printf(" path %s (original file's disk:[directory] %s)n",
  885.    showoff(lf_opts & LBL_PTH),
  886.    lf_opts & LBL_PTH ? "preserved" : "discarded");
  887. #else
  888. #ifdef OS2
  889.     printf("OS/2 Labeled File features (attributes):n");
  890.     printf(" archive:   %sn", showoff(lf_opts & LBL_ARC));
  891.     printf(" extended:  %sn", showoff(lf_opts & LBL_EXT));
  892.     printf(" hidden:    %sn", showoff(lf_opts & LBL_HID));
  893.     printf(" read-only: %sn", showoff(lf_opts & LBL_RO ));
  894.     printf(" system:    %sn", showoff(lf_opts & LBL_SYS));
  895. #endif /* OS2 */
  896. #endif /* VMS */
  897. }
  898. #endif /* CK_LABELED */
  899. VOID
  900. shotcs(csl,csr) int csl, csr; { /* Show terminal character set */
  901. #ifndef NOCSETS
  902. #ifdef OS2
  903.     extern struct _vtG G[4], *GL, *GR;
  904.     extern int decnrcm, sni_chcode;
  905.     extern int tt_utf8, dec_nrc, dec_kbd, dec_lang;
  906.     printf(" Terminal character-sets:n");
  907.     if (IS97801(tt_type_mode)) {
  908. if (cmask == 0377)
  909.   printf("     Mode: 8-bit Moden");
  910. else
  911.   printf("     Mode: 7-bit Moden");
  912. printf("     CH.CODE is %sn",sni_chcode?"On":"Off");
  913.     } else if (ISVT100(tt_type_mode)) {
  914. if (decnrcm)
  915.   printf("     Mode: 7-bit National Moden");
  916. else
  917.   printf("     Mode: 8-bit Multinational Moden");
  918.     }
  919.     printf("    Local: %s%sn",
  920.    isunicode() ? "Unicode/" : "",
  921.    csl == TX_TRANSP ? "transparent" :
  922.    csl == TX_UNDEF ? "undefined" : txrinfo[csl]->keywd);
  923.     printf(tt_utf8 ?
  924.    "   Remote: UTF-8n           %sG0: %s (%s)n":
  925.    "   Remote: %sG0: %s (%s)n",
  926.    GL == &G[0] ? "GL->" : GR == &G[0] ? "GR->" : "    ",
  927.    txrinfo[G[0].designation]->keywd,
  928.            G[0].designation == TX_TRANSP ? "" :
  929.    G[0].size == cs94 ? "94 chars" :
  930.    G[0].size == cs96 ? "96 chars" : "multi-byte");
  931.     printf("           %sG1: %s (%s)n",
  932.    GL == &G[1] ? "GL->" : GR == &G[1] ? "GR->" : "    ",
  933.    txrinfo[G[1].designation]->keywd,
  934.             G[1].designation == TX_TRANSP ? "" :
  935.             G[1].size == cs94 ? "94 chars" :
  936.             G[1].size == cs96 ? "96 chars" : "multi-byte");
  937.     printf("           %sG2: %s (%s)n",
  938.    GL == &G[2] ? "GL->" : GR == &G[2] ? "GR->" : "    ",
  939.    txrinfo[G[2].designation]->keywd,
  940.             G[2].designation == TX_TRANSP ? "" :
  941.             G[2].size == cs94 ? "94 chars" :
  942.    G[2].size == cs96 ? "96 chars" : "multi-byte");
  943.     printf("           %sG3: %s (%s)n",
  944.    GL == &G[3] ? "GL->" : GR == &G[3] ? "GR->" : "    ",
  945.    txrinfo[G[3].designation]->keywd,
  946.             G[3].designation == TX_TRANSP ? "" :
  947.             G[3].size == cs94 ? "94 chars" :
  948.    G[3].size == cs96 ? "96 chars" : "multi-byte");
  949.     printf("n");
  950.     printf(" Keyboard character-sets:n");
  951.     printf("   Multinational: %sn",txrinfo[dec_kbd]->keywd);
  952.     printf("        National: %sn",txrinfo[dec_nrc]->keywd);
  953. #else /* OS2 */
  954. #ifndef MAC
  955.     char *s;
  956.     debug(F101,"TERM LOCAL CSET","",csl);
  957.     debug(F101,"TERM REMOTE CSET","",csr);
  958.     printf(" Terminal character-set: ");
  959.     if (tcs_transp) { /* No translation */
  960. printf("transparentn");
  961.     } else { /* Translation */
  962. printf("%s (remote) %s (local)n",
  963.        fcsinfo[csr].keyword,fcsinfo[csl].keyword);
  964. if (csr != csl) {
  965.     switch(gettcs(csr,csl)) {
  966.       case TC_USASCII:  s = "ascii";        break;
  967.       case TC_1LATIN:   s = "latin1-iso";   break;
  968.       case TC_2LATIN:   s = "latin2-iso";   break;
  969.       case TC_CYRILL:   s = "cyrillic-iso"; break;
  970.       case TC_JEUC:     s = "japanese-euc"; break;
  971.       case TC_HEBREW:   s = "hebrew-iso";   break;
  972.       case TC_GREEK:    s = "greek-iso";    break;
  973.       case TC_9LATIN:   s = "latin9-iso";   break;
  974.       default:          s = "transparent";  break;
  975.     }
  976.     if (strcmp(s,fcsinfo[csl].keyword) &&
  977. strcmp(s,fcsinfo[csr].keyword))
  978.       printf("                         (via %s)n",s);
  979. }
  980.     }
  981. #endif /* MAC */
  982. #endif /* OS2 */
  983. #endif /* NOCSETS */
  984. }
  985. #ifdef OS2
  986. extern char htab[];
  987. VOID
  988. shotabs() {
  989.     int i;
  990.     printf("Tab Stops:nn");
  991.     for (i = 1; i <= 70; i++)
  992.       printf("%c",htab[i]=='T'?'T':'-');
  993.     printf("n1.......10........20........30........40........50........60
  994. ........70nn");
  995.     for (; i <= 140; i++)
  996.       printf("%c",htab[i]=='T'?'T':'-');
  997.     printf("n........80........90.......100.......110.......120.......130
  998. .......140nn");
  999.     for (; i <= 210; i++)
  1000.       printf("%c",htab[i]=='T'?'T':'-');
  1001.     printf("n.......150.......160.......170.......180.......190.......200
  1002. .......210nn");
  1003.     for (; i <= 255; i++)
  1004.       printf("%c",htab[i]=='T'?'T':'-');
  1005.     printf("n.......220.......230.......240.......250..255n");
  1006. }
  1007. #endif /* OS2 */
  1008. #ifdef OS2MOUSE
  1009. VOID
  1010. shomou() {
  1011.     int button, event, id, i;
  1012.     char * name = "";
  1013.     printf("Mouse settings:n");
  1014.     printf("   Active:         %snn",showoff(tt_mouse));
  1015.     for (button = 0; button < MMBUTTONMAX; button++)
  1016.       for (event = 0; event < MMEVENTSIZE; event++)
  1017. if (mousemap[button][event].type != error)
  1018.   switch (mousemap[button][event].type) {
  1019.     case key:
  1020.       printf("   %s = Character: %c \%dn",
  1021.      mousename(button,event),
  1022.      mousemap[button][event].key.scancode,
  1023.      mousemap[button][event].key.scancode );
  1024.       break;
  1025.     case kverb:
  1026.       id = mousemap[button][event].kverb.id & ~(F_KVERB);
  1027.       if (id != K_IGNORE) {
  1028.   for (i = 0; i< nkverbs; i++)
  1029.     if (id == kverbs[i].kwval) {
  1030. name = kverbs[i].kwd;
  1031. break;
  1032.     }
  1033.   printf("   %s = Kverb: \K%sn",
  1034.  mousename(button,event),
  1035.  name
  1036.  );
  1037.       }
  1038.       break;
  1039.     case macro:
  1040.       printf("   %s = Macro: ",
  1041.      mousename(button,event) );
  1042.       shostrdef(mousemap[button][event].macro.string);
  1043.       printf("n");
  1044.       break;
  1045.   }
  1046. }
  1047. #endif /* OS2MOUSE */
  1048. #ifndef NOLOCAL
  1049. VOID
  1050. shotrm() {
  1051.     char *s;
  1052.     extern int tt_print;
  1053. #ifdef OS2
  1054.     int lines=0;
  1055.     extern int wy_autopage, autoscroll, sgrcolors, colorreset, user_erasemode,
  1056.     decscnm, decscnm_usr, tt_status, tt_diff_upd, tt_idlesnd_tmo, tt_senddata,
  1057.     wy_blockend, marginbell, marginbellcol, tt_modechg, dgunix;
  1058.     extern char * tt_idlesnd_str, * tt_trigger[];
  1059. #ifdef PCFONTS
  1060.     int i;
  1061.     char *font;
  1062.     if (IsOS2FullScreen()) { /* Determine the font name */
  1063.         if (!os2LoadPCFonts()) {
  1064.             for (i = 0; i < ntermfont; i++) {
  1065.                 if (tt_font == termfont[i].kwval) {
  1066.     font = termfont[i].kwd;
  1067.     break;
  1068. }
  1069.     }
  1070. } else {
  1071.             font = "(DLL not available)";
  1072. }
  1073.     } else {
  1074.         font =     "(full screen only)";
  1075.     }
  1076. #endif /* PCFONTS */
  1077.     printf("Terminal parameters:n");
  1078.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1079.     printf(" %19s: %1d%-12s  %13s: %1d%-14sn",
  1080.    "Bytesize: Command",
  1081.            (cmdmsk == 0377) ? 8 : 7,
  1082.            " bits","Terminal",
  1083.            (cmask == 0377) ? 8 : 7," bits");
  1084.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1085.     printf(" %19s: %-13s","Type",
  1086.    (tt_type >= 0 && tt_type <= max_tt) ?
  1087.    tt_info[tt_type].x_name :
  1088.    "unknown" );
  1089.     if (tt_type >= 0 && tt_type <= max_tt)
  1090.       if (strlen(tt_info[tt_type].x_id))
  1091. printf("  %13s: <ESC>%s","ID",tt_info[tt_type].x_id);
  1092.     printf("n");
  1093.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1094.     printf(" %19s: %-13s  %13s: %-15sn","Echo",
  1095.    duplex ? "local" : "remote","Locking-shift",showoff(sosi));
  1096.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1097.     printf(" %19s: %-13s  %13s: %-15sn","Newline-mode",
  1098.    showoff(tnlm),"Cr-display",tt_crd ? "crlf" : "normal");
  1099.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1100.     printf(" %19s: %-13s  %13s: %-15sn","Cursor",
  1101.    (tt_cursor == 2) ? "full" :
  1102.    (tt_cursor == 1) ? "half" : "underline",
  1103. #ifdef CK_AUTODL
  1104.    "autodownload",autodl ? "on" : "off"
  1105. #else /* CK_AUTODL */
  1106.    "", ""
  1107. #endif /* CK_AUTODL */
  1108.    );
  1109.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1110.     printf(" %19s: %-13s  %13s: %-15sn","Arrow-keys",
  1111.    tt_arrow ? "application" : "cursor",
  1112.            "Keypad-mode", tt_keypad ? "application" : "numeric"
  1113.    );
  1114.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1115.     /* Just to make sure we are using current info */
  1116.     updanswerbk();
  1117.     /*
  1118.        This line doesn't end with 'n' because the answerback string
  1119.        is terminated with a newline
  1120.     */
  1121.     printf(" %19s: %-13s  %13s: %-15s","Answerback",
  1122.    showoff(tt_answer),"response",answerback);
  1123.     switch (tt_bell) {
  1124.       case XYB_NONE:
  1125. s = "none";
  1126. break;
  1127.       case XYB_VIS:
  1128. s= "visible";
  1129. break;
  1130.       case XYB_AUD | XYB_BEEP:
  1131. s="beep";
  1132. break;
  1133.       case XYB_AUD | XYB_SYS:
  1134. s="system sounds";
  1135. break;
  1136.       default:
  1137. s="(unknown)";
  1138.     }
  1139.     printf(" %19s: %-13s  %13s: %-15sn","Bell",s,
  1140.    "Wrap",showoff(tt_wrap));
  1141.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1142.     printf(" %19s: %-13s  %13s: %-15sn","Autopage",showoff(wy_autopage),
  1143.    "Autoscroll",showoff(autoscroll));
  1144.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1145.     printf(" %19s: %-13s  %13s: %-15sn","SGR Colors",showoff(sgrcolors),
  1146.    "ESC[0m color",colorreset?"default-color":"current-color");
  1147.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1148.     printf(" %19s: %-13s  %13s: %-15sn",
  1149.             "Erase color",user_erasemode?"default-color":"current-color",
  1150.    "Screen mode",decscnm?"reverse":"normal");
  1151.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1152.     printf(" %19s: %-13d  %13s: %-15dn","Transmit-timeout",tt_ctstmo,
  1153.    "Output-pacing",tt_pacing);
  1154.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1155.     printf(" %19s: %-13s  %13s: %d secondsn","Idle-Send: string",
  1156.    tt_idlesnd_str,"interval", tt_idlesnd_tmo);
  1157.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1158.     printf(" %19s: %-13s  %13s: %-15sn","Send data",
  1159.   showoff(tt_senddata),"End of Block", wy_blockend?"crlf/etx":"us/cr");
  1160.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1161.     printf(" %19s: %-13s  %13s: %d secondsn","Auto-exit trigger",
  1162.    tt_trigger[0],"Output pacing",tt_pacing );
  1163.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1164.     printf(" %19s: %-13s  %13s: %-15dn","Margin bell",
  1165.    showoff(marginbell),"at column", marginbellcol);
  1166.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1167.     switch (tt_modechg) {
  1168.       case TVC_DIS: s = "disabled"; break;
  1169.       case TVC_ENA: s = "enabled";  break;
  1170.       case TVC_W95: s = "win95-restricted"; break;
  1171.       default: s = "(unknown)";
  1172.     }
  1173.     printf(" %19s: %-13s  %13s: %-15sn","DG Unix mode",
  1174.    showoff(dgunix),"Video change", s);
  1175.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1176. #ifdef CK_APC
  1177.     if (apcstatus == APC_ON) s = "on";
  1178.     else if (apcstatus == APC_OFF) s = "off";
  1179.     else if (apcstatus == APC_UNCH) s = "unchecked";
  1180.     printf(" %19s: %-13s  %13s: %-15sn",
  1181.    "APC", s,
  1182. #ifdef PCFONTS
  1183.    "Font (VGA)",font
  1184. #else /* PCFONTS */
  1185.    "Font (VGA)","(not supported)"
  1186. #endif /* PCFONTS */
  1187.    );
  1188. #endif /* CK_APC */
  1189.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1190. #ifdef CK_TTGWSIZ /* Console terminal screen size */
  1191.     if (tt_cols[VTERM] < 0 || tt_rows[VTERM] < 0)
  1192.       ttgwsiz(); /* Try to get latest size */
  1193. #endif /* CK_TTGWSIZ */
  1194.     printf(" %19s: %-13d  %13s: %-15dn","Height",tt_rows[VTERM],
  1195.            "Width",tt_cols[VTERM]);
  1196.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1197.     printf(" %19s: %-13s  %13s: %d linesn","Roll-mode",
  1198.   tt_roll[VTERM]?"insert":"overwrite","Scrollback", tt_scrsize[VTERM]);
  1199.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1200.     if (updmode == tt_updmode)
  1201.       if (updmode == TTU_FAST)
  1202. s = "fast (fast)";
  1203.       else
  1204. s = "smooth (smooth)";
  1205.     else
  1206.       if (updmode == TTU_FAST)
  1207. s = "fast (smooth)";
  1208.       else
  1209. s = "smooth (fast)";
  1210.     printf(" %19s: %-13s  %13s: %d msn","Screen-update: mode",s,
  1211.    "interval",tt_update);
  1212.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1213.     printf(" %19s: %-13s  %13s: %-15sn",
  1214.    "Screen-optimization",showoff(tt_diff_upd),
  1215.    "Status line",showoff(tt_status));
  1216.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1217.     printf(" %19s: %-13s  %13s: %-15sn","Debug",
  1218.    showoff(debses),"Session log", seslog? sesfil : "(none)" );
  1219.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1220.     /* Display colors (should become SHOW COLORS) */
  1221.     {
  1222.         USHORT row, col;
  1223.         char * colors[16] = {
  1224.             "black","blue","green","cyan","red","magenta","brown","lgray",
  1225.             "dgray","lblue","lgreen","lcyan","lred","lmagent","yellow","white"
  1226. };
  1227.         printf("n");
  1228.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1229.         printf(" Color:");
  1230. #ifndef ONETERMUPD
  1231.         GetCurPos(&row, &col);
  1232.         WrtCharStrAtt("border",    6, row, 9, &colorborder );
  1233. WrtCharStrAtt("debug",     5, row, 17, &colordebug );
  1234.         WrtCharStrAtt("helptext",  8, row, 25, &colorhelp );
  1235. WrtCharStrAtt("reverse",   7, row, 34, &colorreverse );
  1236.         WrtCharStrAtt("select",    6, row, 42, &colorselect );
  1237.         WrtCharStrAtt("status",    6, row, 50, &colorstatus );
  1238.         WrtCharStrAtt("terminal",  8, row, 58, &colornormal );
  1239. WrtCharStrAtt("underline",  9, row, 67, &colorunderline );
  1240. #endif /* ONETERMUPD */
  1241.         row = VscrnGetCurPos(VCMD)->y+1;
  1242.         VscrnWrtCharStrAtt(VCMD, "border",    6, row, 9, &colorborder );
  1243. VscrnWrtCharStrAtt(VCMD, "debug",     5, row, 17, &colordebug );
  1244.         VscrnWrtCharStrAtt(VCMD, "helptext",  8, row, 25, &colorhelp );
  1245. VscrnWrtCharStrAtt(VCMD, "reverse",   7, row, 34, &colorreverse );
  1246.         VscrnWrtCharStrAtt(VCMD, "select",    6, row, 42, &colorselect );
  1247.         VscrnWrtCharStrAtt(VCMD, "status",    6, row, 50, &colorstatus );
  1248.         VscrnWrtCharStrAtt(VCMD, "terminal",  8, row, 58, &colornormal );
  1249. VscrnWrtCharStrAtt(VCMD, "underline",  9, row, 67, &colorunderline );
  1250.         printf("n");
  1251.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1252.         /* Foreground color names */
  1253.         printf("%6s: %-8s%-8s%-9s%-8s%-8s%-8s%-9s%-9sn","fore",
  1254. "",
  1255. colors[colordebug&0x0F],
  1256. colors[colorhelp&0x0F],
  1257. colors[colorreverse&0x0F],
  1258. colors[colorselect&0x0F],
  1259. colors[colorstatus&0x0F],
  1260. colors[colornormal&0x0F],
  1261. colors[colorunderline&0x0F] );
  1262.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1263.         /* Background color names */
  1264.         printf("%6s: %-8s%-8s%-9s%-8s%-8s%-8s%-9s%-9sn","back",
  1265. colors[colorborder],
  1266. colors[colordebug>>4],
  1267. colors[colorhelp>>4],
  1268. colors[colorreverse>>4],
  1269. colors[colorselect>>4],
  1270. colors[colorstatus>>4],
  1271. colors[colornormal>>4],
  1272. colors[colorunderline>>4] );
  1273.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1274.         printf("n");
  1275.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1276.         printf(" Color:");
  1277. #ifndef ONETERMUPD
  1278.         GetCurPos(&row, &col);
  1279.         WrtCharStrAtt("graphic",   7, row, 9, &colorgraphic );
  1280. WrtCharStrAtt("command",   7, row, 17, &colorcmd );
  1281. #endif /* ONETERMUPD */
  1282.         row = VscrnGetCurPos(VCMD)->y+1;
  1283.         VscrnWrtCharStrAtt(VCMD, "graphic",   7, row, 9,  &colorgraphic );
  1284. VscrnWrtCharStrAtt(VCMD, "command",   7, row, 17, &colorcmd );
  1285.         printf("n");
  1286.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1287.         /* Foreground color names */
  1288.         printf("%6s: %-8s%-8sn","fore",
  1289. colors[colorgraphic&0x0F],
  1290. colors[colorcmd&0x0F] );
  1291.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1292.         /* Background color names */
  1293.         printf("%6s: %-8s%-8sn","back",
  1294. colors[colorgraphic>>4],
  1295. colors[colorcmd>>4] );
  1296.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1297.     }
  1298.     printf("n");
  1299.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1300.     {
  1301.         extern int trueblink, truereverse, trueunderline;
  1302.         printf(" Attribute:  blink: %-3s  reverse: %-3s  underline: %-3sn",
  1303.                 trueblink?"on":"off", truereverse?"on":"off",
  1304.                 trueunderline?"on":"off");
  1305.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1306.     }
  1307.     {
  1308.         extern vtattrib WPattrib;
  1309.         printf(" ASCII Protected chars: %s%s%s%s%s%sn",
  1310.                 WPattrib.blinking?"blink ":"",
  1311.                 WPattrib.reversed?"reverse ":"",
  1312.                 WPattrib.underlined?"underline ":"",
  1313.                 WPattrib.bold?"bold ":"",
  1314.                 WPattrib.dim?"dim ":"",
  1315.                 WPattrib.invisible?"invisible ":"");
  1316.         if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1317.     }
  1318.     printf("n");
  1319.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1320.     printf(" CONNECT-mode escape character: %d (Ctrl-%c, %s): %sn",
  1321.    escape,ctl(escape),(escape == 127 ? "DEL" : ccntab[escape]),
  1322.    nm[tt_escape]);
  1323.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1324.     printf(" See SHOW CHARACTER-SETS for character-set infon");
  1325.     if (++lines > cmd_rows - 3) { if (!askmore()) return; else lines = 0; }
  1326. #else /* OS2 */   /* Beginning of new non-OS2 version */
  1327.     printf("n");
  1328.     printf("Terminal parameters:n");
  1329.     printf(" %19s: %1d%-12s  %13s: %1d%-14sn",
  1330.    "Bytesize: Command",
  1331.            (cmdmsk == 0377) ? 8 : 7,
  1332.            " bits","Terminal",
  1333.            (cmask == 0377) ? 8 : 7," bits");
  1334.     s = getenv("TERM");
  1335. #ifdef XPRINT
  1336.     printf(" %19s: %-13s  %13s: %-15sn",
  1337.    "Type",
  1338.    s ? s : "(unknown)",
  1339.    "Print",
  1340.    showoff(tt_print)
  1341.    );
  1342. #else
  1343.     printf(" %19s: %-13sn","Type", s ? s : "(unknown)");
  1344. #endif /* XPRINT */
  1345.     printf(" %19s: %-13s  %13s: %-15sn","Echo",
  1346.    duplex ? "local" : "remote","Locking-shift",showoff(sosi));
  1347.     printf(" %19s: %-13s  %13s: %-15sn","Newline-mode",
  1348.    showoff(tnlm),"Cr-display",tt_crd ? "crlf" : "normal");
  1349. #ifdef CK_APC
  1350.     if (apcstatus == APC_ON) s = "on";
  1351.     else if (apcstatus == APC_OFF) s = "off";
  1352.     else if (apcstatus == APC_UNCH) s = "unchecked";
  1353.     printf(" %19s: %-13s  %13s: %-15sn",
  1354.    "APC", s,
  1355. #ifdef CK_AUTODL
  1356.    "Autodownload", autodl ? "on" : "off"
  1357. #else
  1358.    "",""
  1359. #endif /* CK_AUTODL */
  1360.    );
  1361. #endif /* CK_APC */
  1362. #ifdef CK_TTGWSIZ /* Console terminal screen size */
  1363.     ttgwsiz(); /* Try to get latest size */
  1364.     printf(" %19s: %-13d  %13s: %-15dn","Height",tt_rows, "Width", tt_cols);
  1365. #endif /* CK_TTGWSIZ */
  1366.     printf(" %19s: %-13s  %13s: %-15sn","Debug",
  1367.    showoff(debses),"Session log", seslog? sesfil : "(none)" );
  1368.     printf("n");
  1369.     printf(" CONNECT-mode escape character: %d (Ctrl-%c, %s): %sn",
  1370.    escape,ctl(escape),(escape == 127 ? "DEL" : ccntab[escape]),
  1371.    nm[tt_escape]
  1372.    );
  1373. #ifndef NOCSETS
  1374.     shotcs(tcsl,tcsr); /* Show terminal character sets */
  1375. #endif /* NOCSETS */
  1376. #ifdef UNIX
  1377. #ifndef NOJC
  1378.     printf(" %19s: %-13snn","Suspend", showoff(suspend));
  1379. #endif /* NOJC */
  1380. #endif /* UNIX */
  1381. #endif /* OS2 */
  1382. }
  1383. VOID
  1384. shmdmlin() { /* Briefly show modem & line */
  1385. #ifndef NODIAL
  1386. #ifndef MINIDIAL
  1387. #ifdef OLDTBCODE
  1388.     extern int tbmodel;
  1389.     _PROTOTYP( char * gtbmodel, (void) );
  1390. #endif /* OLDTBCODE */
  1391. #endif /* MINIDIAL */
  1392. #endif /* NODIAL */
  1393.     if (local)
  1394. #ifdef OS2
  1395.       printf(" Port: %s, Modem type: ",ttname);
  1396. #else
  1397.       printf(" Line: %s, Modem type: ",ttname);
  1398. #endif /* OS2 */
  1399.     else
  1400.       printf(
  1401. #ifdef OS2
  1402. " Communication device not yet selected with SET PORTn Modem type: "
  1403. #else
  1404. " Communication device not yet selected with SET LINEn Modem type: "
  1405. #endif /* OS2 */
  1406.      );
  1407. #ifndef NODIAL
  1408.     printf("%s",gmdmtyp());
  1409. #ifndef MINIDIAL
  1410. #ifdef OLDTBCODE
  1411.     if (tbmodel) printf(" (%s)",gtbmodel()); /* Telebit model info */
  1412. #endif /* OLDTBCODE */
  1413. #endif /* MINIDIAL */
  1414. #else
  1415.     printf("(disabled)");
  1416. #endif /* NODIAL */
  1417. }
  1418. #ifdef CK_TAPI
  1419. void
  1420. shotapi(int option) {
  1421.     int rc=0,k ;
  1422.     char *s=NULL;
  1423.     LPDEVCFG        lpDevCfg = NULL;
  1424.     LPCOMMCONFIG    lpCommConfig = NULL;
  1425.     LPMODEMSETTINGS lpModemSettings = NULL;
  1426.     DCB *           lpDCB = NULL;
  1427.     extern struct keytab * tapiloctab; /* Microsoft TAPI Locations */
  1428.     extern int ntapiloc;
  1429.     extern struct keytab * tapilinetab; /* Microsoft TAPI Line Devices */
  1430.     extern int ntapiline;
  1431.     extern int tttapi; /* TAPI in use */
  1432.     extern int tapipass; /* TAPI Passthrough mode */
  1433.     extern int tapiconv; /* TAPI Conversion mode */
  1434.     extern int tapilights;
  1435.     extern int tapipreterm;
  1436.     extern int tapipostterm;
  1437.     extern int tapimanual;
  1438.     extern int tapiinactivity;
  1439.     extern int tapibong;
  1440.     extern int tapiusecfg;
  1441.     extern char tapiloc[];
  1442.     extern int tapilocid;
  1443.     extern int TAPIAvail;
  1444.     if (!TAPIAvail) {
  1445.         printf("TAPI Support not enabledrn");
  1446.         return;
  1447.     }
  1448.     switch (option) {
  1449.       case 0:
  1450. printf("TAPI Settings:n");
  1451. printf("  Line:                      %sn",
  1452.        tttapi ? ttname : "(none in use)");
  1453. cktapiBuildLocationTable(&tapiloctab, &ntapiloc);
  1454. if (tapilocid == -1)
  1455.   tapilocid = cktapiGetCurrentLocationID();
  1456. /* Find the current tapiloc entry */
  1457. /* and use it as the default. */
  1458. for (k = 0; k < ntapiloc; k++) {
  1459.     if (tapiloctab[k].kwval == tapilocid)
  1460.       break;
  1461. }
  1462. if (k >= 0 && k < ntapiloc)
  1463.   s = tapiloctab[k].kwd;
  1464. else
  1465.   s = "(unknown)";
  1466. printf("  Location:                  %sn",s);
  1467. printf("  Modem-dialing:             %sn",tapipass?"off":"on");
  1468. printf("  Phone-number-conversions:  %sn",
  1469. tapiconv==CK_ON?"on":tapiconv==CK_AUTO?"auto":"off");
  1470. printf("  Modem-lights:              %s %sn",tapilights?"on ":"off",
  1471. tapipass?"(n/a)":"");
  1472. printf("  Predial-terminal:          %s %sn",tapipreterm?"on ":"off",
  1473. tapipass?"(n/a)":"");
  1474. printf("  Postdial-terminal:         %s %sn",tapipostterm?"on ":"off",
  1475. tapipass?"(n/a)":"");
  1476. printf("  Manual-dial:               %s %sn",tapimanual?"on ":"off",
  1477. tapipass?"(n/a)":"");
  1478. printf("  Inactivity-timeout:        %d seconds %sn",tapiinactivity,
  1479. tapipass?"(n/a)":"");
  1480. printf("  Wait-for-bong:             %d seconds %sn",tapibong,
  1481. tapipass?"(n/a)":"");
  1482. printf("  Use-windows-configuration: %s %sn",
  1483. tapiusecfg?"on ":"off", tapipass?"(n/a)":"");
  1484. printf("n");
  1485. #ifdef BETATEST
  1486. if (tapipass) {
  1487. printf("K-95 uses the TAPI Line in an exclusive mode.  Other applicationsn");
  1488. printf("may open the device but may not place calls nor answer calls.n");
  1489. printf("Dialing is performed using the K-95 dialing procedures.  SET MODEMn");
  1490. printf("TYPE TAPI after the SET TAPI LINE command to activate the modemn");
  1491. printf("definition associated with the active TAPI LINE device.nn");
  1492. } else {
  1493. printf("K-95 uses the TAPI Line in a cooperative mode.  Other applicationsn");
  1494. printf("may open the device, place and answer calls.  Dialing is performedn");
  1495. printf("by TAPI.  K-95 SET MODEM commands are not used.nn");
  1496. }
  1497. if (tapiconv == CK_ON ||
  1498.     tapiconv == CK_AUTO && !tapipass) {
  1499. printf(
  1500. "Phone numbers are converted from canonical to dialable form by TAPIn");
  1501. printf("using the dialing rules specified in the TAPI Dialing Propertiesn");
  1502. printf("dialog.nn");
  1503. } else {
  1504. printf(
  1505. "Phone numbers are converted from canonical to dialable form by K-95n");
  1506. printf(
  1507. "using the dialing rules specified with the SET DIAL commands.  TAPIn");
  1508. printf(
  1509. "Dialing Properties are imported automaticly upon startup and whenevern");
  1510. printf("the TAPI Dialing Properties are altered or when the TAPI Locationn");
  1511. printf("is changed.nn");
  1512.         }
  1513. #endif /* BETATEST */
  1514. if (tapipass) {
  1515.     printf("Type SHOW MODEM to see MODEM configuration.n");
  1516.     if (tapiconv == CK_ON)
  1517.       printf("Type SHOW DIAL to see DIAL-related items.n");
  1518. } else {
  1519.     if (tapiconv == CK_ON || tapiconv == CK_AUTO)
  1520.       printf("Type SHOW DIAL to see DIAL-related items.n");
  1521. }
  1522. break;
  1523.       case 1:
  1524. cktapiDisplayTapiLocationInfo();
  1525. break;
  1526.       case 2:
  1527.         rc = cktapiGetModemSettings(&lpDevCfg,&lpModemSettings,
  1528.      &lpCommConfig,&lpDCB);
  1529.         if (rc) {
  1530.     cktapiDisplayModemSettings(lpDevCfg,lpModemSettings,
  1531.  lpCommConfig,lpDCB);
  1532. } else {
  1533.     printf("?Unable to retrieve Modem Settingsn");
  1534. }
  1535.         break;
  1536.       case 3: {
  1537.   HANDLE hModem = GetModemHandleFromLine((HLINE)0);
  1538.   if (hModem)
  1539.     DisplayCommProperties(hModem);
  1540.   else
  1541.     printf("?Unable to retrieve a valid Modem Handlen");
  1542.   CloseHandle(hModem);
  1543.   break;
  1544.       }
  1545.     }
  1546.     printf("n");
  1547. }
  1548. #endif /* CK_TAPI */
  1549. #endif /* NOLOCAL */
  1550. #ifdef PATTERNS
  1551. static VOID
  1552. shopat() {
  1553.     extern char * binpatterns[], * txtpatterns[];
  1554.     extern int patterns;
  1555.     char **p, *s;
  1556.     int i, j, k, n, flag, width;
  1557. #ifdef CK_TTGWSIZ
  1558.     ttgwsiz(); /* Try to get latest size */
  1559. #ifdef OS2
  1560.     width = tt_cols[VCMD];
  1561. #else /* OS2 */
  1562.     width = tt_cols;
  1563. #endif /* OS2 */
  1564.     if (width < 1)
  1565. #endif /* CK_TTGWSIZ */
  1566.       width = 80;
  1567.     printf("n");
  1568.     printf(" Set file type:            %sn",gfmode(binary,1));
  1569.     printf(" Set file patterns:        %s", showooa(patterns));
  1570. #ifdef CK_LABELED
  1571.     if (binary == XYFT_L)
  1572.       printf(" (but SET FILE TYPE LABELED overrides)n");
  1573.     else
  1574. #endif /* CK_LABELED */
  1575. #ifdef VMS
  1576.     if (binary == XYFT_I)
  1577.       printf(" (but SET FILE TYPE IMAGE overrides)n");
  1578.     else
  1579. #endif /* VMS */
  1580.       printf("n");
  1581.     printf(" Maximum patterns allowed: %dn", FTPATTERNS);
  1582.     for (k = 0; k < 2; k++) { /* For each kind of patter */
  1583. printf("n");
  1584. if (k == 0) { /* binary... */
  1585.     printf(" File binary-patterns: ");
  1586.     p = binpatterns;
  1587. } else { /* text... */
  1588.     printf(" File text-patterns:   ");
  1589.     p = txtpatterns;
  1590. }
  1591. if (!p[0]) {
  1592.     printf("(none)n");
  1593. } else {
  1594.     printf("n ");
  1595.     n = 2;
  1596.     for (i = 0; i < FTPATTERNS; i++) { /* For each pattern */
  1597. if (!p[i]) /* Done */
  1598.   break;
  1599. s = p[i]; /* Look for embedded space */
  1600. for (j = 0, flag = 1; *s; s++, j++) /* and also get length */
  1601.   if (*s == SP)
  1602.     flag = 3;
  1603. n += j + flag; /* Length of this line */
  1604. if (n >= width - 1) {
  1605.     printf("n ");
  1606.     n = j+2;
  1607. }
  1608. printf(flag == 3 ? " {%s}" : " %s", p[i]);
  1609.     }
  1610.     if (n > 2)
  1611.       printf("n");
  1612. }
  1613.     }
  1614.     printf("n");
  1615. }
  1616. #endif /* PATTERNS */
  1617. #ifndef NOSPL
  1618. static VOID
  1619. shooutput() {
  1620.     printf(" Output pacing:          %d (milliseconds)n",pacing);
  1621.     printf(" Output special-escapes: %sn", showoff(outesc));
  1622. }
  1623. static VOID
  1624. shoinput() {
  1625. #ifdef CK_AUTODL
  1626.     printf(" Input autodownload:     %sn", showoff(inautodl));
  1627. #endif /* CK_AUTODL */
  1628.     printf(" Input cancellation:     %sn", showoff(inintr));
  1629.     printf(" Input case:             %sn", inpcas[cmdlvl] ?
  1630.    "observe" : "ignore");
  1631.     printf(" Input buffer-length:    %dn", inbufsize);
  1632.     printf(" Input echo:             %sn", showoff(inecho));
  1633.     printf(" Input silence:          %d (seconds)n", insilence);
  1634. #ifdef OS2
  1635.     printf(" Input terminal:         %sn", showoff(interm));
  1636. #endif /* OS2 */
  1637.     printf(" Input timeout:          %sn", intime[cmdlvl] ?
  1638.    "quit" : "proceed");
  1639.     if (instatus < 0)
  1640.       printf(" Last INPUT:             -1 (INPUT command not yet given)n");
  1641.     else
  1642.       printf(" Last INPUT:             %d (%s)n", instatus,i_text[instatus]);
  1643. }
  1644. #endif /* NOSPL */
  1645. #ifndef NOSPL
  1646. int
  1647. showarray() {
  1648. #ifdef COMMENT
  1649.     char * p, * q, ** ap;
  1650.     int i;
  1651. #endif /* COMMENT */
  1652.     char buf[16];
  1653.     char *s; int x = 0, y;
  1654.     int range[2];
  1655.     if ((y = cmfld("Array name","",&s,NULL)) < 0)
  1656.       if (y != -3)
  1657. return(y);
  1658.     strcpy(line,s);
  1659.     s = line;
  1660.     if ((y = cmcfm()) < 0)
  1661.       return(y);
  1662.     if (*s) {
  1663. char ** ap;
  1664. if ((x = arraybounds(s,&(range[0]),&(range[1]))) < 0) {
  1665.     printf("?Bad array: %sn",s);
  1666.     return(-9);
  1667. }
  1668. #ifdef COMMENT
  1669. range[0] = -1;
  1670. range[1] = -1;
  1671. p = s;
  1672. for (p = s, q = NULL; *p; p++) {
  1673.     if (*p == '[') {
  1674. q = p+1;
  1675.     } else if (*p == ']')
  1676.       break;
  1677. }
  1678. if (q && *p == ']') {
  1679.     int quitnow = 0;
  1680.     for (i = 0; i < 2 && !quitnow; i++) {
  1681. for (p = q; *p; p++) {
  1682.     if (i == 0 && *p == ':' ||
  1683. *p == ']') {
  1684. if (*p == ']')
  1685.   quitnow = 1;
  1686. *p = NUL;
  1687. if (*q) {
  1688.     y = 15;
  1689.     s = buf;
  1690.     zzstring(q,&s,&y);
  1691.     s = evalx(buf);
  1692.     if (s) if (*s) ckstrncpy(buf,s,16);
  1693.     if (!rdigits(buf)) {
  1694. printf("?Not numeric: %sn",buf);
  1695. return(-9);
  1696.     }
  1697.     q = (i == 0) ? p+1 : NULL;
  1698.     range[i] = atoi(buf);
  1699. }
  1700. break;
  1701.     }
  1702. }
  1703.     }
  1704. }
  1705. #endif /* COMMENT */
  1706. ap = a_ptr[x];
  1707. if (!ap) {
  1708.     printf("Array not declared: %sn", s);
  1709.     return(success = 1);
  1710. } else {
  1711.     int i, n, max;
  1712.     max = (range[1] > 0) ?
  1713.       range[1] :
  1714. ((range[0] > 0) ? range[0] : a_dim[x]);
  1715.     if (range[0] < 0)
  1716.       range[0] = 0;
  1717.     if (max > a_dim[x])
  1718.       max = a_dim[x];
  1719.     n = 1;
  1720.     printf("Dimension = %dn",a_dim[x]);
  1721.     for (i = range[0]; i <= max; i++) {
  1722. if (ap[i]) {
  1723.     printf("%3d. %sn",i,ap[i]);
  1724.     if (xaskmore) {
  1725. if (cmd_cols > 0) {
  1726.     x = strlen(ap[i]) + 5;
  1727.     y = (x % cmd_cols) ? 1 : 0;
  1728.     n += (x / cmd_cols) + y;
  1729. } else {
  1730.     n++;
  1731. }
  1732. if (n > (cmd_rows - 3)) {
  1733.     if (!askmore())
  1734.       break;
  1735.     else
  1736.       n = 0;
  1737. }
  1738.     }
  1739. }
  1740.     }
  1741. }
  1742. return(1);
  1743.     }
  1744.     /* All arrays - just show name and dimension */
  1745.     for (y = 0; y < (int) 'z' - ARRAYBASE + 1; y++) {
  1746. if (a_ptr[y]) {
  1747.     if (x == 0) printf("Declared arrays:n");
  1748.     x = 1;
  1749.     printf(" \&%c[%d]n",
  1750.    (y == 1) ? 64 : y + ARRAYBASE, a_dim[y]);
  1751. }
  1752. if (!x) printf(" No arrays declaredn");
  1753.     }
  1754.     return(1);
  1755. }
  1756. #endif /* NOSPL */
  1757. int
  1758. doshow(x) int x; {
  1759.     int y, z, i; long zz;
  1760.     extern int optlines;
  1761.     char *s;
  1762. #ifdef OS2
  1763.     extern int os2gks;
  1764.     extern int tt_kb_mode;
  1765. #endif /* OS2 */
  1766.     extern int srvcdmsg;
  1767.     extern char * cdmsgstr, * ckcdpath;
  1768. #ifndef NOSETKEY
  1769.     if (x == SHKEY) { /* SHOW KEY */
  1770.         int c;
  1771. #ifdef OS2
  1772.         if ((x = cmkey(shokeytab,nshokey,"How many keys should be shown?",
  1773.                         "one",xxstring)) < 0) return(x);
  1774. switch (tt_kb_mode) {
  1775.   case KBM_EM:
  1776.     s = "emacs";
  1777.     break;
  1778.   case KBM_HE:
  1779.     s = "hebrew";
  1780.     break;
  1781.   case KBM_RU:
  1782.     s = "russian";
  1783.     break;
  1784.   case KBM_EN:
  1785.   default:
  1786.     s = "default";
  1787.     break;
  1788. }
  1789.         if ((z = cmkey(shokeymtab,nshokeym,"Which definition should be shown?",
  1790.                         s,xxstring)) < 0) return(z);
  1791. if (z == SHKEYDEF)
  1792.   z = -1;
  1793. #endif /* OS2 */
  1794.         if ((y = cmcfm()) < 0) return(y);
  1795. #ifdef IKSD
  1796.         if (inserver) {
  1797.             printf("Sorry, command disabled.rn");
  1798.             return(success = 0);
  1799.         }
  1800. #endif /* IKSD */
  1801. #ifdef MAC
  1802. printf("Not implementedn");
  1803. return(0);
  1804. #else /* Not MAC */
  1805. #ifdef OS2
  1806.         if (x) {
  1807.     con_event evt;
  1808.     for (c = 0; c < KMSIZE; c++) {
  1809. evt = (z < 0) ? mapkey(c) : maptermkey(c,z);
  1810. if (evt.type != error) {
  1811.     shokeycode(c,z);
  1812. }
  1813.     }
  1814.         } else {
  1815. #endif /* OS2 */
  1816.     printf(" Press key: ");
  1817. #ifdef UNIX
  1818. #ifdef NOSETBUF
  1819.     fflush(stdout);
  1820. #endif /* NOSETBUF */
  1821. #endif /* UNIX */
  1822.     conbin((char)escape); /* Put terminal in binary mode */
  1823. #ifdef OS2
  1824.     os2gks = 0; /* Raw scancode processing */
  1825. #endif /* OS2 */
  1826.     c = congks(0); /* Get character or scan code */
  1827. #ifdef OS2
  1828.     os2gks = 1; /* Cooked scancode processing */
  1829. #endif /* OS2 */
  1830.     concb((char)escape); /* Restore terminal to cbreak mode */
  1831.     if (c < 0) { /* Check for error */
  1832. printf("?Error reading keyn");
  1833. return(0);
  1834.     }
  1835. #ifndef OS2
  1836. /*
  1837.   Do NOT mask when it can be a raw scan code, perhaps > 255
  1838. */
  1839.     c &= cmdmsk; /* Apply command mask */
  1840. #endif /* OS2 */
  1841.     printf("n");
  1842. #ifdef OS2
  1843.     shokeycode(c,z);
  1844. #else /* OS2 */
  1845.     shokeycode(c);
  1846. #endif /* OS2 */
  1847. #ifdef OS2
  1848.         }
  1849. #endif /* OS2 */
  1850. return(1);
  1851. #endif /* MAC */
  1852.     }
  1853. #ifndef NOKVERBS
  1854.     if (x == SHKVB) { /* SHOW KVERBS */
  1855. if ((y = cmcfm()) < 0) return(y);
  1856. #ifdef IKSD
  1857.         if (inserver) {
  1858.             printf("Sorry, command disabled.rn");
  1859.             return(success = 0);
  1860.         }
  1861. #endif /* IKSD */
  1862. printf("nThe following %d keyboard verbs are available:nn",nkverbs);
  1863. kwdhelp(kverbs,nkverbs,"","\K","",3,0);
  1864. printf("n");
  1865. return(1);
  1866.     }
  1867. #ifdef OS2
  1868.     if (x == SHUDK) { /* SHOW UDKs */
  1869. extern void showudk(void);
  1870. if ((y = cmcfm()) < 0) return(y);
  1871. #ifdef IKSD
  1872.         if (inserver) {
  1873.             printf("Sorry, command disabled.rn");
  1874.             return(success = 0);
  1875.         }
  1876. #endif /* IKSD */
  1877. showudk();
  1878. return(1);
  1879.     }
  1880. #endif /* OS2 */
  1881. #endif /* NOKVERBS */
  1882. #endif /* NOSETKEY */
  1883. #ifndef NOSPL
  1884.     if (x == SHMAC) { /* SHOW MACRO */
  1885. struct FDB kw, fl, cm;
  1886. for (y = 0; y < nmac; y++) { /* copy the macro table */
  1887.     mackey[y].kwd = mactab[y].kwd; /* into a regular keyword table */
  1888.     mackey[y].kwval = y; /* with value = pointer to macro tbl */
  1889.     mackey[y].flgs = mactab[y].flgs;
  1890. }
  1891. /* parse name as keyword */
  1892.     cmfdbi(&kw, /* First FDB - command switches */
  1893.    _CMKEY, /* fcode */
  1894.    "Macro name", /* hlpmsg */
  1895.    "", /* default */
  1896.    "", /* addtl string data */
  1897.    nmac, /* addtl numeric data 1: tbl size */
  1898.    0, /* addtl numeric data 2: 4 = cmswi */
  1899.    xxstring, /* Processing function */
  1900.    mackey, /* Keyword table */
  1901.    &fl /* Pointer to next FDB */
  1902.    );
  1903.     cmfdbi(&fl, /* 2nd FDB - command to send from */
  1904.    _CMFLD, /* fcode */
  1905.    "Pattern", /* hlpmsg */
  1906.    "", /* default */
  1907.    "", /* addtl string data */
  1908.    0, /* addtl numeric data 1 */
  1909.    0, /* addtl numeric data 2 */
  1910.    xxstring,
  1911.    NULL,
  1912.    &cm
  1913.    );
  1914.     cmfdbi(&cm, /* 4th FDB - Confirmation */
  1915.    _CMCFM, /* fcode */
  1916.    "", /* hlpmsg */
  1917.    "", /* default */
  1918.    "", /* addtl string data */
  1919.    0, /* addtl numeric data 1 */
  1920.    0, /* addtl numeric data 2 */
  1921.    NULL,
  1922.    NULL,
  1923.    NULL
  1924.    );
  1925. x = cmfdb(&kw);
  1926. if (x < 0) return(x);
  1927. switch (cmresult.fcode) {
  1928.   case _CMKEY:
  1929.   case _CMFLD:
  1930.     strcpy(line,atmbuf);
  1931.     if ((x = cmcfm()) < 0)
  1932.       return(x);
  1933.     break;
  1934.   case _CMCFM:
  1935.     line[0] = NUL;
  1936.   default:
  1937.     break;
  1938. }
  1939. s = line;
  1940. if (*line) {
  1941.     slc = 0; /* Initial SHO MAC line number */
  1942.     x = mlook(mactab,s,nmac); /* Look up what they typed */
  1943.     switch (x) {
  1944.       case -3: /* Nothing to look up */
  1945. return(0);
  1946.       case -1: /* Not found */
  1947. printf("%s - not foundn",s);
  1948. return(0);
  1949.       case -2: /* Ambiguous, matches more than one */
  1950. y = (int)strlen(line);
  1951. slc = 1;
  1952. for (x = 0; x < nmac; x++)
  1953.   if (!strncmp(mactab[x].kwd,line,y))
  1954.     if (shomac(mactab[x].kwd,mactab[x].mval) < 0) break;
  1955. return(1);
  1956.       default: /* Matches one exactly */
  1957. shomac(mactab[x].kwd,mactab[x].mval);
  1958. return(1);
  1959.     }
  1960. } else { /* They want to see them all */
  1961.     printf("Macros:n");
  1962.     slc = 1;
  1963.     for (y = 0; y < nmac; y++)
  1964.       if (shomac(mactab[y].kwd,mactab[y].mval) < 0) break;
  1965.     return(1);
  1966. }
  1967.     }
  1968. #endif /* NOSPL */
  1969. /*
  1970.   Other SHOW commands only have two fields.  Get command confirmation here,
  1971.   then handle with big switch() statement.
  1972. */
  1973. #ifndef NOSPL
  1974.     if (x != SHBUI && x != SHARR)
  1975. #endif /* NOSPL */
  1976.       if ((y = cmcfm()) < 0)
  1977. return(y);
  1978. #ifdef COMMENT
  1979.     /* This restriction is too general. */
  1980. #ifdef IKSD
  1981.     if (inserver &&
  1982. #ifdef CK_LOGIN
  1983. isguest
  1984. #else
  1985. 0
  1986. #endif /* CK_LOGIN */
  1987. ) {
  1988. printf("Sorry, command disabled.rn");
  1989. return(success = 0);
  1990.     }
  1991. #endif /* IKSD */
  1992. #endif /* COMMENT */
  1993.     switch (x) {
  1994. #ifdef ANYX25
  1995. #ifndef IBMX25
  1996.       case SHPAD:
  1997. shopad(0);
  1998. break;
  1999. #endif /* IBMX25 */
  2000. #endif /* ANYX25 */
  2001.       case SHNET:
  2002. #ifdef NOLOCAL
  2003. printf(" No network support in this version of C-Kermit.n");
  2004. #else
  2005. #ifndef NETCONN
  2006. printf(" No network support in this version of C-Kermit.n");
  2007. #else
  2008. shonet();
  2009. #endif /* NETCONN */
  2010. #endif /* NOLOCAL */
  2011. break;
  2012.       case SHPAR:
  2013. shopar();
  2014. break;
  2015. #ifndef NOXFER
  2016.       case SHATT:
  2017. shoatt();
  2018. break;
  2019. #endif /* NOXFER */
  2020. #ifndef NOSPL
  2021.       case SHCOU:
  2022. printf(" %dn",count[cmdlvl]);
  2023. break;
  2024. #endif /* NOSPL */
  2025. #ifndef NOSERVER
  2026.       case SHSER: /* Show Server */
  2027. i = 0;
  2028. #ifndef NOFRILLS
  2029. printf("Function:          Status:n");
  2030. i++;
  2031. printf(" GET                %sn",nm[en_get]);
  2032. i++;
  2033. printf(" SEND               %sn",nm[en_sen]);
  2034. i++;
  2035. printf(" MAIL               %sn",nm[inserver ? 0 : en_mai]);
  2036. i++;
  2037. printf(" PRINT              %sn",nm[inserver ? 0 : en_pri]);
  2038. i++;
  2039. #ifndef NOSPL
  2040. printf(" REMOTE ASSIGN      %sn",nm[en_asg]);
  2041. i++;
  2042. #endif /* NOSPL */
  2043. printf(" REMOTE CD/CWD      %sn",nm[en_cwd]);
  2044. i++;
  2045. #ifdef ZCOPY
  2046. printf(" REMOTE COPY        %sn",nm[en_cpy]);
  2047. i++;
  2048. #endif /* ZCOPY */
  2049. printf(" REMOTE DELETE      %sn",nm[en_del]);
  2050. printf(" REMOTE DIRECTORY   %sn",nm[en_dir]);
  2051. printf(" REMOTE HOST        %sn",nm[inserver ? 0 : en_hos]);
  2052. i += 3;
  2053. #ifndef NOSPL
  2054. printf(" REMOTE QUERY       %sn",nm[en_que]);
  2055. i++;
  2056. #endif /* NOSPL */
  2057. printf(" REMOTE MKDIR       %sn",nm[en_mkd]);
  2058. printf(" REMOTE RMDIR       %sn",nm[en_rmd]);
  2059. printf(" REMOTE RENAME      %sn",nm[en_ren]);
  2060. printf(" REMOTE SET         %sn",nm[en_set]);
  2061. printf(" REMOTE SPACE       %sn",nm[en_spa]);
  2062. printf(" REMOTE TYPE        %sn",nm[en_typ]);
  2063. printf(" REMOTE WHO         %sn",nm[inserver ? 0 : en_who]);
  2064. printf(" BYE                %sn",nm[en_bye]);
  2065. printf(" FINISH             %sn",nm[en_fin]);
  2066. printf(" EXIT               %sn",nm[en_xit]);
  2067. printf(" ENABLE             %sn",nm[en_ena]);
  2068. i += 11;
  2069. #endif /* NOFRILLS */
  2070. if (i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2071. printf("Server timeout:      %dn",srvtim);
  2072. if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2073.         printf("Server idle-timeout: %dn",srvidl);
  2074.         if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2075. printf("Server keepalive     %sn", showoff(srvping));
  2076.         if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2077. printf("Server cd-message    %sn", showoff(srvcdmsg));
  2078. if (srvcdmsg && cdmsgstr)
  2079.   printf("Server cd-message    %sn", cdmsgstr);
  2080. if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2081. printf("Server display:      %sn", showoff(srvdis));
  2082. if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2083.         printf("Server login:        ");
  2084. if (!x_user) {
  2085.     printf("(none)n");
  2086. } else {
  2087.     printf(""%s", "%s", "%s"n",
  2088.    x_user,
  2089.    x_passwd ? x_passwd : "",
  2090.    x_acct ? x_acct : ""
  2091.    );
  2092. }
  2093. if (++i > cmd_rows - 3) { if (!askmore()) return(1); else i = 0; }
  2094. printf("Server get-path: ");
  2095. if (ngetpath == 0) {
  2096.     printf("    (none)n");
  2097. } else {
  2098.     printf("n");
  2099.     i += 3;
  2100.     for (x = 0; x < ngetpath; x++) {
  2101. if (getpath[x]) printf(" %d. %sn", x, getpath[x]);
  2102. if (++i > (cmd_rows - 3)) { /* More than a screenful... */
  2103.     if (!askmore())
  2104.       break;
  2105.     else
  2106.       i = 0;
  2107. }
  2108.     }
  2109. }
  2110. break;
  2111. #endif /* NOSERVER */
  2112.       case SHSTA: /* Status of last command */
  2113. printf(" %sn", success ? "SUCCESS" : "FAILURE");
  2114. return(0); /* Don't change it */
  2115.       case SHSTK: { /* Stack for MAC debugging */
  2116. #ifdef MAC
  2117.   long sp;
  2118.   sp = -1;
  2119.   loadA0 ((char *)&sp); /* set destination address */
  2120.   SPtoaA0(); /* move SP to destination */
  2121.   printf("Stack at 0x%xn", sp);
  2122.   show_queue(); /* more debugging */
  2123.   break;
  2124. #else
  2125.   shostack();
  2126. #endif /* MAC */
  2127.   break;
  2128.       }
  2129. #ifdef OS2
  2130.       case SHTAB: /* SHOW TABS */
  2131. #ifdef IKSD
  2132.         if (inserver) {
  2133.             printf("Sorry, command disabled.rn");
  2134.             return(success = 0);
  2135.         }
  2136. #endif /* IKSD */
  2137.         shotabs();
  2138.         break;
  2139. #endif /* OS2 */
  2140. #ifndef NOLOCAL
  2141.       case SHTER: /* SHOW TERMINAL */
  2142. #ifdef IKSD
  2143.         if (inserver) {
  2144.             printf("Sorry, command disabled.rn");
  2145.             return(success = 0);
  2146.         }
  2147. #endif /* IKSD */
  2148. shotrm();
  2149. break;
  2150. #endif /* NOLOCAL */
  2151. #ifdef OS2
  2152.       case SHVSCRN: /* SHOW Virtual Screen - for debug */
  2153. shovscrn();
  2154.         break;
  2155. #endif /* OS2 */
  2156. #ifdef OS2MOUSE
  2157.       case SHMOU: /* SHOW MOUSE */
  2158. #ifdef IKSD
  2159.         if (inserver) {
  2160.             printf("Sorry, command disabled.rn");
  2161.             return(success = 0);
  2162.         }
  2163. #endif /* IKSD */
  2164.         shomou();
  2165.         break;
  2166. #endif /* OS2MOUSE */
  2167. #ifndef NOFRILLS
  2168.       case SHVER:
  2169. shover();
  2170. break;
  2171. #endif /* NOFRILLS */
  2172. #ifndef NOSPL
  2173.       case SHBUI: /* Built-in variables */
  2174. if ((y = cmtxt("Variable name or pattern","",&s,xxstring)) < 0)
  2175.   return(y);
  2176. strcpy(line,s);
  2177. if (line[0]) strcat(line,"*");
  2178.       case SHFUN: /* or built-in functions */
  2179. #ifdef CK_TTGWSIZ
  2180. #ifdef OS2
  2181. if (tt_cols[VTERM] < 0 || tt_rows[VTERM] < 0)
  2182.   ttgwsiz();
  2183. #else /* OS2 */
  2184. if (ttgwsiz() > 0) { /* Get current screen size */
  2185.     if (tt_rows > 0 && tt_cols > 0) {
  2186. cmd_rows = tt_rows;
  2187. cmd_cols = tt_cols;
  2188.     }
  2189. }
  2190. #endif /* OS2 */
  2191. #endif /* CK_TTGWSIZ */
  2192. if (x == SHFUN) { /* Functions */
  2193.     printf("nThe following functions are available:nn");
  2194.     kwdhelp(fnctab,nfuncs,"","\F","()",3,0);
  2195.     printf("n");
  2196. #ifndef NOHELP
  2197.     printf(
  2198. "HELP FUNCTION <name> gives the calling conventions of the given function.nn"
  2199.    );
  2200. #endif /* NOHELP */
  2201.     break;
  2202. } else { /* Variables */
  2203.     i = 0;
  2204.     for (y = 0; y < nvars; y++) {
  2205. if ((vartab[y].flgs & CM_INV))
  2206.   continue;
  2207. if (line[0])
  2208.   if (!ckmatch(line,vartab[y].kwd,0,1))
  2209.     continue;
  2210. s = nvlook(vartab[y].kwd);
  2211. printf(" \v(%s) = ",vartab[y].kwd);
  2212. if (vartab[y].kwval == VN_NEWL) { /* v(newline) */
  2213.     while (*s) /* Show control chars symbolically */
  2214.       printf("\{%d}",*s++);
  2215.     printf("n");
  2216. } else if (vartab[y].kwval == VN_IBUF  || /* v(input) */
  2217.    vartab[y].kwval == VN_QUE   || /* v(query) */
  2218. #ifdef OS2
  2219.    vartab[y].kwval == VN_SELCT || /* v(select) */
  2220. #endif /* OS2 */
  2221.    (vartab[y].kwval >= VN_M_AAA && /* modem ones */
  2222.     vartab[y].kwval <= VN_M_ZZZ)
  2223.    ) {
  2224.     int r = 12; /* This one can wrap around */
  2225.     char buf[10];
  2226.     while (*s) {
  2227. if (isprint(*s)) {
  2228.     buf[0] = *s;
  2229.     buf[1] = NUL;
  2230.     r++;
  2231. } else {
  2232.     sprintf(buf,"\{%d}",*s);
  2233.     r += (int) strlen(buf);
  2234. }
  2235. if (r >= cmd_cols - 1) {
  2236.     printf("n");
  2237.     r = 0;
  2238.     i++;
  2239. }
  2240. printf("%s",buf);
  2241. s++;
  2242.     }
  2243.     printf("n");
  2244. } else
  2245.   printf("%sn",s);
  2246. if (++i > (cmd_rows - 3)) { /* More than a screenful... */
  2247.     if ((y >= nvars - 1) || !askmore())
  2248.       break;
  2249.     else
  2250.       i = 0;
  2251. }
  2252.     }
  2253. }
  2254. break;
  2255.       case SHVAR: /* Global variables */
  2256. x = 0; /* Variable count */
  2257. slc = 1; /* Screen line count for "more?" */
  2258. for (y = 33; y < GVARS; y++)
  2259.   if (g_var[y]) {
  2260.       if (x++ == 0) printf("Global variables:n");
  2261.       sprintf(line," \%%%c",y);
  2262.       if (shomac(line,g_var[y]) < 0) break;
  2263.   }
  2264. if (!x) printf(" No variables definedn");
  2265. break;
  2266.       case SHARG: { /* Args */
  2267.   char * s1, * s2;
  2268.   if (maclvl > -1) {
  2269.       printf("Macro arguments at level %d (\v(argc) = %d):n",
  2270.      maclvl,
  2271.      macargc[maclvl]
  2272.      );
  2273.       for (y = 0; y < macargc[maclvl]; y++) {
  2274.   s1 = m_arg[maclvl][y];
  2275.   if (!s1) s1 = "(NULL)";
  2276.   s2 = m_xarg[maclvl][y];
  2277.   if (!s2) s2 = "(NULL)";
  2278.   if (y < 10)
  2279.     printf(" \%%%d = %sn",y,s1);
  2280.   else
  2281.     printf(" \&_[%d] = %sn",y,s2);
  2282.       }
  2283.   } else {
  2284.       printf("Top-level arguments (\v(argc) = %d):n", topargc);
  2285.       for (y = 0; y < topargc; y++) {
  2286.   s1 = g_var[y + '0'];
  2287.   if (!s1) s1 = "(NULL)";
  2288.   s2 = toparg[y];
  2289.   if (!s2) s2 = "(NULL)";
  2290.   if (y < 10 && g_var[y])
  2291.     printf(" \%%%d = %sn",y,s1);
  2292.   if (toparg[y])
  2293.     printf(" \&_[%d] = %sn",y,s2);
  2294.       }
  2295.   }
  2296.         }
  2297. break;
  2298.       case SHARR: /* Arrays */
  2299. return(showarray());
  2300. #endif /* NOSPL */
  2301. #ifndef NOXFER
  2302.       case SHPRO: /* Protocol parameters */
  2303. shoparp();
  2304. printf("n");
  2305. break;
  2306. #endif /* NOXFER */
  2307. #ifndef NOLOCAL
  2308.       case SHCOM: /* Communication parameters */
  2309. printf("n");
  2310. shoparc();
  2311. #ifdef OS2
  2312. {
  2313.     int i;
  2314.     char *s = "(unknown)";
  2315.     for (i = 0; i < nprty; i++)
  2316.       if (prtytab[i].kwval == priority) {
  2317.   s = prtytab[i].kwd;
  2318.   break;
  2319.       }
  2320.     printf(" Priority: %sn", s );
  2321. }
  2322. #endif /* OS2 */
  2323. printf("n");
  2324. #ifdef NETCONN
  2325. if (!network
  2326. #ifdef IKSD
  2327.              && !inserver
  2328. #endif /* IKSD */
  2329.              ) {
  2330. #endif /* NETCONN */
  2331.     shomdm();
  2332.     printf("n");
  2333. #ifdef NETCONN
  2334. }
  2335. #endif /* NETCONN */
  2336. #ifndef NODIAL
  2337. #ifdef IKSD
  2338.         if ( !inserver )
  2339. #endif /* IKSD */
  2340.         {
  2341.     printf("Type SHOW DIAL to see DIAL-related items.n");
  2342.     printf("Type SHOW MODEM to see modem-related items.n");
  2343. #ifdef CK_TAPI
  2344.     printf("Type SHOW TAPI to see TAPI-related items.n");
  2345. #endif /* CK_TAPI */
  2346.     printf("n");
  2347. }
  2348. #endif /* NODIAL */
  2349. break;
  2350. #endif /* NOLOCAL */
  2351.       case SHFIL: /* File parameters */
  2352. shofil();
  2353. /* printf("n"); */ /* (out o' space) */
  2354. break;
  2355. #ifndef NOCSETS
  2356.       case SHLNG: /* Languages */
  2357. shoparl();
  2358. break;
  2359. #endif /* NOCSETS */
  2360. #ifndef NOSPL
  2361.       case SHSCR: /* Scripts */
  2362. printf("n");
  2363. printf(" Command quoting:        %sn", showoff(cmdgquo()));
  2364. printf(" Take  echo:             %sn", showoff(techo));
  2365. printf(" Take  error:            %sn", showoff(takerr[cmdlvl]));
  2366. printf(" Macro echo:             %sn", showoff(mecho));
  2367. printf(" Macro error:            %sn", showoff(merror[cmdlvl]));
  2368.      printf(" Quiet:                  %sn", showoff(quiet));
  2369.         printf(" Function diagnostics:   %sn", showoff(fndiags));
  2370.         printf(" Function error:         %sn", showoff(fnerror));
  2371. shoinput();
  2372. shooutput();
  2373. #ifndef NOSCRIPT
  2374. printf(" Script echo:            %sn", showoff(secho));
  2375. #endif /* NOSCRIPT */
  2376. printf(" Command buffer length:  %dn", CMDBL);
  2377. printf(" Atom buffer length:     %dn", ATMBL);
  2378. printf("n");
  2379. break;
  2380. #endif /* NOSPL */
  2381. #ifndef NOXMIT
  2382.       case SHXMI:
  2383. printf("n");
  2384. printf(" File type:                       %sn",
  2385.        binary ? "binary" : "text");
  2386. #ifndef NOCSETS
  2387. printf(" File character-set:              %sn",
  2388.        fcsinfo[fcharset].keyword);
  2389. printf(" Terminal character-set (remote): %sn",
  2390.        fcsinfo[tcsr].keyword);
  2391. printf(" Terminal character-set (local):  %sn",
  2392.        fcsinfo[tcsl].keyword);
  2393. #endif /* NOCSETS */
  2394. printf(" Terminal bytesize:               %dn",
  2395.        (cmask == 0xff) ? 8 : 7);
  2396. printf(" Terminal echo:                   %sn",
  2397.        duplex ? "local" : "remote");
  2398. printf(" Transmit EOF:                    ");
  2399. if (*xmitbuf == NUL) {
  2400.     printf("(none)n");
  2401. } else {
  2402.     char *p;
  2403.     p = xmitbuf;
  2404.     while (*p) {
  2405. if (*p < SP)
  2406.   printf("^%c",ctl(*p));
  2407. else
  2408.   printf("%c",*p);
  2409. p++;
  2410.     }
  2411.     printf("n");
  2412. }
  2413. if (xmitf)
  2414.   printf(" Transmit Fill:                   %dn", xmitf);
  2415. else
  2416.   printf(" Transmit Fill:                   (none)n");
  2417. printf(" Transmit Linefeed:               %sn",showoff(xmitl));
  2418. if (xmitp)
  2419.   printf(" Transmit Prompt:                 %d (%s)n",
  2420.  xmitp,
  2421.  chartostr(xmitp)
  2422.  );
  2423. else
  2424.   printf(" Transmit Prompt:                 (none)n");
  2425. printf(" Transmit Echo:                   %sn", showoff(xmitx));
  2426. printf(" Transmit Locking-Shift:          %sn", showoff(xmits));
  2427. printf(" Transmit Pause:                  %d (millisecond%s)n",
  2428.        xmitw,
  2429.        (xmitw == 1) ? "" : "s"
  2430.        );
  2431. printf(" Transmit Timeout:                %d (second%s)n",
  2432.        xmitt,
  2433.        (xmitt == 1) ? "" : "s"
  2434.        );
  2435. printf("n");
  2436. break;
  2437. #endif /* NOXMIT */
  2438. #ifndef NODIAL
  2439.       case SHMOD: /* SHOW MODEM */
  2440. #ifdef IKSD
  2441.         if (inserver) {
  2442.             printf("Sorry, command disabled.rn");
  2443.             return(success = 0);
  2444.         }
  2445. #endif /* IKSD */
  2446. shomodem(); /* Show SET MODEM items */
  2447. break;
  2448. #endif /* NODIAL */
  2449. #ifndef MAC
  2450.       case SHDFLT:
  2451.         printf("%sn",zgtdir());
  2452. break;
  2453. #endif /* MAC */
  2454. #ifndef NOLOCAL
  2455.       case SHESC:
  2456. #ifdef IKSD
  2457.         if (inserver) {
  2458.             printf("Sorry, command disabled.rn");
  2459.             return(success = 0);
  2460.         }
  2461. #endif /* IKSD */
  2462. printf(" Escape character: Ctrl-%c (ASCII %d, %s): %srn",
  2463.        ctl(escape), escape, (escape == 127 ? "DEL" : ccntab[escape]),
  2464.    nm[tt_escape]
  2465.    );
  2466. break;
  2467. #ifndef NODIAL
  2468.       case SHDIA: /* SHOW DIAL */
  2469. #ifdef IKSD
  2470.         if (inserver) {
  2471.             printf("Sorry, command disabled.rn");
  2472.             return(success = 0);
  2473.         }
  2474. #endif /* IKSD */
  2475. shmdmlin();
  2476. printf(", speed: ");
  2477. if ((zz = ttgspd()) < 0) {
  2478.     printf("unknown");
  2479. } else {
  2480.     if (zz == 8880) printf("75/1200"); else printf("%ld",zz);
  2481. }
  2482. if (carrier == CAR_OFF) s = "off";
  2483. else if (carrier == CAR_ON) s = "on";
  2484. else if (carrier == CAR_AUT) s = "auto";
  2485. else s = "unknown";
  2486. printf(", carrier: %s", s);
  2487. if (carrier == CAR_ON) {
  2488.     if (cdtimo) printf(", timeout: %d sec", cdtimo);
  2489.     else printf(", timeout: none");
  2490. }
  2491. printf("n");
  2492. doshodial();
  2493. if (local
  2494. #ifdef NETCONN
  2495.     && !network
  2496. #endif /* NETCONN */
  2497.     ) {
  2498.     printf("Type SHOW MODEM to see modem settings.n");
  2499. #ifdef CK_TAPI
  2500.             printf("Type SHOW TAPI to see TAPI-related itemsn");
  2501. #endif /* CK_TAPI */
  2502.     printf("Type SHOW COMMUNICATIONS to see modem signals.n");
  2503. }
  2504. break;
  2505. #endif /* NODIAL */
  2506. #endif /* NOLOCAL */
  2507. #ifndef NOXFER
  2508. #ifdef CK_LABELED
  2509.       case SHLBL: /* Labeled file info */
  2510. sholbl();
  2511. break;
  2512. #endif /* CK_LABELED */
  2513. #endif /* NOXFER */
  2514.       case SHCSE: /* Character sets */
  2515. #ifdef NOCSETS
  2516. printf(
  2517. " Character set translation is not supported in this version of C-Kermitn");
  2518. #else
  2519. shocharset();
  2520. #ifndef NOXFER
  2521. printf("n Unknown-Char-Set: %sn",
  2522.        unkcs ? "Keep" : "Discard");
  2523. #endif /* NOXFER */
  2524. #ifdef OS2
  2525.         printf("n");
  2526. #endif /* OS2 */
  2527.         shotcs(tcsl,tcsr);
  2528. printf("n");
  2529. #ifdef OS2
  2530.         /* PC Code Page information */
  2531.         {
  2532.             char cpbuf[50];
  2533.             int cplist[16], cps;
  2534.             cps = os2getcplist(cplist, sizeof(cplist));
  2535.             sprintf(cpbuf,"%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d,%3d",
  2536.                      cps > 1 ? cplist[1] : 0,
  2537.                      cps > 2 ? cplist[2] : 0, cps > 3 ? cplist[3] : 0,
  2538.                      cps > 4 ? cplist[4] : 0, cps > 5 ? cplist[5] : 0,
  2539.                      cps > 6 ? cplist[6] : 0, cps > 7 ? cplist[7] : 0,
  2540.                      cps > 8 ? cplist[8] : 0, cps > 9 ? cplist[9] : 0,
  2541.                      cps > 10 ? cplist[10] : 0, cps > 11 ? cplist[11] : 0,
  2542.                      cps > 12 ? cplist[12] : 0
  2543.                      );
  2544.             printf(" Code Pages:n");
  2545.             printf("     Active: %dn",os2getcp());
  2546.             if (!isWin95())
  2547.               printf("  Available: %sn",cpbuf);
  2548.             printf("n");
  2549.         }
  2550. #endif /* OS2 */
  2551. #endif /* NOCSETS */
  2552. break;
  2553.       case SHFEA: /* Features */
  2554. shofea();
  2555. break;
  2556. #ifdef CK_SPEED
  2557.       case SHCTL: /* Control-Prefix table */
  2558. shoctl();
  2559. break;
  2560. #endif /* CK_SPEED */
  2561.       case SHEXI:
  2562. printf("n Exit warning %sn", xitwarn ?
  2563.        (xitwarn == 1 ? "on" : "always") : "off");
  2564. printf(" Exit on-disconnect: %sn", showoff(exitonclose));
  2565. printf(" Current exit status: %dnn", xitsta);
  2566. break;
  2567.       case SHPRT: {
  2568. #ifdef PRINTSWI
  2569.   extern int printtimo, printertype, noprinter;
  2570.   extern char * printterm, * printsep;
  2571. #ifdef BPRINT
  2572.   extern int printbidi;
  2573. #endif /* BPRINT */
  2574. #endif /* PRINTSWI */
  2575. #ifdef IKSD
  2576.         if (inserver &&
  2577. #ifdef CK_LOGIN
  2578.             isguest
  2579. #else /* CK_LOGIN */
  2580.             0
  2581. #endif /* CK_LOGIN */
  2582.              ) {
  2583.             printf("Sorry, command disabled.rn");
  2584.             return(success = 0);
  2585.         }
  2586. #endif /* IKSD */
  2587. #ifdef PRINTSWI
  2588.   if (noprinter) {
  2589.       printf("Printer: (none)nn");
  2590.       break;
  2591.   }
  2592. #endif /* PRINTSWI */
  2593.   printf("Printer: %s%sn",
  2594.  printpipe ? "| " : "",
  2595.  printername ? printername :
  2596. #ifdef OS2
  2597.  "PRN"
  2598. #else
  2599.  "(default)"
  2600. #endif /* OS2 */
  2601.  );
  2602. #ifdef PRINTSWI
  2603. #ifdef BPRINT
  2604.   if (printbidi) {
  2605.       printf(" /BIDIRECTIONALn");
  2606.       if (pportspeed > 0)
  2607. printf(" /SPEED:%ldn",pportspeed);
  2608.       printf(" /PARITY:%sn",parnam((char)pportparity));
  2609.       printf(" /FLOW:%sn",
  2610.      pportflow == FLO_NONE ? "NONE" :
  2611.      (pportflow == FLO_RTSC ? "RTS/CTS" : "XON/XOFF")
  2612.      );
  2613.   } else
  2614.     printf(" /OUTPUT-ONLYn");
  2615. #endif /* BPRINT */
  2616.   switch (printertype) {
  2617.     case PRT_NON: printf(" /NONEn"); break;
  2618.     case PRT_FIL: printf(" /FILEn"); break;
  2619.     case PRT_PIP: printf(" /PIPEn"); break;
  2620.     case PRT_DOS: printf(" /DOS-DEVICEn"); break;
  2621.     case PRT_WIN: printf(" /WINDOWS-QUEUEn"); break;
  2622.   }
  2623.   printf(" /TIMEOUT:%dn",printtimo);
  2624.           if (printterm) {
  2625.               printf(" /END-OF-JOB-STRING:");
  2626.               shostrdef(printterm);
  2627.               printf("n");
  2628.           } else
  2629.     printf(" /END-OF-JOB-STRING:(none)n");
  2630.   printf(" /JOB-HEADER-FILE:%sn",printsep ? printsep : "(none)");
  2631. #endif /* PRINTSWI */
  2632.   printf("n");
  2633.   break;
  2634.       }
  2635.       case SHCMD:
  2636. #ifdef CK_AUTODL
  2637. printf(" Command autodownload: %sn",showoff(cmdadl));
  2638. #else
  2639. printf(" Command autodownload: (not available)n");
  2640. #endif /* CK_AUTODL */
  2641. printf(" Command bytesize: %d bitsn",
  2642.        (cmdmsk == 0377) ? 8 : 7);
  2643. #ifdef CK_RECALL
  2644. printf(" Command recall-buffer-size: %dn",cm_recall);
  2645. #else
  2646. printf(" Command recall-buffer not available in this versionn");
  2647. #endif /* CK_RECALL */
  2648. #ifdef CK_RECALL
  2649. printf(" Command retry: %sn",showoff(cm_retry));
  2650. #else
  2651. printf(" Command retry not available in this versionn");
  2652. #endif /* CK_RECALL */
  2653. printf(" Command interruption: %sn", showoff(cmdint));
  2654. printf(" Command quoting: %sn", showoff(cmdgquo()));
  2655. printf(" Command more-prompting: %sn", showoff(xaskmore));
  2656. printf(" Command height: %dn", cmd_rows);
  2657. printf(" Command width:  %dn", cmd_cols);
  2658. printf(" Hints:          %sn", showoff(hints));
  2659. printf(" Quiet:          %sn", showoff(quiet));
  2660. printf(" Maximum command length: %dn", CMDBL);
  2661. #ifndef NOSPL
  2662. printf(" Maximum number of macros: %dn", MAC_MAX);
  2663. printf(" Macros defined: %dn", nmac);
  2664. printf(" Maximum macro depth: %dn", MACLEVEL);
  2665. printf(" Maximum TAKE depth: %dn", MAXTAKE);
  2666. #endif /* NOSPL */
  2667. #ifdef UNIX
  2668. #ifndef NOJC
  2669. printf(" Suspend: %sn", showoff(suspend));
  2670. #endif /* NOJC */
  2671. #endif /* UNIX */
  2672. break;
  2673. #ifndef NOSPL
  2674.       case SHALRM:
  2675. if (ck_alarm)
  2676.   printf("Alarm at %s %sn",alrm_date,alrm_time);
  2677. else
  2678.   printf("(no alarm set)n");
  2679. break;
  2680. #endif /* NOSPL */
  2681. #ifndef NOMSEND
  2682.       case SHSFL: {
  2683.   extern struct filelist * filehead;
  2684.   if (!filehead) {
  2685.       printf("send-list is emptyn");
  2686.   } else {
  2687.       struct filelist * flp;
  2688.       char * s;
  2689.       flp = filehead;
  2690.       while (flp) {
  2691.   s = flp->fl_alias;
  2692.   if (!s) s = "(none)";
  2693.   printf("%s, mode: %s, alias: %sn",
  2694.  flp->fl_name,
  2695.  gfmode(flp->fl_mode,0),
  2696.  s
  2697.  );
  2698.   flp = flp->fl_next;
  2699.       }
  2700.   }
  2701.       }
  2702.       break;
  2703. #endif /* NOMSEND */
  2704. #ifdef CKXXCHAR
  2705.       case SHDBL:
  2706. shodbl();
  2707. break;
  2708. #endif /* CKXXCHAR */
  2709. #ifndef NOPUSH
  2710. #ifndef NOFRILLS
  2711.       case SHEDIT:
  2712. if (!editor[0]) {
  2713.     s = getenv("EDITOR");
  2714.     if (s) ckstrncpy(editor,s,CKMAXPATH);
  2715. }
  2716. printf("n editor:  %sn", editor[0] ? editor : "(none)");
  2717. if (editor[0]) {
  2718.     printf(" options: %sn", editopts[0] ? editopts : "(none)");
  2719.     printf(" file:    %sn", editfile[0] ? editfile : "(none)");
  2720.         }
  2721. printf("n");
  2722. break;
  2723. #ifdef BROWSER
  2724.       case SHBROWSE:
  2725. if (!browser[0]) {
  2726.     s = getenv("BROWSER");
  2727.     if (s) ckstrncpy(browser,s,CKMAXPATH);
  2728. }
  2729. printf("n browser: %sn", browser[0] ? browser : "(none)");
  2730. if (browser[0]) {
  2731.     printf(" options: %sn", browsopts[0] ? browsopts : "(none)");
  2732.     printf(" url:     %sn", browsurl[0] ? browsurl : "(none)");
  2733. }
  2734. printf("n");
  2735. break;
  2736. #endif /* BROWSER */
  2737. #endif /*  NOFRILLS */
  2738. #endif /* NOPUSH */
  2739. #ifndef NOLOCAL
  2740. #ifdef CK_TAPI
  2741.       case SHTAPI: /* TAPI options */
  2742. #ifdef IKSD
  2743.         if (inserver) {
  2744.             printf("Sorry, command disabled.rn");
  2745.             return(success = 0);
  2746.         }
  2747. #endif /* IKSD */
  2748. shotapi(0);
  2749. break;
  2750.       case SHTAPI_L: /* TAPI Locations */
  2751. #ifdef IKSD
  2752.         if (inserver) {
  2753.             printf("Sorry, command disabled.rn");
  2754.             return(success = 0);
  2755.         }
  2756. #endif /* IKSD */
  2757. shotapi(1);
  2758. break;
  2759.       case SHTAPI_M: /* TAPI Modem */
  2760. #ifdef IKSD
  2761.         if (inserver) {
  2762.             printf("Sorry, command disabled.rn");
  2763.             return(success = 0);
  2764.         }
  2765. #endif /* IKSD */
  2766. shotapi(2);
  2767. break;
  2768.       case SHTAPI_C: /* TAPI Comm */
  2769. #ifdef IKSD
  2770.         if (inserver) {
  2771.             printf("Sorry, command disabled.rn");
  2772.             return(success = 0);
  2773.         }
  2774. #endif /* IKSD */
  2775. shotapi(3);
  2776. break;
  2777. #endif /* CK_TAPI */
  2778. #ifdef TNCODE
  2779.       case SHTEL: /* TELNET */
  2780. printf("n");
  2781. shotel(0);
  2782. printf("n");
  2783. break;
  2784.       case SHTOPT: /* TELNET OPTIONS */
  2785.         printf("n");
  2786.         shotopt(0);
  2787.         printf("n");
  2788.         break;
  2789. #endif /* TNCODE */
  2790. #ifdef CK_TRIGGER
  2791.       case SHTRIG: {
  2792.   extern char * tt_trigger[], * triggerval;
  2793.   int i;
  2794.   if (!tt_trigger[0]) {
  2795.       printf(" Triggers: (none)n");
  2796.   } else {
  2797.       printf(" Triggers:n");
  2798.       for (i = 0; i < TRIGGERS; i++) {
  2799.   if (!tt_trigger[i])
  2800.     break;
  2801.   printf("  "%s"n",tt_trigger[i]);
  2802.       }
  2803.       printf(" Most recent trigger encountered: ");
  2804.       if (triggerval)
  2805. printf(""%s"n",triggerval);
  2806.       else
  2807. printf("(none)n");
  2808.   }
  2809.   break;
  2810.       }
  2811. #endif /* CK_TRIGGER */
  2812. #endif /* NOLOCAL */
  2813. #ifndef NOSPL
  2814.       case SHINP:
  2815. shoinput();
  2816. break;
  2817. #endif /* NOSPL */
  2818.       case SHLOG: {
  2819. #ifndef MAC
  2820.   extern int xferlog;
  2821. #ifdef IKSD
  2822.           if (inserver &&
  2823. #ifdef CK_LOGIN
  2824.               isguest
  2825. #else /* CK_LOGIN */
  2826.               0
  2827. #endif /* CK_LOGIN */
  2828.              ) {
  2829.             printf("Sorry, command disabled.rn");
  2830.             return(success = 0);
  2831.         }
  2832. #endif /* IKSD */
  2833. #ifdef DEBUG
  2834.   printf("n Debug log:       %sn", deblog ? debfil : "(none)");
  2835. #endif /* DEBUG */
  2836. #ifndef NOXFER
  2837.   printf(" Packet log:      %sn",   pktlog ? pktfil : "(none)");
  2838. #endif /* NOXFER */
  2839. #ifndef NOLOCAL
  2840.   printf(" Session log:     %sn",   seslog ? sesfil : "(none)");
  2841. #endif /* NOLOCAL */
  2842. #ifdef TLOG
  2843.   if (tralog || (xferlog && tlogfmt == 2)) {
  2844.       extern int tlogsep;
  2845.       printf(" Transaction log: %s (%s)",
  2846.      trafil,
  2847.      tlogfmt ?
  2848.      ((tlogfmt == 2) ? "ftp" : "verbose") :
  2849.      "brief"
  2850.      );
  2851.       if (tlogfmt == 0)
  2852. printf(" (separator='%c')", (char)tlogsep);
  2853.       printf("nn");
  2854.   } else
  2855.     printf(" Transaction log: (none)n");
  2856. #endif /* TLOG */
  2857. #ifdef CKLOGDIAL
  2858.        printf(" Connection log:  %sn", dialog ? diafil : "(none)");
  2859. #endif /* CKLOGDIAL */
  2860.   printf("n");
  2861. #endif /* MAC */
  2862.   break;
  2863.       }
  2864. #ifndef NOSPL
  2865.       case SHOUTP: /* OUTPUT */
  2866. shooutput();
  2867. break;
  2868. #endif /* NOSPL */
  2869. #ifdef PATTERNS
  2870.       case SHOPAT: /* PATTERNS */
  2871. shopat();
  2872. break;
  2873. #endif /* PATTERNS */
  2874. #ifdef STREAMING
  2875.       case SHOSTR: { /* STREAMING */
  2876.   extern int streamrq, tsecs, clearrq, cleared;
  2877.   extern long tfc;
  2878.   extern long tfcps;
  2879.   printf("n Reliable:     %sn",showooa(reliable));
  2880.   printf(" Clearchannel: %sn",showooa(clearrq));
  2881.   printf(" Streaming:    %snn",showooa(streamrq));
  2882.   if (!local && streamrq == SET_ON ||
  2883.       streamrq == SET_AUTO && reliable)
  2884.     printf(" Streaming will be done if requested.n");
  2885.   else if (streamrq == SET_OFF || streamrq == SET_AUTO && !reliable)
  2886.     printf(" Streaming will not be requested and will not be done.n");
  2887.   else if (streamrq == SET_ON || streamrq == SET_AUTO && reliable)
  2888.     printf(
  2889. " Streaming will be requested and will be done if the other Kermit agrees.n");
  2890.   printf(" Last transfer: %sstreaming%s, %ld cps.n",
  2891.  streamed > 0 ? "" : "no ",
  2892.  cleared ? ", clearchannel" : "",
  2893.  tfcps
  2894.  );
  2895.   printf("n");
  2896.   break;
  2897.       }
  2898. #endif /* STREAMING */
  2899. #ifdef CK_AUTHENTICATION
  2900.       case SHOAUTH:
  2901. return(sho_auth(0));
  2902. #endif /* CK_AUTHENTICATION */
  2903. #ifdef BROWSER
  2904.       case SHOFTP: {
  2905.   extern char ftpapp[], ftpopts[];
  2906. #ifdef IKSD
  2907.         if (inserver) {
  2908.             printf("Sorry, command disabled.rn");
  2909.             return(success = 0);
  2910.         }
  2911. #endif /* IKSD */
  2912.   printf("n ftp-client:  %sn", ftpapp[0] ? ftpapp : "(none)");
  2913.   if (ftpapp[0]) {
  2914.       printf(" ftp options: %sn", ftpopts[0] ? ftpopts : "(none)");
  2915.   }
  2916.   printf("n");
  2917.   break;
  2918.       }
  2919. #endif /* BROWSER */
  2920. #ifndef NOCMDL
  2921.       case SHXOPT: {
  2922. #ifdef IKSDB
  2923.   extern unsigned long mystate;
  2924.   extern int dbenabled;
  2925.   extern char * dbfile, * dbdir, myhexip[];
  2926.   extern unsigned long mypid;
  2927. #endif /* IKSDB */
  2928. #ifdef CKWTMP
  2929.   extern int ckxwtmp;
  2930.   extern char * wtmpfile;
  2931. #endif /* CKWTMP */
  2932. #ifdef CK_LOGIN
  2933.   extern int ckxanon, ckxpriv, ckxperms, xferlog, logintimo;
  2934.   extern char * xferfile;
  2935. #endif /* CK_LOGIN */
  2936.   extern char * bannerfile, * helpfile;
  2937. #ifdef IKSD
  2938.           if (inserver &&
  2939. #ifdef CK_LOGIN
  2940.               isguest
  2941. #else /* CK_LOGIN */
  2942.               0
  2943. #endif /* CK_LOGIN */
  2944.       ) {
  2945.       printf("Sorry, command disabled.rn");
  2946.       return(success = 0);
  2947.   }
  2948. #endif /* IKSD */
  2949.   printf("n");
  2950.   if (!cmdint)
  2951.     printf(" --nointerruptsn");
  2952.   printf(" --bannerfile=%sn",bannerfile ? bannerfile : "(null)");
  2953.   printf(" --cdfile:%sn",cdmsgstr ? cdmsgstr : "(null)");
  2954.   printf(" --cdmessage:%dn",srvcdmsg);
  2955.   printf(" --helpfile:%dn",helpfile);
  2956.   if (inserver) {
  2957.       printf("n");
  2958.       break;
  2959.   }
  2960. #ifdef CKSYSLOG
  2961. #ifdef SYSLOGLEVEL
  2962.   printf(" --syslog:%d (forced)n",ckxsyslog);
  2963. #else
  2964.   printf(" --syslog:%dn",ckxsyslog);
  2965. #endif /* SYSLOGLEVEL */
  2966. #endif /* CKSYSLOG */
  2967. #ifdef CKWTMP
  2968.   printf(" --wtmplog:%dn",ckxwtmp);
  2969.   printf(" --wtmpfile=%sn",wtmpfile ? wtmpfile : "(null)");
  2970. #endif /* CKWTMP */
  2971. #ifdef IKSD
  2972. #ifdef CK_LOGIN
  2973.   printf(" --anonymous:%dn",ckxanon);
  2974.   printf(" --privid:%dn",ckxpriv);
  2975.   printf(" --permission:%04on",ckxperms);
  2976.   printf(" --initfile:%sn",anonfile ? anonfile : "(null)");
  2977.   printf(" --userfile:%sn",userfile ? userfile : "(null)");
  2978.   printf(" --root:%sn",anonroot ? anonroot : "(null)");
  2979.   printf(" --xferlog=%dn",xferlog);
  2980.   printf(" --xferfile=%sn",xferfile ? xferfile : "(null)");
  2981.   printf(" --timeout=%dn",logintimo);
  2982. #endif /* CK_LOGIN */
  2983. #ifdef IKSDB
  2984.   printf(" --database=%dn",dbenabled);
  2985.   printf(" --dbfile=%sn",dbfile ? dbfile : "(null)");
  2986.   if (dbdir)
  2987.     printf("   (db directory=[%s])n",dbdir);
  2988. #endif /* IKSDB */
  2989. #ifdef IKSDCONF
  2990.   printf(" IKSD conf=%sn",iksdconf);
  2991. #endif /* IKSDCONF */
  2992. #endif /* IKSD */
  2993.   printf("n");
  2994.   break;
  2995.       }
  2996. #endif /* NOCMDL */
  2997.       case SHCD:
  2998. s = getenv("CDPATH");
  2999. if (!s) s = "(none)";
  3000.         printf("n current directory:  %sn", zgtdir());
  3001.         printf(" previous directory: %sn", prevdir ? prevdir : "(none)");
  3002.         printf(" cd path:            %sn", ckcdpath ? ckcdpath : s);
  3003. printf(" cd message:         %sn", showoff(srvcdmsg & 2));
  3004. printf(" server cd-message:  %sn", showoff(srvcdmsg & 1));
  3005. printf(" cd message file:    %snn", cdmsgstr ? cdmsgstr : "(none)");
  3006. break;
  3007. #ifndef NOCSETS
  3008.       case SHASSOC:
  3009. (VOID) showassoc();
  3010. break;
  3011. #endif /* NOCSETS */
  3012. #ifdef CKLOGDIAL
  3013.       case SHCONNX:
  3014. (VOID) dologshow(1);
  3015. break;
  3016. #endif /* CKLOGDIAL */
  3017.       case SHOPTS:
  3018. optlines = 0;
  3019. #ifndef NOFRILLS
  3020. (VOID) showdelopts();
  3021. #endif /* NOFRILLS */
  3022. #ifdef DOMYDIR
  3023. (VOID) showdiropts();
  3024. #endif /* DOMYDIR */
  3025. #ifdef CKPURGE
  3026. (VOID) showpurgopts();
  3027. #endif /* CKPURGE */
  3028. (VOID) showtypopts();
  3029. break;
  3030. #ifndef NOLOCAL
  3031.       case SHOFLO:
  3032. (VOID) shoflow();
  3033. break;
  3034. #endif /* NOLOCAL */
  3035. #ifndef NOXFER
  3036.       case SHOXFER:
  3037. (VOID) shoxfer();
  3038. break;
  3039. #endif /* NOXFER */
  3040.       default:
  3041. printf("nNothing to show...n");
  3042. return(-2);
  3043.     }
  3044.     return(success = 1);
  3045. }
  3046. #ifndef NOXFER
  3047. int
  3048. shoatt() {
  3049.     printf("Attributes: %sn", showoff(atcapr));
  3050.     if (!atcapr) return(0);
  3051.     printf(" Blocksize: %sn", showoff(atblki));
  3052.     printf(" Date: %sn", showoff(atdati));
  3053.     printf(" Disposition: %sn", showoff(atdisi));
  3054.     printf(" Encoding (Character Set): %sn", showoff(atenci));
  3055.     printf(" Length: %sn", showoff(atleni));
  3056.     printf(" Type (text/binary): %sn", showoff(attypi));
  3057.     printf(" System ID: %sn", showoff(atsidi));
  3058.     printf(" System Info: %sn", showoff(atsysi));
  3059. #ifdef CK_PERMS
  3060.     printf(" Protection: %sn", showoff(atlpri));
  3061. #endif /* CK_PERMS */
  3062. #ifdef STRATUS
  3063.     printf(" Format: %sn", showoff(atfrmi));
  3064.     printf(" Creator: %sn", showoff(atcrei));
  3065.     printf(" Account: %sn", showoff(atacti));
  3066. #endif /* STRATUS */
  3067.     return(0);
  3068. }
  3069. #endif /* NOXFER */
  3070. #ifndef NOSPL
  3071. int /* SHOW MACROS */
  3072. shomac(s1, s2) char *s1, *s2; {
  3073.     int x, n, pp;
  3074.     pp = 0; /* Parenthesis counter */
  3075.     debug(F110,"shomac s1",s1,0);
  3076.     debug(F110,"shomac s2",s2,0);
  3077.     if (!s1)
  3078.       return(0);
  3079.     else
  3080.       printf("n%s = ",s1); /* Print blank line and macro name */
  3081.     slc++; /* Count the line */
  3082.     n = (int)strlen(s1) + 4; /* Width of current line */
  3083.     if (!s2) s2 = "(null definition)";
  3084.     while (x = *s2++) { /* Loop thru definition */
  3085. if (x == '(') pp++; /* Treat commas within parens */
  3086. if (x == ')') pp--; /* as ordinary text */
  3087. if (pp < 0) pp = 0; /* Outside parens, */
  3088. if (x == ',' && pp == 0) { /* comma becomes comma-dash-NL. */
  3089.     putchar(',');
  3090.     putchar('-');
  3091.     x = 'n';
  3092. }
  3093. putchar((CHAR)x); /* Output the character */
  3094. if (x == 'n') { /* If it was a newline */
  3095. #ifdef UNIX
  3096. #ifdef NOSETBUF
  3097.     fflush(stdout);
  3098. #endif /* NOSETBUF */
  3099. #endif /* UNIX */
  3100.     putchar(' '); /* Indent the next line 1 space */
  3101.     while(*s2 == ' ') s2++; /* skip past leading blanks */
  3102.     n = 2; /* restart the character counter */