]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - banner/banner.c
Changed the type of data_table to be unsigned char[] instead of char[],
[bsdgames-darwin.git] / banner / banner.c
index 0b5fddd24ff5028c3ef11ffc040a1cf99f284942..f73a2260461b9622c90092c6f245040fd5137cfa 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: banner.c,v 1.3 1995/03/25 07:44:49 glass Exp $ */
+/*     $NetBSD: banner.c,v 1.14 2005/06/27 20:32:07 rillig Exp $       */
 
 /*
  * Copyright (c) 1980, 1993, 1994
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
  * SUCH DAMAGE.
  */
 
+#include <sys/cdefs.h>
 #ifndef lint
-static char copyright[] =
-"@(#) Copyright (c) 1980, 1993, 1994\n\
-       The Regents of the University of California.  All rights reserved.\n";
+__COPYRIGHT("@(#) Copyright (c) 1980, 1993, 1994\n\
+       The Regents of the University of California.  All rights reserved.\n");
 #endif /* not lint */
 
 #ifndef lint
 #if 0
-static char sccsid[] = "@(#)banner.c   8.3 (Berkeley) 4/2/94";
+static char sccsid[] = "@(#)banner.c   8.4 (Berkeley) 4/29/95";
 #else
-static char rcsid[] = "$NetBSD: banner.c,v 1.3 1995/03/25 07:44:49 glass Exp $";
+__RCSID("$NetBSD: banner.c,v 1.14 2005/06/27 20:32:07 rillig Exp $");
 #endif
 #endif /* not lint */
 
 /*
  * banner - prints large signs
- * banner [-w#] [-d] [-t] message ...
+ * banner [-w width] [-d] [-t] message ...
  */
 
 #include <err.h>
@@ -64,7 +60,7 @@ static char rcsid[] = "$NetBSD: banner.c,v 1.3 1995/03/25 07:44:49 glass Exp $";
 #define NBYTES 9271
 
 /* Pointers into data_table for each ASCII char */
-int asc_ptr[NCHARS] = {
+const int asc_ptr[NCHARS] = {
 /* ^@ */   0,      0,      0,      0,      0,      0,      0,      0,
 /* ^H */   0,      0,      0,      0,      0,      0,      0,      0,
 /* ^P */   0,      0,      0,      0,      0,      0,      0,      0,
@@ -91,7 +87,7 @@ int asc_ptr[NCHARS] = {
  * is the next elt in array) and goto second
  * next element in array.
  */
-char data_table[NBYTES] = {
+const unsigned char data_table[NBYTES] = {
 /*             0     1     2     3     4     5     6     7     8     9 */
 /*    0 */   129,  227,  130,   34,    6,   90,   19,  129,   32,   10, 
 /*   10 */    74,   40,  129,   31,   12,   64,   53,  129,   30,   14, 
@@ -1029,29 +1025,37 @@ char    print[DWIDTH];
 int    debug, i, j, linen, max, nchars, pc, term, trace, x, y;
 int    width = DWIDTH; /* -w option: scrunch letters to 80 columns */
 
+static void
+toolong(void)
+{
+       errx(EXIT_FAILURE, "message too long");
+}
+
+int main(int, char *[]);
+
 int
 main(argc, argv)
        int argc;
-       char **argv;
+       char *argv[];
 { 
        int ch;
 
-       while ((ch = getopt(argc, argv, "w:td")) != EOF)
-               switch(ch) {
-               case 'w':
-                       width = atoi(optarg);
-                       if (width <= 0)
-                               width = 80;
-                       break;
+       while ((ch = getopt(argc, argv, "w:td")) != -1)
+               switch (ch) {
                case 'd':
                        debug = 1;
                        break;
                case 't':
                        trace = 1;
                        break;
+               case 'w':
+                       width = atoi(optarg);
+                       if (width <= 0)
+                               errx(1, "illegal argument for -w option");
+                       break;
                case '?':
                default:
-                       fprintf(stderr, "usage: banner [-w width]\n");
+                       (void)fprintf(stderr, "usage: banner [-w width]\n");
                        exit(1);
                }
        argc -= optind;
@@ -1064,14 +1068,20 @@ main(argc, argv)
 
        /* Have now read in the data. Next get the message to be printed. */
        if (*argv) {
-               strcpy(message, *argv);
+               const size_t msize = sizeof(message);
+
+               if (strlcpy(message, *argv, msize) >= msize)
+                       toolong();
                while (*++argv) {
-                       strcat(message, " ");
-                       strcat(message, *argv);
+                       if (strlcat(message, " ", msize) >= msize)
+                               toolong();
+                       if (strlcat(message, *argv, msize) >= msize)
+                               toolong();
                }
                nchars = strlen(message);
        } else {
-               fprintf(stderr,"Message: ");
+               if (isatty(fileno(stdin)))
+                       fprintf(stderr,"Message: ");
                (void)fgets(message, sizeof(message), stdin);
                nchars = strlen(message);
                message[nchars--] = '\0';       /* get rid of newline */
@@ -1092,7 +1102,7 @@ main(argc, argv)
                for (i = 0; i < NBYTES; i += 10) {
                        printf("/* %4d */  ",i);
                        for (j = i; j < i+10; j++) { 
-                               x = data_table[j] & 0377;
+                               x = data_table[j];
                                printf(" %3d, ",x);
                        }
                        putchar('\n');
@@ -1129,7 +1139,7 @@ main(argc, argv)
                                printf("bad pc: %d\n",pc);
                                exit(1);
                        }
-                       x = data_table[pc] & 0377;
+                       x = data_table[pc];
                        if (trace)
                                printf("pc=%d, term=%d, max=%d, linen=%d, x=%d\n",pc,term,max,linen,x);
                        if (x >= 128) {
@@ -1149,7 +1159,7 @@ main(argc, argv)
                        else {
                                y = data_table[pc+1];
                                /* compensate for narrow teminals */
-#ifdef notdef
+#if 0 /* notdef */
                                x = (x*width + (DWIDTH/2)) / DWIDTH;
                                y = (y*width + (DWIDTH/2)) / DWIDTH;
 #endif