home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / bcd / bcd.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-08  |  6.8 KB  |  200 lines

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * This code is derived from software contributed to Berkeley by
  6.  * Steve Hayman of the Indiana University Computer Science Dept..
  7.  *
  8.  * Redistribution and use in source and binary forms, with or without
  9.  * modification, are permitted provided that the following conditions
  10.  * are met:
  11.  * 1. Redistributions of source code must retain the above copyright
  12.  *    notice, this list of conditions and the following disclaimer.
  13.  * 2. Redistributions in binary form must reproduce the above copyright
  14.  *    notice, this list of conditions and the following disclaimer in the
  15.  *    documentation and/or other materials provided with the distribution.
  16.  * 3. All advertising materials mentioning features or use of this software
  17.  *    must display the following acknowledgement:
  18.  *    This product includes software developed by the University of
  19.  *    California, Berkeley and its contributors.
  20.  * 4. Neither the name of the University nor the names of its contributors
  21.  *    may be used to endorse or promote products derived from this software
  22.  *    without specific prior written permission.
  23.  *
  24.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  25.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  26.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  27.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  28.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  29.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  30.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  31.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  32.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  33.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  34.  * SUCH DAMAGE.
  35.  */
  36.  
  37. #ifndef lint
  38. char copyright[] =
  39. "@(#) Copyright (c) 1989 The Regents of the University of California.\n\
  40.  All rights reserved.\n";
  41. #endif /* not lint */
  42.  
  43. #ifndef lint
  44. static char sccsid[] = "@(#)bcd.c    4.4 (Berkeley) 6/1/90";
  45. #endif /* not lint */
  46.  
  47. /*
  48.  * bcd --
  49.  *
  50.  * Read one line of standard input and produce something that looks like a
  51.  * punch card.  An attempt to reimplement /usr/games/bcd.  All I looked at
  52.  * was the man page.
  53.  *
  54.  * I couldn't find a BCD table handy so I wrote a shell script to deduce what
  55.  * the patterns were that the old bcd was using for each possible 8-bit
  56.  * character.  These are the results -- the low order 12 bits represent the
  57.  * holes.  (A 1 bit is a hole.)  These may be wrong, but they match the old
  58.  * program!
  59.  *
  60.  * Steve Hayman
  61.  * sahayman@iuvax.cs.indiana.edu
  62.  * 1989 11 30
  63.  */
  64.  
  65. #include <sys/types.h>
  66. #include <stdio.h>
  67. #include <ctype.h>
  68.  
  69. u_short holes[256] = {
  70.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  71.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  72.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  73.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  74.     0x0,     0x206,      0x20a,   0x042,   0x442,   0x222,   0x800,   0x406,
  75.     0x812,     0x412,      0x422,   0xa00,   0x242,   0x400,   0x842,   0x300,
  76.     0x200,     0x100,      0x080,   0x040,   0x020,   0x010,   0x008,   0x004,
  77.     0x002,     0x001,      0x012,   0x40a,   0x80a,   0x212,   0x00a,   0x006,
  78.     0x022,     0x900,      0x880,   0x840,   0x820,   0x810,   0x808,   0x804,
  79.     0x802,     0x801,      0x500,   0x480,   0x440,   0x420,   0x410,   0x408,
  80.     0x404,     0x402,      0x402,   0x280,   0x240,   0x220,   0x210,   0x208,
  81.     0x204,     0x202,      0x201,   0x082,   0x822,   0x600,   0x282,   0x30f,
  82.     0x900,     0x880,      0x840,   0x820,   0x810,   0x808,   0x804,   0x802,
  83.     0x801,     0x500,      0x480,   0x440,   0x420,   0x410,   0x408,   0x404,
  84.     0x402,     0x402,      0x280,   0x240,   0x220,   0x210,   0x208,   0x204,
  85.     0x202,     0x201,      0x082,   0x806,   0x822,   0x600,   0x282,   0x0,
  86.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  87.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  88.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  89.     0x0,     0x0,      0x0,       0x0,        0x0,     0x0,     0x0,     0x0,
  90.     0x206,     0x20a,      0x042,   0x442,   0x222,   0x800,   0x406,   0x812,
  91.     0x412,     0x422,      0xa00,   0x242,   0x400,   0x842,   0x300,   0x200,
  92.     0x100,     0x080,      0x040,   0x020,   0x010,   0x008,   0x004,   0x002,
  93.     0x001,     0x012,      0x40a,   0x80a,   0x212,   0x00a,   0x006,   0x022,
  94.     0x900,     0x880,      0x840,   0x820,   0x810,   0x808,   0x804,   0x802,
  95.     0x801,     0x500,      0x480,   0x440,   0x420,   0x410,   0x408,   0x404,
  96.     0x402,     0x402,      0x280,   0x240,   0x220,   0x210,   0x208,   0x204,
  97.     0x202,     0x201,      0x082,   0x806,   0x822,   0x600,   0x282,   0x30f,
  98.     0x900,     0x880,      0x840,   0x820,   0x810,   0x808,   0x804,   0x802,
  99.     0x801,     0x500,      0x480,   0x440,   0x420,   0x410,   0x408,   0x404,
  100.     0x402,     0x402,      0x280,   0x240,   0x220,   0x210,   0x208,   0x204,
  101.     0x202,     0x201,      0x082,   0x806,   0x822,   0x600,   0x282,   0x0
  102. };
  103.  
  104. /*
  105.  * i'th bit of w.
  106.  */
  107. #define    bit(w,i)    ((w)&(1<<(i)))
  108.  
  109. main(argc, argv)
  110.     int argc;
  111.     char **argv;
  112. {
  113.     char cardline[80];
  114.  
  115.     /*
  116.      * The original bcd prompts with a "%" when reading from stdin,
  117.      * but this seems kind of silly.  So this one doesn't.
  118.      */
  119.  
  120.     if (argc > 1) {
  121.         while (--argc)
  122.             printcard(*++argv);
  123.     } else
  124.         while (fgets(cardline, sizeof(cardline), stdin))
  125.             printcard(cardline);
  126.     exit(0);
  127. }
  128.  
  129. #define    COLUMNS    48
  130.  
  131. printcard(str)
  132.     register char *str;
  133. {
  134.     static char rowchars[] = "   123456789";
  135.     register int i, row;
  136.     register char *p;
  137.     char *index();
  138.  
  139.     /* ruthlessly remove newlines and truncate at 48 characters. */
  140.     if ((p = index(str, '\n')))
  141.         *p = '\0';
  142.  
  143.     if (strlen(str) > COLUMNS)
  144.         str[COLUMNS] = '\0';
  145.  
  146.     /* make string upper case. */
  147.     for (p = str; *p; ++p)
  148.         if (isascii(*p) && islower(*p))
  149.             *p = toupper(*p);
  150.  
  151.      /* top of card */
  152.     putchar(' ');
  153.     for (i = 1; i <= COLUMNS; ++i)
  154.         putchar('_');
  155.     putchar('\n');
  156.  
  157.     /*
  158.      * line of text.  Leave a blank if the character doesn't have
  159.      * a hole pattern.
  160.      */
  161.     p = str;
  162.     putchar('/');
  163.     for (i = 1; *p; i++, p++)
  164.         if (holes[*p])
  165.             putchar(*p);
  166.         else
  167.             putchar(' ');
  168.     while (i++ <= COLUMNS)
  169.         putchar(' ');
  170.     putchar('|');
  171.     putchar('\n');
  172.  
  173.     /*
  174.      * 12 rows of potential holes; output a ']', which looks kind of
  175.      * like a hole, if the appropriate bit is set in the holes[] table.
  176.      * The original bcd output a '[', a backspace, five control A's,
  177.      * and then a ']'.  This seems a little excessive.
  178.      */
  179.     for (row = 0; row <= 11; ++row) {
  180.         putchar('|');
  181.         for (i = 0, p = str; *p; i++, p++) {
  182.             if (bit(holes[*p], 11 - row))
  183.                 putchar(']');
  184.             else
  185.                 putchar(rowchars[row]);
  186.         }
  187.         while (i++ < COLUMNS)
  188.             putchar(rowchars[row]);
  189.         putchar('|');
  190.         putchar('\n');
  191.     }
  192.  
  193.     /* bottom of card */
  194.     putchar('|');
  195.     for (i = 1; i <= COLUMNS; i++)
  196.         putchar('_');
  197.     putchar('|');
  198.     putchar('\n');
  199. }
  200.