aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/common.c')
-rw-r--r--src/lib/common.c55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/lib/common.c b/src/lib/common.c
index 111366782..338e9316c 100644
--- a/src/lib/common.c
+++ b/src/lib/common.c
@@ -404,6 +404,61 @@ char *replace_cntrl_chars(const char *str, char c) {
404 return rv; 404 return rv;
405} 405}
406 406
407char *escape_cntrl_chars(const char *str) {
408 if (str) {
409 unsigned int cntrl_chars = 0;
410 const char *c = str;
411 while (*c) {
412 switch (*c++) {
413 case '\b':
414 case '\a':
415 case '\e':
416 case '\f':
417 case '\n':
418 case '\r':
419 case '\t':
420 case '\v':
421 case '\"':
422 case '\'':
423 case '\?':
424 case '\\':
425 ++cntrl_chars;
426 default: break;
427 }
428 }
429 char *rv = malloc(strlen(str) + cntrl_chars + 1);
430 char *ptr = rv;
431 if (!rv)
432 errExit("malloc");
433 c = str;
434 while (*c) {
435 if (iscntrl(*c)) {
436 *ptr++ = '\\';
437 switch (*c) {
438 case '\b': *ptr++ = 'b'; break;
439 case '\a': *ptr++ = 'a'; break;
440 case '\e': *ptr++ = 'e'; break;
441 case '\f': *ptr++ = 'f'; break;
442 case '\n': *ptr++ = 'n'; break;
443 case '\r': *ptr++ = 'r'; break;
444 case '\t': *ptr++ = 't'; break;
445 case '\v': *ptr++ = 'v'; break;
446 case '\"': *ptr++ = '\"'; break;
447 case '\'': *ptr++ = '\''; break;
448 case '\?': *ptr++ = '?'; break;
449 case '\\': *ptr++ = '\\'; break;
450 }
451 } else {
452 *ptr++ = *c;
453 }
454 c++;
455 }
456 *ptr = '\0';
457 return rv;
458 }
459 return NULL;
460}
461
407int has_cntrl_chars(const char *str) { 462int has_cntrl_chars(const char *str) {
408 assert(str); 463 assert(str);
409 464