X-Git-Url: http://git.marmaro.de/?p=mmh;a=blobdiff_plain;f=uip%2Fprompter.c;h=6db0455a58024838d6412c3ea06fbe84da78d753;hp=f92eda12e93902da8b4b995e49488dc0df079ef8;hb=32b2354dbaf4bf934936eb5b102a4a3d2fdd209a;hpb=a485ed478abbd599d8c9aab48934e7a26733ecb1 diff --git a/uip/prompter.c b/uip/prompter.c index f92eda1..6db0455 100644 --- a/uip/prompter.c +++ b/uip/prompter.c @@ -1,10 +1,10 @@ /* - * prompter.c -- simple prompting editor front-end - * - * 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. - */ +** prompter.c -- simple prompting editor front-end +** +** 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 #include @@ -13,15 +13,7 @@ #include #include -#ifdef HAVE_TERMIOS_H -# include -#else -# ifdef HAVE_TERMIO_H -# include -# else -# include -# endif -#endif +#include #define QUOTE '\\' @@ -55,48 +47,33 @@ static struct swit switches[] = { #define NDOTSW 9 { "nodoteof", 0 }, #define VERSIONSW 10 - { "version", 0 }, + { "Version", 0 }, #define HELPSW 11 { "help", 0 }, { NULL, 0 } }; -#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; static jmp_buf sigenv; /* - * prototypes - */ -int getln (char *, int); -static int chrcnv (char *); -static void chrdsp (char *, char); -static RETSIGTYPE intrser (int); +** prototypes +*/ +int getln(char *, int); +static int chrcnv(char *); +static void chrdsp(char *, char); +static void intrser(int); int -main (int argc, char **argv) +main(int argc, char **argv) { int body = 1, prepend = 1, rapid = 0; int doteof = 0, fdi, fdo, i, state; @@ -110,301 +87,266 @@ main (int argc, char **argv) #ifdef LOCALE setlocale(LC_ALL, ""); #endif - invo_name = r1bindex (argv[0], '/'); + invo_name = mhbasename(argv[0]); /* read user profile/context */ context_read(); - arguments = getarguments (invo_name, argc, argv, 1); + arguments = getarguments(invo_name, argc, argv, 1); argp = arguments; while ((cp = *argp++)) if (*cp == '-') { - switch (smatch (++cp, switches)) { - case AMBIGSW: - ambigsw (cp, switches); - done (1); - case UNKWNSW: - adios (NULL, "-%s unknown", cp); - - case HELPSW: - snprintf (buffer, sizeof(buffer), "%s [switches] file", + switch (smatch(++cp, switches)) { + case AMBIGSW: + ambigsw(cp, switches); + done(1); + case UNKWNSW: + adios(NULL, "-%s unknown", cp); + + case HELPSW: + snprintf(buffer, sizeof(buffer), + "%s [switches] file", invo_name); - print_help (buffer, switches, 1); - done (1); - case VERSIONSW: - print_version(invo_name); - done (1); - - case ERASESW: - if (!(erasep = *argp++) || *erasep == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - case KILLSW: - if (!(killp = *argp++) || *killp == '-') - adios (NULL, "missing argument to %s", argp[-2]); - continue; - - case PREPSW: - prepend++; - continue; - case NPREPSW: - prepend = 0; - continue; - - case RAPDSW: - rapid++; - continue; - case NRAPDSW: - rapid = 0; - continue; - - case BODYSW: - body++; - continue; - case NBODYSW: - body = 0; - continue; - - case DOTSW: - doteof++; - continue; - case NDOTSW: - doteof = 0; - continue; + print_help(buffer, switches, 1); + done(1); + case VERSIONSW: + print_version(invo_name); + done(1); + + case ERASESW: + if (!(erasep = *argp++) || *erasep == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + case KILLSW: + if (!(killp = *argp++) || *killp == '-') + adios(NULL, "missing argument to %s", + argp[-2]); + continue; + + case PREPSW: + prepend++; + continue; + case NPREPSW: + prepend = 0; + continue; + + case RAPDSW: + rapid++; + continue; + case NRAPDSW: + rapid = 0; + continue; + + case BODYSW: + body++; + continue; + case NBODYSW: + body = 0; + continue; + + case DOTSW: + doteof++; + continue; + case NDOTSW: + doteof = 0; + continue; } - } else { - if (!drft) - drft = cp; + } else if (!drft) { + drft = cp; } if (!drft) - adios (NULL, "usage: %s [switches] file", invo_name); - if ((in = fopen (drft, "r")) == NULL) - adios (drft, "unable to open"); + adios(NULL, "usage: %s [switches] file", invo_name); + if ((in = fopen(drft, "r")) == NULL) + adios(drft, "unable to open"); 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)); + 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? - */ + ** 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; save_erase = ERASE; /* set new kill, erase character in terminal structure */ - KILL = killp ? chrcnv (killp) : save_kill; - ERASE = erasep ? chrcnv (erasep) : save_erase; + KILL = killp ? chrcnv(killp) : save_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); - chrdsp (", kill", KILL); - chrdsp (", intr", INTR); - putchar ('\n'); - fflush (stdout); + chrdsp("erase", ERASE); + chrdsp(", kill", KILL); + chrdsp(", intr", INTR); + putchar('\n'); + fflush(stdout); /* - * We set the kill and erase character back to original - * setup in terminal structure so we can easily - * restore it upon exit. - */ + ** We set the kill and erase character back to original + ** setup in terminal structure so we can easily + ** restore it upon exit. + */ KILL = save_kill; ERASE = save_erase; } sigint = 0; - SIGNAL2 (SIGINT, intrser); + SIGNAL2(SIGINT, intrser); /* - * Loop through the lines of the draft skeleton. - */ + ** Loop through the lines of the draft skeleton. + */ for (state = FLD;;) { - switch (state = m_getfld (state, name, field, sizeof(field), in)) { - case FLD: - case FLDEOF: - case FLDPLUS: - /* - * Check if the value of field contains anything - * other than space or tab. - */ - for (cp = field; *cp; cp++) - if (*cp != ' ' && *cp != '\t') - break; - - /* If so, just add header line to draft */ - if (*cp++ != '\n' || *cp != 0) { - printf ("%s:%s", name, field); - fprintf (out, "%s:%s", name, field); - while (state == FLDPLUS) { - state = - m_getfld (state, name, field, sizeof(field), in); - printf ("%s", field); - fprintf (out, "%s", field); - } - } else { - /* Else, get value of header field */ - printf ("%s: ", name); - fflush (stdout); - i = getln (field, sizeof(field)); - if (i == -1) { + switch (state = m_getfld(state, name, field, sizeof(field), + in)) { + case FLD: + case FLDEOF: + case FLDPLUS: + /* + ** Check if the value of field contains + ** anything other than space or tab. + */ + for (cp = field; *cp; cp++) + if (*cp != ' ' && *cp != '\t') + break; + + /* If so, just add header line to draft */ + if (*cp++ != '\n' || *cp != 0) { + printf("%s:%s", name, field); + fprintf(out, "%s:%s", name, field); + while (state == FLDPLUS) { + state = m_getfld(state, name, field, + sizeof(field), in); + printf("%s", field); + fprintf(out, "%s", field); + } + } else { + /* Else, get value of header field */ + printf("%s: ", name); + fflush(stdout); + i = getln(field, sizeof(field)); + 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); - } - if (i != 0 || (field[0] != '\n' && field[0] != 0)) { - fprintf (out, "%s:", name); - do { - if (field[0] != ' ' && field[0] != '\t') - putc (' ', out); - fprintf (out, "%s", field); - } while (i == 1 - && (i = getln (field, sizeof(field))) >= 0); - if (i == -1) - goto abort; + if (killp || erasep) { + tcsetattr(0, TCSADRAIN, &tio); } + unlink(tmpfil); + done(1); } - - if (state == FLDEOF) { /* moby hack */ - fprintf (out, "--------\n"); - printf ("--------\n"); - if (!body) - break; - goto no_body; + if (i != 0 || (field[0] != '\n' && field[0] != 0)) { + fprintf(out, "%s:", name); + do { + if (field[0] != ' ' && field[0] != '\t') + putc(' ', out); + fprintf(out, "%s", field); + } while (i == 1 && (i = getln(field, sizeof(field))) >= 0); + if (i == -1) + goto abort; } - continue; + } - case BODY: - case BODYEOF: - case FILEEOF: + if (state == FLDEOF) { /* moby hack */ + fprintf(out, "--------\n"); + printf("--------\n"); if (!body) break; - fprintf (out, "--------\n"); - if (field[0] == 0 || !prepend) - printf ("--------\n"); - if (field[0]) { - if (prepend && body) { - printf ("\n--------Enter initial text\n\n"); - fflush (stdout); - for (;;) { - getln (buffer, sizeof(buffer)); - if (doteof && buffer[0] == '.' && buffer[1] == '\n') - break; - if (buffer[0] == 0) - break; - fprintf (out, "%s", buffer); - } - } + goto no_body; + } + continue; - do { - fprintf (out, "%s", field); - if (!rapid && !sigint) - printf ("%s", field); - } while (state == BODY && - (state = m_getfld (state, name, field, sizeof(field), in))); - if (prepend || !body) - break; - else - printf ("\n--------Enter additional text\n\n"); + case BODY: + case BODYEOF: + case FILEEOF: + if (!body) + break; + fprintf(out, "--------\n"); + if (field[0] == 0 || !prepend) + printf("--------\n"); + if (field[0]) { + if (prepend && body) { + printf("\n--------Enter initial text\n\n"); + fflush(stdout); + for (;;) { + getln(buffer, sizeof(buffer)); + if (doteof && buffer[0] == '.' && buffer[1] == '\n') + break; + if (buffer[0] == 0) + break; + fprintf(out, "%s", buffer); + } } + + do { + fprintf(out, "%s", field); + if (!rapid && !sigint) + printf("%s", field); + } while (state == BODY && (state = m_getfld(state, name, field, sizeof(field), in))); + if (prepend || !body) + break; + else + printf ("\n--------Enter additional text\n\n"); + } no_body: - fflush (stdout); - for (;;) { - getln (field, sizeof(field)); - if (doteof && field[0] == '.' && field[1] == '\n') - break; - if (field[0] == 0) - break; - fprintf (out, "%s", field); - } - break; + fflush(stdout); + for (;;) { + getln(field, sizeof(field)); + if (doteof && field[0] == '.' && field[1] == '\n') + break; + if (field[0] == 0) + break; + fprintf(out, "%s", field); + } + break; - default: - adios (NULL, "skeleton is poorly formatted"); + default: + adios(NULL, "skeleton is poorly formatted"); } break; } if (body) - printf ("--------\n"); + printf("--------\n"); - fflush (stdout); - fclose (in); - fclose (out); - SIGNAL (SIGINT, SIG_IGN); + fflush(stdout); + fclose(in); + fclose(out); + 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) - adios (tmpfil, "unable to re-open"); - if ((fdo = creat (drft, m_gmprot ())) == NOTOK) - adios (drft, "unable to write"); - cpydata (fdi, fdo, tmpfil, drft); - close (fdi); - close (fdo); - unlink (tmpfil); - - context_save (); /* save the context file */ - done (0); + if ((fdi = open(tmpfil, O_RDONLY)) == NOTOK) + adios(tmpfil, "unable to re-open"); + if ((fdo = creat(drft, m_gmprot())) == NOTOK) + adios(drft, "unable to write"); + cpydata(fdi, fdo, tmpfil, drft); + close(fdi); + close(fdo); + unlink(tmpfil); + + context_save(); /* save the context file */ + done(0); return 1; } int -getln (char *buffer, int n) +getln(char *buffer, int n) { int c; char *cp; @@ -412,72 +354,68 @@ getln (char *buffer, int n) cp = buffer; *cp = 0; - switch (setjmp (sigenv)) { - case OK: - wtuser = 1; - break; + switch (setjmp(sigenv)) { + case OK: + wtuser = 1; + break; - case DONE: - wtuser = 0; - return 0; + case DONE: + wtuser = 0; + return 0; - default: - wtuser = 0; - return NOTOK; + default: + wtuser = 0; + return NOTOK; } for (;;) { - switch (c = getchar ()) { - case EOF: - clearerr (stdin); - longjmp (sigenv, DONE); - - case '\n': - if (cp[-1] == QUOTE) { - cp[-1] = c; - wtuser = 0; - return 1; - } - *cp++ = c; - *cp = 0; + switch (c = getchar()) { + case EOF: + clearerr(stdin); + longjmp(sigenv, DONE); + + case '\n': + if (cp[-1] == QUOTE) { + cp[-1] = c; wtuser = 0; - return 0; + return 1; + } + *cp++ = c; + *cp = 0; + wtuser = 0; + return 0; - default: - if (cp < buffer + n) - *cp++ = c; - *cp = 0; + default: + if (cp < buffer + n) + *cp++ = c; + *cp = 0; } } } -static RETSIGTYPE -intrser (int i) +static void +intrser(int i) { -#ifndef RELIABLE_SIGNALS - SIGNAL (SIGINT, intrser); -#endif - if (wtuser) - longjmp (sigenv, NOTOK); + longjmp(sigenv, NOTOK); sigint++; } static int -chrcnv (char *cp) +chrcnv(char *cp) { - return (*cp != QUOTE ? *cp : m_atoi (++cp)); + return (*cp != QUOTE ? *cp : m_atoi(++cp)); } static void -chrdsp (char *s, char c) +chrdsp(char *s, char c) { - printf ("%s ", s); + printf("%s ", s); if (c < ' ' || c == 0177) - printf ("^%c", c ^ 0100); + printf("^%c", c ^ 0100); else - printf ("%c", c); + printf("%c", c); }