4.3BSD-Reno/share/man/cat3/unvis.0
UNVIS(3) 1990 UNVIS(3)
NNAAMMEE
unvis, strunvis - decode a visual representation of charac-
ters
SSYYNNOOPPSSIISS
##iinncclluuddee <<vviiss..hh>>
iinntt uunnvviiss((ccpp,, cc,, aassttaattee,, ffllaagg))
uu__cchhaarr **ccpp,, cc;;
iinntt **aassttaattee,, ffllaagg;;
iinntt ssttrruunnvviiss((ddsstt,, ssrrcc))
cchhaarr **ddsstt,, **ssrrcc;;
DDEESSCCRRIIPPTTIIOONN
_U_n_v_i_s and _s_t_r_u_n_v_i_s are used to decode a visual representa-
tion of characters, as produced by the vis(3) function, back
into its original form. Unvis is called with successive
characters in c until a valid sequence is recognized, at
which time the decoded character is available at the charac-
ter pointed to by cp. Strunvis decodes the characters
pointed to by src into the buffer pointed to by dst.
_S_t_r_u_n_v_i_s simply copies src to dst, decoding any escape
sequences along the way, and returns the number of charac-
ters placed into dst, or -1 if an invalid escape sequence
was detected. The size of dst should be equal to the size
of src (that is, no expansion takes place during decoding).
_U_n_v_i_s 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 _u_n_v_i_s 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 an
destination character. _V_i_s has several return codes that
must be handled properly. They are:
0 (zero)
Another character is necessary; nothing has been recog-
nized yet.
UNVIS_VALID
A valid character has been recognized and is available
at the location pointed to by cp.
UNVIS_VALIDPUSH
A valid character has been recognized and is available
at the location pointed to by cp; however, the
Printed 7/27/90 June 1
UNVIS(3) 1990 UNVIS(3)
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 esacpe 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 _u_n_v_i_s
one more time with flag set to UUNNVVIISS__EENNDD to extract any
remaining character (the character passed in is ignored).
The following code fragment illustrates a proper use of
_u_n_v_i_s.
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:
(void) putchar(out);
break;
case UNVIS_VALIDPUSH:
(void) putchar(out);
goto again;
case UNVIS_SYNBAD:
(void)fprintf(stderr, "bad sequence!0);
exit(1);
}
}
if (unvis(&out, (char)0, &state, UNVIS_END) == UNVIS_VALID)
(void) putchar(out);
SSEEEE AALLSSOO
vis(1)
Printed 7/27/90 June 2