/* $OpenBSD: banner.c,v 1.8 2003/06/10 22:20:44 deraadt Exp $ */ /* $NetBSD: banner.c,v 1.2 1995/04/09 06:00:15 cgd Exp $ */ /* * Changes for banner(1) * * @(#)Copyright (c) 1995, Simon J. Gerraty. * * This is free software. It comes with NO WARRANTY. * Permission to use, modify and distribute this source code * is granted subject to the following conditions. * 1/ that the above copyright notice and this notice * are preserved in all copies and that due credit be given * to the author. * 2/ that any changes to this code are clearly commented * as such so that the author does not get blamed for bugs * other than his own. * * Please send copies of changes and bug-fixes to: * sjg@zen.void.oz.au */ /* * Copyright (c) 1983, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef lint static const char copyright[] = "@(#) Copyright (c) 1983, 1993\n\ The Regents of the University of California. All rights reserved.\n"; #if 0 static char sccsid[] = "@(#)printjob.c 8.2 (Berkeley) 4/16/94"; #else static const char rcsid[] = "$OpenBSD: banner.c,v 1.8 2003/06/10 22:20:44 deraadt Exp $"; #endif #endif /* not lint */ #include #include #include #include #include "banner.h" static long PW = LINELEN; /* the char gen code below is lifted from lpd */ static char * scnline(int key, char *p, int c) { int scnwidth; /* * lpd makes chars out of the letter in question. * the results are somewhat mixed. Sticking to '#' as * banner(1) does is more consistent. */ #ifndef NOHASH_ONLY c = '#'; #endif for (scnwidth = WIDTH; --scnwidth;) { key <<= 1; *p++ = key & 0200 ? c : BACKGND; } return (p); } #define TRC(q) (((q)-' ')&0177) static int dropit(int c) { switch(c) { case TRC('_'): case TRC(';'): case TRC(','): case TRC('g'): case TRC('j'): case TRC('p'): case TRC('q'): case TRC('y'): return (DROP); default: return (0); } } static void scan_out(int scfd, char *scsp, int dlm) { char *strp; int nchrs, j; char outbuf[LINELEN+1], *sp, c, cc; int d, scnhgt; extern char scnkey[][HEIGHT]; /* in lpdchar.c */ for (scnhgt = 0; scnhgt++ < HEIGHT+DROP; ) { strp = &outbuf[0]; sp = scsp; for (nchrs = 0; *sp != dlm && *sp != '\0'; ) { cc = *sp++; if ((unsigned char)cc < ' ' || (unsigned char)cc > 0x7f) cc = INVALID; c = TRC(cc); d = dropit(c); if ((!d && scnhgt > HEIGHT) || (scnhgt <= DROP && d)) for (j = WIDTH; --j;) *strp++ = BACKGND; else strp = scnline(scnkey[(int)c][scnhgt-1-d], strp, cc); if (nchrs++ >= PW/(WIDTH+1)-1) break; *strp++ = BACKGND; #ifdef LPD_CHSET /* */ *strp++ = BACKGND; #endif } while (*--strp == BACKGND && strp >= outbuf) ; strp++; *strp++ = '\n'; (void) write(scfd, outbuf, strp-outbuf); } } /* * for each word, print up to 10 chars in big letters. */ int main(int argc, char *argv[]) { char word[10+1]; /* strings limited to 10 chars */ while (*++argv) { (void)strlcpy(word, *argv, sizeof (word)); scan_out(1, word, '\0'); } exit(0); }