Blame src/config.c

Packit 15a96c
/*
Packit 15a96c
 * config.c	Read and write the configuration file(s).
Packit 15a96c
 *
Packit 15a96c
 *		This file is part of the minicom communications package,
Packit 15a96c
 *		Copyright 1991-1995 Miquel van Smoorenburg.
Packit 15a96c
 *
Packit 15a96c
 *		This program is free software; you can redistribute it and/or
Packit 15a96c
 *		modify it under the terms of the GNU General Public License
Packit 15a96c
 *		as published by the Free Software Foundation; either version
Packit 15a96c
 *		2 of the License, or (at your option) any later version.
Packit 15a96c
 
Packit 15a96c
 *  You should have received a copy of the GNU General Public License along
Packit 15a96c
 *  with this program; if not, write to the Free Software Foundation, Inc.,
Packit 15a96c
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Packit 15a96c
 *
Packit 15a96c
 * // fmg 12/20/93 - Added color selection to Screen & Keyboard menu
Packit 15a96c
 * // fmg 2/15/94 - Added macro filename & Macro define selection to
Packit 15a96c
 *                  Screen & Keyboard menu. Added window for macro
Packit 15a96c
 *                  definition.
Packit 15a96c
 * // jl 04.09.97 - Added configuring the character conversion tables
Packit 15a96c
 * // jl 09.09.97 - Save conversion table filename in the config file and
Packit 15a96c
 *                  read the table at startup
Packit 15a96c
 * // jl 22.02.98 - Setting for filename selection window
Packit 15a96c
 * // acme 25.02.98 - i18n
Packit 15a96c
 * // jl 05.04.98 - Handling the P_MUL option
Packit 15a96c
 *    jl 06.07.98 - the P_CONVCAP option
Packit 15a96c
 *    jl 10.07.98 - moved functions pfix_home and do_log to file common.c
Packit 15a96c
 *    jl 29.11.98 - the P_SHOWSPD option
Packit 15a96c
 *    jl 05.04.99 - logging options menu
Packit 15a96c
 *    er 18-Apr-99 - the P_MULTILINE option
Packit 15a96c
 *    jl 11.02.2000 - the P_STOPB option
Packit 15a96c
 */
Packit 15a96c
#ifdef HAVE_CONFIG_H
Packit 15a96c
#include <config.h>
Packit 15a96c
#endif
Packit 15a96c
Packit 15a96c
#include <limits.h>
Packit 15a96c
Packit 15a96c
#include "port.h"
Packit 15a96c
#include "minicom.h"
Packit 15a96c
#include "intl.h"
Packit 15a96c
Packit 15a96c
void doconv(void);   /* jl 04.09.97 */
Packit 15a96c
Packit 15a96c
/* Read in parameters. */
Packit 15a96c
void read_parms(void)
Packit 15a96c
{
Packit 15a96c
  FILE *fp;
Packit 15a96c
  int f;
Packit 15a96c
  char buf[64];
Packit 15a96c
  char *p;
Packit 15a96c
Packit 15a96c
  /* Read global parameters */
Packit 15a96c
  if ((fp = fopen(parfile, "r"))) {
Packit 15a96c
    readpars(fp, CONFIG_GLOBAL);
Packit 15a96c
    fclose(fp);
Packit 15a96c
  }
Packit 15a96c
Packit 15a96c
  /* Read personal parameters */
Packit 15a96c
  if ((fp = fopen(pparfile, "r")) != NULL) {
Packit 15a96c
    readpars(fp, CONFIG_PERSONAL);
Packit 15a96c
    fclose(fp);
Packit 15a96c
  }
Packit 15a96c
Packit 15a96c
  /* fmg - set colors from readin values (Jcolor Xlates name to #) */
Packit 15a96c
  mfcolor = Jcolor(P_MFG); mbcolor = Jcolor(P_MBG);
Packit 15a96c
  tfcolor = Jcolor(P_TFG); tbcolor = Jcolor(P_TBG);
Packit 15a96c
  sfcolor = Jcolor(P_SFG); sbcolor = Jcolor(P_SBG);
Packit 15a96c
Packit 15a96c
  /* fmg - Read personal macros */
Packit 15a96c
  if (P_MACROS[0] != 0) { /* fmg - null length? */
Packit 15a96c
    if ((fp = fopen(pfix_home(P_MACROS), "r")) == NULL) {
Packit 15a96c
      if (errno != ENOENT) {
Packit 15a96c
        fprintf(stderr,
Packit 15a96c
                _("minicom: cannot open macro file %s\n"), pfix_home(P_MACROS));
Packit 15a96c
        sleep(1); /* fmg - give the "slow" ones time to read :-) */
Packit 15a96c
      }
Packit 15a96c
    } else {
Packit 15a96c
      readmacs(fp, 0);
Packit 15a96c
      fclose(fp);
Packit 15a96c
    }
Packit 15a96c
  } /* fmg - but it's perfectly OK if macros file name is NULL... */
Packit 15a96c
  if (P_CONVF[0] != 0) { /* jl 09.09.97 */
Packit 15a96c
    loadconv(P_CONVF);
Packit 15a96c
  }
Packit 15a96c
Packit 15a96c
  /* This code is to use old configuration files. */
Packit 15a96c
  for (f = PROTO_BASE; f < MAXPROTO; f++) {
Packit 15a96c
    if (P_PNAME(f)[0] && P_PIORED(f) != 'Y' && P_PIORED(f) != 'N') {
Packit 15a96c
      strncpy(buf, P_PNAME(f) - 2, sizeof(buf));
rpm-build c8e99c
      buf[sizeof(buf) - 1] = '\0';
Packit 15a96c
      strcpy(P_PNAME(f), buf);
Packit 15a96c
      P_PIORED(f) = 'Y';
Packit 15a96c
      P_PFULL(f) = 'N';
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
  if ((p = strrchr(P_LOCK, '/')) != NULL && strncmp(p, "/LCK", 4) == 0)
Packit 15a96c
    *p = 0;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * fmg - Convert color word to number
Packit 15a96c
 */
Packit 15a96c
int Jcolor(char *s)
Packit 15a96c
{
Packit 15a96c
  char c1, c3;
Packit 15a96c
Packit 15a96c
  c1 = toupper(s[0]); /* fmg - it's already up but why tempt it? */
Packit 15a96c
  c3 = toupper(s[2]);
Packit 15a96c
Packit 15a96c
  switch (c1)
Packit 15a96c
  {
Packit 15a96c
    case 'G': return GREEN;
Packit 15a96c
    case 'Y': return YELLOW;
Packit 15a96c
    case 'W': return WHITE;
Packit 15a96c
    case 'R': return RED;
Packit 15a96c
    case 'M': return MAGENTA;
Packit 15a96c
    case 'C': return CYAN;
Packit 15a96c
    case 'B': if (c3 == 'A')
Packit 15a96c
                return BLACK;
Packit 15a96c
              if (c3 == 'U')
Packit 15a96c
                return BLUE;
Packit 15a96c
              else
Packit 15a96c
                break;
Packit 15a96c
  }
Packit 15a96c
  return -1; /* fmg - should never get here */
Packit 15a96c
}
Packit 15a96c
 
Packit 15a96c
/*
Packit 15a96c
 * See if we have write access to a file.
Packit 15a96c
 * If it is not there, see if the directory is writable.
Packit 15a96c
 */
Packit 15a96c
int waccess(char *s)
Packit 15a96c
{
Packit 15a96c
  char *p;
Packit 15a96c
  char buf[128];
Packit 15a96c
  struct stat stt;
Packit 15a96c
Packit 15a96c
  /* We use stat instead of access(s, F_OK) because I couldn't get
Packit 15a96c
   * that to work under BSD 4.3 ...
Packit 15a96c
   */
Packit 15a96c
  if (stat(s, &stt) == 0) {
Packit 15a96c
    if (access(s, W_OK) == 0)
Packit 15a96c
      return(XA_OK_EXIST);
Packit 15a96c
    return -1;
Packit 15a96c
  }
Packit 15a96c
  strncpy(buf, s, sizeof(buf)-1);
Packit 15a96c
  buf[sizeof(buf)-1] = 0;
Packit 15a96c
  if ((p = strrchr(buf, '/')) == (char *)NULL)
Packit 15a96c
    strcpy(buf, ".");
Packit 15a96c
  else
Packit 15a96c
    *p = '\0';
Packit 15a96c
  if (access(buf, W_OK) == 0)
Packit 15a96c
    return XA_OK_NOTEXIST;
Packit 15a96c
  return -1;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * fmg - Read in a macro, but first check to see if it's
Packit 15a96c
 * allowed to do so.
Packit 15a96c
 *
Packit 15a96c
 * TODO: have System macros and user macros (in theory it's already there
Packit 15a96c
 * since user can specify their own macros file (unless root makes it
Packit 15a96c
 * private... that's silly) ... anyways, you know what I mean...)
Packit 15a96c
 */
Packit 15a96c
static void mgets(WIN *w, int x, int y, char *s, int len, int maxl)
Packit 15a96c
{
Packit 15a96c
  struct macs *m = (struct macs *)s;
Packit 15a96c
Packit 15a96c
  mc_wlocate(w, x, y);
Packit 15a96c
  mc_wgets(w, s, len, maxl);
Packit 15a96c
  m->flags |= CHANGED;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Read in a string, but first check to see if it's
Packit 15a96c
 * allowed to do so.
Packit 15a96c
 */
Packit 15a96c
static void pgets(WIN *w, int x, int y, char *s, int len, unsigned int maxl,
Packit 15a96c
                  int extend_tilde)
Packit 15a96c
{
Packit 15a96c
  struct pars *p = (struct pars *)s;
Packit 15a96c
  char *home = NULL;
Packit 15a96c
Packit 15a96c
  mc_wlocate(w, x, y);
Packit 15a96c
  mc_wgets(w, s, len, maxl);
Packit 15a96c
  if (extend_tilde &&
Packit 15a96c
      s[0] == '~' && (s[1] == '/' || s[1] == 0) &&
Packit 15a96c
      (home = getenv("HOME")) && strlen(s) + strlen(home) <= maxl) {
Packit 15a96c
    int i = 0;
Packit 15a96c
    memmove(s + strlen(home), s + 1, strlen(s));
Packit 15a96c
    memcpy(s, home, strlen(home));
Packit 15a96c
    mc_wlocate(w, x, y);
Packit 15a96c
    for (i = 0; i < (len >= w->xs - x ? w->xs - x - 1 : len) && *s; i++) {
Packit 15a96c
      wchar_t wc;
Packit 15a96c
Packit 15a96c
      s += one_mbtowc(&wc, s, MB_LEN_MAX);
Packit 15a96c
      mc_wputc(w, wc);
Packit 15a96c
    }
Packit 15a96c
    mc_wflush();
Packit 15a96c
  }
Packit 15a96c
  p->flags |= CHANGED;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Mark a variable as changed.
Packit 15a96c
 */
Packit 15a96c
static void markch(char *s)
Packit 15a96c
{
Packit 15a96c
  struct pars *p = (struct pars *)s;
Packit 15a96c
Packit 15a96c
  p->flags |= CHANGED;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Set a string to a given value, but only if we're allowed to.
Packit 15a96c
 */
Packit 15a96c
static void psets(char *s, const char *w)
Packit 15a96c
{
Packit 15a96c
  struct pars *p = (struct pars *)s;
Packit 15a96c
Packit 15a96c
  strcpy(s, w);
Packit 15a96c
  p->flags |= CHANGED;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Get a a character from the keyboard. Translate lower
Packit 15a96c
 * to uppercase and '\r' to '\n'.
Packit 15a96c
 */
Packit 15a96c
static int rwxgetch(void)
Packit 15a96c
{
Packit 15a96c
  int c = wxgetch();
Packit 15a96c
Packit 15a96c
  if (islower(c))
Packit 15a96c
    c = toupper(c);
Packit 15a96c
  if (c == '\n' || c == '\r' || c == '\033')
Packit 15a96c
    return '\n';
Packit 15a96c
  return c;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
#ifdef LOGFILE
Packit 15a96c
static void dologopt(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  int c;
Packit 15a96c
  char *logfnstr = _(" A - File name (empty=disable) :");
Packit 15a96c
  char *logconn  = _(" B - Log connects and hangups  :");
Packit 15a96c
  char *logxfer  = _(" C - Log file transfers        :");
Packit 15a96c
  char *question = _("Change which setting?");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(5, 4, 75, 8, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
Packit 15a96c
  mc_wtitle(w, TMID, _("Logging options"));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", logfnstr, P_LOGFNAME);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", logconn, _(P_LOGCONN));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", logxfer, _(P_LOGXFER));
Packit 15a96c
  mc_wlocate(w, 4, 4);
Packit 15a96c
  mc_wputs(w, question);
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
  while(1) {
Packit 15a96c
    mc_wlocate(w, mbslen(question) + 5, 5);
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    switch(c) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      case 'A':
Packit 15a96c
        pgets(w, mbslen(logfnstr) + 1, 0,
Packit 15a96c
              P_LOGFNAME, PARS_VAL_LEN, PARS_VAL_LEN, 1);
Packit 15a96c
        strcpy(logfname,P_LOGFNAME);
Packit 15a96c
        break;
Packit 15a96c
      case 'B':
Packit 15a96c
        strcpy(P_LOGCONN, yesno(P_LOGCONN[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen(logconn) + 1, 1);
Packit 15a96c
        mc_wprintf(w, "%s  ", _(P_LOGCONN));
Packit 15a96c
        markch(P_LOGCONN);
Packit 15a96c
        break;
Packit 15a96c
      case 'C':
Packit 15a96c
        strcpy(P_LOGXFER, yesno(P_LOGXFER[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen(logxfer) + 1, 2);
Packit 15a96c
        mc_wprintf(w, "%s  ", _(P_LOGXFER));
Packit 15a96c
        markch(P_LOGXFER);
Packit 15a96c
        break;
Packit 15a96c
      default:
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
#endif
Packit 15a96c
Packit 15a96c
static void dopath(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  int c;
Packit 15a96c
  char *download_directory = _(" A - Download directory :");
Packit 15a96c
  char *upload_directory   = _(" B - Upload directory   :");
Packit 15a96c
  char *script_directory   = _(" C - Script directory   :");
Packit 15a96c
  char *script_program     = _(" D - Script program     :");
Packit 15a96c
  char *kermit_program     = _(" E - Kermit program     :");
Packit 15a96c
#ifdef LOGFILE
Packit 15a96c
  char *log_settings       = _(" F - Logging options");
Packit 15a96c
#endif
Packit 15a96c
  char *question           = _("Change which setting?");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(5, 5, 75, 12, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wprintf(w, "%s %.44s\n", download_directory, P_DOWNDIR);
Packit 15a96c
  mc_wprintf(w, "%s %.44s\n", upload_directory, P_UPDIR);
Packit 15a96c
  mc_wprintf(w, "%s %.44s\n", script_directory, P_SCRIPTDIR);
Packit 15a96c
  mc_wprintf(w, "%s %.44s\n", script_program, P_SCRIPTPROG);
Packit 15a96c
  mc_wprintf(w, "%s %.44s\n", kermit_program, P_KERMIT);
Packit 15a96c
#ifdef LOGFILE
Packit 15a96c
  mc_wprintf(w, "%s\n", log_settings);
Packit 15a96c
#endif
Packit 15a96c
  mc_wlocate(w, 4, 8);
Packit 15a96c
  mc_wputs(w, question);
Packit 15a96c
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while(1) {
Packit 15a96c
    mc_wlocate(w, mbslen (question) + 5, 8);
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    switch(c) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      case 'A':
Packit 15a96c
        pgets(w, mbslen (download_directory) + 1, 0, P_DOWNDIR, 64, 64, 1);
Packit 15a96c
        init_dir('d');
Packit 15a96c
        break;
Packit 15a96c
      case 'B':
Packit 15a96c
        pgets(w, mbslen (upload_directory) + 1, 1, P_UPDIR, 64, 64, 1);
Packit 15a96c
        init_dir('u');
Packit 15a96c
        break;
Packit 15a96c
      case 'C':
Packit 15a96c
        pgets(w, mbslen (script_directory) + 1, 2, P_SCRIPTDIR, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
      case 'D':
Packit 15a96c
        pgets(w, mbslen (script_program) + 1, 3, P_SCRIPTPROG, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
      case 'E':
Packit 15a96c
        pgets(w, mbslen (kermit_program) + 1, 4, P_KERMIT, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
#ifdef LOGFILE
Packit 15a96c
      case 'F':
Packit 15a96c
        dologopt();
Packit 15a96c
        break;
Packit 15a96c
#endif
Packit 15a96c
      default:
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
const char *yesno(int k)
Packit 15a96c
{
Packit 15a96c
  return(k ? N_("Yes") : N_("No "));
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Input the definition of an up/download protocol.
Packit 15a96c
 */
Packit 15a96c
static void inputproto(WIN *w, int n)
Packit 15a96c
{
Packit 15a96c
  int c = 0;
Packit 15a96c
Packit 15a96c
  mpars[PROTO_BASE + n].flags |= CHANGED;
Packit 15a96c
Packit 15a96c
  if (P_PNAME(n)[0] == '\0') {
Packit 15a96c
    P_PNN(n) = 'Y';
Packit 15a96c
    P_PUD(n) = 'U';
Packit 15a96c
    P_PFULL(n) = 'N';
Packit 15a96c
    P_PPROG(n)[0] = 0;
Packit 15a96c
    P_PIORED(n) = 'Y';
Packit 15a96c
    mc_wlocate(w, 4, n+1);
Packit 15a96c
    mc_wputs(w, "       ");
Packit 15a96c
  }
Packit 15a96c
  mc_wlocate(w, 4, n + 1);
Packit 15a96c
  mc_wgets(w, P_PNAME(n), 10, 64);
Packit 15a96c
  pgets(w, 15, n+1, P_PPROG(n), 31, 64, 0);
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, 47, n + 1);
Packit 15a96c
    mc_wprintf(w, "%c", P_PNN(n));
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c == 'Y')
Packit 15a96c
      P_PNN(n) = 'Y';
Packit 15a96c
    if (c == 'N')
Packit 15a96c
      P_PNN(n) = 'N';
Packit 15a96c
  } while (c != '\r' && c != '\n');
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, 52, n + 1);
Packit 15a96c
    mc_wprintf(w, "%c", P_PUD(n));
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c == 'U')
Packit 15a96c
      P_PUD(n) = 'U';
Packit 15a96c
    if (c == 'D')
Packit 15a96c
      P_PUD(n) = 'D';
Packit 15a96c
  } while (c != '\r' && c != '\n');
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, 57, n + 1);
Packit 15a96c
    mc_wprintf(w, "%c", P_PFULL(n));
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c == 'Y')
Packit 15a96c
      P_PFULL(n) = 'Y';
Packit 15a96c
    if (c == 'N')
Packit 15a96c
      P_PFULL(n) = 'N';
Packit 15a96c
  } while (c != '\r' && c != '\n');
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, 65, n + 1);
Packit 15a96c
    mc_wprintf(w, "%c", P_PIORED(n));
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c == 'Y')
Packit 15a96c
      P_PIORED(n) = 'Y';
Packit 15a96c
    if (c == 'N')
Packit 15a96c
      P_PIORED(n) = 'N';
Packit 15a96c
  } while (c != '\r' && c != '\n');
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, 73, n + 1);
Packit 15a96c
    mc_wprintf(w, "%c", P_MUL(n));
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c == 'Y')
Packit 15a96c
      P_MUL(n) = 'Y';
Packit 15a96c
    if (c == 'N')
Packit 15a96c
      P_MUL(n) = 'N';
Packit 15a96c
  } while (c != '\r' && c != '\n');
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
static void doproto(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  int f, c;
Packit 15a96c
  char *zmodem_download        = _("M  Zmodem download string activates...");
Packit 15a96c
  char *use_filename_selection = _("N  Use filename selection window......");
Packit 15a96c
  char *prompt_downdir         = _("O  Prompt for download directory......");
Packit 15a96c
  char *question               = _("Change which setting? (SPACE to delete)");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(1, 3, 78, 20, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wputs(w, _("     Name             Program"));
Packit 15a96c
  mc_wlocate(w, 46, 0);
Packit 15a96c
  mc_wputs(w,
Packit 15a96c
        /* TRANSLATORS:
Packit 15a96c
	 * Name: Protocol sends filename internally
Packit 15a96c
	 * U/D: Command is used for upload or download
Packit 15a96c
	 * FullScr: Command runs fullscreen
Packit 15a96c
	 * IO-Red: Redirect output of commands to logfile
Packit 15a96c
	 * Multi: Protocol can transfer multiple files at once */
Packit 15a96c
        _("Name U/D FullScr IO-Red. Multi"));
Packit 15a96c
  for (f = 0; f < 12; f++) {
Packit 15a96c
    mc_wlocate(w, 1, f + 1);
Packit 15a96c
    if (P_PNAME(f)[0])
Packit 15a96c
      mc_wprintf(w, "%c  %-10.10s %-31.31s %c    %c    %c       %c       %c",
Packit 15a96c
              'A' + f,
Packit 15a96c
              P_PNAME(f), P_PPROG(f),
Packit 15a96c
              P_PNN(f), P_PUD(f),
Packit 15a96c
              P_PFULL(f), P_PIORED(f),
Packit 15a96c
              P_MUL(f));
Packit 15a96c
    else
Packit 15a96c
      mc_wprintf(w, "%c    -", 'A' + f);
Packit 15a96c
  }
Packit 15a96c
  mc_wlocate(w, 1, 13);
Packit 15a96c
  mc_wprintf(w, "%s %c", zmodem_download, P_PAUTO[0]);
Packit 15a96c
  mc_wlocate(w, 1, 14);
Packit 15a96c
  mc_wprintf(w, "%s %s", use_filename_selection, _(P_FSELW));
Packit 15a96c
  mc_wlocate(w, 1, 15);
Packit 15a96c
  mc_wprintf(w, "%s %s", prompt_downdir, _(P_ASKDNDIR));
Packit 15a96c
Packit 15a96c
  mc_wlocate(w, 3, 17);
Packit 15a96c
  mc_wputs(w, question);
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  do {
Packit 15a96c
    mc_wlocate(w, mbslen (question) + 4, 17);
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    if (c >= 'A' && c <= 'L')
Packit 15a96c
      inputproto(w, c - 'A');
Packit 15a96c
    if (c == ' ') {
Packit 15a96c
      mc_wlocate(w, 3, 17);
Packit 15a96c
      mc_wputs(w, _("Delete which protocol? "));
Packit 15a96c
      mc_wclreol(w);
Packit 15a96c
      c = rwxgetch();
Packit 15a96c
      if (c >= 'A' && c <= 'L') {
Packit 15a96c
        P_PNAME(c - 'A')[0] = '\0';
Packit 15a96c
        mpars[PROTO_BASE + (c - 'A')].flags |= CHANGED;
Packit 15a96c
        mc_wlocate(w, 3, c - 'A' + 1);
Packit 15a96c
        mc_wclreol(w);
Packit 15a96c
        mc_wputs(w, "   -");
Packit 15a96c
      }
Packit 15a96c
      mc_wlocate(w, 3, 17);
Packit 15a96c
      mc_wputs(w, question);
Packit 15a96c
      c = ' ';
Packit 15a96c
    }
Packit 15a96c
    else if (c == 'M') {
Packit 15a96c
      mc_wlocate(w, mbslen (zmodem_download) + 2, 13);
Packit 15a96c
      mc_wprintf(w, " \b");
Packit 15a96c
      c = rwxgetch();
Packit 15a96c
      if (c >= 'A' && c <= 'L') {
Packit 15a96c
        P_PAUTO[0] = c;
Packit 15a96c
        markch(P_PAUTO);
Packit 15a96c
        mc_wprintf(w, "%c", c);
Packit 15a96c
      } else if (c == '\n' || c == ' ') {
Packit 15a96c
        P_PAUTO[0] = ' ';
Packit 15a96c
        markch(P_PAUTO);
Packit 15a96c
      } else {
Packit 15a96c
        mc_wprintf(w, "%c", P_PAUTO[0]);
Packit 15a96c
      }
Packit 15a96c
      c = 0;
Packit 15a96c
    }
Packit 15a96c
    else if (c == 'N') {
Packit 15a96c
      strcpy(P_FSELW, yesno(P_FSELW[0] == 'N'));
Packit 15a96c
      if (P_FSELW[0] == 'N') {
Packit 15a96c
        strcpy(P_ASKDNDIR, "No ");
Packit 15a96c
        mc_wlocate(w, mbslen (prompt_downdir) + 2, 15);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_ASKDNDIR));
Packit 15a96c
        markch(P_ASKDNDIR);
Packit 15a96c
      }
Packit 15a96c
      mc_wlocate(w, mbslen (use_filename_selection) + 2, 14);
Packit 15a96c
      mc_wprintf(w, "%s ", _(P_FSELW));
Packit 15a96c
      markch(P_FSELW);
Packit 15a96c
    }
Packit 15a96c
    else if (c == 'O') {
Packit 15a96c
      strcpy(P_ASKDNDIR, yesno(P_ASKDNDIR[0] == 'N'));
Packit 15a96c
      if (P_ASKDNDIR[0] == 'Y') {
Packit 15a96c
        strcpy(P_FSELW, "Yes");
Packit 15a96c
        mc_wlocate(w, mbslen (use_filename_selection) + 2, 14);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_FSELW));
Packit 15a96c
        markch(P_FSELW);
Packit 15a96c
      }
Packit 15a96c
      mc_wlocate(w, mbslen (prompt_downdir) + 2, 15);
Packit 15a96c
      mc_wprintf(w, "%s ", _(P_ASKDNDIR));
Packit 15a96c
      markch(P_ASKDNDIR);
Packit 15a96c
    }
Packit 15a96c
  } while (c != '\n');
Packit 15a96c
  mc_wclose(w, 1);
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
static void doserial(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  char *serial_device         = _(" A -    Serial Device      :");
rpm-build 074359
#if !HAVE_LOCKDEV
Packit 15a96c
  char *lockfile_location     = _(" B - Lockfile Location     :");
rpm-build 074359
#endif
Packit 15a96c
  char *callin_program        = _(" C -   Callin Program      :");
Packit 15a96c
  char *callout_program       = _(" D -  Callout Program      :");
Packit 15a96c
  char *bps_par_bits          = _(" E -    Bps/Par/Bits       :");
Packit 15a96c
  char *hardware_flow_control = _(" F - Hardware Flow Control :");
Packit 15a96c
  char *software_flow_control = _(" G - Software Flow Control :");
Packit 15a96c
  char *question              = _("Change which setting?");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(5, 4, 75, 12, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wprintf(w, "%s %.41s\n", serial_device, P_PORT);
Packit 15a96c
#if !HAVE_LOCKDEV
Packit 15a96c
  mc_wprintf(w, "%s %.41s\n", lockfile_location, P_LOCK);
Packit 15a96c
#else
Packit 15a96c
  mc_wprintf(w, "\n");
Packit 15a96c
#endif
Packit 15a96c
  mc_wprintf(w, "%s %.41s\n", callin_program, P_CALLIN);
Packit 15a96c
  mc_wprintf(w, "%s %.41s\n", callout_program, P_CALLOUT);
Packit 15a96c
  mc_wprintf(w, "%s %s %s%s%s\n",
Packit 15a96c
          bps_par_bits, P_BAUDRATE, P_BITS, P_PARITY, P_STOPB);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", hardware_flow_control, _(P_HASRTS));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", software_flow_control, _(P_HASXON));
Packit 15a96c
  mc_wlocate(w, 4, 8);
Packit 15a96c
  mc_wputs(w, question);
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while(1) {
Packit 15a96c
    mc_wlocate(w, mbslen (question) + 5, 8);
Packit 15a96c
    switch (rwxgetch()) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      case 'A':
Packit 15a96c
        pgets(w, mbslen (serial_device) + 1, 0, P_PORT, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
#if !HAVE_LOCKDEV
Packit 15a96c
      case 'B':
Packit 15a96c
        pgets(w, mbslen (lockfile_location) + 1, 1, P_LOCK, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
#endif
Packit 15a96c
      case 'C':
Packit 15a96c
        pgets(w, mbslen (callin_program) + 1, 2, P_CALLIN, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
      case 'D':
Packit 15a96c
        pgets(w, mbslen (callout_program) + 1, 3, P_CALLOUT, 64, 64, 1);
Packit 15a96c
        break;
Packit 15a96c
      case 'E':
Packit 15a96c
        get_bbp(P_BAUDRATE, P_BITS, P_PARITY, P_STOPB, 0);
Packit 15a96c
        if (portfd >= 0)
Packit 15a96c
          port_init();
Packit 15a96c
        mc_wlocate(w, mbslen (bps_par_bits) + 1, 4);
Packit 15a96c
        mc_wprintf(w, "%s %s%s%s  \n", P_BAUDRATE, P_BITS, P_PARITY, P_STOPB);
Packit 15a96c
        show_status();
Packit 15a96c
        markch(P_BAUDRATE);
Packit 15a96c
        markch(P_BITS);
Packit 15a96c
        markch(P_PARITY);
Packit 15a96c
        markch(P_STOPB);
Packit 15a96c
        break;
Packit 15a96c
      case 'F':
Packit 15a96c
        strcpy(P_HASRTS, yesno(P_HASRTS[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (hardware_flow_control) + 1, 5);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_HASRTS));
Packit 15a96c
        if (portfd >= 0)
Packit 15a96c
          port_init();
Packit 15a96c
        markch(P_HASRTS);
Packit 15a96c
        break;
Packit 15a96c
      case 'G':
Packit 15a96c
        strcpy(P_HASXON, yesno(P_HASXON[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (software_flow_control) + 1, 6);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_HASXON));
Packit 15a96c
        if (portfd >= 0)
Packit 15a96c
          port_init();
Packit 15a96c
        markch(P_HASXON);
Packit 15a96c
        break;
Packit 15a96c
      default:
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
char * sspd(char *sptyp)
Packit 15a96c
{
Packit 15a96c
  if (sptyp[0] == 'd')
Packit 15a96c
    return (_("DTE speed "));
Packit 15a96c
  else
Packit 15a96c
    return (_("line speed"));
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
static void domodem(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  char *str;
Packit 15a96c
  int c, x, y, ypos, maxl, string_size;
Packit 15a96c
  const char *init_string         = _(" A - Init string .........");
Packit 15a96c
  const char *reset_string        = _(" B - Reset string ........");
Packit 15a96c
  const char *dialing_prefix_1    = _(" C - Dialing prefix #1....");
Packit 15a96c
  const char *dialing_suffix_1    = _(" D - Dialing suffix #1....");
Packit 15a96c
  const char *dialing_prefix_2    = _(" E - Dialing prefix #2....");
Packit 15a96c
  const char *dialing_suffix_2    = _(" F - Dialing suffix #2....");
Packit 15a96c
  const char *dialing_prefix_3    = _(" G - Dialing prefix #3....");
Packit 15a96c
  const char *dialing_suffix_3    = _(" H - Dialing suffix #3....");
Packit 15a96c
  const char *connect_string      = _(" I - Connect string ......");
Packit 15a96c
  const char *no_connect_strings  = _(" J - No connect strings ..");
Packit 15a96c
  const char *hangup_string       = _(" K - Hang-up string ......");
Packit 15a96c
  const char *dial_cancel_string  = _(" L - Dial cancel string ..");
Packit 15a96c
  const char *dial_time           = _(" M - Dial time ...........");
Packit 15a96c
  const char *delay_before_redial = _(" N - Delay before redial .");
Packit 15a96c
  const char *number_of_tries     = _(" O - Number of tries .....");
Packit 15a96c
  const char *dtr_drop_time       = _(" P - DTR drop time (0=no).");
Packit 15a96c
  const char *auto_bps_detect     = _(" Q - Auto bps detect .....");
Packit 15a96c
  const char *modem_has_dcd_line  = _(" R - Modem has DCD line ..");
Packit 15a96c
  const char *shown_speed         = _(" S - Status line shows ...");
Packit 15a96c
  const char *multi_node          = _(" T - Multi-line untag ....");
Packit 15a96c
  const char *question            = _("Change which setting?");
Packit 15a96c
Packit 15a96c
  const char *defaults[] =
Packit 15a96c
    {
Packit 15a96c
      "~^M~AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0^M",
Packit 15a96c
      "^M~ATZ^M~",
Packit 15a96c
    };
Packit 15a96c
Packit 15a96c
  w = mc_wopen(2, 2, 77, 22, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
Packit 15a96c
  dirflush = 0;
Packit 15a96c
  mc_wtitle(w, TMID, _("Modem and dialing parameter setup"));
Packit 15a96c
  mc_wprintf(w, "\n");
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", init_string, P_MINIT);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", reset_string, P_MRESET);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_prefix_1, P_MDIALPRE);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_suffix_1, P_MDIALSUF);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_prefix_2, P_MDIALPRE2);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_suffix_2, P_MDIALSUF2);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_prefix_3, P_MDIALPRE3);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dialing_suffix_3, P_MDIALSUF3);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", connect_string, P_MCONNECT);
Packit 15a96c
  mc_wprintf(w, "%s %-20.20s  %.20s\n", no_connect_strings, P_MNOCON1, P_MNOCON2);
Packit 15a96c
  mc_wlocate(w, mbslen (no_connect_strings) + 1, 11);
Packit 15a96c
  mc_wprintf(w, "%-20.20s  %.20s\n", P_MNOCON3, P_MNOCON4);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", hangup_string, P_MHANGUP);
Packit 15a96c
  mc_wprintf(w, "%s %.48s\n", dial_cancel_string, P_MDIALCAN);
Packit 15a96c
  mc_wprintf(w, "\n");
Packit 15a96c
  mc_wprintf(w, "%s %.3s\n", dial_time, P_MDIALTIME);
Packit 15a96c
  mc_wprintf(w, "%s %.3s\n", delay_before_redial, P_MRDELAY);
Packit 15a96c
  mc_wprintf(w, "%s %.3s\n", number_of_tries, P_MRETRIES);
Packit 15a96c
  mc_wprintf(w, "%s %.3s\n", dtr_drop_time, P_MDROPDTR);
Packit 15a96c
  mc_wlocate(w, 34, 15);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", auto_bps_detect, _(P_MAUTOBAUD));
Packit 15a96c
  mc_wlocate(w, 34, 16);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", modem_has_dcd_line, _(P_HASDCD));
Packit 15a96c
  mc_wlocate(w, 34, 17);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", shown_speed, sspd(P_SHOWSPD));
Packit 15a96c
  mc_wlocate(w, 34, 18); /* Option for multi-node untag */
Packit 15a96c
  mc_wprintf(w, "%s %s\n", multi_node, _(P_MULTILINE));	/* er 18-Apr-99 */
Packit 15a96c
Packit 15a96c
  mc_wlocate(w, 1, 20);
Packit 15a96c
  mc_wprintf(w, "%s ", question);
Packit 15a96c
  x = w->curx; y = w->cury;
Packit 15a96c
  mc_wprintf(w, _("    Return or Esc to exit. Edit A+B to get defaults."));
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while (1) {
Packit 15a96c
    mc_wlocate(w, x, y);
Packit 15a96c
    mc_wflush();
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    ypos = 1;
Packit 15a96c
    maxl = 64;
Packit 15a96c
    string_size = 0;
Packit 15a96c
    switch(c) {
Packit 15a96c
      case 'M':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dial_time);
Packit 15a96c
      case 'N':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(delay_before_redial);
Packit 15a96c
      case 'O':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(number_of_tries);
Packit 15a96c
      case 'P':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dtr_drop_time);
Packit 15a96c
        ypos++;
Packit 15a96c
        maxl = 4;
Packit 15a96c
      case 'K':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(hangup_string);
Packit 15a96c
      case 'L':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dial_cancel_string);
Packit 15a96c
        ypos -= 2;
Packit 15a96c
        c += 3;
Packit 15a96c
      case 'A':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(init_string);
Packit 15a96c
      case 'B':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(reset_string);
Packit 15a96c
      case 'C':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_prefix_1);
Packit 15a96c
      case 'D':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_suffix_1);
Packit 15a96c
      case 'E':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_prefix_2);
Packit 15a96c
      case 'F':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_suffix_2);
Packit 15a96c
      case 'G':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_prefix_3);
Packit 15a96c
      case 'H':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(dialing_suffix_3);
Packit 15a96c
      case 'I':
Packit 15a96c
        if (string_size == 0)
Packit 15a96c
          string_size = mbslen(connect_string);
Packit 15a96c
Packit 15a96c
	{
Packit 15a96c
	  int loc = c - 'A';
Packit 15a96c
Packit 15a96c
	  /* Calculate adress of string to modify */
Packit 15a96c
	  str = P_MINIT + loc * sizeof(struct pars);
Packit 15a96c
Packit 15a96c
	  /* Nowadays (2011), the modem init and reset strings are seldomly
Packit 15a96c
	   * used, so we initialize those values to an empty string and
Packit 15a96c
	   * offer the default value when trying to set those strings from
Packit 15a96c
	   * an empty value */
Packit 15a96c
	  if ((loc == 0 || loc == 1) && !*str)
Packit 15a96c
	    {
Packit 15a96c
	      strncpy(str, defaults[loc], PARS_VAL_LEN);
Packit 15a96c
	      str[PARS_VAL_LEN - 1] = 0;
Packit 15a96c
Packit 15a96c
              mc_wlocate(w, string_size + 1, 1 + loc);
Packit 15a96c
              mc_wprintf(w, "%.48s\n", str);
Packit 15a96c
	    }
Packit 15a96c
Packit 15a96c
	  pgets(w, string_size + 1, ypos + loc, str, maxl, maxl, 0);
Packit 15a96c
	}
Packit 15a96c
        break;
Packit 15a96c
      case 'J':
Packit 15a96c
        string_size = mbslen (no_connect_strings);
Packit 15a96c
        /* Walk through all four */
Packit 15a96c
        pgets(w, string_size + 1, 10, P_MNOCON1, 20, 64, 0);
Packit 15a96c
        pgets(w, string_size + 1 + 22, 10, P_MNOCON2, 20, 64, 0);
Packit 15a96c
        pgets(w, string_size + 1 , 11, P_MNOCON3, 20, 64, 0);
Packit 15a96c
        pgets(w, string_size + 1 + 22, 11, P_MNOCON4, 20, 64, 0);
Packit 15a96c
        break;
Packit 15a96c
      case 'Q':
Packit 15a96c
        psets(P_MAUTOBAUD, yesno(P_MAUTOBAUD[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, 35 + mbslen (auto_bps_detect), 15);
Packit 15a96c
        mc_wputs(w, _(P_MAUTOBAUD));
Packit 15a96c
        break;
Packit 15a96c
      case 'R':
Packit 15a96c
        psets(P_HASDCD, yesno(P_HASDCD[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, 35 + mbslen (modem_has_dcd_line), 16);
Packit 15a96c
        mc_wputs(w, _(P_HASDCD));
Packit 15a96c
        break;
Packit 15a96c
      case 'S':
Packit 15a96c
        psets(P_SHOWSPD, P_SHOWSPD[0] == 'd' ? "l": "d");
Packit 15a96c
        mc_wlocate(w, 35 + mbslen (shown_speed), 17);
Packit 15a96c
        mc_wputs(w, sspd(P_SHOWSPD));
Packit 15a96c
        show_status();
Packit 15a96c
        break;
Packit 15a96c
      case 'T': /* Update for multi-node */
Packit 15a96c
        psets(P_MULTILINE, yesno(P_MULTILINE[0] == 'N' ));
Packit 15a96c
        mc_wlocate(w, 35 + mbslen(multi_node), 18);
Packit 15a96c
        mc_wputs(w, _(P_MULTILINE));
Packit 15a96c
        break;
Packit 15a96c
        /* er 18-Apr-99 */
Packit 15a96c
      case '\n':
Packit 15a96c
        dirflush = 1;
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      default:
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Screen and keyboard menu.
Packit 15a96c
 */
Packit 15a96c
static void doscrkeyb(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w, *w1;
Packit 15a96c
  int c;
Packit 15a96c
  int once = 0;
Packit 15a96c
  int clr = 1;
Packit 15a96c
  int tmp_c;    /* fmg - need it to color keep in sanity checks */
Packit 15a96c
  char buf[16];
Packit 15a96c
  int miny = 2, maxy = 22;
Packit 15a96c
  int old_stat = P_STATLINE[0];
Packit 15a96c
  FILE *fp;
Packit 15a96c
  char *command_key           = _(" A - Command key is         :");
Packit 15a96c
  char *backspace_key         = _(" B - Backspace key sends    :");
Packit 15a96c
  char *status_line           = _(" C - Status line is         :");
Packit 15a96c
  char *alarm_sound           = _(" D - Alarm sound            :");
Packit 15a96c
  char *foreground_color_menu = _(" E - Foreground Color (menu):");
Packit 15a96c
  char *background_color_menu = _(" F - Background Color (menu):");
Packit 15a96c
  char *foreground_color_term = _(" G - Foreground Color (term):");
Packit 15a96c
  char *background_color_term = _(" H - Background Color (term):");
Packit 15a96c
  char *foreground_color_stat = _(" I - Foreground Color (stat):");
Packit 15a96c
  char *background_color_stat = _(" J - Background Color (stat):");
Packit 15a96c
  char *history_buffer_size   = _(" K - History Buffer Size    :");
Packit 15a96c
  char *macros_file           = _(" L - Macros file            :");
Packit 15a96c
  char *macros_enabled        = _(" N - Macros enabled         :");
Packit 15a96c
  char *character_conversion  = _(" O - Character conversion   :");
Packit 15a96c
  char *add_linefeed          = _(" P - Add linefeed           :");
Packit 15a96c
  char *local_echo_str        = _(" Q - Local echo             :");
Packit 15a96c
  char *line_wrap             = _(" R - Line Wrap              :");
Packit 15a96c
  char *display_hex_str       = _(" S - Hex Display            :");
Packit 15a96c
  char *add_carriagereturn    = _(" T - Add carriage return    :");
Packit 15a96c
  char *question              = _("Change which setting?  (Esc to exit)");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(15, miny, 69, maxy, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
Packit 15a96c
  mc_wtitle(w, TMID, _("Screen and keyboard"));
Packit 15a96c
Packit 15a96c
  mc_wprintf(w, "%s %s\n", command_key, P_ESCAPE);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", backspace_key, P_BACKSPACE);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", status_line, _(P_STATLINE));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", alarm_sound, _(P_SOUND));
Packit 15a96c
  /* fmg - colors support */
Packit 15a96c
  mc_wprintf(w, "%s %s\n", foreground_color_menu, _(J_col[mfcolor]));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", background_color_menu, _(J_col[mbcolor]));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", foreground_color_term, _(J_col[tfcolor]));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", background_color_term, _(J_col[tbcolor]));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", foreground_color_stat, _(J_col[sfcolor]));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", background_color_stat, _(J_col[sbcolor]));
Packit 15a96c
Packit 15a96c
  /* MARK updated 02/17/95 - Configurable history buffer size */
Packit 15a96c
  mc_wprintf(w, "%s %s\n", history_buffer_size, P_HISTSIZE);
Packit 15a96c
Packit 15a96c
  /* fmg - macros support */
Packit 15a96c
  mc_wprintf(w, "%s %s\n", macros_file, P_MACROS);
Packit 15a96c
  mc_wprintf(w, _(" M - Edit Macros\n"));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", macros_enabled, _(P_MACENAB));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", character_conversion, P_CONVF);
Packit 15a96c
Packit 15a96c
  mc_wprintf(w, "%s %s\n", add_linefeed, _(P_ADDLINEFEED));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", local_echo_str, _(P_LOCALECHO));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", line_wrap, _(P_LINEWRAP));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", display_hex_str, _(P_DISPLAYHEX));
Packit 15a96c
  mc_wprintf(w, "%s %s\n", add_carriagereturn, _(P_ADDCARRIAGERETURN));
Packit 15a96c
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while (1) {
Packit 15a96c
    if (clr) {
Packit 15a96c
      mc_wlocate(w, 2, maxy - miny);
Packit 15a96c
      mc_wprintf(w, "%s ", question);
Packit 15a96c
      mc_wclreol(w);
Packit 15a96c
      clr = 0;
Packit 15a96c
    } else
Packit 15a96c
      mc_wlocate(w, mbslen (question) + 3, maxy - miny);
Packit 15a96c
Packit 15a96c
    if (once) {	/* fmg - allow to force looping */
Packit 15a96c
      c = once;
Packit 15a96c
      once = 0;
Packit 15a96c
    } else
Packit 15a96c
      c = rwxgetch();
Packit 15a96c
#if 0 /* This might save us someday */
Packit 15a96c
    if (!usecolor && (c >= 'E' && c <= 'J')) {
Packit 15a96c
      werror(_("You can't change colors in black and white mode"));
Packit 15a96c
      continue;
Packit 15a96c
    }
Packit 15a96c
#endif
Packit 15a96c
    switch(c) {
Packit 15a96c
      case '\n':
Packit 15a96c
        /* fmg - sanity checks... "we found the enemy and he is us" :-) */
Packit 15a96c
Packit 15a96c
        if (mfcolor == mbcolor) {  /* oops... */
Packit 15a96c
          tmp_c = mfcolor;      /* save color (same for both, right?) */
Packit 15a96c
          mfcolor = WHITE;      /* make sure they can see error :-) */
Packit 15a96c
          mbcolor = BLACK;
Packit 15a96c
          werror(_("Menu foreground == background color, change!"));
Packit 15a96c
          mfcolor = tmp_c;      /* restore colors */
Packit 15a96c
          mbcolor = tmp_c;
Packit 15a96c
          break;
Packit 15a96c
        }
Packit 15a96c
        if (tfcolor == tbcolor) {  /* oops... */
Packit 15a96c
          tmp_c = mfcolor;      /* save color (same for both, right?) */
Packit 15a96c
          mfcolor = WHITE;      /* make sure they can see error :-) */
Packit 15a96c
          mbcolor = BLACK;
Packit 15a96c
          werror(_("Terminal foreground == background color, change!"));
Packit 15a96c
          mfcolor = tmp_c;      /* restore colors */
Packit 15a96c
          mbcolor = tmp_c;
Packit 15a96c
          break;
Packit 15a96c
        }
Packit 15a96c
        /* fmg - I'll let them change sfcolor=sbcolor because it's just
Packit 15a96c
           another way of turning "off" the status line... */
Packit 15a96c
Packit 15a96c
        /* MARK updated 02/17/95, Warn user to restart */
Packit 15a96c
        /* minicom if they changed history buffer size */
Packit 15a96c
        if (atoi(P_HISTSIZE) != num_hist_lines) {
Packit 15a96c
          w1 = mc_wopen(14, 9, 70, 15, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
          mc_wtitle(w1, TMID, _("History Buffer Size"));
Packit 15a96c
          mc_wputs(w1, _("\n\
Packit 15a96c
                You have changed the history buffer size.\n\
Packit 15a96c
                You will need to save the configuration file and\n\
Packit 15a96c
                restart minicom for the change to take effect.\n\n\
Packit 15a96c
                Hit a key to Continue... "));
Packit 15a96c
          mc_wredraw(w1, 1);
Packit 15a96c
          c = wxgetch();
Packit 15a96c
          mc_wclose(w1, 1);
Packit 15a96c
        }
Packit 15a96c
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        /* If status line enabled/disabled resize screen. */
Packit 15a96c
        if (P_STATLINE[0] != old_stat)
Packit 15a96c
          init_emul(terminal, 0);
Packit 15a96c
        return;
Packit 15a96c
      case 'A':
Packit 15a96c
        w1 = mc_wopen(11, 8, 73, 17, BSINGLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
        mc_wtitle(w1, TMID, _("Program new command key"));
Packit 15a96c
        mc_wputs(w1, _(
Packit 15a96c
	   "\n Press the new command key. If you want to use\n"
Packit 15a96c
	   " the META or ALT key enter:\n\n"
Packit 15a96c
	   "  o SPACE if your meta key sets the 8th bit high\n"
Packit 15a96c
	   "  o ESC   if your meta key sends the ESCAPE prefix (standard)\n"
Packit 15a96c
           "\n\n Press new command key: "));
Packit 15a96c
        mc_wredraw(w1, 1);
Packit 15a96c
        c = wxgetch();
Packit 15a96c
        mc_wclose(w1, 1);
Packit 15a96c
        if (c  == ' ')
Packit 15a96c
          strcpy(buf, N_("Meta-8th bit "));
Packit 15a96c
        else if (c == 27)
Packit 15a96c
          strcpy(buf, N_("Escape (Meta)"));
Packit 15a96c
        else
Packit 15a96c
          sprintf(buf, "^%c           ", (c & 0x1f) + 'A' - 1);
Packit 15a96c
        psets(P_ESCAPE, buf);
Packit 15a96c
        mc_wlocate(w, mbslen (command_key) + 1, 0);
Packit 15a96c
        mc_wputs(w, _(buf));
Packit 15a96c
        clr = 1;
Packit 15a96c
        alt_override = 0;
Packit 15a96c
        switch(P_ESCAPE[0]) {
Packit 15a96c
          case '^':
Packit 15a96c
            c = P_ESCAPE[1] & 31;
Packit 15a96c
            break;
Packit 15a96c
          case 'E':
Packit 15a96c
            c = 27;
Packit 15a96c
            break;
Packit 15a96c
          default:
Packit 15a96c
            c = 128;
Packit 15a96c
            break;
Packit 15a96c
        }
Packit 15a96c
        keyboard(KSETESC, c);
Packit 15a96c
        show_status();
Packit 15a96c
        break;
Packit 15a96c
      case 'B':
Packit 15a96c
        if (P_BACKSPACE[0] == 'D')
Packit 15a96c
          psets(P_BACKSPACE, "BS");
Packit 15a96c
        else
Packit 15a96c
          psets(P_BACKSPACE, "DEL");
Packit 15a96c
        mc_wlocate(w, mbslen (backspace_key) + 1, 1);
Packit 15a96c
        mc_wprintf(w, "%s ", P_BACKSPACE);
Packit 15a96c
        keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
Packit 15a96c
        break;
Packit 15a96c
      case 'C':
Packit 15a96c
        if (P_STATLINE[0] == 'e') {
Packit 15a96c
          psets(P_STATLINE, N_("disabled"));
Packit 15a96c
          tempst = 1;
Packit 15a96c
        } else {
Packit 15a96c
          psets(P_STATLINE, N_("enabled"));
Packit 15a96c
          /* See if it fits on screen */
Packit 15a96c
          if (LINES > 24)
Packit 15a96c
            tempst = 0;
Packit 15a96c
        }
Packit 15a96c
        mc_wlocate(w, mbslen (status_line) + 1, 2);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_STATLINE));
Packit 15a96c
        break;
Packit 15a96c
      case 'D':
Packit 15a96c
        psets(P_SOUND, yesno(P_SOUND[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (alarm_sound) + 1, 3);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_SOUND));
Packit 15a96c
        break;
Packit 15a96c
      case 'E': /* fmg - letters cycle colors */
Packit 15a96c
        if (mfcolor == WHITE)
Packit 15a96c
          mfcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          mfcolor++;
Packit 15a96c
        psets(P_MFG, J_col[mfcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (foreground_color_menu) + 1, 4);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[mfcolor]));
Packit 15a96c
        break;
Packit 15a96c
      case 'F': /* fmg - letters cycle colors */
Packit 15a96c
        if (mbcolor == WHITE)
Packit 15a96c
          mbcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          mbcolor++;
Packit 15a96c
        psets(P_MBG, J_col[mbcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (background_color_menu) + 1, 5);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[mbcolor]));
Packit 15a96c
        break;
Packit 15a96c
      case 'G': /* fmg - letters cycle colors */
Packit 15a96c
        if (tfcolor == WHITE)
Packit 15a96c
          tfcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          tfcolor++;
Packit 15a96c
        psets(P_TFG, J_col[tfcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (foreground_color_term) + 1, 6);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[tfcolor]));
Packit 15a96c
        if (us)
Packit 15a96c
          vt_pinit(us, tfcolor, tbcolor);
Packit 15a96c
        break;
Packit 15a96c
      case 'H': /* fmg - letters cycle colors */
Packit 15a96c
        if (tbcolor == WHITE)
Packit 15a96c
          tbcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          tbcolor++;
Packit 15a96c
        psets(P_TBG, J_col[tbcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (background_color_term) + 1, 7);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[tbcolor]));
Packit 15a96c
        if (us)
Packit 15a96c
          vt_pinit(us, tfcolor, tbcolor);
Packit 15a96c
        break;
Packit 15a96c
      case 'I': /* fmg - letters cycle colors & redraw stat line */
Packit 15a96c
        if (sfcolor == WHITE)
Packit 15a96c
          sfcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          sfcolor++;
Packit 15a96c
Packit 15a96c
        /* fmg - this causes redraw of status line (if any)
Packit 15a96c
           in current color */
Packit 15a96c
Packit 15a96c
        if (st) {
Packit 15a96c
          mc_wclose(st,0);
Packit 15a96c
          st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
Packit 15a96c
                     XA_NORMAL, sfcolor, sbcolor, 1, 0, 1);
Packit 15a96c
          show_status();
Packit 15a96c
        }
Packit 15a96c
        psets(P_SFG, J_col[sfcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (foreground_color_stat) + 1, 8);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[sfcolor]));
Packit 15a96c
        break;
Packit 15a96c
      case 'J': /* fmg - letters cycle colors & redraw stat line */
Packit 15a96c
        if (sbcolor == WHITE)
Packit 15a96c
          sbcolor = BLACK;
Packit 15a96c
        else
Packit 15a96c
          sbcolor++;
Packit 15a96c
Packit 15a96c
        /* fmg - this causes redraw of status line (if any)
Packit 15a96c
           in current color */
Packit 15a96c
Packit 15a96c
        if (st) {
Packit 15a96c
          mc_wclose(st,0);
Packit 15a96c
          st = mc_wopen(0, LINES - 1, COLS - 1, LINES - 1, BNONE,
Packit 15a96c
                     XA_NORMAL, sfcolor, sbcolor, 1, 0, 0);
Packit 15a96c
          show_status();
Packit 15a96c
        }
Packit 15a96c
        psets(P_SBG, J_col[sbcolor]);
Packit 15a96c
        mc_wlocate(w, mbslen (background_color_stat) + 1, 9);
Packit 15a96c
        mc_wprintf(w, "%s   ", _(J_col[sbcolor]));
Packit 15a96c
        break;
Packit 15a96c
      case 'K': /* MARK updated 02/17/95 - Config history size */
Packit 15a96c
        pgets(w, mbslen (history_buffer_size) + 1, 10,
Packit 15a96c
              P_HISTSIZE, 6, 6, 0);
Packit 15a96c
Packit 15a96c
        /* In case gibberish or a value was out of bounds, */
Packit 15a96c
        /* limit history buffer size between 0 to 5000 lines */
Packit 15a96c
        /* 5000 line history at 80 columns consumes about */
Packit 15a96c
        /* 800 kilobytes including chars and attrs bytes! */
Packit 15a96c
        if (atoi(P_HISTSIZE) <= 0) 
Packit 15a96c
          strcpy(P_HISTSIZE,"0");
Packit 15a96c
        else if (atoi(P_HISTSIZE) >= 5000)
Packit 15a96c
          strcpy(P_HISTSIZE,"5000");
Packit 15a96c
Packit 15a96c
        mc_wlocate(w, mbslen (history_buffer_size) + 1, 10);
Packit 15a96c
        mc_wprintf(w, "%s     ", P_HISTSIZE);
Packit 15a96c
        break;
Packit 15a96c
      case 'L': /* fmg - get local macros storage file */
Packit 15a96c
        pgets(w, mbslen (macros_file) + 1, 11, P_MACROS, 64, 64, 1);
Packit 15a96c
Packit 15a96c
        /* Try to open the file to read it in. */
Packit 15a96c
        fp = fopen(pfix_home(P_MACROS), "r+");
Packit 15a96c
        if (fp == NULL) {
Packit 15a96c
          if (errno == EPERM) {
Packit 15a96c
            /* Permission denied, hacker! */
Packit 15a96c
            werror(_("ERROR: you do not have permission to create a file there!"));
Packit 15a96c
            once = 'J'; /* fmg - re-enter it! */
Packit 15a96c
            continue;
Packit 15a96c
          }
Packit 15a96c
          if (errno != ENOENT) {
Packit 15a96c
            /* File does exist, but cannot be opened. */
Packit 15a96c
            werror(_("ERROR: cannot open macro file %s"),
Packit 15a96c
                   pfix_home(P_MACROS));
Packit 15a96c
          }
Packit 15a96c
          continue;
Packit 15a96c
        }
Packit 15a96c
        /* Read macros from the file. */
Packit 15a96c
        werror(_("Reading macros"));
Packit 15a96c
        readmacs(fp, 0);
Packit 15a96c
        fclose(fp);
Packit 15a96c
        break;
Packit 15a96c
      case 'M': /* fmg - Bring up macro editing window */
Packit 15a96c
        domacros();
Packit 15a96c
        break;
Packit 15a96c
      case 'N':
Packit 15a96c
        psets(P_MACENAB, yesno(P_MACENAB[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (macros_enabled) + 1, 13);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_MACENAB));
Packit 15a96c
        break;
Packit 15a96c
      case 'O': /* Character conversions - jl / 04.09.97 */
Packit 15a96c
        doconv();
Packit 15a96c
        mc_wlocate(w, mbslen (character_conversion) + 1, 14);
Packit 15a96c
        mc_wprintf(w, "%-16.16s", _(P_CONVF));
Packit 15a96c
        break;
Packit 15a96c
      case 'P':
Packit 15a96c
        psets(P_ADDLINEFEED, yesno(P_ADDLINEFEED[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (add_linefeed) + 1, 15);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_ADDLINEFEED));
Packit 15a96c
        break;
Packit 15a96c
      case 'Q':
Packit 15a96c
        psets(P_LOCALECHO, yesno(P_LOCALECHO[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (local_echo_str) + 1, 16);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_LOCALECHO));
Packit 15a96c
        break;
Packit 15a96c
      case 'R':
Packit 15a96c
        psets(P_LINEWRAP, yesno(P_LINEWRAP[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (line_wrap) + 1, 17);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_LINEWRAP));
Packit 15a96c
        break;
Packit 15a96c
      case 'S':
Packit 15a96c
	psets(P_DISPLAYHEX, yesno(P_DISPLAYHEX[0] == 'N'));
Packit 15a96c
	mc_wlocate(w, mbslen(display_hex_str) + 1, 18);
Packit 15a96c
	mc_wprintf(w, "%s", _(P_DISPLAYHEX));
Packit 15a96c
	display_hex = strcasecmp(P_DISPLAYHEX, "yes") == 0;
Packit 15a96c
	break;
Packit 15a96c
      case 'T':
Packit 15a96c
        psets(P_ADDCARRIAGERETURN, yesno(P_ADDCARRIAGERETURN[0] == 'N'));
Packit 15a96c
        mc_wlocate(w, mbslen (add_carriagereturn) + 1, 19);
Packit 15a96c
        mc_wprintf(w, "%s", _(P_ADDCARRIAGERETURN));
Packit 15a96c
        break;
Packit 15a96c
     }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * This is the 'T' menu - terminal parameters. Does NOT set the new
Packit 15a96c
 * terminal type, but returns it to the calling functions that has
Packit 15a96c
 * to call init_emul itself.
Packit 15a96c
 */
Packit 15a96c
int dotermmenu(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  int c;
Packit 15a96c
  int new_term = -1;
Packit 15a96c
  int old_stat = P_STATLINE[0];
Packit 15a96c
  char buf[8];
Packit 15a96c
  char *terminal_emulation  = _(" A -      Terminal emulation :");
Packit 15a96c
  char *backspace_key_sends = _(" B -     Backspace key sends :");
Packit 15a96c
  char *status_line         = _(" C -          Status line is :");
Packit 15a96c
  char *msg_nl_delay        = _(" D -   Newline tx delay (ms) :");
Packit 15a96c
  char *msg_answerback      = _(" E -          ENQ answerback :");
Packit 15a96c
  char *msg_ch_delay        = _(" F - Character tx delay (ms) :");
Packit 15a96c
  char *question            = _("Change which setting?");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(15, 7, 64, 15, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wtitle(w, TMID, _("Terminal settings"));
Packit 15a96c
  mc_wprintf(w, "\n");
Packit 15a96c
  mc_wprintf(w, "%s %s\n", terminal_emulation, terminal == VT100 ? "VT102" : "ANSI");
Packit 15a96c
  mc_wprintf(w, "%s %s\n", backspace_key_sends, P_BACKSPACE);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", status_line, _(P_STATLINE));
Packit 15a96c
  mc_wprintf(w, "%s %d\n", msg_nl_delay, vt_nl_delay);
Packit 15a96c
  mc_wprintf(w, "%s %s\n", msg_answerback, P_ANSWERBACK);
Packit 15a96c
  mc_wprintf(w, "%s %d\n", msg_ch_delay, vt_ch_delay);
Packit 15a96c
  mc_wlocate(w, 4, 7);
Packit 15a96c
  mc_wputs(w, question);
Packit 15a96c
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while (1) {
Packit 15a96c
    mc_wlocate(w, mbslen (question) + 5, 7);
Packit 15a96c
    c = rwxgetch();
Packit 15a96c
    switch(c) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        /* If status line enabled/disabled resize screen. */
Packit 15a96c
        if (P_STATLINE[0] != old_stat && new_term < 0)
Packit 15a96c
          init_emul(terminal, 0);
Packit 15a96c
        return new_term;
Packit 15a96c
      case 'A':
Packit 15a96c
        if (new_term < 0)
Packit 15a96c
          new_term = terminal;
Packit 15a96c
        if (new_term == VT100) {
Packit 15a96c
          new_term = ANSI;
Packit 15a96c
          psets(P_BACKSPACE, "BS");
Packit 15a96c
        } else {
Packit 15a96c
          new_term = VT100;
Packit 15a96c
          psets(P_BACKSPACE, "DEL");
Packit 15a96c
        }
Packit 15a96c
        mc_wlocate(w, mbslen (terminal_emulation) + 1, 1);
Packit 15a96c
        mc_wprintf(w, "%s ", new_term == VT100 ? "VT102" : "ANSI");
Packit 15a96c
        mc_wlocate(w, mbslen (backspace_key_sends) + 1, 2);
Packit 15a96c
        mc_wprintf(w, "%s ", P_BACKSPACE);
Packit 15a96c
        keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
Packit 15a96c
        break;
Packit 15a96c
      case 'B':
Packit 15a96c
        if (P_BACKSPACE[0] == 'D')
Packit 15a96c
          psets(P_BACKSPACE, "BS");
Packit 15a96c
        else
Packit 15a96c
          psets(P_BACKSPACE, "DEL");
Packit 15a96c
        mc_wlocate(w, mbslen (backspace_key_sends) + 1, 2);
Packit 15a96c
        mc_wprintf(w, "%s ", P_BACKSPACE);
Packit 15a96c
        keyboard(KSETBS, P_BACKSPACE[0] == 'B' ? 8 : 127);
Packit 15a96c
        break;
Packit 15a96c
      case 'C':
Packit 15a96c
        if (P_STATLINE[0] == 'e') {
Packit 15a96c
          psets(P_STATLINE, N_("disabled"));
Packit 15a96c
          tempst = 1;
Packit 15a96c
        } else {
Packit 15a96c
          psets(P_STATLINE, N_("enabled"));
Packit 15a96c
          /* See if it fits on screen */
Packit 15a96c
          if (LINES > 24 || use_status)
Packit 15a96c
            tempst = 0;
Packit 15a96c
        }
Packit 15a96c
        mc_wlocate(w, mbslen (status_line) + 1, 3);
Packit 15a96c
        mc_wprintf(w, "%s ", _(P_STATLINE));
Packit 15a96c
        break;
Packit 15a96c
      case 'D':
Packit 15a96c
        sprintf(buf, "%d", vt_nl_delay);
Packit 15a96c
        mc_wlocate(w, mbslen(msg_nl_delay) + 1, 4);
Packit 15a96c
        mc_wgets(w, buf, 5, 5);
Packit 15a96c
        vt_nl_delay = atoi(buf);
Packit 15a96c
        mc_wlocate(w, mbslen(msg_nl_delay) + 1, 4);
Packit 15a96c
        mc_wprintf(w, "%-4d", vt_nl_delay);
Packit 15a96c
        break;
Packit 15a96c
      case 'E':
Packit 15a96c
        pgets(w, strlen(msg_answerback) + 1, 5, P_ANSWERBACK, 50, 50, 0);
Packit 15a96c
        break;
Packit 15a96c
      case 'F':
Packit 15a96c
        sprintf(buf, "%d", vt_ch_delay);
Packit 15a96c
        mc_wlocate(w, mbslen(msg_ch_delay) + 1, 6);
Packit 15a96c
        mc_wgets(w, buf, 5, 5);
Packit 15a96c
        vt_ch_delay = atoi(buf);
Packit 15a96c
        mc_wlocate(w, mbslen(msg_ch_delay) + 1, 6);
Packit 15a96c
        mc_wprintf(w, "%-4d", vt_ch_delay);
Packit 15a96c
        break;
Packit 15a96c
      default:
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Save the configuration.
Packit 15a96c
 */
Packit 15a96c
void vdodflsave(void)
Packit 15a96c
{
Packit 15a96c
  dodflsave();
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Save the configuration.
Packit 15a96c
 */
Packit 15a96c
int dodflsave(void)
Packit 15a96c
{
Packit 15a96c
  FILE *fp;
Packit 15a96c
  char *fname = dosetup ? parfile : pparfile;
Packit 15a96c
Packit 15a96c
  if ((fp = fopen(fname, "w")) == NULL) {
Packit 15a96c
    werror(_("Cannot write to %s"), fname);
Packit 15a96c
    return -1;
Packit 15a96c
  }
Packit 15a96c
  writepars(fp, dosetup);
Packit 15a96c
  fclose(fp);
Packit 15a96c
  if (dosetup)
Packit 15a96c
    chmod(fname, (mode_t) 0644);
Packit 15a96c
  werror(_("Configuration saved"));
Packit 15a96c
Packit 15a96c
  return domacsave() < 0 ? -1 : 0;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Save the macros. (fmg)
Packit 15a96c
 */
Packit 15a96c
int domacsave(void)
Packit 15a96c
{
Packit 15a96c
  FILE *fp;
Packit 15a96c
Packit 15a96c
  /* fmg - do some basic silly-mortal checks and allow for recovery */
Packit 15a96c
  if (!strcmp(P_MACCHG,"CHANGED")) {
Packit 15a96c
    if (strlen(P_MACROS) == 0) { /* fmg - they might want to know... */
Packit 15a96c
      werror(_("ERROR: Macros have changed but no filename is set!"));
Packit 15a96c
      return -1;
Packit 15a96c
    } else {
Packit 15a96c
      if ((fp = fopen(pfix_home(P_MACROS), "w")) == (FILE *)NULL) {
Packit 15a96c
        werror(_("Cannot write macros file %s"),
Packit 15a96c
               pfix_home(P_MACROS));
Packit 15a96c
        return -1;
Packit 15a96c
      }
Packit 15a96c
      writemacs(fp);
Packit 15a96c
      fclose(fp);
Packit 15a96c
      werror(_("Macros saved"));
Packit 15a96c
      strcpy(P_MACCHG,"SAVED"); /* fmg - reset after save */
Packit 15a96c
      return 0;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
  return 0;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Save the configuration, ask a name for it.
Packit 15a96c
 */
Packit 15a96c
static void donamsave(void)
Packit 15a96c
{
Packit 15a96c
  char ifile[128];
Packit 15a96c
  char *s;
Packit 15a96c
Packit 15a96c
  ifile[0] = 0;
Packit 15a96c
  s = input(_("Give name to save this configuration?"), ifile);
Packit 15a96c
  if (s != (char *)0 && *s != 0) {
Packit 15a96c
    snprintf(parfile, sizeof(parfile), "%s/minirc.%s", CONFDIR, s);
Packit 15a96c
    dodflsave();
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
static void (*funcs1[])(void) = {
Packit 15a96c
  dopath,
Packit 15a96c
  doproto,
Packit 15a96c
  doserial,
Packit 15a96c
  domodem,
Packit 15a96c
  doscrkeyb,
Packit 15a96c
  vdodflsave,
Packit 15a96c
  donamsave,
Packit 15a96c
  NULL,
Packit 15a96c
  NULL
Packit 15a96c
};
Packit 15a96c
Packit 15a96c
char some_string[64];
Packit 15a96c
Packit 15a96c
static char const *menu1[] = {
Packit 15a96c
  N_("Filenames and paths"),
Packit 15a96c
  N_("File transfer protocols"),
Packit 15a96c
  N_("Serial port setup"),
Packit 15a96c
  N_("Modem and dialing"),
Packit 15a96c
  N_("Screen and keyboard"),
Packit 15a96c
  some_string,
Packit 15a96c
  N_("Save setup as.."),
Packit 15a96c
  N_("Exit"),
Packit 15a96c
  N_("Exit from Minicom"),
Packit 15a96c
  NULL,
Packit 15a96c
};
Packit 15a96c
Packit 15a96c
Packit 15a96c
int config(int setup)
Packit 15a96c
{
Packit 15a96c
  int c;
Packit 15a96c
  char *s;
Packit 15a96c
Packit 15a96c
  /* Find out extension of parameter file */
Packit 15a96c
  s = parfile + strlen(CONFDIR) + 8;
Packit 15a96c
  snprintf(some_string, sizeof(some_string), _("Save setup as %s"), s);
Packit 15a96c
  some_string[sizeof(some_string) - 1] = 0;
Packit 15a96c
Packit 15a96c
  if (!setup)
Packit 15a96c
    menu1[8] = NULL;
Packit 15a96c
Packit 15a96c
  c = mc_wselect(13, 10, menu1, funcs1, _("configuration"), stdattr, mfcolor, mbcolor);
Packit 15a96c
  if (c == 9)
Packit 15a96c
    return 1;
Packit 15a96c
  return 0;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/* fmg 1/11/94 Color names for menu */
Packit 15a96c
Packit 15a96c
const char *J_col[] =
Packit 15a96c
  { N_("BLACK"), N_("RED"), N_("GREEN"), N_("YELLOW"),
Packit 15a96c
    N_("BLUE"), N_("MAGENTA"), N_("CYAN"), N_("WHITE") };
Packit 15a96c
Packit 15a96c
static const unsigned int speeds[] =
Packit 15a96c
   {     300,    1200,    2400,    4800,    9600,
Packit 15a96c
       19200,   38400,   57600,  115200,  230400,
Packit 15a96c
      460800,  500000,  576000,  921600, 1000000,
Packit 15a96c
     1152000, 1500000, 2000000, 2500000, 3000000,
Packit 15a96c
     3500000, 4000000
Packit 15a96c
   };
Packit 15a96c
#define NR_SPEEDS (sizeof(speeds) / sizeof(speeds[0]))
Packit 15a96c
Packit 15a96c
int speed_valid(unsigned int speed)
Packit 15a96c
{
Packit 15a96c
  unsigned i;
Packit 15a96c
  for (i = 0; i < NR_SPEEDS; ++i)
Packit 15a96c
    if (speed == speeds[i])
Packit 15a96c
      return 1;
Packit 15a96c
  return 0;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * Ask user for Baudrate, Bits and Parity
Packit 15a96c
 */
Packit 15a96c
void get_bbp(char *ba, char *bi, char *pa, char *stopb, int curr_ok)
Packit 15a96c
{
Packit 15a96c
  int c;
Packit 15a96c
  WIN *w;
Packit 15a96c
  int x, y;
Packit 15a96c
Packit 15a96c
  w = mc_wopen(23, 4, 58, 18, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wtitle(w, TMID, _("Comm Parameters"));
Packit 15a96c
Packit 15a96c
  dirflush = 0;
Packit 15a96c
Packit 15a96c
  mc_wlocate(w, 0, 3);
Packit 15a96c
  mc_wputs(w, _(" Speed            Parity      Data\n"));
Packit 15a96c
  mc_wputs(w, _(" A: <next>        L: None     S: 5\n"));
Packit 15a96c
  mc_wputs(w, _(" B: <prev>        M: Even     T: 6\n"));
Packit 15a96c
  mc_wputs(w, _(" C:   9600        N: Odd      U: 7\n"));
Packit 15a96c
  mc_wputs(w, _(" D:  38400        O: Mark     V: 8\n"));
Packit 15a96c
  mc_wputs(w, _(" E: 115200        P: Space\n"));
Packit 15a96c
  mc_wputs(w, "\n");
Packit 15a96c
  mc_wputs(w, _(" Stopbits\n"));
Packit 15a96c
  mc_wputs(w, _(" W: 1             Q: 8-N-1\n"));
Packit 15a96c
  mc_wputs(w, _(" X: 2             R: 7-E-1\n"));
Packit 15a96c
  if (curr_ok)
Packit 15a96c
    mc_wputs(w, _(" K: Current\n"));
Packit 15a96c
  else
Packit 15a96c
    mc_wputs(w, "\n");
Packit 15a96c
  mc_wputs(w, _("\n Choice, or <Enter> to exit? "));
Packit 15a96c
  x = w->curx;
Packit 15a96c
  y = w->cury;
Packit 15a96c
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while (1) {
Packit 15a96c
    mc_wlocate(w, 5, 1);
Packit 15a96c
    mc_wprintf(w, _("Current: %5s %s%s%s  "), ba, bi, pa, stopb);
Packit 15a96c
    mc_wlocate(w, x, y);
Packit 15a96c
    mc_wflush();
Packit 15a96c
    c = wxgetch();
Packit 15a96c
    switch(c) {
Packit 15a96c
      case 27:
Packit 15a96c
      case '\n':
Packit 15a96c
      case '\r':
Packit 15a96c
        dirflush = 1;
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      default:
Packit 15a96c
	update_bbp_from_char(c, ba, bi, pa, stopb, curr_ok);
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
Packit 15a96c
/* Update the baud rate variables using the given character as the menu
Packit 15a96c
 * option selected.
Packit 15a96c
 */
Packit 15a96c
int update_bbp_from_char(char c, char *ba, char *bi, char *pa, char *stopb,
Packit 15a96c
                         int curr_ok)
Packit 15a96c
{
Packit 15a96c
  int characterRecognised = 1;
Packit 15a96c
  unsigned i;
Packit 15a96c
  int speed_idx = 0; /* Default value is the first value of the speeds array */
Packit 15a96c
  int delta = -1;
Packit 15a96c
  unsigned max_speed = m_getmaxspd();
Packit 15a96c
  char tmps[15];
Packit 15a96c
  int update_ba = 0;
Packit 15a96c
Packit 15a96c
  /* We have strings for the baud rate, find the index in the speeds array */
Packit 15a96c
  for (i = 0; !speed_idx && i < NR_SPEEDS; i++) {
Packit 15a96c
    snprintf(tmps, sizeof(tmps), "%d", speeds[i]);
Packit 15a96c
    tmps[sizeof(tmps) - 1] = 0;
Packit 15a96c
    if (!strcmp(tmps, ba))
Packit 15a96c
      speed_idx = i;
Packit 15a96c
  }
Packit 15a96c
Packit 15a96c
  bi[1] = 0;
Packit 15a96c
  pa[1] = 0;
Packit 15a96c
Packit 15a96c
  switch(c = toupper(c)) {
Packit 15a96c
    case 'A':
Packit 15a96c
      delta = 1;
Packit 15a96c
    case 'B':
Packit 15a96c
      speed_idx += delta;
Packit 15a96c
      if (speed_idx < 0)
Packit 15a96c
	speed_idx = NR_SPEEDS - 1;
Packit 15a96c
      else if (speed_idx > (int)NR_SPEEDS - 1
Packit 15a96c
               || max_speed < speeds[speed_idx])
Packit 15a96c
	speed_idx = 0;
Packit 15a96c
    case 'C':
Packit 15a96c
    case 'D':
Packit 15a96c
    case 'E':
Packit 15a96c
      if (c == 'C')
Packit 15a96c
	speed_idx = 4;
Packit 15a96c
      else if (c == 'D')
Packit 15a96c
	speed_idx = 6;
Packit 15a96c
      else if (c == 'E')
Packit 15a96c
        speed_idx = 8;
Packit 15a96c
    case 'K':
Packit 15a96c
      if (c == 'K' && !curr_ok)
Packit 15a96c
        break;
Packit 15a96c
      update_ba = 1;
Packit 15a96c
      break;
Packit 15a96c
Packit 15a96c
    case 'L':
Packit 15a96c
      pa[0] = 'N';
Packit 15a96c
      break;
Packit 15a96c
    case 'M':
Packit 15a96c
      pa[0] = 'E';
Packit 15a96c
      break;
Packit 15a96c
    case 'N':
Packit 15a96c
      pa[0] = 'O';
Packit 15a96c
      break;
Packit 15a96c
    case 'O':
Packit 15a96c
      pa[0] = 'M';
Packit 15a96c
      break;
Packit 15a96c
    case 'P':
Packit 15a96c
      pa[0] = 'S';
Packit 15a96c
      break;
Packit 15a96c
    case 'Q':
Packit 15a96c
      pa[0] = 'N';
Packit 15a96c
      bi[0] = '8';
Packit 15a96c
      stopb[0] = '1';
Packit 15a96c
      break;
Packit 15a96c
    case 'R':
Packit 15a96c
      pa[0] = 'E';
Packit 15a96c
      bi[0] = '7';
Packit 15a96c
      stopb[0] = '1';
Packit 15a96c
      break;
Packit 15a96c
    case 'S':
Packit 15a96c
      bi[0] = '5';
Packit 15a96c
      break;
Packit 15a96c
    case 'T':
Packit 15a96c
      bi[0] = '6';
Packit 15a96c
      break;
Packit 15a96c
    case 'U':
Packit 15a96c
      bi[0] = '7';
Packit 15a96c
      break;
Packit 15a96c
    case 'V':
Packit 15a96c
      bi[0] = '8';
Packit 15a96c
      break;
Packit 15a96c
    case 'W':
Packit 15a96c
      stopb[0] = '1';
Packit 15a96c
      break;
Packit 15a96c
    case 'X':
Packit 15a96c
      stopb[0] = '2';
Packit 15a96c
      break;
Packit 15a96c
   default:
Packit 15a96c
      characterRecognised = 0;
Packit 15a96c
      break;
Packit 15a96c
  }
Packit 15a96c
Packit 15a96c
  if (update_ba)
Packit 15a96c
    sprintf(ba, "%d", speeds[speed_idx]); /* XXX: uff, how long is 'ba' ? */
Packit 15a96c
Packit 15a96c
  return characterRecognised;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * fmg - part of the Macros menu, "[none]" beats (null) :-)
Packit 15a96c
 */
Packit 15a96c
static void out_mac(WIN *w, char *s, char n)
Packit 15a96c
{
Packit 15a96c
  mc_wprintf(w, " %c : %.67s\n", n, s ? s : "[none]");
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/*
Packit 15a96c
 * fmg - Macros editing window
Packit 15a96c
 */
Packit 15a96c
void domacros(void)
Packit 15a96c
{
Packit 15a96c
  WIN   *w;
Packit 15a96c
  int   clr = 1;
Packit 15a96c
  int   Jch = '1', Jm = 0; /* fmg - ok, so I was lazy.. */
Packit 15a96c
  char* question = _("Change which setting?  (Esc to exit)");
Packit 15a96c
Packit 15a96c
  w = mc_wopen(3, 6, 75, 24, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wtitle(w, TMID, _("F1 to F10 Macros"));
Packit 15a96c
Packit 15a96c
  mc_wprintf(w, "\n");
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
  Jch = 'A'; /* fmg - ran out of single digits... */
Packit 15a96c
  out_mac(w,mmacs[Jm++].value, Jch++);
Packit 15a96c
Packit 15a96c
  mc_wredraw(w, 1);
Packit 15a96c
Packit 15a96c
  while(1) {
Packit 15a96c
    mc_wlocate(w, 1, 14);
Packit 15a96c
    mc_wputs(w, _(" (LEGEND: ^M = C-M, ^L = C-L, ^G = C-G, ^R = C-R, ^~ = pause 1 second,"));
Packit 15a96c
    mc_wlocate(w, 1, 15);
Packit 15a96c
    mc_wputs(w, _("  \\u = username, \\p = password, \\\\ = \\, \\e = toggle echo, "));
Packit 15a96c
    mc_wlocate(w, 1, 16);
Packit 15a96c
    mc_wputs(w, _("  \\l = toggle LF, \\bX1..Xn<sp> = change baud rate. Example: \"\\beq \""));
Packit 15a96c
    mc_wlocate(w, 1, 17);
Packit 15a96c
    mc_wputs(w, _("  = 115200 8N1. (See the \"Comm Parameters\" menu for valid values of X.))"));
Packit 15a96c
    if (clr) {
Packit 15a96c
      mc_wlocate(w, 1, 12);
Packit 15a96c
      mc_wprintf(w, "%s ", question);
Packit 15a96c
      mc_wclreol(w);
Packit 15a96c
      clr = 0;
Packit 15a96c
    } else
Packit 15a96c
      mc_wlocate(w, mbslen (question) + 2, 12);
Packit 15a96c
Packit 15a96c
    switch (rwxgetch()) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1);
Packit 15a96c
        return;
Packit 15a96c
      case '1':
Packit 15a96c
        mgets(w, 5, 1, P_MAC1, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,_("CHANGED")); /* fmg - ...I'm ashamed */
Packit 15a96c
        mc_wlocate(w, 0, 1);
Packit 15a96c
        out_mac(w,P_MAC1, '1');
Packit 15a96c
        break;
Packit 15a96c
      case '2':
Packit 15a96c
        mgets(w, 5, 2, P_MAC2, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... really, I am */
Packit 15a96c
        mc_wlocate(w, 0, 2);
Packit 15a96c
        out_mac(w,P_MAC2, '2');
Packit 15a96c
        break;
Packit 15a96c
      case '3':
Packit 15a96c
        mgets(w, 5, 3, P_MAC3, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... this is the */
Packit 15a96c
        mc_wlocate(w, 0, 3);
Packit 15a96c
        out_mac(w,P_MAC3, '3');
Packit 15a96c
        break;
Packit 15a96c
      case '4':
Packit 15a96c
        mgets(w, 5, 4, P_MAC4, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... first entry on */
Packit 15a96c
        mc_wlocate(w, 0, 4);
Packit 15a96c
        out_mac(w,P_MAC4, '4');
Packit 15a96c
        break;
Packit 15a96c
      case '5':
Packit 15a96c
        mgets(w, 5, 5, P_MAC5, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... my TODO list. */
Packit 15a96c
        mc_wlocate(w, 0, 5);
Packit 15a96c
        out_mac(w,P_MAC5, '5');
Packit 15a96c
        break;
Packit 15a96c
      case '6':
Packit 15a96c
        mgets(w, 5, 6, P_MAC6, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... and, come to think */
Packit 15a96c
        mc_wlocate(w, 0, 6);
Packit 15a96c
        out_mac(w,P_MAC6, '6');
Packit 15a96c
        break;
Packit 15a96c
      case '7':
Packit 15a96c
        mgets(w, 5, 7, P_MAC7, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... of it, I no longer */
Packit 15a96c
        mc_wlocate(w, 0, 7);
Packit 15a96c
        out_mac(w,P_MAC7, '7');
Packit 15a96c
        break;
Packit 15a96c
      case '8':
Packit 15a96c
        mgets(w, 5, 8, P_MAC8, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... even use this... */
Packit 15a96c
        mc_wlocate(w, 0, 8);
Packit 15a96c
        out_mac(w,P_MAC8, '8');
Packit 15a96c
        break;
Packit 15a96c
      case '9':
Packit 15a96c
        mgets(w, 5, 9, P_MAC9, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... [sigh] */
Packit 15a96c
        mc_wlocate(w, 0, 9);
Packit 15a96c
        out_mac(w,P_MAC9, '9');
Packit 15a96c
        break;
Packit 15a96c
      case 'A':
Packit 15a96c
        mgets(w, 5, 10, P_MAC10, 72, MAC_LEN);
Packit 15a96c
        strcpy(P_MACCHG,"CHANGED"); /* fmg - ... [sigh] */
Packit 15a96c
        mc_wlocate(w, 0, 10);
Packit 15a96c
        out_mac(w,P_MAC10, 'A');
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/* is this *REALLY* a printable or non-printable character?
Packit 15a96c
 * the isprint() function seems to consider all chars > 127d non-printable..
Packit 15a96c
 * jl 10.03.1998
Packit 15a96c
 */
Packit 15a96c
int prch(int c)
Packit 15a96c
{
Packit 15a96c
  if (c < 32 || c == 127 || c == 155)
Packit 15a96c
    return (' ');
Packit 15a96c
  else
Packit 15a96c
    return (c);
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
/* Edit the character conversion tables. jl 04.09.97 */
Packit 15a96c
void doconv(void)
Packit 15a96c
{
Packit 15a96c
  WIN *w;
Packit 15a96c
  int i, j, k, l, h,
Packit 15a96c
      offs = 32,
Packit 15a96c
      ymax = 22,
Packit 15a96c
      redraw = 1;
Packit 15a96c
  char buf[64];
Packit 15a96c
  char *prompt;
Packit 15a96c
Packit 15a96c
  h = 16;
Packit 15a96c
  w = mc_wopen (1, 1, 77, ymax, BDOUBLE, stdattr, mfcolor, mbcolor, 0, 0, 1);
Packit 15a96c
  mc_wtitle(w, TMID, _("Character conversion"));
Packit 15a96c
  while (1) {
Packit 15a96c
    if (redraw) {
Packit 15a96c
      mc_winclr(w);
Packit 15a96c
      mc_wprintf(w,
Packit 15a96c
              _(" char    in out    char    in out    char    in out    char    in out\n"));
Packit 15a96c
      for (i = offs, j = i+h, k = j+h, l = k+h;
Packit 15a96c
           i < offs+h && i < 256;
Packit 15a96c
           i++, j++, k++, l++) {
Packit 15a96c
        mc_wprintf(w, "%3d (%c) %3d %3d   ",
Packit 15a96c
                i, prch(i), (int) vt_inmap[i], (int) vt_outmap[i]);
Packit 15a96c
        if (j < 256)
Packit 15a96c
          mc_wprintf(w, "%3d (%c) %3d %3d   ",
Packit 15a96c
                  j, prch(j), (int) vt_inmap[j], (int) vt_outmap[j]);
Packit 15a96c
        else
Packit 15a96c
          mc_wprintf(w, "                  ");
Packit 15a96c
        if (k < 256)
Packit 15a96c
          mc_wprintf(w, "%3d (%c) %3d %3d   ",
Packit 15a96c
                  k, prch(k), (int) vt_inmap[k], (int) vt_outmap[k]);
Packit 15a96c
        else
Packit 15a96c
          mc_wprintf(w, "                  ");
Packit 15a96c
        if (l < 256)
Packit 15a96c
          mc_wprintf(w, "%3d (%c) %3d %3d\n",
Packit 15a96c
                  l, prch(l), (int) vt_inmap[l], (int) vt_outmap[l]);
Packit 15a96c
        else
Packit 15a96c
          mc_wprintf(w, "               \n");
Packit 15a96c
      }
Packit 15a96c
      mc_wprintf(w, _("\n A - load table\tB - save table"));
Packit 15a96c
      if (P_CONVF[0])
Packit 15a96c
        mc_wprintf(w, _("\tfile:%s"),P_CONVF);
Packit 15a96c
      mc_wprintf(w, _("\n C - edit char\tD - next screen\tE - prev screen\n"));
Packit 15a96c
      mc_wprintf(w, _(" F - convert capture: %s\n"), _(P_CONVCAP));
Packit 15a96c
Packit 15a96c
      mc_wredraw(w, 1);
Packit 15a96c
      redraw = 0;
Packit 15a96c
    }
Packit 15a96c
Packit 15a96c
    mc_wlocate(w, 1, ymax - 1);
Packit 15a96c
    mc_wclreol(w);
Packit 15a96c
    mc_wflush();
Packit 15a96c
    switch (toupper(rwxgetch())) {
Packit 15a96c
      case '\n':
Packit 15a96c
        mc_wclose(w, 1); return;
Packit 15a96c
        break;
Packit 15a96c
      case 'A':
Packit 15a96c
        strcpy(buf,P_CONVF);
Packit 15a96c
        prompt=_("Load file: %s");
Packit 15a96c
        mc_wprintf(w, prompt, buf);
Packit 15a96c
        pgets(w, mbslen(prompt) - 1, ymax - 1, P_CONVF, 64, 64, 1);
Packit 15a96c
        if (loadconv(P_CONVF) == 0) {
Packit 15a96c
          if (strcmp(P_CONVF,buf))
Packit 15a96c
            markch(P_CONVF);
Packit 15a96c
          redraw = 1;
Packit 15a96c
        } else
Packit 15a96c
          strcpy(P_CONVF,buf);
Packit 15a96c
        break;
Packit 15a96c
      case 'B':
Packit 15a96c
        strcpy(buf,P_CONVF);
Packit 15a96c
        prompt=_("Save as file: %s");
Packit 15a96c
        mc_wprintf(w, prompt, buf);
Packit 15a96c
        pgets(w, mbslen(prompt) - 1, ymax - 1, P_CONVF, 64, 64, 1);
Packit 15a96c
        if (saveconv(P_CONVF) == 0) {
Packit 15a96c
          if (strcmp(P_CONVF,buf))
Packit 15a96c
            markch(P_CONVF);
Packit 15a96c
          redraw = 1;
Packit 15a96c
        } else
Packit 15a96c
          strcpy(P_CONVF,buf);
Packit 15a96c
        break;
Packit 15a96c
      case 'C':
Packit 15a96c
        prompt = _("Character to be edited: ");
Packit 15a96c
        mc_wprintf(w, "%s", prompt);
Packit 15a96c
        buf[0] = 0;
Packit 15a96c
        i = -1;
Packit 15a96c
        mc_wlocate(w, mbslen(prompt), ymax - 1);
Packit 15a96c
        mc_wgets(w, buf, 7, 7);
Packit 15a96c
        sscanf(buf, "%d", &i);
Packit 15a96c
        if (i > 255 || i < 0) {
Packit 15a96c
          werror(_("Input character ascii value 0-255"));
Packit 15a96c
          break;
Packit 15a96c
        }
Packit 15a96c
Packit 15a96c
        sprintf(buf, "%u",(unsigned int) vt_inmap[i]);
Packit 15a96c
        mc_wlocate(w, 30, ymax - 1);
Packit 15a96c
        prompt=_("Change input to: %s");
Packit 15a96c
        mc_wprintf(w, prompt,buf);
Packit 15a96c
        mc_wlocate(w, mbslen(prompt) + 28, ymax - 1);
Packit 15a96c
        mc_wgets(w, buf, 7, 7);
Packit 15a96c
        sscanf(buf, "%d", &j);
Packit 15a96c
        if (j > 255 || j < 0) {
Packit 15a96c
          werror(_("Input character ascii value 0-255"));
Packit 15a96c
          break;
Packit 15a96c
        }
Packit 15a96c
        else vt_inmap[i] = j;
Packit 15a96c
        sprintf(buf, "%u",(unsigned int) vt_outmap[i]);
Packit 15a96c
        mc_wlocate(w, 54, ymax - 1);
Packit 15a96c
        prompt = _("Change output to: %s");
Packit 15a96c
        mc_wprintf(w, prompt, buf);
Packit 15a96c
        mc_wlocate(w, mbslen(prompt) + 52, ymax - 1);
Packit 15a96c
        mc_wgets(w, buf, 7, 7);
Packit 15a96c
        sscanf(buf, "%d", &j);
Packit 15a96c
        if (j > 255 || j < 0) {
Packit 15a96c
          werror(_("Input character ascii value 0-255"));
Packit 15a96c
          break;
Packit 15a96c
        }
Packit 15a96c
        else vt_outmap[i] = j;
Packit 15a96c
        redraw = 1;
Packit 15a96c
        break;
Packit 15a96c
      case 'D':
Packit 15a96c
        offs += 4 * h;
Packit 15a96c
        if (offs > 255)
Packit 15a96c
          offs = 0;
Packit 15a96c
        redraw = 1;
Packit 15a96c
        break;
Packit 15a96c
      case 'E':
Packit 15a96c
        offs -= 4 * h;
Packit 15a96c
        if (offs < 0)
Packit 15a96c
          offs = 0;
Packit 15a96c
        redraw = 1;
Packit 15a96c
        break;
Packit 15a96c
      case 'F':
Packit 15a96c
        strcpy(P_CONVCAP, yesno(P_CONVCAP[0] == 'N'));
Packit 15a96c
        markch(P_CONVCAP);
Packit 15a96c
        redraw = 1;
Packit 15a96c
        break;
Packit 15a96c
    }
Packit 15a96c
  }
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
int loadconv(char *buf)
Packit 15a96c
{
Packit 15a96c
  FILE *fp;
rpm-build f4ee89
  int err = 0;
Packit 15a96c
Packit 15a96c
  if ((fp = fopen(pfix_home(buf), "rb")) == (FILE *)NULL) {
Packit 15a96c
    werror(_("Cannot open conversion table %s"), pfix_home(buf));
Packit 15a96c
    return 1;
Packit 15a96c
  }
Packit 15a96c
  if (   fread(vt_inmap, sizeof(vt_inmap), (size_t)1, fp) != 1
Packit 15a96c
      || fread(vt_outmap, sizeof(vt_outmap), (size_t)1, fp) != 1)
Packit 15a96c
    {
Packit 15a96c
      werror(_("Cannot read conversion table %s"), pfix_home(buf));
rpm-build f4ee89
      err = 1;
Packit 15a96c
    }
rpm-build f4ee89
Packit 15a96c
  fclose(fp);
rpm-build f4ee89
  return err;
Packit 15a96c
}
Packit 15a96c
Packit 15a96c
int saveconv(char *buf)
Packit 15a96c
{
Packit 15a96c
  FILE *fp;
Packit 15a96c
Packit 15a96c
  if ((fp = fopen(pfix_home(buf), "wb")) == (FILE *)NULL) {
Packit 15a96c
    werror(_("Cannot write conversion table %s"), pfix_home(buf));
Packit 15a96c
    return 1;
Packit 15a96c
  }
Packit 15a96c
  fwrite(vt_inmap, sizeof(vt_inmap), (size_t)1, fp);
Packit 15a96c
  fwrite(vt_outmap, sizeof(vt_outmap), (size_t)1, fp);
Packit 15a96c
  fclose(fp);
Packit 15a96c
  return 0;
Packit 15a96c
}