Annotation of src/usr.bin/tset/wrterm.c, Revision 1.2
1.2 ! deraadt 1: /* $OpenBSD: wrterm.c,v 1.3 1994/12/07 05:08:16 jtc Exp $ */
1.1 deraadt 2: /* $NetBSD: wrterm.c,v 1.3 1994/12/07 05:08:16 jtc Exp $ */
3:
4: /*-
5: * Copyright (c) 1991, 1993
6: * The Regents of the University of California. All rights reserved.
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: #if 0
39: static char sccsid[] = "@(#)wrterm.c 8.1 (Berkeley) 6/9/93";
40: #endif
1.2 ! deraadt 41: static char rcsid[] = "$OpenBSD: wrterm.c,v 1.3 1994/12/07 05:08:16 jtc Exp $";
1.1 deraadt 42: #endif /* not lint */
43:
44: #include <sys/types.h>
45: #include <stdio.h>
46: #include <ctype.h>
47: #include <string.h>
48: #include "extern.h"
49:
50: /*
51: * Output termcap entry to stdout, quoting characters that would give the
52: * shell problems and omitting empty fields.
53: */
54: void
55: wrtermcap(bp)
56: char *bp;
57: {
58: register int ch;
59: register char *p;
60: char *t, *sep;
61:
62: /* Find the end of the terminal names. */
63: if ((t = index(bp, ':')) == NULL)
64: err("termcap names not colon terminated");
65: *t++ = '\0';
66:
67: /* Output terminal names that don't have whitespace. */
68: sep = "";
69: while ((p = strsep(&bp, "|")) != NULL)
70: if (*p != '\0' && strpbrk(p, " \t") == NULL) {
71: (void)printf("%s%s", sep, p);
72: sep = "|";
73: }
74: (void)putchar(':');
75:
76: /*
77: * Output fields, transforming any dangerous characters. Skip
78: * empty fields or fields containing only whitespace.
79: */
80: while ((p = strsep(&t, ":")) != NULL) {
81: while ((ch = *p) != '\0' && isspace(ch))
82: ++p;
83: if (ch == '\0')
84: continue;
85: while ((ch = *p++) != '\0')
86: switch(ch) {
87: case '\033':
88: (void)printf("\\E");
89: case ' ': /* No spaces. */
90: (void)printf("\\040");
91: break;
92: case '!': /* No csh history chars. */
93: (void)printf("\\041");
94: break;
95: case ',': /* No csh history chars. */
96: (void)printf("\\054");
97: break;
98: case '"': /* No quotes. */
99: (void)printf("\\042");
100: break;
101: case '\'': /* No quotes. */
102: (void)printf("\\047");
103: break;
104: case '`': /* No quotes. */
105: (void)printf("\\140");
106: break;
107: case '\\': /* Anything following is OK. */
108: case '^':
109: (void)putchar(ch);
110: if ((ch = *p++) == '\0')
111: break;
112: /* FALLTHROUGH */
113: default:
114: (void)putchar(ch);
115: }
116: (void)putchar(':');
117: }
118: }