home *** CD-ROM | disk | FTP | other *** search
-
- UNVIS(3) UNIX Programmer's Manual UNVIS(3)
-
- NNAAMMEE
- uunnvviiss, ssttrruunnvviiss - decode a visual representation of characters
-
- SSYYNNOOPPSSIISS
- ##iinncclluuddee <<vviiss..hh>>
-
- _i_n_t
- uunnvviiss(_u___c_h_a_r _*_c_p, _u___c_h_a_r _c, _i_n_t _*_a_s_t_a_t_e, _i_n_t _f_l_a_g)
-
- _i_n_t
- ssttrruunnvviiss(_c_h_a_r _*_d_s_t, _c_h_a_r _*_s_r_c)
-
- DDEESSCCRRIIPPTTIIOONN
- The uunnvviiss() and ssttrruunnvviiss() functions are used to decode a visual repre
- sentation of characters, as produced by the vis(3) function, back into
- the 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 character pointed to by _c_p. Strunvis decodes the charac
- ters pointed to by _s_r_c into the buffer pointed to by _d_s_t.
-
- The ssttrruunnvviiss() function simply copies _s_r_c to _d_s_t, decoding any escape se
- quences along the way, and returns the number of characters placed into
- _d_s_t, or -1 if an invalid escape sequence was detected. The size of _d_s_t
- should be equal to the size of _s_r_c (that is, no expansion takes place
- during decoding).
-
- The uunnvviiss() function implements a state machine that can be used to de
- code an arbitrary stream of bytes. All state associated with the bytes
- being decoded is stored outside the uunnvviiss() 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 uunnvviiss() with each successive byte, along with a
- pointer to this integer, and a pointer to an destination character. The
- unvis function 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 character
- currently passed in should be passed in again.
-
- UNVIS_NOCHAR A valid sequence was detected, but no character was pro
- duced. This return code is necessary to indicate a log
- ical 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 uunnvviiss() one more
- time with flag set to UNVIS_END to extract any remaining character (the
- character passed in is ignored).
-
- The following code fragment illustrates a proper use of uunnvviiss().
-
- 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)
-
- HHIISSTTOORRYY
- The uunnvviiss() function is currently under development.
-
- BSD Experimental April 19, 1991 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-