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