xref: /openbsd-src/games/ppt/ppt.c (revision 6fa5e1da3490487b9d3a614457ba0b7c041eb1ac)
1*6fa5e1daSmestre /*	$OpenBSD: ppt.c,v 1.17 2016/03/07 12:07:56 mestre Exp $	*/
2df930be7Sderaadt /*	$NetBSD: ppt.c,v 1.4 1995/03/23 08:35:40 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * Copyright (c) 1988, 1993
6df930be7Sderaadt  *	The Regents of the University of California.  All rights reserved.
7df930be7Sderaadt  *
8df930be7Sderaadt  * Redistribution and use in source and binary forms, with or without
9df930be7Sderaadt  * modification, are permitted provided that the following conditions
10df930be7Sderaadt  * are met:
11df930be7Sderaadt  * 1. Redistributions of source code must retain the above copyright
12df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer.
13df930be7Sderaadt  * 2. Redistributions in binary form must reproduce the above copyright
14df930be7Sderaadt  *    notice, this list of conditions and the following disclaimer in the
15df930be7Sderaadt  *    documentation and/or other materials provided with the distribution.
167a09557bSmillert  * 3. Neither the name of the University nor the names of its contributors
17df930be7Sderaadt  *    may be used to endorse or promote products derived from this software
18df930be7Sderaadt  *    without specific prior written permission.
19df930be7Sderaadt  *
20df930be7Sderaadt  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21df930be7Sderaadt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22df930be7Sderaadt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23df930be7Sderaadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24df930be7Sderaadt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25df930be7Sderaadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26df930be7Sderaadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27df930be7Sderaadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28df930be7Sderaadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29df930be7Sderaadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30df930be7Sderaadt  * SUCH DAMAGE.
31df930be7Sderaadt  */
32df930be7Sderaadt 
339db45b5dSmickey #include <err.h>
34df930be7Sderaadt #include <stdio.h>
3570ef01f6Sdavid #include <stdlib.h>
369db45b5dSmickey #include <string.h>
371ed0e75dSpjanzen #include <unistd.h>
389db45b5dSmickey #include <vis.h>
39df930be7Sderaadt 
409db45b5dSmickey 
419db45b5dSmickey #define	EDGE	"___________"
429db45b5dSmickey 
43f0628b46Smestre __dead void	usage(void);
449db45b5dSmickey void	putppt(int);
459db45b5dSmickey int	getppt(const char *buf);
469db45b5dSmickey 
479db45b5dSmickey void
usage(void)489db45b5dSmickey usage(void)
499db45b5dSmickey {
509db45b5dSmickey 	extern char *__progname;
510d300bcaSschwarze 	fprintf(stderr, "usage: %s [string ...]\n", __progname);
520d300bcaSschwarze 	fprintf(stderr, "usage: %s -d [-b]\n", __progname);
539db45b5dSmickey 	exit(1);
549db45b5dSmickey }
55df930be7Sderaadt 
561ed0e75dSpjanzen int
main(int argc,char ** argv)579db45b5dSmickey main(int argc, char **argv)
58df930be7Sderaadt {
599db45b5dSmickey 	char *p, buf[132];
609db45b5dSmickey 	int c, start, seenl, dflag, bflag;
61893fd100Sderaadt 
62673e924cSdoug 	if (pledge("stdio", NULL) == -1)
63673e924cSdoug 		err(1, "pledge");
64673e924cSdoug 
659db45b5dSmickey 	dflag = bflag = 0;
669db45b5dSmickey 	while ((c = getopt(argc, argv, "bdh")) != -1)
679db45b5dSmickey 		switch(c) {
689db45b5dSmickey 		case 'd':
699db45b5dSmickey 			dflag = 1;
709db45b5dSmickey 			break;
719db45b5dSmickey 		case 'b':
729db45b5dSmickey 			bflag = 1;
739db45b5dSmickey 			break;
74*6fa5e1daSmestre 		case 'h':
759db45b5dSmickey 		default:
769db45b5dSmickey 			usage();
779db45b5dSmickey 		}
789db45b5dSmickey 	if (bflag && !dflag)
799db45b5dSmickey 		usage();
809db45b5dSmickey 	argc -= optind;
819db45b5dSmickey 	argv += optind;
829db45b5dSmickey 
839db45b5dSmickey 	if (dflag) {
849db45b5dSmickey 		if (argc > 0)
859db45b5dSmickey 			usage();
869db45b5dSmickey 
879db45b5dSmickey 		seenl = start = 0;
889db45b5dSmickey 		while (fgets(buf, sizeof(buf), stdin) != NULL) {
899db45b5dSmickey 			c = getppt(buf);
909db45b5dSmickey 			if (c == -2)
919db45b5dSmickey 				continue;
929db45b5dSmickey 			if (c == -1) {
939db45b5dSmickey 				if (start)
949db45b5dSmickey 					/* lost sync */
959db45b5dSmickey 					putchar('x');
969db45b5dSmickey 				continue;
979db45b5dSmickey 			}
989db45b5dSmickey 			start = 1;
999db45b5dSmickey 			if (bflag)
1009db45b5dSmickey 				putchar(c);
1019db45b5dSmickey 			else {
1029db45b5dSmickey 				char vbuf[5];
1039db45b5dSmickey 				vis(vbuf, c, VIS_NOSLASH, 0);
1049db45b5dSmickey 				fputs(vbuf, stdout);
1059db45b5dSmickey 			}
1069db45b5dSmickey 			seenl = (c == '\n');
1079db45b5dSmickey 		}
1089db45b5dSmickey 		if (!feof(stdin))
1099db45b5dSmickey 			err(1, "fgets");
1109db45b5dSmickey 		if (!seenl && !bflag)
1119db45b5dSmickey 			putchar('\n');
1129db45b5dSmickey 	} else {
1139db45b5dSmickey 		(void) puts(EDGE);
1149db45b5dSmickey 		if (argc > 0)
1159db45b5dSmickey 			while ((p = *argv++)) {
116df930be7Sderaadt 				for (; *p; ++p)
117df930be7Sderaadt 					putppt((int)*p);
1189db45b5dSmickey 				if (*argv)
1190562672dSpjanzen 					putppt((int)' ');
1200562672dSpjanzen 			}
121df930be7Sderaadt 		else while ((c = getchar()) != EOF)
122df930be7Sderaadt 			putppt(c);
1239db45b5dSmickey 		(void) puts(EDGE);
1249db45b5dSmickey 	}
12517641e31Stb 	return 0;
126df930be7Sderaadt }
127df930be7Sderaadt 
1289db45b5dSmickey void
putppt(int c)1299db45b5dSmickey putppt(int c)
130df930be7Sderaadt {
131ef2c807aSpjanzen 	int i;
132df930be7Sderaadt 
133df930be7Sderaadt 	(void) putchar('|');
134df930be7Sderaadt 	for (i = 7; i >= 0; i--) {
135df930be7Sderaadt 		if (i == 2)
136df930be7Sderaadt 			(void) putchar('.');	/* feed hole */
137df930be7Sderaadt 		if ((c&(1<<i)) != 0)
138df930be7Sderaadt 			(void) putchar('o');
139df930be7Sderaadt 		else
140df930be7Sderaadt 			(void) putchar(' ');
141df930be7Sderaadt 	}
142df930be7Sderaadt 	(void) putchar('|');
143df930be7Sderaadt 	(void) putchar('\n');
144df930be7Sderaadt }
1459db45b5dSmickey 
1469db45b5dSmickey int
getppt(const char * buf)1479db45b5dSmickey getppt(const char *buf)
1489db45b5dSmickey {
1499db45b5dSmickey 	int c;
1509db45b5dSmickey 
1519db45b5dSmickey 	/* Demand left-aligned paper tape, but allow comments to the right */
1529db45b5dSmickey 	if (strncmp(buf, EDGE, strlen(EDGE)) == 0)
1539db45b5dSmickey 	    return (-2);
1549db45b5dSmickey 	if (strlen(buf) < 12 || buf[0] != '|' || buf[10] != '|' ||
1559db45b5dSmickey 	    buf[6] != '.' || strspn(buf, "| o.") < 11)
1569db45b5dSmickey 		return (-1);
1579db45b5dSmickey 
1589db45b5dSmickey 	c = 0;
1599db45b5dSmickey 	if (buf[1] != ' ')
1609db45b5dSmickey 		c |= 0200;
1619db45b5dSmickey 	if (buf[2] != ' ')
1629db45b5dSmickey 		c |= 0100;
1639db45b5dSmickey 	if (buf[3] != ' ')
1649db45b5dSmickey 		c |= 0040;
1659db45b5dSmickey 	if (buf[4] != ' ')
1669db45b5dSmickey 		c |= 0020;
1679db45b5dSmickey 	if (buf[5] != ' ')
1689db45b5dSmickey 		c |= 0010;
1699db45b5dSmickey 	if (buf[7] != ' ')
1709db45b5dSmickey 		c |= 0004;
1719db45b5dSmickey 	if (buf[8] != ' ')
1729db45b5dSmickey 		c |= 0002;
1739db45b5dSmickey 	if (buf[9] != ' ')
1749db45b5dSmickey 		c |= 0001;
1759db45b5dSmickey 
1769db45b5dSmickey 	return (c);
1779db45b5dSmickey }
178