1/* escape.c
2   Translate escape sequences.  */
3
4#include "uucp.h"
5
6#include <ctype.h>
7
8#include "uudefs.h"
9
10size_t
11cescape (z)
12     char *z;
13{
14  char *zto, *zfrom;
15
16  zto = z;
17  zfrom = z;
18  while (*zfrom != '\0')
19    {
20      if (*zfrom != '\\')
21	{
22	  *zto++ = *zfrom++;
23	  continue;
24	}
25      ++zfrom;
26      switch (*zfrom)
27	{
28	case '-':
29	  *zto++ = '-';
30	  break;
31	case 'b':
32	  *zto++ = '\b';
33	  break;
34	case 'n':
35	  *zto++ = '\n';
36	  break;
37	case 'N':
38	  *zto++ = '\0';
39	  break;
40	case 'r':
41	  *zto++ = '\r';
42	  break;
43	case 's':
44	  *zto++ = ' ';
45	  break;
46	case 't':
47	  *zto++ = '\t';
48	  break;
49	case '\0':
50	  --zfrom;
51	  /* Fall through.  */
52	case '\\':
53	  *zto++ = '\\';
54	  break;
55	case '0': case '1': case '2': case '3': case '4':
56	case '5': case '6': case '7': case '8': case '9':
57	  {
58	    int i;
59
60	    i = *zfrom - '0';
61	    if (zfrom[1] >= '0' && zfrom[1] <= '7')
62	      i = 8 * i + *++zfrom - '0';
63	    if (zfrom[1] >= '0' && zfrom[1] <= '7')
64	      i = 8 * i + *++zfrom - '0';
65	    *zto++ = (char) i;
66	  }
67	  break;
68	case 'x':
69	  {
70	    int i;
71
72	    i = 0;
73	    while (isxdigit (BUCHAR (zfrom[1])))
74	      {
75		if (isdigit (BUCHAR (zfrom[1])))
76		  i = 16 * i + *++zfrom - '0';
77		else if (isupper (BUCHAR (zfrom[1])))
78		  i = 16 * i + *++zfrom - 'A' + 10;
79		else
80		  i = 16 * i + *++zfrom - 'a' + 10;
81	      }
82	    *zto++ = (char) i;
83	  }
84	  break;
85	default:
86	  ulog (LOG_ERROR, "Unrecognized escape sequence \\%c",
87		*zfrom);
88	  *zto++ = *zfrom;
89	  break;
90	}
91
92      ++zfrom;
93    }
94
95  *zto = '\0';
96
97  return (size_t) (zto - z);
98}
99