]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/getele.c
Update copyright notice
[empserver] / src / lib / subs / getele.c
index 8c8785ad58025d78d70fd0525969a97446c1b1f2..eb13f9179d3f3b09ea8e6d4b6f5ac8427bdf8ce8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2005, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2010, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
  *
  *  ---
  *
- *  See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- *  related information and legal notices. It is expected that any future
- *  projects/authors will amend these files as needed.
+ *  See files README, COPYING and CREDITS in the root of the source
+ *  tree for related information and legal notices.  It is expected
+ *  that future projects/authors will amend these files as needed.
  *
  *  ---
  *
  *  getele.c: Read a telegram from a file or stdin and send it to a country
- * 
+ *
  *  Known contributors to this file:
- *    
+ *     Ron Koenderink, 2005
+ *     Markus Armbruster, 2005-2009
+ *
  */
 
-#include <ctype.h>
-#include "misc.h"
+#include <config.h>
+
 #include "player.h"
-#include "tel.h"
 #include "prototypes.h"
+#include "tel.h"
 
-static int tilde_escape(s_char *s, s_char c);
+static int tilde_escape(char *s);
 
+/*
+ * Read a telegram for RECIPIENT into BUF, in UTF-8.
+ * BUF must have space for MAXTELSIZE+1 characters.
+ * Return telegram length, or -1 on error.
+ */
 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]; /* UTF-8 */
+    char left[16];
 
-    pr("Enter telegram for %s\n", nation);
-    pr("undo last line with ~u, print with ~p, abort with ~q, end with ^D or .\n");
+    pr("Enter telegram for %s\n", recipient);
+    pr("undo last line with ~u, print with ~p, abort with ~q, end with .\n");
     bp = buf;
-    while (!player->aborted) {
+    *bp = 0;
+    for (;;) {
        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");
-           pr("%s", buf);
+           uprnf(buf);
            continue;
        }
-       if (buffer[0] == '.' && ((buffer[1] == 0)
-                                || (buffer[1] == '\n')
-                                || (buffer[1] == '\r')))
+       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) || (s[2] == '\n') || (s[2] == '\r')))
-       return 1;
-    return 0;
+    return s[0] == '~' && s[2] == 0 ? s[1] : 0;
 }