add POSIX/IEEE contribution notice
[unix-history] / usr / src / bin / stty / cchar.c
CommitLineData
d8887343
KB
1/*-
2 * Copyright (c) 1991 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8#ifndef lint
3ac03562 9static char sccsid[] = "@(#)cchar.c 5.4 (Berkeley) %G%";
d8887343
KB
10#endif /* not lint */
11
12#include <sys/types.h>
d8887343 13#include <stddef.h>
14cc5c1c
KB
14#include <stdlib.h>
15#include <string.h>
d8887343 16#include "stty.h"
14cc5c1c 17#include "extern.h"
d8887343
KB
18
19/*
20 * Special control characters.
21 *
22 * Cchars1 are the standard names, cchars2 are the old aliases.
23 * The first are displayed, but both are recognized on the
24 * command line.
25 */
26struct cchar cchars1[] = {
27 "discard", VDISCARD, CDISCARD,
28 "dsusp", VDSUSP, CDSUSP,
29 "eof", VEOF, CEOF,
30 "eol", VEOL, CEOL,
31 "eol2", VEOL2, CEOL,
32 "erase", VERASE, CERASE,
33 "intr", VINTR, CINTR,
34 "kill", VKILL, CKILL,
35 "lnext", VLNEXT, CLNEXT,
36 "quit", VQUIT, CQUIT,
37 "reprint", VREPRINT, CREPRINT,
38 "start", VSTART, CSTART,
39 "status", VSTATUS, CSTATUS,
40 "stop", VSTOP, CSTOP,
41 "susp", VSUSP, CSUSP,
42 "werase", VWERASE, CWERASE,
3ac03562 43 NULL,
d8887343
KB
44};
45
46struct cchar cchars2[] = {
47 "brk", VEOL, CEOL,
48 "flush", VDISCARD, CDISCARD,
49 "rprnt", VREPRINT, CREPRINT,
50 "xoff", VSTOP, CSTOP,
51 "xon", VSTART, CSTART,
3ac03562 52 NULL,
d8887343 53};
14cc5c1c
KB
54
55csearch(argvp, ip)
56 char ***argvp;
57 struct info *ip;
58{
59 extern char *usage;
60 register struct cchar *cp;
61 struct cchar tmp;
62 char *arg, *name;
63 static int c_cchar __P((const void *, const void *));
64
65 name = **argvp;
66
67 tmp.name = name;
68 if (!(cp = (struct cchar *)bsearch(&tmp, cchars1,
3ac03562 69 sizeof(cchars1)/sizeof(struct cchar) - 1, sizeof(struct cchar),
14cc5c1c 70 c_cchar)) && !(cp = (struct cchar *)bsearch(&tmp, cchars1,
3ac03562 71 sizeof(cchars1)/sizeof(struct cchar) - 1, sizeof(struct cchar),
14cc5c1c
KB
72 c_cchar)))
73 return(0);
74
75 arg = *++*argvp;
76 if (!arg)
77 err("option requires an argument -- %s\n%s", name, usage);
78
79#define CHK(s) (*name == s[0] && !strcmp(name, s))
80 if (CHK("undef") || CHK("<undef>"))
81 ip->t.c_cc[cp->sub] = _POSIX_VDISABLE;
82 else if (arg[0] == '^')
83 ip->t.c_cc[cp->sub] = (arg[1] == '?') ? 0177 :
84 (arg[1] == '-') ? _POSIX_VDISABLE : arg[1] & 037;
85 else
86 ip->t.c_cc[cp->sub] = arg[0];
87 ip->set = 1;
88 return(1);
89}
90
91static
92c_cchar(a, b)
93 const void *a, *b;
94{
95 return(strcmp(((struct cchar *)a)->name, ((struct cchar *)b)->name));
96}