From bc8a44326478b36e0d1e039190289f015a357914 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Sun, 12 Jun 2005 09:58:38 +0000 Subject: [PATCH] (getele): Abort telegram when uprmptrd() fails. Previously, failures that didn't set player->aborted sent the telegram, e.g. EOF. (getele): Fix misleading size of left[]. (getele, tilde_escape): Simplify. tilde_escape() now returns the escape code instead of comparing it to second argument. --- src/lib/subs/getele.c | 64 +++++++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/lib/subs/getele.c b/src/lib/subs/getele.c index 0d1c4e2dc..1fe4825a7 100644 --- a/src/lib/subs/getele.c +++ b/src/lib/subs/getele.c @@ -37,69 +37,73 @@ #include "tel.h" #include "prototypes.h" -static int tilde_escape(s_char *s, s_char c); +static int tilde_escape(char *s); +/* + * Read a telegram for RECIPIENT into BUF. + * BUF must have space for MAXTELSIZE+1 characters. + * Return telegram length, or -1 on error. + * Note: telegrams are message text (see doc/unicode). + */ int -getele(char *nation, char *buf /* buf is message text */) +getele(char *recipient, char *buf) { - register char *bp; - register int len; - char buffer[MAXTELSIZE + 2]; /* buf is message text */ - char left[MAXTELSIZE + 2]; /* buf is message text */ + char *bp; + size_t len; + char buffer[MAXTELSIZE + 2]; /* message text */ + char left[16]; - pr("Enter telegram for %s\n", nation); + pr("Enter telegram for %s\n", recipient); pr("undo last line with ~u, print with ~p, abort with ~q, end with ^D or .\n"); bp = buf; while (!player->aborted) { sprintf(left, "%4d left: ", (int)(buf + MAXTELSIZE - bp)); - buffer[0] = 0; - if (uprmptrd(left, buffer, MAXTELSIZE - 2) <= 0) - break; - if (tilde_escape(buffer, 'q')) + if (uprmptrd(left, buffer, sizeof(buffer) - 2) <= 0) + return -1; + switch(tilde_escape(buffer)) { + case 'q': return -1; - if (tilde_escape(buffer, 'u')) { + case 'u': if (bp == buf) { pr("No more lines to undo\n"); continue; } + for (bp -= 2; bp >= buf && *bp != '\n'; --bp) ; + *++bp = 0; pr("Last line deleted.\n"); - for (bp -= 2; bp > buf && *bp != '\n'; --bp) ; - if (bp > buf) - *(++bp) = 0; - else - bp = buf; continue; - } - if (tilde_escape(buffer, 'p')) { + case 'p': pr("This is what you have written so far:\n"); uprnf(buf); continue; } if (buffer[0] == '.' && buffer[1] == 0) break; + if (buffer[0] == '>') /* forgery attempt? */ + buffer[0] = '?'; /* foil it */ len = strlen(buffer); + if (CANT_HAPPEN(len > sizeof(buffer) - 2)) + len = sizeof(buffer) - 2; buffer[len++] = '\n'; buffer[len] = 0; - if (len + (bp - buf) > MAXTELSIZE) + if (bp + len > buf + MAXTELSIZE) pr("Too long. Try that last line again...\n"); else { - if (buffer[0] == '>') /* forgery attempt? */ - buffer[0] = '?'; /* foil it */ - (void)strcpy(bp, buffer); + memcpy(bp, buffer, len + 1); bp += len; } } if (player->aborted) return -1; - len = bp - buf; - buf[len] = 0; - return len; + return bp - buf; } +/* + * If S is a `tilde escape', return its code, else 0. + * A tilde escape is '~' followed by the code character. + */ static int -tilde_escape(s_char *s, s_char c) +tilde_escape(char *s) { - if (s[0] == '~' && s[1] == c && s[2] == 0) - return 1; - return 0; + return s[0] == '~' && s[2] == 0 ? s[1] : 0; } -- 2.43.0