]> git.saurik.com Git - apple/libc.git/blame - gen/FreeBSD/unvis.3
Libc-498.1.5.tar.gz
[apple/libc.git] / gen / FreeBSD / unvis.3
CommitLineData
5b2abdfb
A
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
3d9156a7 33.\" $FreeBSD: src/lib/libc/gen/unvis.3,v 1.17 2004/07/03 22:30:08 ru Exp $
5b2abdfb
A
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
3d9156a7
A
63the original form.
64Unvis is called with successive characters in
9385eb3d 65.Fa c
5b2abdfb
A
66until a valid
67sequence is recognized, at which time the decoded character is
68available at the character pointed to by
9385eb3d 69.Fa cp .
5b2abdfb
A
70Strunvis decodes the
71characters pointed to by
9385eb3d 72.Fa src
5b2abdfb 73into the buffer pointed to by
9385eb3d 74.Fa dst .
5b2abdfb
A
75.Pp
76The
77.Fn strunvis
78function
79simply copies
9385eb3d 80.Fa src
5b2abdfb 81to
9385eb3d 82.Fa dst ,
5b2abdfb
A
83decoding any escape sequences along the way,
84and returns the number of characters placed into
9385eb3d 85.Fa dst ,
5b2abdfb 86or \-1 if an
3d9156a7
A
87invalid escape sequence was detected.
88The size of
9385eb3d 89.Fa dst
5b2abdfb
A
90should be
91equal to the size of
9385eb3d 92.Fa src
5b2abdfb
A
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
9385eb3d 102.Fa src
5b2abdfb
A
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
3d9156a7
A
111stream of bytes.
112All state associated with the bytes being decoded
5b2abdfb
A
113is stored outside the
114.Fn unvis
115function (that is, a pointer to the state is passed in), so
3d9156a7
A
116calls decoding different streams can be freely intermixed.
117To
5b2abdfb 118start decoding a stream of bytes, first initialize an integer
3d9156a7
A
119to zero.
120Call
5b2abdfb
A
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
3d9156a7
A
127has several return codes that must be handled properly.
128They are:
5b2abdfb
A
129.Bl -tag -width UNVIS_VALIDPUSH
130.It Li \&0 (zero)
131Another character is necessary; nothing has been recognized yet.
3d9156a7 132.It Dv UNVIS_VALID
5b2abdfb
A
133A valid character has been recognized and is available at the location
134pointed to by cp.
3d9156a7 135.It Dv UNVIS_VALIDPUSH
5b2abdfb
A
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.
3d9156a7
A
139.It Dv UNVIS_NOCHAR
140A valid sequence was detected, but no character was produced.
141This
5b2abdfb 142return code is necessary to indicate a logical break between characters.
3d9156a7 143.It Dv UNVIS_SYNBAD
5b2abdfb 144An invalid escape sequence was detected, or the decoder is in an
3d9156a7
A
145unknown state.
146The decoder is placed into the starting state.
5b2abdfb
A
147.El
148.Pp
149When all bytes in the stream have been processed, call
150.Fn unvis
151one more time with
9385eb3d 152.Fa flag
5b2abdfb
A
153set to
154.Dv UNVIS_END
155to extract any remaining character (the character passed in is ignored).
156.Pp
157The
9385eb3d 158.Fa flag
5b2abdfb
A
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 .