1 /* $NetBSD: banner.c,v 1.2 1995/04/09 06:00:15 cgd 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 #ifndef lint 55 static char copyright[] = 56 "@(#) Copyright (c) 1983, 1993\n\ 57 The Regents of the University of California. All rights reserved.\n"; 58 #endif /* not lint */ 59 60 #ifndef lint 61 #if 0 62 static char sccsid[] = "@(#)printjob.c 8.2 (Berkeley) 4/16/94"; 63 #else 64 static char rcsid[] = "$NetBSD: banner.c,v 1.2 1995/04/09 06:00:15 cgd Exp $"; 65 #endif 66 #endif /* not lint */ 67 68 #include <stdio.h> 69 70 #include "banner.h" 71 72 static long PW = LINELEN; 73 74 /* the char gen code below is lifted from lpd */ 75 76 static char * 77 scnline(key, p, c) 78 register int key; 79 register char *p; 80 int c; 81 { 82 register scnwidth; 83 84 /* 85 * <sjg> lpd makes chars out of the letter in question. 86 * the results are somewhat mixed. Sticking to '#' as 87 * banner(1) does is more consistent. 88 */ 89 #ifndef NOHASH_ONLY 90 c = '#'; 91 #endif 92 93 for (scnwidth = WIDTH; --scnwidth;) { 94 key <<= 1; 95 *p++ = key & 0200 ? c : BACKGND; 96 } 97 return (p); 98 } 99 100 #define TRC(q) (((q)-' ')&0177) 101 102 103 static int 104 dropit(c) 105 int c; 106 { 107 switch(c) { 108 109 case TRC('_'): 110 case TRC(';'): 111 case TRC(','): 112 case TRC('g'): 113 case TRC('j'): 114 case TRC('p'): 115 case TRC('q'): 116 case TRC('y'): 117 return (DROP); 118 119 default: 120 return (0); 121 } 122 } 123 124 static void 125 scan_out(scfd, scsp, dlm) 126 int scfd, dlm; 127 char *scsp; 128 { 129 register char *strp; 130 register nchrs, j; 131 char outbuf[LINELEN+1], *sp, c, cc; 132 int d, scnhgt; 133 extern char scnkey[][HEIGHT]; /* in lpdchar.c */ 134 135 for (scnhgt = 0; scnhgt++ < HEIGHT+DROP; ) { 136 strp = &outbuf[0]; 137 sp = scsp; 138 for (nchrs = 0; ; ) { 139 d = dropit(c = TRC(cc = *sp++)); 140 if ((!d && scnhgt > HEIGHT) || (scnhgt <= DROP && d)) 141 for (j = WIDTH; --j;) 142 *strp++ = BACKGND; 143 else 144 strp = scnline(scnkey[c][scnhgt-1-d], strp, cc); 145 if (*sp == dlm || *sp == '\0' || nchrs++ >= PW/(WIDTH+1)-1) 146 break; 147 *strp++ = BACKGND; 148 #ifdef LPD_CHSET /* <sjg> */ 149 *strp++ = BACKGND; 150 #endif 151 } 152 while (*--strp == BACKGND && strp >= outbuf) 153 ; 154 strp++; 155 *strp++ = '\n'; 156 (void) write(scfd, outbuf, strp-outbuf); 157 } 158 } 159 160 /* 161 * for each word, print up to 10 chars in big letters. 162 */ 163 int 164 main(argc, argv) 165 int argc; 166 char **argv; 167 { 168 char word[10+1]; /* strings limited to 10 chars */ 169 170 while (*++argv) { 171 (void)strncpy(word, *argv, sizeof (word) - 1); 172 word[sizeof (word) - 1] = '\0'; 173 scan_out(1, word, '\0'); 174 } 175 exit(0); 176 } 177