home *** CD-ROM | disk | FTP | other *** search
/ OpenStep 4.2J (Developer) / os42jdev.iso / NextDeveloper / Source / GNU / uucp / Uucp.framework / uucp.subproj / escape.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-10-09  |  1.5 KB  |  99 lines

  1. /* escape.c
  2.    Translate escape sequences.  */
  3.  
  4. #include "uucp.h"
  5.  
  6. #include <ctype.h>
  7.  
  8. #include "uudefs.h"
  9.  
  10. size_t
  11. cescape (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.