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