banner.c revision 1.3 1 /* $NetBSD: banner.c,v 1.3 1997/10/18 12:12:47 lukem Exp $ */
2
3 /*
4 * Changes for banner(1)
5 *
6 * @(#)Copyright (c) 1995, Simon J. Gerraty.
7 *
8 * This is free software. It comes with NO WARRANTY.
9 * Permission to use, modify and distribute this source code
10 * is granted subject to the following conditions.
11 * 1/ that the above copyright notice and this notice
12 * are preserved in all copies and that due credit be given
13 * to the author.
14 * 2/ that any changes to this code are clearly commented
15 * as such so that the author does not get blamed for bugs
16 * other than his own.
17 *
18 * Please send copies of changes and bug-fixes to:
19 * sjg (at) zen.void.oz.au
20 */
21
22 /*
23 * Copyright (c) 1983, 1993
24 * The Regents of the University of California. All rights reserved.
25 *
26 * Redistribution and use in source and binary forms, with or without
27 * modification, are permitted provided that the following conditions
28 * are met:
29 * 1. Redistributions of source code must retain the above copyright
30 * notice, this list of conditions and the following disclaimer.
31 * 2. Redistributions in binary form must reproduce the above copyright
32 * notice, this list of conditions and the following disclaimer in the
33 * documentation and/or other materials provided with the distribution.
34 * 3. All advertising materials mentioning features or use of this software
35 * must display the following acknowledgement:
36 * This product includes software developed by the University of
37 * California, Berkeley and its contributors.
38 * 4. Neither the name of the University nor the names of its contributors
39 * may be used to endorse or promote products derived from this software
40 * without specific prior written permission.
41 *
42 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
43 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
44 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
45 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
46 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
47 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
48 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
49 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
50 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
51 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
52 * SUCH DAMAGE.
53 */
54
55 #include <sys/cdefs.h>
56 #ifndef lint
57 __COPYRIGHT("@(#) Copyright (c) 1983, 1993\n\
58 The Regents of the University of California. All rights reserved.\n");
59 #endif /* not lint */
60
61 #ifndef lint
62 #if 0
63 static char sccsid[] = "@(#)printjob.c 8.2 (Berkeley) 4/16/94";
64 #else
65 __RCSID("$NetBSD: banner.c,v 1.3 1997/10/18 12:12:47 lukem Exp $");
66 #endif
67 #endif /* not lint */
68
69 #include <stdio.h>
70 #include <string.h>
71 #include <unistd.h>
72
73 #include "banner.h"
74
75 static long PW = LINELEN;
76
77 static int dropit __P((int));
78 int main __P((int, char **));
79 static void scan_out __P((int, char *, int));
80 static char *scnline __P((int, char *, int));
81
82 /* the char gen code below is lifted from lpd */
83
84 static char *
85 scnline(key, p, c)
86 int key;
87 char *p;
88 int c;
89 {
90 int scnwidth;
91
92 /*
93 * <sjg> lpd makes chars out of the letter in question.
94 * the results are somewhat mixed. Sticking to '#' as
95 * banner(1) does is more consistent.
96 */
97 #ifndef NOHASH_ONLY
98 c = '#';
99 #endif
100
101 for (scnwidth = WIDTH; --scnwidth;) {
102 key <<= 1;
103 *p++ = key & 0200 ? c : BACKGND;
104 }
105 return (p);
106 }
107
108 #define TRC(q) (((q)-' ')&0177)
109
110
111 static int
112 dropit(c)
113 int c;
114 {
115 switch(c) {
116
117 case TRC('_'):
118 case TRC(';'):
119 case TRC(','):
120 case TRC('g'):
121 case TRC('j'):
122 case TRC('p'):
123 case TRC('q'):
124 case TRC('y'):
125 return (DROP);
126
127 default:
128 return (0);
129 }
130 }
131
132 static void
133 scan_out(scfd, scsp, dlm)
134 int scfd;
135 char *scsp;
136 int dlm;
137 {
138 char *strp;
139 int nchrs, j;
140 char outbuf[LINELEN+1], *sp, c, cc;
141 int d, scnhgt;
142 extern char scnkey[][HEIGHT]; /* in lpdchar.c */
143
144 for (scnhgt = 0; scnhgt++ < HEIGHT+DROP; ) {
145 strp = &outbuf[0];
146 sp = scsp;
147 for (nchrs = 0; ; ) {
148 d = dropit(c = TRC(cc = *sp++));
149 if ((!d && scnhgt > HEIGHT) || (scnhgt <= DROP && d))
150 for (j = WIDTH; --j;)
151 *strp++ = BACKGND;
152 else
153 strp = scnline(
154 scnkey[(int)c][scnhgt-1-d], strp, cc);
155 if (*sp == dlm || *sp == '\0' || nchrs++ >= PW/(WIDTH+1)-1)
156 break;
157 *strp++ = BACKGND;
158 #ifdef LPD_CHSET /* <sjg> */
159 *strp++ = BACKGND;
160 #endif
161 }
162 while (*--strp == BACKGND && strp >= outbuf)
163 ;
164 strp++;
165 *strp++ = '\n';
166 (void) write(scfd, outbuf, strp-outbuf);
167 }
168 }
169
170 /*
171 * for each word, print up to 10 chars in big letters.
172 */
173 int
174 main(argc, argv)
175 int argc;
176 char **argv;
177 {
178 char word[10+1]; /* strings limited to 10 chars */
179
180 while (*++argv) {
181 (void)strncpy(word, *argv, sizeof (word) - 1);
182 word[sizeof (word) - 1] = '\0';
183 scan_out(1, word, '\0');
184 }
185 exit(0);
186 }
187