strvis.c
上传用户:zm130024
上传日期:2007-01-04
资源大小:432k
文件大小:5k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /* $Id: strvis.c,v 1.5 1999/05/13 16:35:58 karls Exp $ */
  2. #ifdef HAVE_CONFIG_H
  3. #include "autoconf.h"
  4. #endif  /* HAVE_CONFIG_H */
  5. #include "common.h"
  6. #if !HAVE_STRVIS
  7. /*-
  8.  * Copyright (c) 1989, 1993
  9.  * The Regents of the University of California.  All rights reserved.
  10.  *
  11.  * Redistribution and use in source and binary forms, with or without
  12.  * modification, are permitted provided that the following conditions
  13.  * are met:
  14.  * 1. Redistributions of source code must retain the above copyright
  15.  *    notice, this list of conditions and the following disclaimer.
  16.  * 2. Redistributions in binary form must reproduce the above copyright
  17.  *    notice, this list of conditions and the following disclaimer in the
  18.  *    documentation and/or other materials provided with the distribution.
  19.  * 3. All advertising materials mentioning features or use of this software
  20.  *    must display the following acknowledgement:
  21.  * This product includes software developed by the University of
  22.  * California, Berkeley and its contributors.
  23.  * 4. Neither the name of the University nor the names of its contributors
  24.  *    may be used to endorse or promote products derived from this software
  25.  *    without specific prior written permission.
  26.  *
  27.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  28.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  29.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  30.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  31.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  32.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  33.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  34.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  35.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  36.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  37.  * SUCH DAMAGE.
  38.  */
  39. #if defined(LIBC_SCCS) && !defined(lint)
  40. static char rcsid[] = "$OpenBSD: vis.c,v 1.4 1997/07/25 20:30:05 mickey Exp $";
  41. #endif /* LIBC_SCCS and not lint */
  42. #ifndef _COMMON_H_
  43. #include <sys/types.h>
  44. #include <limits.h>
  45. #endif /* !_COMMON_H_ */
  46. #include <ctype.h>
  47. /*#include <vis.h> */ /* get defines from compat.h */
  48. #include "compat.h"
  49. #define isoctal(c) (((u_char)(c)) >= '0' && ((u_char)(c)) <= '7')
  50. /*
  51.  * vis - visually encode characters
  52.  */
  53. char *
  54. vis(dst, c, flag, nextc)
  55. register char *dst;
  56. int c, nextc;
  57. register int flag;
  58. {
  59. if (((u_int)c <= UCHAR_MAX && isascii(c) && isgraph(c)) ||
  60.    ((flag & VIS_SP) == 0 && c == ' ') ||
  61.    ((flag & VIS_TAB) == 0 && c == 't') ||
  62.    ((flag & VIS_NL) == 0 && c == 'n') ||
  63.    ((flag & VIS_SAFE) && (c == 'b' || c == '07' || c == 'r'))) {
  64. *dst++ = c;
  65. if (c == '\' && (flag & VIS_NOSLASH) == 0)
  66. *dst++ = '\';
  67. *dst = '';
  68. return (dst);
  69. }
  70. if (flag & VIS_CSTYLE) {
  71. switch(c) {
  72. case 'n':
  73. *dst++ = '\';
  74. *dst++ = 'n';
  75. goto done;
  76. case 'r':
  77. *dst++ = '\';
  78. *dst++ = 'r';
  79. goto done;
  80. case 'b':
  81. *dst++ = '\';
  82. *dst++ = 'b';
  83. goto done;
  84. #ifdef STDC_HEADERS
  85. case 'a':
  86. #else
  87. case '07':
  88. #endif  /* STDC_HEADERS */
  89. *dst++ = '\';
  90. *dst++ = 'a';
  91. goto done;
  92. case 'v':
  93. *dst++ = '\';
  94. *dst++ = 'v';
  95. goto done;
  96. case 't':
  97. *dst++ = '\';
  98. *dst++ = 't';
  99. goto done;
  100. case 'f':
  101. *dst++ = '\';
  102. *dst++ = 'f';
  103. goto done;
  104. case ' ':
  105. *dst++ = '\';
  106. *dst++ = 's';
  107. goto done;
  108. case '':
  109. *dst++ = '\';
  110. *dst++ = '0';
  111. if (isoctal(nextc)) {
  112. *dst++ = '0';
  113. *dst++ = '0';
  114. }
  115. goto done;
  116. }
  117. }
  118. if (((c & 0177) == ' ') || (flag & VIS_OCTAL)) {
  119. *dst++ = '\';
  120. *dst++ = ((u_char)c >> 6 & 07) + '0';
  121. *dst++ = ((u_char)c >> 3 & 07) + '0';
  122. *dst++ = ((u_char)c & 07) + '0';
  123. goto done;
  124. }
  125. if ((flag & VIS_NOSLASH) == 0)
  126. *dst++ = '\';
  127. if (c & 0200) {
  128. c &= 0177;
  129. *dst++ = 'M';
  130. }
  131. if (iscntrl(c)) {
  132. *dst++ = '^';
  133. if (c == 0177)
  134. *dst++ = '?';
  135. else
  136. *dst++ = c + '@';
  137. } else {
  138. *dst++ = '-';
  139. *dst++ = c;
  140. }
  141. done:
  142. *dst = '';
  143. return (dst);
  144. }
  145. /*
  146.  * strvis, strvisx - visually encode characters from src into dst
  147.  *
  148.  * Dst must be 4 times the size of src to account for possible
  149.  * expansion.  The length of dst, not including the trailing NULL,
  150.  * is returned.
  151.  *
  152.  * Strvisx encodes exactly len bytes from src into dst.
  153.  * This is useful for encoding a block of data.
  154.  */
  155. int
  156. strvis(dst, src, flag)
  157. register char *dst;
  158. register const char *src;
  159. int flag;
  160. {
  161. register char c;
  162. char *start;
  163. for (start = dst; (c = *src);)
  164. dst = vis(dst, c, flag, *++src);
  165. *dst = '';
  166. return (dst - start);
  167. }
  168. int
  169. strvisx(dst, src, len, flag)
  170. register char *dst;
  171. register const char *src;
  172. register size_t len;
  173. int flag;
  174. {
  175. register char c;
  176. char *start;
  177. for (start = dst; len > 1; len--) {
  178. c = *src;
  179. dst = vis(dst, c, flag, *++src);
  180. }
  181. if (len)
  182. dst = vis(dst, *src, flag, '');
  183. *dst = '';
  184. return (dst - start);
  185. }
  186. #else
  187. static void avoid_error __P((void));
  188. static void avoid_error()
  189. {
  190. avoid_error();
  191. }
  192. #endif /* !HAVE_STRVIS */