11 if (c
>= '0' && c
<= '9')
13 if (c
>= 'a' && c
<= 'f')
15 if (c
>= 'A' && c
<= 'F')
20 char *escape_char(char c
, char *buf
, bool str
)
22 buf
= buf
== NULL
? safe_malloc(10) : buf
;
24 case '\0': strcpy(buf
, "\\0"); break;
25 case '\a': strcpy(buf
, "\\a"); break;
26 case '\b': strcpy(buf
, "\\b"); break;
27 case '\t': strcpy(buf
, "\\t"); break;
28 case '\n': strcpy(buf
, "\\n"); break;
29 case '\v': strcpy(buf
, "\\v"); break;
30 case '\f': strcpy(buf
, "\\f"); break;
31 case '\r': strcpy(buf
, "\\r"); break;
32 case '\\': strcpy(buf
, "\\\\"); break;
33 case '\'': strcpy(buf
, str
? "'" : "\\'"); break;
34 case '"': strcpy(buf
, str
? "\\\"" : "\""); break;
36 if (c
>= ' ' && c
< 127)
37 sprintf(buf
, "%c", c
);
39 sprintf(buf
, "\\x%02x", (unsigned char)c
);
47 return c
>= '0' && c
<= '7';
57 char *unescape_char(char *c
)
60 if (c
[1] == 'x' && isxdigit(c
[2])) {
63 c
[3] = (fromHex(c
[2])*16)+fromHex(c
[3]);
70 } else if (c
[1] == '0' && isodigit(c
[2])) {
74 c
[4] = fromOctal(c
[2])*64
80 c
[3] = fromOctal(c
[2])*8
86 c
[2] = fromOctal(c
[2]);
91 case '0': c
[1] = '\0'; break;
92 case '\'': c
[1] = '\''; break;
93 case '\\': c
[1] = '\\'; break;
94 case '"': c
[1] = '"'; break;
95 case 'a': c
[1] = '\a'; break;
96 case 'b': c
[1] = '\b'; break;
97 case 't': c
[1] = '\t'; break;
98 case 'v': c
[1] = '\v'; break;
99 case 'f': c
[1] = '\f'; break;
100 case 'r': c
[1] = '\r'; break;
108 char *trimquotes(char *c
)
111 r
[strlen(r
)-1] = '\0';
115 void pdie(const char *msg
)
121 void die(const char *msg
, ...)
125 vfprintf(stderr
, msg
, ap
);
130 void pindent(int indent
, FILE *out
)
132 for (int i
= 0; i
<indent
; i
++)
133 if (fputc('\t', out
) == EOF
)
137 void safe_fprintf(FILE *out
, const char *msg
, ...)
141 int r
= vfprintf(out
, msg
, ap
);
147 void *safe_malloc(size_t size
)
149 void *res
= malloc(size
);
155 void *safe_strdup(const char *c
)
157 size_t nchar
= strlen(c
);
158 char *res
= malloc((nchar
+1)*sizeof(char));
161 memcpy(res
, c
, nchar
+1);
165 FILE *safe_fopen(const char *path
, const char *mode
)
167 FILE *res
= fopen(path
, mode
);
173 void safe_fclose(FILE *file
)
175 if (fclose(file
) == -1)