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