1 /* $NetBSD: banner.c,v 1.10 2003/03/13 20:49:11 he 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@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.10 2003/03/13 20:49:11 he Exp $"); 66 #endif 67 #endif /* not lint */ 68 69 #include <stdio.h> 70 #include <stdlib.h> 71 #include <string.h> 72 #include <unistd.h> 73 74 #include "banner.h" 75 76 static long PW = LINELEN; 77 /* 78 * <sjg> lpd makes chars out of the letter in question. 79 * the results are somewhat mixed. Sticking to '#' as 80 * banner(1) does is more consistent. 81 */ 82 static int ForeGnd = '#'; 83 static int BackGnd = ' '; 84 static int Drop = 0; /* 3 for the LPD font */ 85 86 static int dropit (int); 87 static void scan_out (int, char *, int); 88 static char *scnline (int, char *, int); 89 static void usage(void); 90 91 /* the char gen code below is lifted from lpd */ 92 93 static char * 94 scnline(int key, char *p, int c) 95 { 96 int scnwidth; 97 98 if (ForeGnd) 99 c = ForeGnd; 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(int c) 113 { 114 switch(c) { 115 116 case TRC('_'): 117 case TRC(';'): 118 case TRC(','): 119 case TRC('g'): 120 case TRC('j'): 121 case TRC('p'): 122 case TRC('q'): 123 case TRC('y'): 124 return (Drop); 125 126 default: 127 return (0); 128 } 129 } 130 131 static void 132 scan_out(int scfd, char *scsp, int dlm) 133 { 134 char *strp; 135 int nchrs, j; 136 char outbuf[LINELEN+1], *sp, c, cc; 137 int d, scnhgt; 138 139 for (scnhgt = 0; scnhgt++ < HEIGHT+Drop; ) { 140 strp = &outbuf[0]; 141 if (BackGnd != ' ') 142 *strp++ = BackGnd; 143 sp = scsp; 144 for (nchrs = 0; *sp != dlm && *sp != '\0'; ) { 145 cc = *sp++; 146 if(cc < ' ' || ((int)cc) >= 0x7f) 147 cc = ' '; 148 d = dropit(c = TRC(cc)); 149 if ((!d && scnhgt > HEIGHT) || (scnhgt <= Drop && d)) 150 for (j = WIDTH; --j;) 151 *strp++ = BackGnd; 152 else if (Drop == 0) 153 strp = scnline( 154 scnkey_def[(int)c][scnhgt-1-d], strp, cc); 155 else 156 strp = scnline( 157 scnkey_lpd[(int)c][scnhgt-1-d], strp, cc); 158 if (nchrs++ >= PW/(WIDTH+1)-1) 159 break; 160 *strp++ = BackGnd; 161 } 162 if (BackGnd != ' ') 163 *strp++ = BackGnd; 164 else { 165 while (*--strp == ' ' && strp >= outbuf) 166 ; 167 strp++; 168 } 169 *strp++ = '\n'; 170 (void) write(scfd, outbuf, strp-outbuf); 171 } 172 } 173 174 /* 175 * for each word, print up to 10 chars in big letters. 176 */ 177 int 178 main(int argc, char **argv) 179 { 180 char word[10+1]; /* strings limited to 10 chars */ 181 int c; 182 183 while ((c = getopt(argc, argv, "b:f:l")) != -1) { 184 switch (c) { 185 case 'f': 186 if (*optarg == '-') 187 ForeGnd = 0; 188 else 189 ForeGnd = *optarg; 190 break; 191 case 'b': 192 BackGnd = *optarg; 193 break; 194 case 'l': 195 Drop = 3; /* for LPD font */ 196 break; 197 default: 198 usage(); 199 } 200 } 201 202 for (; optind < argc; ++optind) { 203 (void)strlcpy(word, argv[optind], sizeof (word)); 204 scan_out(STDOUT_FILENO, word, '\0'); 205 } 206 exit(0); 207 } 208 209 void 210 usage(void) 211 { 212 fprintf(stderr, "usage: %s [-f fgchar] [-b bgchar] [-l] message...\n", 213 getprogname()); 214 exit(1); 215 } 216