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