Annotation of 43BSDReno/lib/libc/gen/vis.c, revision 1.1.1.1

1.1       root        1: /*-
                      2:  * Copyright (c) 1989 The Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted provided
                      6:  * that: (1) source distributions retain this entire copyright notice and
                      7:  * comment, and (2) distributions including binaries display the following
                      8:  * acknowledgement:  ``This product includes software developed by the
                      9:  * University of California, Berkeley and its contributors'' in the
                     10:  * documentation or other materials provided with the distribution and in
                     11:  * all advertising materials mentioning features or use of this software.
                     12:  * Neither the name of the University nor the names of its contributors may
                     13:  * be used to endorse or promote products derived from this software without
                     14:  * specific prior written permission.
                     15:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
                     16:  * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
                     17:  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     18:  */
                     19: 
                     20: #if defined(LIBC_SCCS) && !defined(lint)
                     21: static char sccsid[] = "@(#)vis.c      5.3 (Berkeley) 6/26/90";
                     22: #endif /* LIBC_SCCS and not lint */
                     23: 
                     24: #include <sys/types.h>
                     25: #include <ctype.h>
                     26: #include <vis.h>
                     27: 
                     28: #define        isoctal(c)      (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
                     29: 
                     30: /*
                     31:  * vis - visually encode characters
                     32:  */
                     33: char *
                     34: vis(dst, c, flag, nextc)
                     35:        register char *dst, c;
                     36:        char nextc;
                     37:        register int flag;
                     38: {
                     39:        if (isascii(c) && isgraph(c) ||
                     40:           ((flag & VIS_SP) == 0 && c == ' ') ||
                     41:           ((flag & VIS_TAB) == 0 && c == '\t') ||
                     42:           ((flag & VIS_NL) == 0 && c == '\n') ||
                     43:           ((flag & VIS_SAFE) && (c == '\b' || c == '\007' || c == '\r'))) {
                     44:                *dst++ = c;
                     45:                if (c == '\\' && (flag & VIS_NOSLASH) == 0)
                     46:                        *dst++ = '\\';
                     47:                *dst = '\0';
                     48:                return (dst);
                     49:        }
                     50: 
                     51:        if (flag & VIS_CSTYLE) {
                     52:                switch(c) {
                     53:                case '\n':
                     54:                        *dst++ = '\\';
                     55:                        *dst++ = 'n';
                     56:                        goto done;
                     57:                case '\r':
                     58:                        *dst++ = '\\';
                     59:                        *dst++ = 'r';
                     60:                        goto done;
                     61:                case '\b':
                     62:                        *dst++ = '\\';
                     63:                        *dst++ = 'b';
                     64:                        goto done;
                     65:                case '\007':    /* waiting for ansi compiler */
                     66:                        *dst++ = '\\';
                     67:                        *dst++ = 'a';
                     68:                        goto done;
                     69:                case '\v':
                     70:                        *dst++ = '\\';
                     71:                        *dst++ = 'v';
                     72:                        goto done;
                     73:                case '\t':
                     74:                        *dst++ = '\\';
                     75:                        *dst++ = 't';
                     76:                        goto done;
                     77:                case '\f':
                     78:                        *dst++ = '\\';
                     79:                        *dst++ = 'f';
                     80:                        goto done;
                     81:                case ' ':
                     82:                        *dst++ = '\\';
                     83:                        *dst++ = 's';
                     84:                        goto done;
                     85:                case '\0':
                     86:                        *dst++ = '\\';
                     87:                        *dst++ = '0';
                     88:                        if (isoctal(nextc)) {
                     89:                                *dst++ = '0';
                     90:                                *dst++ = '0';
                     91:                        }
                     92:                        goto done;
                     93:                }
                     94:        }
                     95:        if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) {        
                     96:                *dst++ = '\\';
                     97:                *dst++ = ((u_char)c >> 6 & 07) + '0';
                     98:                *dst++ = ((u_char)c >> 3 & 07) + '0';
                     99:                *dst++ = ((u_char)c & 07) + '0';
                    100:                goto done;
                    101:        }
                    102:        if ((flag & VIS_NOSLASH) == 0)
                    103:                *dst++ = '\\';
                    104:        if (c & 0200) {
                    105:                c &= 0177;
                    106:                *dst++ = 'M';
                    107:        }
                    108:        if (iscntrl(c)) {
                    109:                *dst++ = '^';
                    110:                if (c == 0177)
                    111:                        *dst++ = '?';
                    112:                else
                    113:                        *dst++ = c + '@';
                    114:        } else {
                    115:                *dst++ = '-';
                    116:                *dst++ = c;
                    117:        }
                    118: done:
                    119:        *dst = '\0';
                    120:        return (dst);
                    121: }
                    122: 
                    123: /*
                    124:  * strvis, strvisx - visually encode characters from src into dst
                    125:  *     
                    126:  *     Dst must be 4 times the size of src to account for possible
                    127:  *     expansion.  The length of dst, not including the trailing NULL,
                    128:  *     is returned. 
                    129:  *
                    130:  *     Strvisx encodes exactly len bytes from src into dst.
                    131:  *     This is useful for encoding a block of data.
                    132:  */
                    133: strvis(dst, src, flag)
                    134:        register char *dst, *src;
                    135: {
                    136:        register char c;
                    137:        char *start = dst;
                    138: 
                    139:        for (;c = *src; src++)
                    140:                dst = vis(dst, c, flag, *(src+1));
                    141: 
                    142:        return (dst - start);
                    143: }
                    144: 
                    145: strvisx(dst, src, len, flag)
                    146:        register char *dst, *src;
                    147:        register int len;
                    148: {
                    149:        char *start = dst;
                    150: 
                    151:        while (len > 1) {
                    152:                dst = vis(dst, *src, flag, *(src+1));
                    153:                len--;
                    154:        }
                    155:        if (len)
                    156:                dst = vis(dst, *src, flag, '\0');
                    157: 
                    158:        return (dst - start);
                    159: }

unix.superglobalmegacorp.com

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