1 /*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)wrterm.c 8.1 (Berkeley) 06/09/93";
10 #endif /* not lint */
11
12 #include <sys/types.h>
13 #include <stdio.h>
14 #include <ctype.h>
15 #include <string.h>
16 #include "extern.h"
17
18 /*
19 * Output termcap entry to stdout, quoting characters that would give the
20 * shell problems and omitting empty fields.
21 */
22 void
wrtermcap(bp)23 wrtermcap(bp)
24 char *bp;
25 {
26 register int ch;
27 register char *p;
28 char *t, *sep;
29
30 /* Find the end of the terminal names. */
31 if ((t = index(bp, ':')) == NULL)
32 err("termcap names not colon terminated");
33 *t++ = '\0';
34
35 /* Output terminal names that don't have whitespace. */
36 sep = "";
37 while ((p = strsep(&bp, "|")) != NULL)
38 if (*p != '\0' && strpbrk(p, " \t") == NULL) {
39 (void)printf("%s%s", sep, p);
40 sep = "|";
41 }
42 (void)putchar(':');
43
44 /*
45 * Output fields, transforming any dangerous characters. Skip
46 * empty fields or fields containing only whitespace.
47 */
48 while ((p = strsep(&t, ":")) != NULL) {
49 while ((ch = *p) != '\0' && isspace(ch))
50 ++p;
51 if (ch == '\0')
52 continue;
53 while ((ch = *p++) != '\0')
54 switch(ch) {
55 case '\033':
56 (void)printf("\\E");
57 case ' ': /* No spaces. */
58 (void)printf("\\040");
59 break;
60 case '!': /* No csh history chars. */
61 (void)printf("\\041");
62 break;
63 case ',': /* No csh history chars. */
64 (void)printf("\\054");
65 break;
66 case '"': /* No quotes. */
67 (void)printf("\\042");
68 break;
69 case '\'': /* No quotes. */
70 (void)printf("\\047");
71 break;
72 case '`': /* No quotes. */
73 (void)printf("\\140");
74 break;
75 case '\\': /* Anything following is OK. */
76 case '^':
77 (void)putchar(ch);
78 if ((ch = *p++) == '\0')
79 break;
80 /* FALLTHROUGH */
81 default:
82 (void)putchar(ch);
83 }
84 (void)putchar(':');
85 }
86 }
87