4.3BSD-Reno/share/man/cat3/unvis.0

Compare this file to the similar file:
Show the results in this format:




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