]> andersk Git - gssapi-openssh.git/blobdiff - openssh/openbsd-compat/vis.c
Import of OpenSSH 3.9p1
[gssapi-openssh.git] / openssh / openbsd-compat / vis.c
index fc57413907bdf537ec25372b3def9a6c190647d6..1fb7a01e3a9592771f15faed902ea6674eca3814 100644 (file)
@@ -1,3 +1,5 @@
+/* OPENBSD ORIGINAL: lib/libc/gen/vis.c */
+
 /*-
  * Copyright (c) 1989, 1993
  *     The Regents of the University of California.  All rights reserved.
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-#include "config.h"
+#include "includes.h"
 #if !defined(HAVE_STRNVIS)
 
 #if defined(LIBC_SCCS) && !defined(lint)
-static char rcsid[] = "$OpenBSD: vis.c,v 1.8 2002/02/19 19:39:36 millert Exp $";
+static char rcsid[] = "$OpenBSD: vis.c,v 1.12 2003/06/02 20:18:35 millert Exp $";
 #endif /* LIBC_SCCS and not lint */
 
 #include <ctype.h>
+#include <string.h>
 
 #include "vis.h"
 
@@ -47,8 +46,9 @@ static char rcsid[] = "$OpenBSD: vis.c,v 1.8 2002/02/19 19:39:36 millert Exp $";
                                ((flag & VIS_SP) == 0 && (c) == ' ') ||      \
                                ((flag & VIS_TAB) == 0 && (c) == '\t') ||    \
                                ((flag & VIS_NL) == 0 && (c) == '\n') ||     \
-                               ((flag & VIS_SAFE) &&                        \
-                               ((c) == '\b' || (c) == '\007' || (c) == '\r')))
+                               ((flag & VIS_SAFE) && ((c) == '\b' ||        \
+                               (c) == '\007' || (c) == '\r' ||              \
+                               isgraph((u_char)(c)))))
 
 /*
  * vis - visually encode characters
@@ -169,16 +169,20 @@ strvis(dst, src, flag)
 
 int
 strnvis(dst, src, siz, flag)
-       register char *dst;
-       register const char *src;
+       char *dst;
+       const char *src;
        size_t siz;
        int flag;
 {
-       register char c;
+       char c;
        char *start, *end;
+       char tbuf[5];
+       int  i;
 
+       i = 0;
        for (start = dst, end = start + siz - 1; (c = *src) && dst < end; ) {
                if (isvisible(c)) {
+                       i = 1;
                        *dst++ = c;
                        if (c == '\\' && (flag & VIS_NOSLASH) == 0) {
                                /* need space for the extra '\\' */
@@ -186,22 +190,25 @@ strnvis(dst, src, siz, flag)
                                        *dst++ = '\\';
                                else {
                                        dst--;
+                                       i = 2;
                                        break;
                                }
                        }
                        src++;
                } else {
-                       /* vis(3) requires up to 4 chars */
-                       if (dst + 3 < end)
-                               dst = vis(dst, c, flag, *++src);
-                       else
+                       i = vis(tbuf, c, flag, *++src) - tbuf;
+                       if (dst + i <= end) {
+                               memcpy(dst, tbuf, i);
+                               dst += i;
+                       } else {
+                               src--;
                                break;
+                       }
                }
        }
-       *dst = '\0';
-       if (dst >= end) {
-               char tbuf[5];
-
+       if (siz > 0)
+               *dst = '\0';
+       if (dst + i > end) {
                /* adjust return value for truncation */
                while ((c = *src))
                        dst += vis(tbuf, c, flag, *++src) - tbuf;
This page took 0.032269 seconds and 4 git commands to generate.