]> git.saurik.com Git - apple/libc.git/blame_incremental - gen/FreeBSD/unvis.3
Libc-498.1.5.tar.gz
[apple/libc.git] / gen / FreeBSD / unvis.3
... / ...
CommitLineData
1.\" Copyright (c) 1989, 1991, 1993
2.\" The Regents of the University of California. All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\" notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\" notice, this list of conditions and the following disclaimer in the
11.\" documentation and/or other materials provided with the distribution.
12.\" 3. All advertising materials mentioning features or use of this software
13.\" must display the following acknowledgement:
14.\" This product includes software developed by the University of
15.\" California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\" may be used to endorse or promote products derived from this software
18.\" without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\" @(#)unvis.3 8.2 (Berkeley) 12/11/93
33.\" $FreeBSD: src/lib/libc/gen/unvis.3,v 1.17 2004/07/03 22:30:08 ru Exp $
34.\"
35.Dd December 11, 1993
36.Dt UNVIS 3
37.Os
38.Sh NAME
39.Nm unvis ,
40.Nm strunvis
41.Nd decode a visual representation of characters
42.Sh LIBRARY
43.Lb libc
44.Sh SYNOPSIS
45.In vis.h
46.Ft int
47.Fn unvis "char *cp" "int c" "int *astate" "int flag"
48.Ft int
49.Fn strunvis "char *dst" "const char *src"
50.Ft int
51.Fn strunvisx "char *dst" "const char *src" "int flag"
52.Sh DESCRIPTION
53The
54.Fn unvis ,
55.Fn strunvis
56and
57.Fn strunvisx
58functions
59are used to decode a visual representation of characters, as produced
60by the
61.Xr vis 3
62function, back into
63the original form.
64Unvis is called with successive characters in
65.Fa c
66until a valid
67sequence is recognized, at which time the decoded character is
68available at the character pointed to by
69.Fa cp .
70Strunvis decodes the
71characters pointed to by
72.Fa src
73into the buffer pointed to by
74.Fa dst .
75.Pp
76The
77.Fn strunvis
78function
79simply copies
80.Fa src
81to
82.Fa dst ,
83decoding any escape sequences along the way,
84and returns the number of characters placed into
85.Fa dst ,
86or \-1 if an
87invalid escape sequence was detected.
88The size of
89.Fa dst
90should be
91equal to the size of
92.Fa src
93(that is, no expansion takes place during
94decoding).
95.Pp
96The
97.Fn strunvisx
98function does the same as the
99.Fn strunvis
100function,
101but it allows you to add a flag that specifies the style the string
102.Fa src
103is encoded with.
104Currently, the only supported flag is
105.Dv VIS_HTTPSTYLE .
106.Pp
107The
108.Fn unvis
109function
110implements a state machine that can be used to decode an arbitrary
111stream of bytes.
112All state associated with the bytes being decoded
113is stored outside the
114.Fn unvis
115function (that is, a pointer to the state is passed in), so
116calls decoding different streams can be freely intermixed.
117To
118start decoding a stream of bytes, first initialize an integer
119to zero.
120Call
121.Fn unvis
122with each successive byte, along with a pointer
123to this integer, and a pointer to a destination character.
124The
125.Fn unvis
126function
127has several return codes that must be handled properly.
128They are:
129.Bl -tag -width UNVIS_VALIDPUSH
130.It Li \&0 (zero)
131Another character is necessary; nothing has been recognized yet.
132.It Dv UNVIS_VALID
133A valid character has been recognized and is available at the location
134pointed to by cp.
135.It Dv UNVIS_VALIDPUSH
136A valid character has been recognized and is available at the location
137pointed to by cp; however, the character currently passed in should
138be passed in again.
139.It Dv UNVIS_NOCHAR
140A valid sequence was detected, but no character was produced.
141This
142return code is necessary to indicate a logical break between characters.
143.It Dv UNVIS_SYNBAD
144An invalid escape sequence was detected, or the decoder is in an
145unknown state.
146The decoder is placed into the starting state.
147.El
148.Pp
149When all bytes in the stream have been processed, call
150.Fn unvis
151one more time with
152.Fa flag
153set to
154.Dv UNVIS_END
155to extract any remaining character (the character passed in is ignored).
156.Pp
157The
158.Fa flag
159argument is also used to specify the encoding style of the source.
160If set to
161.Dv VIS_HTTPSTYLE ,
162.Fn unvis
163will decode URI strings as specified in RFC 1808.
164.Pp
165The following code fragment illustrates a proper use of
166.Fn unvis .
167.Bd -literal -offset indent
168int state = 0;
169char out;
170
171while ((ch = getchar()) != EOF) {
172again:
173 switch(unvis(&out, ch, &state, 0)) {
174 case 0:
175 case UNVIS_NOCHAR:
176 break;
177 case UNVIS_VALID:
178 (void) putchar(out);
179 break;
180 case UNVIS_VALIDPUSH:
181 (void) putchar(out);
182 goto again;
183 case UNVIS_SYNBAD:
184 (void)fprintf(stderr, "bad sequence!\en");
185 exit(1);
186 }
187}
188if (unvis(&out, (char)0, &state, UNVIS_END) == UNVIS_VALID)
189 (void) putchar(out);
190.Ed
191.Sh SEE ALSO
192.Xr vis 1 ,
193.Xr vis 3
194.Rs
195.%A R. Fielding
196.%T Relative Uniform Resource Locators
197.%O RFC1808
198.Re
199.Sh HISTORY
200The
201.Fn unvis
202function
203first appeared in
204.Bx 4.4 .