/*
* prompter.c -- simple prompting editor front-end
*
- * $Id$
+ * This code is Copyright (c) 2002, by the authors of nmh. See the
+ * COPYRIGHT file in the root directory of the nmh distribution for
+ * complete copyright information.
*/
#include <h/mh.h>
#include <signal.h>
#include <setjmp.h>
-#ifdef HAVE_TERMIOS_H
-# include <termios.h>
-#else
-# ifdef HAVE_TERMIO_H
-# include <termio.h>
-# else
-# include <sgtty.h>
-# endif
-#endif
+#include <termios.h>
#define QUOTE '\\'
{ NULL, 0 }
};
-extern int errno;
-#ifdef HAVE_TERMIOS_H
static struct termios tio;
-# define ERASE tio.c_cc[VERASE]
-# define KILL tio.c_cc[VKILL]
-# define INTR tio.c_cc[VINTR]
-#else
-# ifdef HAVE_TERMIO_H
-static struct termio tio;
-# define ERASE tio.c_cc[VERASE]
-# define KILL tio.c_cc[VKILL]
-# define INTR tio.c_cc[VINTR]
-# else
-static struct sgttyb tio;
-static struct tchars tc;
-# define ERASE tio.sg_erase
-# define KILL tio.sg_kill
-# define INTR tc.t_intrc
-# endif
-#endif
+#define ERASE tio.c_cc[VERASE]
+#define KILL tio.c_cc[VKILL]
+#define INTR tio.c_cc[VINTR]
static int wtuser = 0;
static int sigint = 0;
int getln (char *, int);
static int chrcnv (char *);
static void chrdsp (char *, char);
-static RETSIGTYPE intrser (int);
+static void intrser (int);
int
char buffer[BUFSIZ], tmpfil[BUFSIZ];
char **arguments, **argp;
FILE *in, *out;
+ char *tfile = NULL;
#ifdef LOCALE
setlocale(LC_ALL, "");
snprintf (buffer, sizeof(buffer), "%s [switches] file",
invo_name);
print_help (buffer, switches, 1);
- done (1);
+ done (0);
case VERSIONSW:
print_version(invo_name);
- done (1);
+ done (0);
case ERASESW:
if (!(erasep = *argp++) || *erasep == '-')
if ((in = fopen (drft, "r")) == NULL)
adios (drft, "unable to open");
- strncpy (tmpfil, m_tmpfil (invo_name), sizeof(tmpfil));
- if ((out = fopen (tmpfil, "w")) == NULL)
- adios (tmpfil, "unable to create");
+ tfile = m_mktemp2(NULL, invo_name, NULL, &out);
+ if (tfile == NULL) adios("prompter", "unable to create temporary file");
chmod (tmpfil, 0600);
+ strncpy (tmpfil, tfile, sizeof(tmpfil));
/*
* Are we changing the kill or erase character?
*/
if (killp || erasep) {
-#ifdef HAVE_TERMIOS_H
cc_t save_erase, save_kill;
-#else
- int save_erase, save_kill;
-#endif
/* get the current terminal attributes */
-#ifdef HAVE_TERMIOS_H
tcgetattr(0, &tio);
-#else
-# ifdef HAVE_TERMIO_H
- ioctl(0, TCGETA, &tio);
-# else
- ioctl (0, TIOCGETP, (char *) &tio);
- ioctl (0, TIOCGETC, (char *) &tc);
-# endif
-#endif
/* save original kill, erase character for later */
save_kill = KILL;
ERASE = erasep ? chrcnv (erasep) : save_erase;
/* set the new terminal attributes */
-#ifdef HAVE_TERMIOS_H
tcsetattr(0, TCSADRAIN, &tio);
-#else
-# ifdef HAVE_TERMIO_H
- ioctl(0, TCSETAW, &tio);
-# else
- ioctl (0, TIOCSETN, (char *) &tio);
-# endif
-#endif
/* print out new kill erase characters */
chrdsp ("erase", ERASE);
if (i == -1) {
abort:
if (killp || erasep) {
-#ifdef HAVE_TERMIOS_H
tcsetattr(0, TCSADRAIN, &tio);
-#else
-# ifdef HAVE_TERMIO
- ioctl (0, TCSETA, &tio);
-# else
- ioctl (0, TIOCSETN, (char *) &tio);
-# endif
-#endif
}
unlink (tmpfil);
done (1);
SIGNAL (SIGINT, SIG_IGN);
if (killp || erasep) {
-#ifdef HAVE_TERMIOS_H
tcsetattr(0, TCSADRAIN, &tio);
-#else
-# ifdef HAVE_TERMIO_H
- ioctl (0, TCSETAW, &tio);
-# else
- ioctl (0, TIOCSETN, (char *) &tio);
-# endif
-#endif
}
if ((fdi = open (tmpfil, O_RDONLY)) == NOTOK)
unlink (tmpfil);
context_save (); /* save the context file */
- return done (0);
+ done (0);
+ return 1;
}
}
-static RETSIGTYPE
+static void
intrser (int i)
{
-#ifndef RELIABLE_SIGNALS
- SIGNAL (SIGINT, intrser);
-#endif
+ NMH_UNUSED (i);
if (wtuser)
longjmp (sigenv, NOTOK);