r42@gandalf: fugalh | 2006-06-07 17:08:39 -0600
[ardour.git] / libs / pbd3 / unescape.cc
1 #include <cstdlib>
2
3 #include <pbd/unescape.h>
4
5 void
6 unescape (char *str)
7
8 {
9         char *p;
10         bool escaped;
11         long offset;
12         char octal[4];
13         int noct;
14         char hex[3];
15         int nhex;
16
17         escaped = false;
18         offset = 0;
19         octal[3] = '\0';
20         hex[2] = '\0';
21
22         p = str;
23
24         while (*p) {
25                 if (!escaped) {
26                         if (*p == '\\') {
27                                 escaped = true;
28                         } else {
29                                 *(p-offset) = *p;
30                         }
31                         p++;
32                         continue;
33                 }
34
35                 switch (*p) {
36                 case 'f':
37                         offset++;
38                         *(p-offset) = '\f';
39                         break;
40                 case 'r':
41                         offset++;
42                         *(p-offset) = '\r';
43                         break;
44                         
45                 case 'v':
46                         offset++;
47                         *(p-offset) = '\v';
48                         break;
49                         
50                 case 'n':
51                         offset++;
52                         *(p-offset) = '\n';
53                         break;
54                         
55                 case 't':
56                         offset++;
57                         *(p-offset) = '\t';
58                         break;
59                         
60                 case 'b':
61                         offset++;
62                         *(p-offset) = '\b';
63                         break;
64                         
65                 case '0':
66                 case '1':
67                 case '2':
68                 case '3':
69                 case '4':
70                 case '5':
71                 case '6':
72                 case '7':
73                         noct = 0;
74                         while (noct < 3 &&
75                                (*p >= '0' && *p <= '7')) {
76                                 octal[noct++] = *p;
77                                 offset++;
78                                 p++;
79                         }
80                         p--;
81                         *(p-offset) = strtol (octal, 0, 8);
82                         break;
83                         
84                 case 'x':
85                         nhex = 0;
86                         p++;
87                         offset++;
88                         
89                         while (nhex < 2 &&
90                                ((*p >= '0' && *p <= '9') ||
91                                 (*p >= 'a' && *p <= 'f') ||
92                                 (*p >= 'A' && *p <= 'F'))) {
93                                 hex[nhex++] = *p;
94                                 offset++;
95                                 p++;
96                         }
97                         p--;
98                         *(p-offset) = strtol (hex, 0, 16);
99                         break;
100                         
101                 case '\\':
102                         offset++;
103                         *(p-offset) = '\\';
104                         break;
105                         
106                 case '"':
107                         offset++;
108                         *(p-offset) = '"';
109                         break;
110
111                 case '\'':
112                         offset++;
113                         *(p-offset) = '\'';
114                         break;
115
116                 default:
117                         *(p-offset) = *p;
118                 }
119
120                 escaped = false;
121                 p++;
122         }
123         
124         *(p-offset) = '\0';
125 }
126
127 #ifdef TEST
128 #include <cstdio>
129
130 main (int argc, char *argv[])
131
132 {
133         unescape (argv[1]);
134         printf ("%s\n", argv[1]);
135 }
136
137 #endif