#include <vis.h>
int unvis(char *cp, int c,
int *astate, int flag);
int strunvis(char *dst,
const char *src);
int strnunvis(char *dst, size_t dlen, const char *src);
int strunvisx(char *dst, const char *src, int flag);
int strnunvisx(char *dst, size_t dlen, const char *src, int flag);
The unvis(), strunvis() and strunvisx()
functions are used to decode a visual representation of
characters, as produced by the vis(),
strvis() and strvisx() functions,
back into the original form.
The unvis() function is called with successive characters
in c until a valid sequence is recognized, at which time the decoded
character is available at the specified pointer.
The strunvis() function decodes the characters at the
specified source into the destination buffer.
The strunvis() function
simply copies the source to the destination, decoding any escape
sequences along the way, and returns the number of characters
placed into the destination buffer, or -1 if an invalid escape
sequence was detected. The size of the destination buffer should
be equal to the size of the source buffer (that is, no expansion
takes place during decoding).
The strunvisx() function does the same as the strunvis() function, but it
allows you to add a flag that specifies the style the string src is
encoded with. Currently, the supported flags are: VIS_HTTPSTYLE and
VIS_MIMESTYLE.
The unvis() function
implements a state machine that can be used to decode an
arbitrary stream of bytes. All state associated with the bytes
being decoded is stored outside the unvis() function
(that is, a pointer to the state is passed in), so calls decoding different
streams can be freely intermixed. To start decoding a stream of
bytes, first initialize an integer to zero. Call unvis()
with each successive, byte, along with a pointer to this integer,
and a pointer to the destination character. The unvis()
function has several return codes that must be handled properly.
They are:
-
0
-
Another character is necessary; nothing has been recognized yet.
-
UNVIS_VALID
-
A valid character has been recognized and is available
at the specified location.
-
UNVIS_VALIDPUSH
-
A valid character has been recognized and is available at the
specified location; however, the character currently passed in should be
passed in again.
-
UNVIS_NOCHAR
-
A valid sequence was detected, but no character was produced. This return
code is necessary to indicate a logical break between characters.
-
UNVIS_SYNBAD
-
An invalid escape sequence was detected, or the decoder is in an unknown
state. The decoder is placed into the starting state.
When all bytes in the stream have been processed, call
unvis() one more time with the
flag set to UNVIS_END to extract any remaining character (the
character passed in is ignored).
The flag argument is also used to specify the encoding style of the
source. If set to VIS_HTTPSTYLE or VIS_HTTP1808, unvis() will decode URI
strings as specified in RFC 1808. If set to VIS_HTTP1866, unvis() will
decode entity references and numeric character references as specified in
RFC 1866. If set to VIS_MIMESTYLE, unvis() will decode MIME Quoted-
Printable strings as specified in RFC 2045. If set to VIS_NOESCAPE,
unvis() will not decode `\' quoted characters.
The following code fragment
illustrates a proper use of unvis():
int state = 0;
char out;
while ((ch = getchar()) != EOF) {
again:
switch (unvis(&out, ch, &state, 0)) {
case 0:
case UNVIS_NOCHAR:
break;
case UNVIS_VALID:
putchar(out);
break;
case UNVIS_VALIDPUSH:
putchar(out);
goto again;
case UNVIS_SYNBAD:
fprintf(stderr, "bad sequence!\n");
exit(1);
}
}
if (unvis(&out, (char)0, &state, UNVIS_END) == UNVIS_VALID)
putchar(out);
- cp
-
Pointer to stored
character.
- c
-
Character to parse for
conversion
- astate
-
Pointer to location in
which state is stored
- flag
-
Should be 0 until the end
of the input stream, at which time a final call should be
made with flag set to UNVIS_END
- dst
-
Destination buffer for
decoded characters.
- dlen
-
Size in characters of dst buffer.
- src
-
Buffer of characters to be
converted.
The unvis() function
returns one of the state flags described above. The strunvis()
function returns the number of characters stored to the
destination buffer, or -1 on error.
On error, the functions strunvis(), strnunvis(), strunvisx(), and strnunvisx() will return -1 on error and set errno to:
- EINVAL
-
An invalid escape sequence was detected, or the decoder is in an unknown state.
In addition the functions strnunvis() and strnunvisx() will can also set
errno on error to:
- ENOSPC
-
Not enough space to perform the conversion.
The unvis() function first appeared in 4.4BSD. The strnunvis() and
strnunvisx() functions appeared in NetBSD 6.0.
MT-Safe.
None.
PTC MKS Toolkit for Professional Developers
PTC MKS Toolkit for Professional Developers 64-Bit Edition
PTC MKS Toolkit for Enterprise Developers
PTC MKS Toolkit for Enterprise Developers 64-Bit Edition
- Functions:
- strvis(), strvisx(), vis()
PTC MKS Toolkit 10.5 Documentation Build 40.