A few small followup fixes to the unused data table entries.
First, fill a missing pixel in the glyph for 'U':
$ ./banner -w 40 U
#
#
#######################
########################
###### #
#### #
###
##
##
##
##
### #
#######################
############# ######
#
Second, fix an off-by-one in the line output routine. This caused an
extra space character to be output at the end of every line. It might
have caused a buffer overflow if any glyph had used the entire possible
width of 132 pixels, but as it is the widest is only 124 pixels.
Third, output blank lines instead of lines full of spaces (the number of
spaces was equal to the width of the most recent non-blank line).
Finally, add bounds checks to protect against buffer overflows that could arise
in case the data table were ever modified to draw out of bounds (characters
wider or taller than 132 pixels, or a two-byte code where the second byte is
past the end of the table).
$ ./banner '
!"#$%&'"'"'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ`abcdefghijklmnopqrstuvwxyz'
> output.1
$ patch -p0 < banner.fixes.patch
$ make
$ ./banner '
!"#$%&'"'"'()*+,-./0123456789:;=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ`abcdefghijklmnopqrstuvwxyz'
> output.2
$ diff -uw output.1 output.2 # Only one line of diff, the filled pixel in 'U'.
--- banner.c.orig Sun Oct 14 21:05:27 2018
+++ banner.c Sun Oct 14 21:22:22 2018
@@ -44,7 +44,7 @@
#define MAXMSG 1024
#define DWIDTH 132
#define NCHARS 128
-#define NBYTES 9087
+#define NBYTES 9085
/* Pointers into data_table for each ASCII char */
const int asc_ptr[NCHARS] = {
@@ -58,12 +58,12 @@
/* '8' */ 2202, 2411, 2587, 2623, 0, 2671, 0, 2677,
/* '@' */ 2818, 3032, 3232, 3361, 3517, 3618, 3685, 3739,
/* 'H' */ 3918, 3952, 3966, 4065, 4230, 4262, 4379, 4494,
-/* 'P' */ 4654, 4734, 4942, 5130, 5338, 5388, 5515, 5648,
-/* 'X' */ 5829, 6042, 6192, 0, 0, 0, 0, 0,
-/* '`' */ 48, 6437, 6575, 6665, 6767, 6859, 7001, 7084,
-/* 'h' */ 7306, 7377, 7423, 7507, 7611, 7623, 7717, 7788,
-/* 'p' */ 7896, 7986, 8076, 8137, 8295, 8355, 8420, 8516,
-/* 'x' */ 8642, 8797, 8924, 0, 0, 0, 0, 0,
+/* 'P' */ 4654, 4734, 4942, 5130, 5338, 5388, 5513, 5646,
+/* 'X' */ 5827, 6040, 6190, 0, 0, 0, 0, 0,
+/* '`' */ 48, 6435, 6573, 6663, 6765, 6857, 6999, 7082,
+/* 'h' */ 7304, 7375, 7421, 7505, 7609, 7621, 7715, 7786,
+/* 'p' */ 7894, 7984, 8074, 8135, 8293, 8353, 8418, 8514,
+/* 'x' */ 8640, 8795, 8922, 0, 0, 0, 0, 0,
};
/*
@@ -697,9 +697,9 @@
33, 7, 129, 34, 7, 129, 35, 8, 129, 36,
9, 117, 4, 129, 38, 9, 117, 4, 129, 40,
10, 117, 4, 129, 42, 12, 117, 4, 129, 44,
- 77, 129, 46, 75, 129, 50, 71, 129, 56, 43,
- 100, 21, 129, 117, 4, 132, 193,
-/* 5515 'V' */
+ 77, 129, 46, 75, 129, 50, 71, 129, 56, 65,
+ 129, 117, 4, 132, 193,
+/* 5513 'V' */
117, 4, 132, 115, 6, 129, 110, 11, 129, 105,
16, 129, 101, 20, 129, 96, 25, 129, 92, 29,
129, 87, 34, 129, 83, 38, 129, 78, 43, 129,
@@ -714,7 +714,7 @@
4, 129, 95, 16, 117, 4, 129, 100, 21, 129,
105, 16, 129, 110, 11, 129, 114, 7, 129, 117,
4, 132, 193,
-/* 5648 'W' */
+/* 5646 'W' */
117, 4, 132, 115, 6, 129, 110, 11, 129, 105,
16, 129, 101, 20, 129, 96, 25, 129, 92, 29,
129, 87, 34, 129, 83, 38, 129, 78, 43, 129,
@@ -734,7 +734,7 @@
95, 16, 117, 4, 129, 100, 21, 129, 105, 16,
129, 110, 11, 129, 114, 7, 129, 117, 4, 132,
193,
-/* 5829 'X' */
+/* 5827 'X' */
30, 4, 117, 4, 132, 30, 4, 115, 6, 129,
30, 4, 112, 9, 129, 30, 6, 109, 12, 129,
30, 9, 106, 15, 129, 30, 11, 103, 18, 129,
@@ -757,7 +757,7 @@
8, 129, 30, 12, 116, 5, 129, 30, 9, 117,
4, 129, 30, 6, 117, 4, 129, 30, 4, 117,
4, 132, 193,
-/* 6042 'Y' */
+/* 6040 'Y' */
117, 4, 132, 114, 7, 129, 111, 10, 129, 108,
13, 129, 105, 16, 129, 102, 19, 129, 100, 21,
129, 96, 25, 129, 93, 28, 129, 90, 31, 129,
@@ -773,7 +773,7 @@
11, 117, 4, 129, 97, 12, 117, 4, 129, 101,
12, 117, 4, 129, 104, 17, 129, 108, 13, 129,
111, 10, 129, 115, 6, 129, 117, 4, 134, 193,
-/* 6192 'Z' */
+/* 6190 'Z' */
30, 1, 103, 18, 129, 30, 4, 103, 18, 129,
30, 7, 103, 18, 129, 30, 9, 103, 18, 129,
30, 12, 110, 11, 129, 30, 15, 113, 8, 129,
@@ -799,7 +799,7 @@
11, 109, 12, 129, 30, 18, 112, 9, 129, 30,
18, 115, 6, 129, 30, 18, 117, 4, 129, 30,
18, 120, 1, 129, 193,
-/* 6437 'a' */
+/* 6435 'a' */
42, 8, 129, 38, 16, 129, 36, 20, 129, 34,
24, 71, 5, 129, 33, 26, 69, 10, 129, 32,
28, 68, 13, 129, 31, 30, 68, 14, 129, 31,
@@ -814,7 +814,7 @@
31, 49, 129, 30, 49, 129, 30, 47, 129, 30,
45, 129, 30, 41, 129, 30, 6, 129, 30, 4,
129, 30, 3, 129, 30, 2, 129, 193,
-/* 6575 'b' */
+/* 6573 'b' */
30, 4, 117, 4, 130, 30, 91, 136, 37, 5,
72, 5, 129, 35, 5, 74, 5, 129, 33, 5,
76, 5, 129, 32, 5, 77, 5, 129, 31, 5,
@@ -824,7 +824,7 @@
72, 11, 129, 32, 15, 67, 15, 129, 33, 48,
129, 34, 46, 129, 35, 44, 129, 37, 40, 129,
39, 36, 129, 42, 30, 129, 46, 22, 129, 193,
-/* 6665 'c' */
+/* 6663 'c' */
48, 18, 129, 43, 28, 129, 41, 32, 129, 39,
36, 129, 37, 40, 129, 35, 44, 129, 34, 46,
129, 33, 13, 68, 13, 129, 32, 9, 73, 9,
@@ -836,7 +836,7 @@
129, 34, 4, 72, 8, 129, 35, 5, 72, 7,
129, 37, 5, 73, 4, 129, 39, 4, 74, 1,
129, 194,
-/* 6767 'd' */
+/* 6765 'd' */
46, 22, 129, 42, 30, 129, 39, 36, 129, 37,
40, 129, 35, 44, 129, 34, 46, 129, 33, 48,
129, 32, 15, 67, 15, 129, 31, 11, 72, 11,
@@ -847,7 +847,7 @@
129, 35, 5, 74, 5, 117, 4, 129, 37, 5,
72, 5, 117, 4, 129, 30, 91, 136, 30, 4,
130, 193,
-/* 6859 'e' */
+/* 6857 'e' */
48, 18, 129, 43, 28, 129, 41, 32, 129, 39,
36, 129, 37, 40, 129, 35, 44, 129, 34, 46,
129, 33, 13, 55, 4, 68, 13, 129, 32, 9,
@@ -863,7 +863,7 @@
24, 129, 37, 5, 55, 22, 129, 39, 4, 55,
20, 129, 55, 18, 129, 55, 16, 129, 55, 11,
129, 193,
-/* 7001 'f' */
+/* 6999 'f' */
80, 4, 129, 30, 4, 80, 4, 130, 30, 78,
129, 30, 82, 129, 30, 85, 129, 30, 87, 129,
30, 88, 129, 30, 89, 129, 30, 90, 130, 30,
@@ -873,7 +873,7 @@
19, 129, 80, 4, 101, 19, 129, 101, 19, 129,
101, 18, 129, 102, 16, 129, 103, 12, 129, 105,
6, 129, 193,
-/* 7084 'g' */
+/* 7082 'g' */
12, 10, 59, 11, 129, 9, 16, 55, 19, 129,
7, 20, 53, 23, 129, 6, 7, 23, 5, 32,
6, 51, 27, 129, 4, 7, 25, 16, 50, 29,
@@ -897,7 +897,7 @@
55, 19, 80, 12, 129, 12, 12, 59, 11, 81,
11, 129, 82, 10, 129, 84, 7, 129, 86, 4,
129, 193,
-/* 7306 'h' */
+/* 7304 'h' */
30, 4, 117, 4, 130, 30, 91, 136, 30, 4,
72, 5, 129, 30, 4, 74, 5, 129, 75, 5,
129, 76, 5, 129, 76, 6, 129, 77, 6, 130,
@@ -906,13 +906,13 @@
53, 130, 30, 52, 129, 30, 51, 129, 30, 49,
129, 30, 46, 129, 30, 42, 129, 30, 4, 130,
193,
-/* 7377 'i' */
+/* 7375 'i' */
30, 4, 80, 4, 129, 30, 4, 80, 4, 100,
6, 129, 30, 54, 98, 10, 129, 30, 54, 97,
12, 129, 30, 54, 96, 14, 131, 30, 54, 97,
12, 129, 30, 54, 98, 10, 129, 30, 54, 100,
6, 129, 30, 4, 130, 193,
-/* 7423 'j' */
+/* 7421 'j' */
7, 6, 129, 4, 11, 129, 3, 13, 129, 2,
14, 129, 1, 15, 130, 1, 3, 6, 9, 129,
1, 3, 7, 6, 129, 1, 3, 130, 1, 4,
@@ -922,7 +922,7 @@
96, 14, 129, 7, 77, 96, 14, 129, 10, 74,
97, 12, 129, 14, 70, 98, 10, 129, 19, 65,
100, 6, 129, 193,
-/* 7507 'k' */
+/* 7505 'k' */
30, 4, 117, 4, 130, 30, 91, 136, 30, 4,
57, 9, 129, 30, 4, 55, 12, 129, 52, 17,
129, 50, 20, 129, 48, 24, 129, 46, 27, 129,
@@ -934,10 +934,10 @@
80, 4, 129, 30, 14, 80, 4, 129, 30, 12,
129, 30, 10, 129, 30, 7, 129, 30, 5, 129,
30, 4, 130, 193,
-/* 7611 'l' */
+/* 7609 'l' */
30, 4, 117, 4, 130, 30, 91, 136, 30, 4,
130, 193,
-/* 7623 'm' */
+/* 7621 'm' */
30, 4, 80, 4, 130, 30, 54, 136, 30, 4,
72, 5, 129, 30, 4, 74, 5, 129, 75, 5,
129, 76, 5, 129, 30, 4, 75, 7, 129, 30,
@@ -948,7 +948,7 @@
30, 4, 74, 9, 129, 30, 54, 132, 30, 53,
129, 30, 52, 129, 30, 51, 129, 30, 48, 129,
30, 4, 130, 193,
-/* 7717 'n' */
+/* 7715 'n' */
30, 4, 80, 4, 130, 30, 54, 136, 30, 4,
72, 5, 129, 30, 4, 74, 5, 129, 75, 5,
129, 76, 5, 129, 76, 6, 129, 77, 6, 130,
@@ -957,7 +957,7 @@
53, 130, 30, 52, 129, 30, 51, 129, 30, 49,
129, 30, 46, 129, 30, 42, 129, 30, 4, 130,
193,
-/* 7788 'o' */
+/* 7786 'o' */
48, 18, 129, 43, 28, 129, 41, 32, 129, 39,
36, 129, 37, 40, 129, 35, 44, 129, 34, 46,
129, 33, 13, 68, 13, 129, 32, 9, 73, 9,
@@ -969,7 +969,7 @@
129, 33, 13, 68, 13, 129, 34, 46, 129, 35,
44, 129, 37, 40, 129, 39, 36, 129, 41, 32,
129, 43, 28, 129, 48, 18, 129, 193,
-/* 7896 'p' */
+/* 7894 'p' */
1, 3, 80, 4, 130, 1, 83, 137, 37, 5,
72, 5, 129, 35, 5, 74, 5, 129, 33, 5,
76, 5, 129, 32, 5, 77, 5, 129, 31, 5,
@@ -979,7 +979,7 @@
72, 11, 129, 32, 15, 67, 15, 129, 33, 48,
129, 34, 46, 129, 35, 44, 129, 37, 40, 129,
39, 36, 129, 42, 30, 129, 46, 22, 129, 193,
-/* 7986 'q' */
+/* 7984 'q' */
46, 22, 129, 42, 30, 129, 39, 36, 129, 37,
40, 129, 35, 44, 129, 34, 46, 129, 33, 48,
129, 32, 15, 67, 15, 129, 31, 11, 72, 11,
@@ -989,7 +989,7 @@
129, 32, 5, 77, 5, 129, 33, 5, 76, 5,
129, 35, 5, 74, 5, 129, 37, 5, 72, 5,
129, 1, 83, 136, 1, 3, 80, 4, 130, 193,
-/* 8076 'r' */
+/* 8074 'r' */
30, 4, 80, 4, 130, 30, 54, 136, 30, 4,
68, 6, 129, 30, 4, 70, 6, 129, 71, 7,
129, 72, 7, 129, 73, 7, 129, 74, 7, 129,
@@ -997,7 +997,7 @@
17, 129, 66, 18, 129, 65, 19, 130, 65, 18,
130, 66, 16, 129, 67, 13, 129, 69, 8, 129,
193,
-/* 8137 's' */
+/* 8135 's' */
30, 13, 64, 8, 129, 30, 13, 61, 14, 129,
30, 13, 59, 18, 129, 30, 13, 57, 22, 129,
33, 8, 56, 24, 129, 32, 7, 55, 26, 129,
@@ -1014,14 +1014,14 @@
71, 13, 129, 33, 27, 71, 13, 129, 34, 26,
71, 13, 129, 35, 24, 71, 13, 129, 37, 20,
129, 39, 16, 129, 43, 9, 129, 193,
-/* 8295 't' */
+/* 8293 't' */
80, 4, 131, 41, 56, 129, 37, 60, 129, 35,
62, 129, 33, 64, 129, 32, 65, 129, 31, 66,
129, 30, 67, 130, 30, 11, 80, 4, 129, 30,
9, 80, 4, 129, 30, 8, 80, 4, 129, 31,
7, 80, 4, 129, 31, 6, 129, 32, 5, 129,
33, 5, 129, 35, 4, 129, 38, 3, 129, 193,
-/* 8355 'u' */
+/* 8353 'u' */
80, 4, 130, 42, 42, 129, 38, 46, 129, 35,
49, 129, 33, 51, 129, 32, 52, 129, 31, 53,
130, 30, 54, 129, 30, 12, 129, 30, 9, 129,
@@ -1029,7 +1029,7 @@
6, 129, 33, 5, 129, 34, 5, 129, 35, 5,
80, 4, 129, 37, 5, 80, 4, 129, 30, 54,
136, 30, 4, 130, 193,
-/* 8420 'v' */
+/* 8418 'v' */
80, 4, 130, 77, 7, 129, 74, 10, 129, 70,
14, 129, 66, 18, 129, 62, 22, 129, 59, 25,
129, 55, 29, 129, 51, 33, 129, 47, 37, 129,
@@ -1040,7 +1040,7 @@
59, 13, 80, 4, 129, 63, 13, 80, 4, 129,
67, 17, 129, 71, 13, 129, 74, 10, 129, 78,
6, 129, 80, 4, 131, 193,
-/* 8516 'w' */
+/* 8514 'w' */
80, 4, 130, 77, 7, 129, 74, 10, 129, 70,
14, 129, 66, 18, 129, 62, 22, 129, 59, 25,
129, 55, 29, 129, 51, 33, 129, 47, 37, 129,
@@ -1054,7 +1054,7 @@
59, 13, 80, 4, 129, 63, 13, 80, 4, 129,
67, 17, 129, 71, 13, 129, 74, 10, 129, 78,
6, 129, 80, 4, 131, 193,
-/* 8642 'x' */
+/* 8640 'x' */
30, 4, 80, 4, 130, 30, 4, 79, 5, 129,
30, 5, 77, 7, 129, 30, 6, 74, 10, 129,
30, 8, 72, 12, 129, 30, 11, 69, 15, 129,
@@ -1071,7 +1071,7 @@
12, 75, 9, 129, 30, 10, 77, 7, 129, 30,
7, 79, 5, 129, 30, 5, 80, 4, 129, 30,
4, 80, 4, 130, 193,
-/* 8797 'y' */
+/* 8795 'y' */
4, 5, 80, 4, 129, 2, 9, 80, 4, 129,
1, 11, 77, 7, 129, 1, 12, 74, 10, 129,
1, 12, 70, 14, 129, 1, 12, 66, 18, 129,
@@ -1085,7 +1085,7 @@
129, 59, 13, 80, 4, 129, 63, 13, 80, 4,
129, 67, 17, 129, 71, 13, 129, 74, 10, 129,
78, 6, 129, 80, 4, 131, 193,
-/* 8924 'z' */
+/* 8922 'z' */
30, 1, 71, 13, 129, 30, 3, 71, 13, 129,
30, 6, 71, 13, 129, 30, 9, 75, 9, 129,
30, 11, 77, 7, 129, 30, 14, 79, 5, 129,
@@ -1224,8 +1224,8 @@
if (x>192) term++;
x = x & 63;
while (x--) {
- if (print[linen++]) {
- for (j=0; j <= max; j++)
+ if (print[(unsigned int) linen++ %
DWIDTH]) {
+ for (j=0; j < max && j <
DWIDTH; j++)
if (print[j])
putchar(line[j]);
putchar('\n');
@@ -1233,8 +1233,13 @@
}
for (j = 0; j < DWIDTH; j++) line[j] = ' ';
pc++;
+ max = 0;
}
else {
+ if (pc+1 < 0 || pc+1 >= NBYTES) {
+ printf("bad pc: %d\n",pc+1);
+ return 1;
+ }
y = data_table[pc+1];
/* compensate for narrow teminals */
#ifdef notdef
@@ -1242,7 +1247,8 @@
y = (y*width + (DWIDTH/2)) / DWIDTH;
#endif
max = x+y;
- while (x < max) line[x++] = '#';
+ while (x < max && x < DWIDTH)
+ line[x++] = '#';
pc += 2;
if (trace)
printf("x=%d, y=%d, max=%d\n",x,y,max);