1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1989-2013 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *               Glenn Fowler <glenn.s.fowler@gmail.com>                *
18 *                                                                      *
19 ***********************************************************************/
20 #pragma prototyped
21 /*
22  * David Korn
23  * AT&T Research
24  *
25  * banner [-d delim] [-w width] arg ...
26  */
27 
28 static const char usage[] =
29 "[-?\n@(#)$Id: banner (AT&T Research) 1999-04-28 $\n]"
30 USAGE_LICENSE
31 "[+NAME?banner - print large banner]"
32 "[+DESCRIPTION?\bbanner\b prints a large banner on the standard output.]"
33 
34 "[d:delimiter?The banner print character is \achar\a.]:[char:=#]"
35 "[w:width?The banner print width is \awidth\a.]#[width:=80]"
36 
37 "\n"
38 "\n[ message ... ]\n"
39 "\n"
40 "[+SEE ALSO?\blpr\b(1), \bpr\b(1)]"
41 ;
42 
43 #include	<cmd.h>
44 #include	<ccode.h>
45 
46 #define CHAR_HEIGHT	8
47 
48 const unsigned char bandata[128][CHAR_HEIGHT] =
49 {
50 	 0, 0, 0, 0, 0, 0, 0, 0,
51 	 0, 0, 0, 0, 0, 0, 0, 0,
52 	 0, 0, 0, 0, 0, 0, 0, 0,
53 	 0, 0, 0, 0, 0, 0, 0, 0,
54 	 0, 0, 0, 0, 0, 0, 0, 0,
55 	 0, 0, 0, 0, 0, 0, 0, 0,
56 	 0, 0, 0, 0, 0, 0, 0, 0,
57 	 0, 0, 0, 0, 0, 0, 0, 0,
58 	 0, 0, 0, 0, 0, 0, 0, 0,
59 	 0, 0, 0, 0, 0, 0, 0, 0,
60 	 0, 0, 0, 0, 0, 0, 0, 0,
61 	 0, 0, 0, 0, 0, 0, 0, 0,
62 	 0, 0, 0, 0, 0, 0, 0, 0,
63 	 0, 0, 0, 0, 0, 0, 0, 0,
64 	 0, 0, 0, 0, 0, 0, 0, 0,
65 	 0, 0, 0, 0, 0, 0, 0, 0,
66 	 0, 0, 0, 0, 0, 0, 0, 0,
67 	 0, 0, 0, 0, 0, 0, 0, 0,
68 	 0, 0, 0, 0, 0, 0, 0, 0,
69 	 0, 0, 0, 0, 0, 0, 0, 0,
70 	 0, 0, 0, 0, 0, 0, 0, 0,
71 	 0, 0, 0, 0, 0, 0, 0, 0,
72 	 0, 0, 0, 0, 0, 0, 0, 0,
73 	 0, 0, 0, 0, 0, 0, 0, 0,
74 	 0, 0, 0, 0, 0, 0, 0, 0,
75 	 0, 0, 0, 0, 0, 0, 0, 0,
76 	 0, 0, 0, 0, 0, 0, 0, 0,
77 	 0, 0, 0, 0, 0, 0, 0, 0,
78 	 0, 0, 0, 0, 0, 0, 0, 0,
79 	 0, 0, 0, 0, 0, 0, 0, 0,
80 	 0, 0, 0, 0, 0, 0, 0, 0,
81 	 0, 0, 0, 0, 0, 0, 0, 0,
82 	 0, 0, 0, 0, 0, 0, 0, 0,
83 	 0x38, 0x38, 0x38, 0x10, 0, 0x38, 0x38, 0,
84 	 0xee, 0xee, 0x44, 0, 0, 0, 0, 0,
85 	 0x28, 0x28, 0xfe, 0x28, 0xfe, 0x28, 0x28, 0,
86 	 0x7c, 0x92, 0x90, 0x7c, 0x12, 0x92, 0x7c, 0,
87 	 0xe2, 0xa4, 0xe8, 0x10, 0x2e, 0x4a, 0x8e, 0,
88 	 0x30, 0x48, 0x30, 0x70, 0x8a, 0x84, 0x72, 0,
89 	 0x38, 0x38, 0x10, 0x20, 0, 0, 0, 0,
90 	 0x18, 0x20, 0x40, 0x40, 0x40, 0x20, 0x18, 0,
91 	 0x30, 0x8, 0x4, 0x4, 0x4, 0x8, 0x30, 0,
92 	 0, 0x44, 0x28, 0xfe, 0x28, 0x44, 0, 0,
93 	 0, 0x10, 0x10, 0x7c, 0x10, 0x10, 0, 0,
94 	 0, 0, 0, 0x38, 0x38, 0x10, 0x20, 0,
95 	 0, 0, 0, 0x7c, 0, 0, 0, 0,
96 	 0, 0, 0, 0, 0x38, 0x38, 0x38, 0,
97 	 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0,
98 	 0x38, 0x44, 0x82, 0x82, 0x82, 0x44, 0x38, 0,
99 	 0x10, 0x30, 0x50, 0x10, 0x10, 0x10, 0x7c, 0,
100 	 0x7c, 0x82, 0x2, 0x7c, 0x80, 0x80, 0xfe, 0,
101 	 0x7c, 0x82, 0x2, 0x7c, 0x2, 0x82, 0x7c, 0,
102 	 0x80, 0x84, 0x84, 0x84, 0xfe, 0x4, 0x4, 0,
103 	 0xfe, 0x80, 0x80, 0xfc, 0x2, 0x82, 0x7c, 0,
104 	 0x7c, 0x82, 0x80, 0xfc, 0x82, 0x82, 0x7c, 0,
105 	 0xfe, 0x84, 0x8, 0x10, 0x20, 0x20, 0x20, 0,
106 	 0x7c, 0x82, 0x82, 0x7c, 0x82, 0x82, 0x7c, 0,
107 	 0x7c, 0x82, 0x82, 0x7e, 0x2, 0x82, 0x7c, 0,
108 	 0x10, 0x38, 0x10, 0, 0x10, 0x38, 0x10, 0,
109 	 0x38, 0x38, 0, 0x38, 0x38, 0x10, 0x20, 0,
110 	 0x8, 0x10, 0x20, 0x40, 0x20, 0x10, 0x8, 0,
111 	 0, 0, 0x7c, 0, 0x7c, 0, 0, 0,
112 	 0x20, 0x10, 0x8, 0x4, 0x8, 0x10, 0x20, 0,
113 	 0x7c, 0x82, 0x2, 0x1c, 0x10, 0, 0x10, 0,
114 	 0x7c, 0x82, 0xba, 0xba, 0xbc, 0x80, 0x7c, 0,
115 	 0x10, 0x28, 0x44, 0x82, 0xfe, 0x82, 0x82, 0,
116 	 0xfc, 0x82, 0x82, 0xfc, 0x82, 0x82, 0xfc, 0,
117 	 0x7c, 0x82, 0x80, 0x80, 0x80, 0x82, 0x7c, 0,
118 	 0xfc, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfc, 0,
119 	 0xfe, 0x80, 0x80, 0xf8, 0x80, 0x80, 0xfe, 0,
120 	 0xfe, 0x80, 0x80, 0xf8, 0x80, 0x80, 0x80, 0,
121 	 0x7c, 0x82, 0x80, 0x9e, 0x82, 0x82, 0x7c, 0,
122 	 0x82, 0x82, 0x82, 0xfe, 0x82, 0x82, 0x82, 0,
123 	 0x38, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0,
124 	 0x2, 0x2, 0x2, 0x2, 0x82, 0x82, 0x7c, 0,
125 	 0x84, 0x88, 0x90, 0xe0, 0x90, 0x88, 0x84, 0,
126 	 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xfe, 0,
127 	 0x82, 0xc6, 0xaa, 0x92, 0x82, 0x82, 0x82, 0,
128 	 0x82, 0xc2, 0xa2, 0x92, 0x8a, 0x86, 0x82, 0,
129 	 0xfe, 0x82, 0x82, 0x82, 0x82, 0x82, 0xfe, 0,
130 	 0xfc, 0x82, 0x82, 0xfc, 0x80, 0x80, 0x80, 0,
131 	 0x7c, 0x82, 0x82, 0x82, 0x8a, 0x84, 0x7a, 0,
132 	 0xfc, 0x82, 0x82, 0xfc, 0x88, 0x84, 0x82, 0,
133 	 0x7c, 0x82, 0x80, 0x7c, 0x2, 0x82, 0x7c, 0,
134 	 0xfe, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0,
135 	 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x7c, 0,
136 	 0x82, 0x82, 0x82, 0x82, 0x44, 0x28, 0x10, 0,
137 	 0x82, 0x92, 0x92, 0x92, 0x92, 0x92, 0x6c, 0,
138 	 0x82, 0x44, 0x28, 0x10, 0x28, 0x44, 0x82, 0,
139 	 0x82, 0x44, 0x28, 0x10, 0x10, 0x10, 0x10, 0,
140 	 0xfe, 0x4, 0x8, 0x10, 0x20, 0x40, 0xfe, 0,
141 	 0x7c, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7c, 0,
142 	 0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0,
143 	 0x7c, 0x4, 0x4, 0x4, 0x4, 0x4, 0x7c, 0,
144 	 0x10, 0x28, 0x44, 0, 0, 0, 0, 0,
145 	 0, 0, 0, 0, 0, 0, 0xfe, 0,
146 	 0x38, 0x38, 0x10, 0x8, 0, 0, 0, 0,
147 	 0, 0x18, 0x24, 0x42, 0x7e, 0x42, 0x42, 0,
148 	 0, 0x7c, 0x42, 0x7c, 0x42, 0x42, 0x7c, 0,
149 	 0, 0x3c, 0x42, 0x40, 0x40, 0x42, 0x3c, 0,
150 	 0, 0x7c, 0x42, 0x42, 0x42, 0x42, 0x7c, 0,
151 	 0, 0x7e, 0x40, 0x7c, 0x40, 0x40, 0x7e, 0,
152 	 0, 0x7e, 0x40, 0x7c, 0x40, 0x40, 0x40, 0,
153 	 0, 0x3c, 0x42, 0x40, 0x4e, 0x42, 0x3c, 0,
154 	 0, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0,
155 	 0, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0,
156 	 0, 0x2, 0x2, 0x2, 0x2, 0x42, 0x3c, 0,
157 	 0, 0x42, 0x44, 0x78, 0x48, 0x44, 0x42, 0,
158 	 0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x7e, 0,
159 	 0, 0x42, 0x66, 0x5a, 0x42, 0x42, 0x42, 0,
160 	 0, 0x42, 0x62, 0x52, 0x4a, 0x46, 0x42, 0,
161 	 0, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x3c, 0,
162 	 0, 0x7c, 0x42, 0x42, 0x7c, 0x40, 0x40, 0,
163 	 0, 0x3c, 0x42, 0x42, 0x4a, 0x44, 0x3a, 0,
164 	 0, 0x7c, 0x42, 0x42, 0x7c, 0x44, 0x42, 0,
165 	 0, 0x3c, 0x40, 0x3c, 0x2, 0x42, 0x3c, 0,
166 	 0, 0x3e, 0x8, 0x8, 0x8, 0x8, 0x8, 0,
167 	 0, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0,
168 	 0, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0,
169 	 0, 0x42, 0x42, 0x42, 0x5a, 0x66, 0x42, 0,
170 	 0, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0,
171 	 0, 0x22, 0x14, 0x8, 0x8, 0x8, 0x8, 0,
172 	 0, 0x7e, 0x4, 0x8, 0x10, 0x20, 0x7e, 0,
173 	 0x38, 0x40, 0x40, 0xc0, 0x40, 0x40, 0x38, 0,
174 	 0x10, 0x10, 0x10, 0, 0x10, 0x10, 0x10, 0,
175 	 0x38, 0x4, 0x4, 0x6, 0x4, 0x4, 0x38, 0,
176 	 0x60, 0x92, 0xc, 0, 0, 0, 0, 0,
177 	 0, 0, 0, 0, 0, 0, 0, 0,
178 };
179 
banner(const char * string,const char * delim,int width)180 static void banner(const char *string,const char *delim,int width)
181 {
182 	register unsigned mask;
183 	register int c,i,n,j = strlen(string);
184 	register const char *cp,*dp;
185 	register unsigned char* map;
186 
187 	map = ccmap(CC_NATIVE, CC_ASCII);
188 	if(j > width/8)
189 		error(ERROR_exit(1),"up to %d char%s per arg",width/8,(width/8)==1?"":"s");
190 	for(i=0; i < CHAR_HEIGHT; i++)
191 	{
192 		dp = delim;
193 		for (n = 0, cp = string; c = ccmapchr(map, *cp++) & 0x07f; dp++)
194 		{
195 			if(*dp==0)
196 				dp = delim;
197 			if((mask = bandata[c][i])==0)
198 			{
199 				n += 8;
200 				continue;
201 			}
202 			for(j=0x80; j>0; j >>=1)
203 			{
204 				if(mask&j)
205 				{
206 					if(n)
207 					{
208 						sfnputc(sfstdout,' ',n);
209 						n = 0;
210 					}
211 					sfputc(sfstdout,*dp);
212 				}
213 				else
214 					n++;
215 			}
216 		}
217 		sfputc(sfstdout,'\n');
218 	}
219 }
220 
221 int
main(int argc,char * argv[])222 main(int argc, char *argv[])
223 {
224 	register int n;
225 	register char *cp;
226 	char *delim  = "#";
227 	int width = 80;
228 
229 	NoP(argc);
230 	error_info.id = "banner";
231 	while (n = optget(argv, usage)) switch (n)
232 	{
233 	case 'd':
234 		delim = opt_info.arg;
235 		break;
236 	case 'w':
237 		width = opt_info.num;
238 		break;
239 	case ':':
240 		error(2, "%s", opt_info.arg);
241 		break;
242 	case '?':
243 		error(ERROR_usage(2), "%s", opt_info.arg);
244 		break;
245 	}
246 	argv += opt_info.index;
247 	if(error_info.errors || !*argv)
248 		error(ERROR_usage(2), "%s", optusage((char*)0));
249 	sfset(sfstdout,SF_LINE,0);
250 	while(cp = *argv++)
251 		banner(cp,delim,width);
252 	exit(0);
253 }
254