route: ensure RTM_IFINFO is sent first when bring interface down/up
[dragonfly.git] / games / ppt / ppt.c
1 /*-
2  * Copyright (c) 1988, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#) Copyright (c) 1988, 1993 The Regents of the University of California.  All rights reserved.
30  * @(#)ppt.c    8.1 (Berkeley) 5/31/93
31  * $NetBSD: ppt.c,v 1.4 1995/03/23 08:35:40 cgd Exp $
32  * $OpenBSD: ppt.c,v 1.17 2016/03/07 12:07:56 mestre Exp $
33  */
34
35 #include <err.h>
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include <string.h>
39 #include <unistd.h>
40 #include <vis.h>
41
42
43 #define EDGE    "___________"
44
45 static void     usage(void);
46 static void     putppt(int);
47 static int      getppt(const char *buf);
48
49 void
50 usage(void)
51 {
52         fprintf(stderr, "usage: %s [string ...]\n", getprogname());
53         fprintf(stderr, "usage: %s -d [-b]\n", getprogname());
54         exit(1);
55 }
56
57 int
58 main(int argc, char **argv)
59 {
60         char *p, buf[132];
61         int c, start, seenl, dflag, bflag;
62
63         /* revoke setgid privileges */
64         setgid(getgid());
65
66         dflag = bflag = 0;
67         while ((c = getopt(argc, argv, "bdh")) != -1)
68                 switch(c) {
69                 case 'd':
70                         dflag = 1;
71                         break;
72                 case 'b':
73                         bflag = 1;
74                         break;
75                 case 'h':
76                 default:
77                         usage();
78                 }
79         if (bflag && !dflag)
80                 usage();
81         argc -= optind;
82         argv += optind;
83
84         if (dflag) {
85                 if (argc > 0)
86                         usage();
87
88                 seenl = start = 0;
89                 while (fgets(buf, sizeof(buf), stdin) != NULL) {
90                         c = getppt(buf);
91                         if (c == -2)
92                                 continue;
93                         if (c == -1) {
94                                 if (start)
95                                         /* lost sync */
96                                         putchar('x');
97                                 continue;
98                         }
99                         start = 1;
100                         if (bflag)
101                                 putchar(c);
102                         else {
103                                 char vbuf[5];
104                                 vis(vbuf, c, VIS_NOSLASH, 0);
105                                 fputs(vbuf, stdout);
106                         }
107                         seenl = (c == '\n');
108                 }
109                 if (!feof(stdin))
110                         err(1, "fgets");
111                 if (!seenl && !bflag)
112                         putchar('\n');
113         } else {
114                 puts(EDGE);
115                 if (argc > 0)
116                         while ((p = *argv++)) {
117                                 for (; *p != '\0'; ++p)
118                                         putppt((int)*p);
119                                 if (*argv)
120                                         putppt((int)' ');
121                         }
122                 else while ((c = getchar()) != EOF)
123                         putppt(c);
124                 puts(EDGE);
125         }
126         return 0;
127 }
128
129 void
130 putppt(int c)
131 {
132         int i;
133
134         putchar('|');
135         for (i = 7; i >= 0; i--) {
136                 if (i == 2)
137                         putchar('.');   /* feed hole */
138                 if ((c & (1 << i)) != 0)
139                         putchar('o');
140                 else
141                         putchar(' ');
142         }
143         putchar('|');
144         putchar('\n');
145 }
146
147 int
148 getppt(const char *buf)
149 {
150         int c;
151
152         /* Demand left-aligned paper tape, but allow comments to the right */
153         if (strncmp(buf, EDGE, strlen(EDGE)) == 0)
154             return (-2);
155         if (strlen(buf) < 12 || buf[0] != '|' || buf[10] != '|' ||
156             buf[6] != '.' || strspn(buf, "| o.") < 11)
157                 return (-1);
158
159         c = 0;
160         if (buf[1] != ' ')
161                 c |= 0200;
162         if (buf[2] != ' ')
163                 c |= 0100;
164         if (buf[3] != ' ')
165                 c |= 0040;
166         if (buf[4] != ' ')
167                 c |= 0020;
168         if (buf[5] != ' ')
169                 c |= 0010;
170         if (buf[7] != ' ')
171                 c |= 0004;
172         if (buf[8] != ' ')
173                 c |= 0002;
174         if (buf[9] != ' ')
175                 c |= 0001;
176
177         return (c);
178 }