#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ malloc(size_t);
char *escape(const char *input) {
  size_t len;
  int escapes = 0;
  for (len = 0; input[len]; ++len) {
    switch (input[len]) {
    case '\n':
    case '\t':
    case '\r':
    case '\b':
    case '\\':
    case '"':
      escapes++;
    default:
      break;
    }
  }
  if (!escapes)
    return NULL;
  char *rv = (char *)malloc(len + escapes + 1);
  char *ptr = rv;
  for (size_t i = 0; i < len; ++i) {
    switch (input[i]) {
    case '\n':
      *(ptr++) = '\\';
      *(ptr++) = 'n';
      break;
    case '\t':
      *(ptr++) = '\\';
      *(ptr++) = 't';
      break;
    case '\r':
      *(ptr++) = '\\';
      *(ptr++) = 'r';
      break;
    case '\b':
      *(ptr++) = '\\';
      *(ptr++) = 'b';
      break;
    case '\\':
      *(ptr++) = '\\';
      *(ptr++) = '\\';
      break;
    case '"':
      *(ptr++) = '\\';
      *(ptr++) = '"';
      break;
    default:
      *(ptr++) = input[i];
    }
  }
  *ptr = 0;
  return rv;
}


x86 assembly (clang, -O0):
<escape>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     11b4 <escape+0xa4>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x3c(%rbp)
add    $0xfffffff8,%eax
sub    $0x3,%eax
jb     1190 <escape+0x80>
jmp    115d <escape+0x4d>
mov    -0x3c(%rbp),%eax
sub    $0xd,%eax
je     1190 <escape+0x80>
jmp    116e <escape+0x5e>
mov    -0x3c(%rbp),%eax
sub    $0x22,%eax
je     1190 <escape+0x80>
jmp    117f <escape+0x6f>
mov    -0x3c(%rbp),%eax
sub    $0x5c,%eax
jne    1199 <escape+0x89>
jmp    1190 <escape+0x80>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119e <escape+0x8e>
jmp    11a3 <escape+0x93>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    112b <escape+0x1b>
cmpl   $0x0,-0x1c(%rbp)
jne    11cb <escape+0xbb>
movq   $0x0,-0x8(%rbp)
jmp    13aa <escape+0x29a>
mov    -0x18(%rbp),%rdi
movslq -0x1c(%rbp),%rax
add    %rax,%rdi
add    $0x1,%rdi
call   1030 <malloc@plt>
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x38(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    139b <escape+0x28b>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
mov    %eax,-0x40(%rbp)
sub    $0x8,%eax
je     12ee <escape+0x1de>
jmp    121e <escape+0x10e>
mov    -0x40(%rbp),%eax
sub    $0x9,%eax
je     129c <escape+0x18c>
jmp    122f <escape+0x11f>
mov    -0x40(%rbp),%eax
sub    $0xa,%eax
je     1273 <escape+0x163>
jmp    1240 <escape+0x130>
mov    -0x40(%rbp),%eax
sub    $0xd,%eax
je     12c5 <escape+0x1b5>
jmp    1251 <escape+0x141>
mov    -0x40(%rbp),%eax
sub    $0x22,%eax
je     1340 <escape+0x230>
jmp    1262 <escape+0x152>
mov    -0x40(%rbp),%eax
sub    $0x5c,%eax
je     1317 <escape+0x207>
jmp    1369 <escape+0x259>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x6e,(%rax)
jmp    1385 <escape+0x275>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x74,(%rax)
jmp    1385 <escape+0x275>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x72,(%rax)
jmp    1385 <escape+0x275>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x62,(%rax)
jmp    1385 <escape+0x275>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
jmp    1385 <escape+0x275>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x5c,(%rax)
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x22,(%rax)
jmp    1385 <escape+0x275>
mov    -0x10(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,1),%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
jmp    138a <escape+0x27a>
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    11f3 <escape+0xe3>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<escape>:
push   %r14
push   %rbx
push   %rax
mov    (%rdi),%dl
xor    %eax,%eax
test   %dl,%dl
je     1175 <escape+0x65>
mov    %rdi,%r14
mov    $0x1,%ebx
movabs $0x400002700,%rcx
jmp    1146 <escape+0x36>
bt     %rdx,%rcx
jae    114e <escape+0x3e>
add    $0x1,%eax
movzbl (%r14,%rbx,1),%edx
add    $0x1,%rbx
test   %dl,%dl
je     1155 <escape+0x45>
movsbl %dl,%edx
cmp    $0x22,%edx
jbe    1130 <escape+0x20>
cmp    $0x5c,%edx
je     1136 <escape+0x26>
jmp    1139 <escape+0x29>
test   %eax,%eax
je     1173 <escape+0x63>
movslq %eax,%rdi
add    %rbx,%rdi
call   1030 <malloc@plt>
mov    %rax,%r9
cmp    $0x1,%rbx
jne    117d <escape+0x6d>
movb   $0x0,(%r9)
jmp    1175 <escape+0x65>
xor    %eax,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
add    $0xfffffffffffffffe,%rbx
mov    $0xffffffffffffffff,%rdx
lea    0xe71(%rip),%r8
mov    %rax,%r9
jmp    11a9 <escape+0x99>
mov    %cl,(%r9)
add    $0x1,%r9
nopl   0x0(%rax,%rax,1)
add    $0x1,%rdx
cmp    %rdx,%rbx
je     116d <escape+0x5d>
movzbl 0x1(%r14,%rdx,1),%ecx
movsbl %cl,%esi
lea    -0x8(%rsi),%edi
cmp    $0x1a,%edi
ja     11d0 <escape+0xc0>
movslq (%r8,%rdi,4),%rsi
add    %r8,%rsi
jmp    *%rsi
movw   $0x625c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>
nop
cmp    $0x5c,%esi
jne    1194 <escape+0x84>
movw   $0x5c5c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>
movw   $0x745c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>
movw   $0x6e5c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>
movw   $0x725c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>
movw   $0x225c,(%r9)
add    $0x2,%r9
jmp    11a0 <escape+0x90>

LLVM IR (-O0):
define i8* @escape(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
%4 = alloca i64
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca i64
store i8* %0, i8** %3
store i32 0, i32* %5
store i64 0, i64* %4
br label %9
9: ; preds = %26, %1
%10 = load i8*, i8** %3
%11 = load i64, i64* %4
%12 = getelementptr inbounds i8, i8* %10, i64 %11
%13 = load i8, i8* %12
%14 = icmp ne i8 %13, 0
br i1 %14, label %15, label %29
15: ; preds = %9
%16 = load i8*, i8** %3
%17 = load i64, i64* %4
%18 = getelementptr inbounds i8, i8* %16, i64 %17
%19 = load i8, i8* %18
%20 = sext i8 %19 to i32
switch i32 %20, label %24 [
i32 10, label %21
i32 9, label %21
i32 13, label %21
i32 8, label %21
i32 92, label %21
i32 34, label %21
]
21: ; preds = %15, %15, %15, %15, %15, %15
%22 = load i32, i32* %5
%23 = add nsw i32 %22, 1
store i32 %23, i32* %5
br label %24
24: ; preds = %15, %21
br label %25
25: ; preds = %24
br label %26
26: ; preds = %25
%27 = load i64, i64* %4
%28 = add i64 %27, 1
store i64 %28, i64* %4
br label %9
29: ; preds = %9
%30 = load i32, i32* %5
%31 = icmp ne i32 %30, 0
br i1 %31, label %33, label %32
32: ; preds = %29
store i8* null, i8** %2
br label %96
33: ; preds = %29
%34 = load i64, i64* %4
%35 = load i32, i32* %5
%36 = sext i32 %35 to i64
%37 = add i64 %34, %36
%38 = add i64 %37, 1
%39 = call i64 @malloc(i64 %38)
%40 = inttoptr i64 %39 to i8*
store i8* %40, i8** %6
%41 = load i8*, i8** %6
store i8* %41, i8** %7
store i64 0, i64* %8
br label %42
42: ; preds = %90, %33
%43 = load i64, i64* %8
%44 = load i64, i64* %4
%45 = icmp ult i64 %43, %44
br i1 %45, label %46, label %93
46: ; preds = %42
%47 = load i8*, i8** %3
%48 = load i64, i64* %8
%49 = getelementptr inbounds i8, i8* %47, i64 %48
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
switch i32 %51, label %82 [
i32 10, label %52
i32 9, label %57
i32 13, label %62
i32 8, label %67
i32 92, label %72
i32 34, label %77
]
52: ; preds = %46
%53 = load i8*, i8** %7
%54 = getelementptr inbounds i8, i8* %53, i32 1
store i8* %54, i8** %7
store i8 92, i8* %53
%55 = load i8*, i8** %7
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %7
store i8 110, i8* %55
br label %89
57: ; preds = %46
%58 = load i8*, i8** %7
%59 = getelementptr inbounds i8, i8* %58, i32 1
store i8* %59, i8** %7
store i8 92, i8* %58
%60 = load i8*, i8** %7
%61 = getelementptr inbounds i8, i8* %60, i32 1
store i8* %61, i8** %7
store i8 116, i8* %60
br label %89
62: ; preds = %46
%63 = load i8*, i8** %7
%64 = getelementptr inbounds i8, i8* %63, i32 1
store i8* %64, i8** %7
store i8 92, i8* %63
%65 = load i8*, i8** %7
%66 = getelementptr inbounds i8, i8* %65, i32 1
store i8* %66, i8** %7
store i8 114, i8* %65
br label %89
67: ; preds = %46
%68 = load i8*, i8** %7
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %7
store i8 92, i8* %68
%70 = load i8*, i8** %7
%71 = getelementptr inbounds i8, i8* %70, i32 1
store i8* %71, i8** %7
store i8 98, i8* %70
br label %89
72: ; preds = %46
%73 = load i8*, i8** %7
%74 = getelementptr inbounds i8, i8* %73, i32 1
store i8* %74, i8** %7
store i8 92, i8* %73
%75 = load i8*, i8** %7
%76 = getelementptr inbounds i8, i8* %75, i32 1
store i8* %76, i8** %7
store i8 92, i8* %75
br label %89
77: ; preds = %46
%78 = load i8*, i8** %7
%79 = getelementptr inbounds i8, i8* %78, i32 1
store i8* %79, i8** %7
store i8 92, i8* %78
%80 = load i8*, i8** %7
%81 = getelementptr inbounds i8, i8* %80, i32 1
store i8* %81, i8** %7
store i8 34, i8* %80
br label %89
82: ; preds = %46
%83 = load i8*, i8** %3
%84 = load i64, i64* %8
%85 = getelementptr inbounds i8, i8* %83, i64 %84
%86 = load i8, i8* %85
%87 = load i8*, i8** %7
%88 = getelementptr inbounds i8, i8* %87, i32 1
store i8* %88, i8** %7
store i8 %86, i8* %87
br label %89
89: ; preds = %82, %77, %72, %67, %62, %57, %52
br label %90
90: ; preds = %89
%91 = load i64, i64* %8
%92 = add i64 %91, 1
store i64 %92, i64* %8
br label %42
93: ; preds = %42
%94 = load i8*, i8** %7
store i8 0, i8* %94
%95 = load i8*, i8** %6
store i8* %95, i8** %2
br label %96
96: ; preds = %93, %32
%97 = load i8*, i8** %2
ret i8* %97
}

LLVM IR (-O2):
define i8* @escape(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %58, label %4
4: ; preds = %1, %11
%5 = phi i8 [ %15, %11 ], [ %2, %1 ]
%6 = phi i32 [ %12, %11 ], [ 0, %1 ]
%7 = phi i64 [ %13, %11 ], [ 0, %1 ]
%8 = sext i8 %5 to i32
switch i32 %8, label %11 [
i32 10, label %9
i32 9, label %9
i32 13, label %9
i32 8, label %9
i32 92, label %9
i32 34, label %9
]
9: ; preds = %4, %4, %4, %4, %4, %4
%10 = add nsw i32 %6, 1
br label %11
11: ; preds = %4, %9
%12 = phi i32 [ %6, %4 ], [ %10, %9 ]
%13 = add i64 %7, 1
%14 = getelementptr inbounds i8, i8* %0, i64 %13
%15 = load i8, i8* %14
%16 = icmp eq i8 %15, 0
br i1 %16, label %17, label %4
17: ; preds = %11
%18 = icmp eq i32 %12, 0
br i1 %18, label %58, label %19
19: ; preds = %17
%20 = sext i32 %12 to i64
%21 = add i64 %7, 2
%22 = add i64 %21, %20
%23 = tail call i64 @malloc(i64 %22)
%24 = inttoptr i64 %23 to i8*
%25 = icmp eq i64 %13, 0
br i1 %25, label %26, label %28
26: ; preds = %54, %19
%27 = phi i8* [ %24, %19 ], [ %55, %54 ]
store i8 0, i8* %27
br label %58
28: ; preds = %19, %54
%29 = phi i64 [ %56, %54 ], [ 0, %19 ]
%30 = phi i8* [ %55, %54 ], [ %24, %19 ]
%31 = getelementptr inbounds i8, i8* %0, i64 %29
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
switch i32 %33, label %52 [
i32 10, label %34
i32 9, label %37
i32 13, label %40
i32 8, label %43
i32 92, label %46
i32 34, label %49
]
34: ; preds = %28
%35 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%36 = getelementptr inbounds i8, i8* %30, i64 2
store i8 110, i8* %35
br label %54
37: ; preds = %28
%38 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%39 = getelementptr inbounds i8, i8* %30, i64 2
store i8 116, i8* %38
br label %54
40: ; preds = %28
%41 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%42 = getelementptr inbounds i8, i8* %30, i64 2
store i8 114, i8* %41
br label %54
43: ; preds = %28
%44 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%45 = getelementptr inbounds i8, i8* %30, i64 2
store i8 98, i8* %44
br label %54
46: ; preds = %28
%47 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%48 = getelementptr inbounds i8, i8* %30, i64 2
store i8 92, i8* %47
br label %54
49: ; preds = %28
%50 = getelementptr inbounds i8, i8* %30, i64 1
store i8 92, i8* %30
%51 = getelementptr inbounds i8, i8* %30, i64 2
store i8 34, i8* %50
br label %54
52: ; preds = %28
%53 = getelementptr inbounds i8, i8* %30, i64 1
store i8 %32, i8* %30
br label %54
54: ; preds = %34, %37, %40, %43, %46, %49, %52
%55 = phi i8* [ %53, %52 ], [ %51, %49 ], [ %48, %46 ], [ %45, %43 ], [ %42, %40 ], [ %39, %37 ], [ %36, %34 ]
%56 = add nuw i64 %29, 1
%57 = icmp eq i64 %29, %7
br i1 %57, label %26, label %28
58: ; preds = %1, %17, %26
%59 = phi i8* [ %24, %26 ], [ null, %17 ], [ null, %1 ]
ret i8* %59
}