Annotation of 43BSDReno/lib/libc/gen/unvis.3, revision 1.1

1.1     ! root        1: .\" Copyright (c) 1989 The Regents of the University of California.
        !             2: .\" All rights reserved.
        !             3: .\"
        !             4: .\" Redistribution and use in source and binary forms are permitted provided
        !             5: .\" that: (1) source distributions retain this entire copyright notice and
        !             6: .\" comment, and (2) distributions including binaries display the following
        !             7: .\" acknowledgement:  ``This product includes software developed by the
        !             8: .\" University of California, Berkeley and its contributors'' in the
        !             9: .\" documentation or other materials provided with the distribution and in
        !            10: .\" all advertising materials mentioning features or use of this software.
        !            11: .\" Neither the name of the University nor the names of its contributors may
        !            12: .\" be used to endorse or promote products derived from this software without
        !            13: .\" specific prior written permission.
        !            14: .\" THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
        !            15: .\" WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
        !            16: .\" MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            17: .\"
        !            18: .\"    @(#)unvis.3     1.2 (Berkeley) 6/27/90
        !            19: .\"
        !            20: .TH UNVIS 3 "June 27, 1990"
        !            21: .UC 7
        !            22: .SH NAME
        !            23: unvis, strunvis - decode a visual representation of characters
        !            24: .SH SYNOPSIS
        !            25: .nf
        !            26: .ft B
        !            27: #include <vis.h>
        !            28: 
        !            29: int unvis(cp, c, astate, flag)
        !            30: u_char *cp, c;
        !            31: int *astate, flag;
        !            32: 
        !            33: int strunvis(dst, src)
        !            34: char *dst, *src;
        !            35: 
        !            36: .ft R
        !            37: .fi
        !            38: .SH DESCRIPTION
        !            39: .I Unvis
        !            40: and
        !            41: .I strunvis
        !            42: are used to decode a visual representation of characters, as produced
        !            43: by the vis(3) function, back into
        !            44: its original form.  Unvis is called with successive characters in c 
        !            45: until a valid
        !            46: sequence is recognized, at which time the decoded character is
        !            47: available at the character pointed to by cp.  Strunvis decodes the
        !            48: characters pointed to by src into the buffer pointed to by dst.
        !            49: .LP
        !            50: .I Strunvis
        !            51: simply copies src to dst, decoding any escape sequences along the way,
        !            52: and returns the number of characters placed into dst, or -1 if an
        !            53: invalid escape sequence was detected.  The size of dst should be
        !            54: equal to the size of src (that is, no expansion takes place during
        !            55: decoding).
        !            56: .LP
        !            57: .I Unvis
        !            58: implements a state machine that can be used to decode an arbitrary
        !            59: stream of bytes.  All state associated with the bytes being decoded
        !            60: is stored outside the
        !            61: .I unvis
        !            62: function (that is, a pointer to the state is passed in), so
        !            63: calls decoding different streams can be freely intermixed.  To
        !            64: start decoding a stream of bytes, first initialize an integer
        !            65: to zero.  Call unvis with each successive byte, along with a pointer
        !            66: to this integer, and a pointer to an destination character.
        !            67: .I Vis
        !            68: has several return codes that must be handled properly.  They are:
        !            69: .TP 
        !            70: 0 (zero)
        !            71: Another character is necessary; nothing has been recognized yet.
        !            72: .TP
        !            73: UNVIS_VALID    
        !            74: A valid character has been recognized and is available at the location
        !            75: pointed to by cp.
        !            76: .TP
        !            77: UNVIS_VALIDPUSH
        !            78: A valid character has been recognized and is available at the location
        !            79: pointed to by cp; however, the character currently passed in should
        !            80: be passed in again.
        !            81: .TP
        !            82: UNVIS_NOCHAR
        !            83: A valid sequence was detected, but no character was produced.  This
        !            84: return code is necessary to indicate a logical break between characters.
        !            85: .TP
        !            86: UNVIS_SYNBAD
        !            87: An invalid esacpe sequence was detected, or the decoder is in an
        !            88: unknown state.  The decoder is placed into the starting state.
        !            89: .LP
        !            90: When all bytes in the stream have been processed, call
        !            91: .I unvis
        !            92: one more time with flag set to
        !            93: .B UNVIS_END
        !            94: to extract any remaining character (the character passed in is ignored).
        !            95: .LP
        !            96: The following code fragment illustrates a proper use of
        !            97: .IR unvis .
        !            98: .PP
        !            99: .nf
        !           100: int state = 0;
        !           101: char out;
        !           102: 
        !           103: while ((ch = getchar()) != EOF) {
        !           104: again:
        !           105:        switch(unvis(&out, ch, &state, 0)) {
        !           106:        case 0:
        !           107:        case UNVIS_NOCHAR:
        !           108:                break;
        !           109:        case UNVIS_VALID:
        !           110:                (void) putchar(out);
        !           111:                break;
        !           112:        case UNVIS_VALIDPUSH:
        !           113:                (void) putchar(out);
        !           114:                goto again;
        !           115:        case UNVIS_SYNBAD:
        !           116:                (void)fprintf(stderr, "bad sequence!\n");
        !           117:                exit(1);
        !           118:        }
        !           119: }
        !           120: if (unvis(&out, (char)0, &state, UNVIS_END) == UNVIS_VALID)
        !           121:        (void) putchar(out);
        !           122: .fi
        !           123: .SH "SEE ALSO"
        !           124: vis(1)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.