X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/afee8ed17a56617618fb7f963b111d7cf0fb56e7..1e03ea3338cc5ccd9ddf4feaaacfeda1998689cc:/uip/prompter.c?ds=inline diff --git a/uip/prompter.c b/uip/prompter.c index 563da058..d91173f2 100644 --- a/uip/prompter.c +++ b/uip/prompter.c @@ -1,31 +1,30 @@ - -/* - * prompter.c -- simple prompting editor front-end +/* 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 "h/mh.h" +#include "sbr/smatch.h" +#include "sbr/cpydata.h" +#include "sbr/m_atoi.h" +#include "sbr/context_save.h" +#include "sbr/ambigsw.h" +#include "sbr/print_version.h" +#include "sbr/print_help.h" +#include "sbr/error.h" #include -#include -#include -#include +#include "h/signals.h" +#include "h/done.h" +#include "h/utils.h" +#include "sbr/m_mktemp.h" #include #include #define QUOTE '\\' -#ifndef CKILL -# define CKILL '@' -#endif - -#ifndef CERASE -# define CERASE '#' -#endif - #define PROMPTER_SWITCHES \ X("erase chr", 0, ERASESW) \ X("kill chr", 0, KILLSW) \ @@ -48,20 +47,16 @@ DEFINE_SWITCH_ENUM(PROMPTER); DEFINE_SWITCH_ARRAY(PROMPTER, switches); #undef X - static struct termios tio; -#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 bool wtuser; +static bool sigint; static jmp_buf sigenv; /* * prototypes */ -int getln (char *, int); +static int getln (char *, int); static int chrcnv (char *); static void chrdsp (char *, char); static void intrser (int); @@ -70,23 +65,20 @@ static void intrser (int); int main (int argc, char **argv) { - int body = 1, prepend = 1, rapid = 0; - int doteof = 0, fdi, fdo, i, state; + bool body = true; + bool prepend = true; + bool rapid = false; + bool doteof = false; + int fdi, fdo, i, state; char *cp, *drft = NULL, *erasep = NULL; - char *killp = NULL, name[NAMESZ], field[BUFSIZ]; - char buffer[BUFSIZ], tmpfil[BUFSIZ]; + char *killp = NULL, name[NAMESZ], field[NMH_BUFSIZ]; + char buffer[BUFSIZ]; char **arguments, **argp; FILE *in, *out; - char *tfile = NULL; - m_getfld_state_t gstate = 0; - -#ifdef LOCALE - setlocale(LC_ALL, ""); -#endif - invo_name = r1bindex (argv[0], '/'); + char *tmpfil; + m_getfld_state_t gstate; - /* read user profile/context */ - context_read(); + if (nmh_init(argv[0], true, false)) { return 1; } arguments = getarguments (invo_name, argc, argv, 1); argp = arguments; @@ -98,7 +90,7 @@ main (int argc, char **argv) ambigsw (cp, switches); done (1); case UNKWNSW: - adios (NULL, "-%s unknown", cp); + die("-%s unknown", cp); case HELPSW: snprintf (buffer, sizeof(buffer), "%s [switches] file", @@ -111,39 +103,39 @@ main (int argc, char **argv) case ERASESW: if (!(erasep = *argp++) || *erasep == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case KILLSW: if (!(killp = *argp++) || *killp == '-') - adios (NULL, "missing argument to %s", argp[-2]); + die("missing argument to %s", argp[-2]); continue; case PREPSW: - prepend++; + prepend = true; continue; case NPREPSW: - prepend = 0; + prepend = false; continue; case RAPDSW: - rapid++; + rapid = true; continue; case NRAPDSW: - rapid = 0; + rapid = false; continue; case BODYSW: - body++; + body = true; continue; case NBODYSW: - body = 0; + body = false; continue; case DOTSW: - doteof++; + doteof = true; continue; case NDOTSW: - doteof = 0; + doteof = false; continue; } } else { @@ -152,14 +144,13 @@ main (int argc, char **argv) } if (!drft) - adios (NULL, "usage: %s [switches] file", invo_name); + die("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 ((tmpfil = m_mktemp2(NULL, invo_name, NULL, &out)) == NULL) { + die("unable to create temporary file in %s", get_temp_dir()); + } /* * Are we changing the kill or erase character? @@ -171,20 +162,20 @@ main (int argc, char **argv) tcgetattr(0, &tio); /* save original kill, erase character for later */ - save_kill = KILL; - save_erase = ERASE; + save_kill = tio.c_cc[VKILL]; + save_erase = tio.c_cc[VERASE]; /* set new kill, erase character in terminal structure */ - KILL = killp ? chrcnv (killp) : save_kill; - ERASE = erasep ? chrcnv (erasep) : save_erase; + tio.c_cc[VKILL] = killp ? chrcnv (killp) : save_kill; + tio.c_cc[VERASE] = erasep ? chrcnv (erasep) : save_erase; /* set the new terminal attributes */ tcsetattr(0, TCSADRAIN, &tio); /* print out new kill erase characters */ - chrdsp ("erase", ERASE); - chrdsp (", kill", KILL); - chrdsp (", intr", INTR); + chrdsp ("erase", tio.c_cc[VERASE]); + chrdsp (", kill", tio.c_cc[VKILL]); + chrdsp (", intr", tio.c_cc[VINTR]); putchar ('\n'); fflush (stdout); @@ -193,19 +184,20 @@ main (int argc, char **argv) * setup in terminal structure so we can easily * restore it upon exit. */ - KILL = save_kill; - ERASE = save_erase; + tio.c_cc[VKILL] = save_kill; + tio.c_cc[VERASE] = save_erase; } - sigint = 0; + sigint = false; SIGNAL2 (SIGINT, intrser); /* * Loop through the lines of the draft skeleton. */ + gstate = m_getfld_state_init(in); for (;;) { int fieldsz = sizeof field; - switch (state = m_getfld (&gstate, name, field, &fieldsz, in)) { + switch (state = m_getfld2(&gstate, name, field, &fieldsz)) { case FLD: case FLDPLUS: /* @@ -222,9 +214,9 @@ main (int argc, char **argv) fprintf (out, "%s:%s", name, field); while (state == FLDPLUS) { fieldsz = sizeof field; - state = m_getfld (&gstate, name, field, &fieldsz, in); - printf ("%s", field); - fprintf (out, "%s", field); + state = m_getfld2(&gstate, name, field, &fieldsz); + fputs(field, stdout); + fputs(field, out); } } else { /* Else, get value of header field */ @@ -236,7 +228,7 @@ abort: if (killp || erasep) { tcsetattr(0, TCSADRAIN, &tio); } - unlink (tmpfil); + (void) m_unlink (tmpfil); done (1); } if (i != 0 || (field[0] != '\n' && field[0] != 0)) { @@ -244,7 +236,7 @@ abort: do { if (field[0] != ' ' && field[0] != '\t') putc (' ', out); - fprintf (out, "%s", field); + fputs(field, out); } while (i == 1 && (i = getln (field, sizeof(field))) >= 0); if (i == -1) @@ -260,10 +252,10 @@ abort: break; fprintf (out, "--------\n"); if (field[0] == 0 || !prepend) - printf ("--------\n"); + puts("--------"); if (field[0]) { if (prepend && body) { - printf ("\n--------Enter initial text\n\n"); + puts("\n--------Enter initial text\n"); fflush (stdout); for (;;) { getln (buffer, sizeof(buffer)); @@ -271,21 +263,20 @@ abort: break; if (buffer[0] == 0) break; - fprintf (out, "%s", buffer); + fputs(buffer, out); } } do { - fprintf (out, "%s", field); + fputs(field, out); if (!rapid && !sigint) - printf ("%s", field); + fputs(field, stdout); } while (state == BODY && (fieldsz = sizeof field, - state = m_getfld (&gstate, name, field, &fieldsz, in))); + state = m_getfld2(&gstate, name, field, &fieldsz))); if (prepend || !body) break; - else - printf ("\n--------Enter additional text\n\n"); + puts("\n--------Enter additional text\n"); } fflush (stdout); @@ -295,19 +286,19 @@ abort: break; if (field[0] == 0) break; - fprintf (out, "%s", field); + fputs(field, out); } break; default: - adios (NULL, "skeleton is poorly formatted"); + die("skeleton is poorly formatted"); } break; } m_getfld_state_destroy (&gstate); if (body) - printf ("--------\n"); + puts("--------"); fflush (stdout); fclose (in); @@ -325,7 +316,7 @@ abort: cpydata (fdi, fdo, tmpfil, drft); close (fdi); close (fdo); - unlink (tmpfil); + (void) m_unlink (tmpfil); context_save (); /* save the context file */ done (0); @@ -333,47 +324,57 @@ abort: } -int +static int getln (char *buffer, int n) { int c; char *cp; + static bool quoting; - cp = buffer; - *cp = 0; + *buffer = 0; switch (setjmp (sigenv)) { case OK: - wtuser = 1; + wtuser = true; break; case DONE: - wtuser = 0; + wtuser = false; return 0; default: - wtuser = 0; + wtuser = false; return NOTOK; } + cp = buffer; + *cp = 0; + for (;;) { switch (c = getchar ()) { case EOF: + quoting = false; clearerr (stdin); longjmp (sigenv, DONE); case '\n': - if (cp[-1] == QUOTE) { - cp[-1] = c; - wtuser = 0; + if (quoting) { + *(cp - 1) = c; + quoting = false; + wtuser = false; return 1; } *cp++ = c; *cp = 0; - wtuser = 0; + wtuser = false; return 0; default: + if (c == QUOTE) { + quoting = true; + } else { + quoting = false; + } if (cp < buffer + n) *cp++ = c; *cp = 0; @@ -389,14 +390,14 @@ intrser (int i) if (wtuser) longjmp (sigenv, NOTOK); - sigint++; + sigint = true; } static int chrcnv (char *cp) { - return (*cp != QUOTE ? *cp : m_atoi (++cp)); + return *cp != QUOTE ? *cp : m_atoi(++cp); }