]> granicus.if.org Git - nethack/commitdiff
tty xputc()
authorPatR <rankin@nethack.org>
Sat, 5 Oct 2019 23:49:34 +0000 (16:49 -0700)
committerPatR <rankin@nethack.org>
Sat, 5 Oct 2019 23:49:34 +0000 (16:49 -0700)
Another part of github issue 227.  Casting a function pointer when
passing it to another function is iffy when lying about the return
type.  tputs() expects a routine which returns int, so give it one.
Other xputc() usage is equivalent to putchar(), so define xputc()
with the same function signature as that has.

The tputs() declarations in system.h should probably be changed
(third argument is a function which takes an int rather than
unspecified parameters) but I've left them alone.  I made that change
to tputs() in sys/share/tclib.c though.

NT and MSDOS changes are untested.  tclib.c compiles ok with clang-
as-gcc on OSX but hasn't been tested with the port that uses it (VMS).

include/wintty.h
sys/msdos/video.c
sys/share/tclib.c
sys/winnt/nttty.c
sys/winnt/stubs.c
win/tty/termcap.c

index 4863d6e10f009fc2e6dd386754e55265ca63498e..a42ed22d42062cd5044b46cb1dbbbd1f765e4b0a 100644 (file)
@@ -114,16 +114,7 @@ E void FDECL(tty_startup, (int *, int *));
 #ifndef NO_TERMS
 E void NDECL(tty_shutdown);
 #endif
-#if defined(apollo)
-/* Apollos don't widen old-style function definitions properly -- they try to
- * be smart and use the prototype, or some such strangeness.  So we have to
- * define UNWIDENDED_PROTOTYPES (in tradstdc.h), which makes CHAR_P below a
- * char.  But the tputs termcap call was compiled as if xputc's argument
- * actually would be expanded. So here, we have to make an exception. */
-E void FDECL(xputc, (int));
-#else
-E void FDECL(xputc, (CHAR_P));
-#endif
+E int FDECL(xputc, (int));
 E void FDECL(xputs, (const char *));
 #if defined(SCREEN_VGA) || defined(SCREEN_8514)
 E void FDECL(xputg, (int, int, unsigned));
index 76002cdf601ed8b0d31df983457afd48181d95e5..1429ade16e9ab47dceb67826ecdd6eea9443e747 100644 (file)
@@ -571,8 +571,10 @@ const char *s;
     }
 }
 
-void xputc(ch) /* write out character (and attribute) */
-char ch;
+/* same signature as 'putchar()' with potential failure result ignored */
+int
+xputc(ch) /* write out character (and attribute) */
+int ch;
 {
     int i;
     char attribute;
@@ -591,16 +593,17 @@ char ch;
         vesa_xputc(ch, attribute);
 #endif /*SCREEN_VESA*/
     }
+    return 0;
 }
 
-void xputg(glyphnum, ch,
-           special) /* write out a glyph picture at current location */
+/* write out a glyph picture at current location */
+void xputg(glyphnum, ch, special)
 int glyphnum;
 int ch;
 unsigned special;
 {
     if (!iflags.grmode || !iflags.tile_view) {
-        xputc((char) ch);
+        (void) xputc((char) ch);
 #ifdef SCREEN_VGA
     } else if (iflags.grmode && iflags.usevga) {
         vga_xputg(glyphnum, ch, special);
index c158741e53248053bcf2cec901671ebe79df43a9..b47f4181545d08eb1b3b73bb18a1d55759ab0099 100644 (file)
@@ -27,7 +27,7 @@ int FDECL(tgetnum, (const char *));
 char *FDECL(tgetstr, (const char *, char **));
 char *FDECL(tgoto, (const char *, int, int));
 char *FDECL(tparam, (const char *, char *, int, int, int, int, int));
-void FDECL(tputs, (const char *, int, int (*)()));
+void FDECL(tputs, (const char *, int, int (*)(int)));
 
 /* local support data */
 static char *tc_entry;
@@ -502,9 +502,10 @@ int row, col, row2, col2;
 /* send a string to the terminal, possibly padded with trailing NULs */
 void
 tputs(string, range, output_func)
-const char *string;   /* characters to output */
-int range;            /* number of lines affected, used for `*' delays */
-int (*output_func)(); /* actual output routine; return value ignored */
+const char *string; /* characters to output */
+int range;          /* number of lines affected, used for `*' delays */
+int FDECL((*output_func),(int)); /* actual output routine;
+                                  * return value ignored */
 {
     register int c, num = 0;
     register const char *p = string;
index 3233dc9cb3f3622ee134a70149d14919d1083aa8..60d9db128efe495ec995a7398e5b8cf3576fc6c9 100644 (file)
@@ -530,12 +530,14 @@ int x, y;
     set_console_cursor(x, y);
 }
 
-void
+/* same signature as 'putchar()' with potential failure result ignored */
+int
 xputc(ch)
-char ch;
+int ch;
 {
     set_console_cursor(ttyDisplay->curx, ttyDisplay->cury);
-    xputc_core(ch);
+    xputc_core((char) ch);
+    return 0;
 }
 
 void
@@ -543,7 +545,7 @@ xputs(s)
 const char *s;
 {
     int k;
-    int slen = strlen(s);
+    int slen = (int) strlen(s);
 
     if (ttyDisplay)
         set_console_cursor(ttyDisplay->curx, ttyDisplay->cury);
index ca7313b5bb43da702af36583e45e5b46c5cb8361..fa4a9361cb94f7bb5bba5c59cc761b34a463b3fd 100644 (file)
@@ -82,11 +82,11 @@ int mode;
     return;
 }
 
-void
+int
 xputc(ch)
-char ch;
+int ch;
 {
-    return;
+    return 0;
 }
 
 void
index 9e0a76eb9a5be721732bf286f29e057ea6d7a99f..0e256ee9173c39c7bd355b46c3d89a20449eae0b 100644 (file)
@@ -495,12 +495,10 @@ tty_end_screen()
 /* Cursor movements */
 
 /* Note to overlay tinkerers.  The placement of this overlay controls the
-   location
-   of the function xputc().  This function is not currently in trampoli.[ch]
-   files for what is deemed to be performance reasons.  If this define is
-   moved
-   and or xputc() is taken out of the ROOT overlay, then action must be taken
-   in trampoli.[ch]. */
+   location of the function xputc().  This function is not currently in
+   trampoli.[ch] files for what is deemed to be performance reasons.  If
+   this define is moved and or xputc() is taken out of the ROOT overlay,
+   then action must be taken in trampoli.[ch]. */
 
 void
 nocmov(x, y)
@@ -528,7 +526,7 @@ int x, y;
             cmov(x, y);
         } else {
             while ((int) ttyDisplay->cury < y) {
-                xputc('\n');
+                (void) xputc('\n');
                 ttyDisplay->curx = 0;
                 ttyDisplay->cury++;
             }
@@ -561,16 +559,27 @@ register int x, y;
     ttyDisplay->curx = x;
 }
 
-/* See note above. xputc() is a special function. */
-void
+/* See note above.  xputc() is a special function for overlays. */
+int
 xputc(c)
-#if defined(apollo)
-    int c;
-#else
-    char c;
-#endif
+int c; /* actually char, but explicitly specify its widened type */
 {
-    (void) putchar(c);
+    /*
+     * Note:  xputc() as a direct all to putchar() doesn't make any
+     * sense _if_ putchar() is a function.  But if it is a macro, an
+     * overlay configuration would want to avoid hidden code bloat
+     * from multiple putchar() expansions.  And it gets passed as an
+     * argument to tputs() so we have to guarantee an actual function
+     * (while possibly lacking ANSI's (func) syntax to override macro).
+     *
+     * xputc() used to be declared as 'void xputc(c) char c; {}' but
+     * avoiding the proper type 'int' just to avoid (void) casts when
+     * ignoring the result can't have been sufficent reason to add it.
+     * It also had '#if apollo' conditional to have the arg be int.
+     * Matching putchar()'s declaration and using explicit casts where
+     * warranted is more robust, so we're just a jacket around that.
+     */
+    return putchar(c);
 }
 
 void
@@ -579,13 +588,9 @@ const char *s;
 {
 #ifndef TERMLIB
     (void) fputs(s, stdout);
-#else
-#if defined(NHSTDC) || defined(ULTRIX_PROTO)
-    tputs(s, 1, (int (*) ()) xputc);
 #else
     tputs(s, 1, xputc);
 #endif
-#endif
 }
 
 void
@@ -599,7 +604,7 @@ cl_end()
         /* this looks terrible, especially on a slow terminal
            but is better than nothing */
         while (cx < CO) {
-            xputc(' ');
+            (void) xputc(' ');
             cx++;
         }
         tty_curs(BASE_WINDOW, (int) ttyDisplay->curx + 1,
@@ -754,25 +759,18 @@ tty_delay_output()
     /* BUG: if the padding character is visible, as it is on the 5620
        then this looks terrible. */
     if (flags.null) {
+        tputs(
 #ifdef TERMINFO
-/* cbosgd!cbcephus!pds for SYS V R2 */
-#ifdef NHSTDC
-        tputs("$<50>", 1, (int (*) ()) xputc);
-#else
-        tputs("$<50>", 1, xputc);
-#endif
-#else
-#if defined(NHSTDC) || defined(ULTRIX_PROTO)
-        tputs("50", 1, (int (*) ()) xputc);
+              "$<50>",
 #else
-        tputs("50", 1, xputc);
-#endif
+              "50",
 #endif
+              1, xputc);
 
     } else if (ospeed > 0 && ospeed < SIZE(tmspc10) && nh_CM) {
         /* delay by sending cm(here) an appropriate number of times */
         register int cmlen =
-            strlen(tgoto(nh_CM, ttyDisplay->curx, ttyDisplay->cury));
+            (int) strlen(tgoto(nh_CM, ttyDisplay->curx, ttyDisplay->cury));
         register int i = 500 + tmspc10[ospeed] / 2;
 
         while (i > 0) {
@@ -794,7 +792,7 @@ cl_eos() /* free after Robert Viduya */
 
         while (cy <= LI - 2) {
             cl_end();
-            xputc('\n');
+            (void) xputc('\n');
             cy++;
         }
         cl_end();