str2bts.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. /* $Header$ */
  2. /*
  3. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  4. * See the copyright notice in the ACK home directory, in the file "Copyright".
  5. */
  6. /* str2bts -- (1985, EHB)
  7. */
  8. static
  9. is_oct(c)
  10. char c;
  11. {
  12. return (c == '0' || c == '1' || c == '2' || c == '3' ||
  13. c == '4' || c == '5' || c == '6' || c == '7');
  14. }
  15. /* str2bts() strips the escaped characters of a
  16. string and replaces them by the ascii characters they stand for.
  17. The ascii length of the resulting string is returned, including the
  18. terminating null-character.
  19. */
  20. char *
  21. str2bts(str, bts, pn)
  22. register char *str;
  23. char *bts;
  24. int *pn;
  25. {
  26. register char *t = bts;
  27. while (*str) {
  28. if (*str == '\\') {
  29. switch (*++str) {
  30. case 'b':
  31. *t++ = '\b';
  32. str++;
  33. break;
  34. case 'f':
  35. *t++ = '\f';
  36. str++;
  37. break;
  38. case 'n':
  39. *t++ = '\n';
  40. str++;
  41. break;
  42. case 'r':
  43. *t++ = '\r';
  44. str++;
  45. break;
  46. case 't':
  47. *t++ = '\t';
  48. str++;
  49. break;
  50. default:
  51. if (is_oct(*str)) {
  52. register cnt = 0, oct = 0;
  53. do
  54. oct = oct * 8 + *str - '0';
  55. while (is_oct(*++str) && ++cnt < 3);
  56. *t++ = (char) oct;
  57. break;
  58. }
  59. *t++ = *str++;
  60. break;
  61. }
  62. }
  63. else
  64. *t++ = *str++;
  65. }
  66. *t = '\0'; /* don't forget this one !!! */
  67. *pn = t - bts + 1;
  68. return bts;
  69. }