DataFile: add API to access spriteflags count/offset
[rofl0r-agsutils.git] / StringEscape.c
blobf0b13df9965b916c3e5aa5ff7c1ee277de50f748
1 #include <stddef.h>
3 size_t escape(char* in, char* out, size_t outsize) {
4 size_t l = 0;
5 while(*in && l + 3 < outsize) {
6 switch(*in) {
7 case '\n':
8 *out++ = '\\';
9 l++;
10 *out = 'n';
11 break;
12 case '\r':
13 *out++ = '\\';
14 l++;
15 *out = 'r';
16 break;
17 case '\t':
18 *out++ = '\\';
19 l++;
20 *out = 't';
21 break;
22 case '\\':
23 *out++ = '\\';
24 l++;
25 *out = '\\';
26 break;
27 case '"':
28 *out++ = '\\';
29 l++;
30 *out = '"';
31 break;
32 case '\v':
33 *out++ = '\\';
34 l++;
35 *out = '\v';
36 break;
37 case '\?':
38 *out++ = '\\';
39 l++;
40 *out = '\?';
41 break;
42 case '\f':
43 *out++ = '\\';
44 l++;
45 *out = '\f';
46 break;
47 default:
48 *out = *in;
50 in++;
51 out++;
52 l++;
54 *out = 0;
55 return l;
57 #include <assert.h>
58 #include <stdlib.h>
59 size_t unescape(char* in, char *out, size_t outsize) {
60 size_t l = 0;
61 while(*in && l + 2 < outsize) {
62 switch (*in) {
63 case '\\':
64 ++in;
65 assert(*in);
66 switch(*in) {
67 case 'n':
68 *out='\n';
69 break;
70 case 'r':
71 *out='\r';
72 break;
73 case 't':
74 *out='\t';
75 break;
76 case '\\':
77 *out='\\';
78 break;
79 case '"':
80 *out='"';
81 break;
82 case 'v':
83 *out='\v';
84 break;
85 case '\?':
86 *out = '\?';
87 break;
88 case 'f':
89 *out = '\f';
90 break;
91 case '\'':
92 *out = '\'';
93 break;
94 default:
95 abort();
97 break;
98 default:
99 *out=*in;
101 in++;
102 out++;
103 l++;
105 *out = 0;
106 return l;