#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 */
int descape(char *dest, const char *src, size_t n) {
  if (!dest || !src)
    return 1;
  size_t i1 = 0;
  size_t i2 = 0;
  for (i1 = 0, i2 = 0; i1 < n && src[i2] > '\0'; i2++) {
    if (src[i2] == '\\') {
      switch (src[i2 + 1]) {
      case '\\':
        i2++;
        dest[i1++] = '\\';
        break;
      case '\'':
        i2++;
        dest[i1++] = '\'';
        break;
      case '\"':
        i2++;
        dest[i1++] = '\"';
        break;
      case 'a':
        i2++;
        dest[i1++] = '\a';
        break;
      case 'b':
        i2++;
        dest[i1++] = '\b';
        break;
      case 'e':
        i2++;
        dest[i1++] = '\e';
        break;
      case 'f':
        i2++;
        dest[i1++] = '\f';
        break;
      case 'n':
        i2++;
        dest[i1++] = '\n';
        break;
      case 'r':
        i2++;
        dest[i1++] = '\r';
        break;
      case 't':
        i2++;
        dest[i1++] = '\t';
        break;
      case 'v':
        i2++;
        dest[i1++] = '\v';
        break;
      default:
        dest[i1++] = src[i2++];
        dest[i1++] = src[i2];
        break;
      }
    } else {
      dest[i1++] = src[i2];
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<descape>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1126 <descape+0x26>
cmpq   $0x0,-0x18(%rbp)
jne    1132 <descape+0x32>
movl   $0x1,-0x4(%rbp)
jmp    141a <descape+0x31a>
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x28(%rbp),%rcx
xor    %eax,%eax
cmp    -0x20(%rbp),%rcx
mov    %al,-0x31(%rbp)
jae    117a <descape+0x7a>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
setg   %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    118a <descape+0x8a>
jmp    1413 <descape+0x313>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
jne    13dc <descape+0x2dc>
mov    -0x18(%rbp),%rcx
mov    -0x30(%rbp),%rax
movsbl 0x1(%rax,%rcx,1),%eax
add    $0xffffffde,%eax
mov    %eax,%ecx
mov    %rcx,-0x40(%rbp)
sub    $0x54,%eax
ja     138a <descape+0x28a>
mov    -0x40(%rbp),%rax
lea    0xe37(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x5c,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x27,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x22,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x7,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x8,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x1b,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0xc,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0xa,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0xd,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0x9,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x28(%rbp)
movb   $0xb,(%rax,%rcx,1)
jmp    13d7 <descape+0x2d7>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x28(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x28(%rbp)
mov    %dl,(%rax,%rcx,1)
jmp    13fd <descape+0x2fd>
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x28(%rbp)
mov    %dl,(%rax,%rcx,1)
jmp    1402 <descape+0x302>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1152 <descape+0x52>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<descape>:
mov    $0x1,%eax
test   %rdi,%rdi
je     11b1 <descape+0xb1>
test   %rsi,%rsi
je     11b1 <descape+0xb1>
xor    %eax,%eax
test   %rdx,%rdx
je     11b1 <descape+0xb1>
lea    0xed7(%rip),%r8
xor    %r10d,%r10d
xor    %r9d,%r9d
jmp    1151 <descape+0x51>
movb   $0x5c,(%rdi,%r9,1)
add    $0x1,%r9
movzbl (%rsi,%r10,1),%r11d
nop
mov    %r11b,(%rdi,%r9,1)
add    $0x1,%r9
add    $0x1,%r10
cmp    %rdx,%r9
jae    11b1 <descape+0xb1>
movzbl (%rsi,%r10,1),%r11d
test   %r11b,%r11b
jle    11b1 <descape+0xb1>
cmp    $0x5c,%r11b
jne    1140 <descape+0x40>
movsbl 0x1(%rsi,%r10,1),%ecx
add    $0x1,%r10
add    $0xffffffde,%ecx
cmp    $0x54,%ecx
ja     1131 <descape+0x31>
mov    $0x5c,%r11b
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
jmp    *%rcx
mov    $0x22,%r11b
jmp    1140 <descape+0x40>
mov    $0x27,%r11b
jmp    1140 <descape+0x40>
mov    $0x7,%r11b
jmp    1140 <descape+0x40>
mov    $0x8,%r11b
jmp    1140 <descape+0x40>
mov    $0x1b,%r11b
jmp    1140 <descape+0x40>
mov    $0xc,%r11b
jmp    1140 <descape+0x40>
mov    $0xa,%r11b
jmp    1140 <descape+0x40>
mov    $0xd,%r11b
jmp    1140 <descape+0x40>
mov    $0x9,%r11b
jmp    1140 <descape+0x40>
mov    $0xb,%r11b
jmp    1140 <descape+0x40>
ret

LLVM IR (-O0):
define i32 @descape(i8* %0, i8* %1, i64 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
store i8* %0, i8** %5
store i8* %1, i8** %6
store i64 %2, i64* %7
%10 = load i8*, i8** %5
%11 = icmp ne i8* %10, null
br i1 %11, label %12, label %15
12: ; preds = %3
%13 = load i8*, i8** %6
%14 = icmp ne i8* %13, null
br i1 %14, label %16, label %15
15: ; preds = %12, %3
store i32 1, i32* %4
br label %154
16: ; preds = %12
store i64 0, i64* %8
store i64 0, i64* %9
store i64 0, i64* %8
store i64 0, i64* %9
br label %17
17: ; preds = %150, %16
%18 = load i64, i64* %8
%19 = load i64, i64* %7
%20 = icmp ult i64 %18, %19
br i1 %20, label %21, label %28
21: ; preds = %17
%22 = load i8*, i8** %6
%23 = load i64, i64* %9
%24 = getelementptr inbounds i8, i8* %22, i64 %23
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = icmp sgt i32 %26, 0
br label %28
28: ; preds = %21, %17
%29 = phi i1 [ false, %17 ], [ %27, %21 ]
br i1 %29, label %30, label %153
30: ; preds = %28
%31 = load i8*, i8** %6
%32 = load i64, i64* %9
%33 = getelementptr inbounds i8, i8* %31, i64 %32
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = icmp eq i32 %35, 92
br i1 %36, label %37, label %140
37: ; preds = %30
%38 = load i8*, i8** %6
%39 = load i64, i64* %9
%40 = add i64 %39, 1
%41 = getelementptr inbounds i8, i8* %38, i64 %40
%42 = load i8, i8* %41
%43 = sext i8 %42 to i32
switch i32 %43, label %121 [
i32 92, label %44
i32 39, label %51
i32 34, label %58
i32 97, label %65
i32 98, label %72
i32 101, label %79
i32 102, label %86
i32 110, label %93
i32 114, label %100
i32 116, label %107
i32 118, label %114
]
44: ; preds = %37
%45 = load i64, i64* %9
%46 = add i64 %45, 1
store i64 %46, i64* %9
%47 = load i8*, i8** %5
%48 = load i64, i64* %8
%49 = add i64 %48, 1
store i64 %49, i64* %8
%50 = getelementptr inbounds i8, i8* %47, i64 %48
store i8 92, i8* %50
br label %139
51: ; preds = %37
%52 = load i64, i64* %9
%53 = add i64 %52, 1
store i64 %53, i64* %9
%54 = load i8*, i8** %5
%55 = load i64, i64* %8
%56 = add i64 %55, 1
store i64 %56, i64* %8
%57 = getelementptr inbounds i8, i8* %54, i64 %55
store i8 39, i8* %57
br label %139
58: ; preds = %37
%59 = load i64, i64* %9
%60 = add i64 %59, 1
store i64 %60, i64* %9
%61 = load i8*, i8** %5
%62 = load i64, i64* %8
%63 = add i64 %62, 1
store i64 %63, i64* %8
%64 = getelementptr inbounds i8, i8* %61, i64 %62
store i8 34, i8* %64
br label %139
65: ; preds = %37
%66 = load i64, i64* %9
%67 = add i64 %66, 1
store i64 %67, i64* %9
%68 = load i8*, i8** %5
%69 = load i64, i64* %8
%70 = add i64 %69, 1
store i64 %70, i64* %8
%71 = getelementptr inbounds i8, i8* %68, i64 %69
store i8 7, i8* %71
br label %139
72: ; preds = %37
%73 = load i64, i64* %9
%74 = add i64 %73, 1
store i64 %74, i64* %9
%75 = load i8*, i8** %5
%76 = load i64, i64* %8
%77 = add i64 %76, 1
store i64 %77, i64* %8
%78 = getelementptr inbounds i8, i8* %75, i64 %76
store i8 8, i8* %78
br label %139
79: ; preds = %37
%80 = load i64, i64* %9
%81 = add i64 %80, 1
store i64 %81, i64* %9
%82 = load i8*, i8** %5
%83 = load i64, i64* %8
%84 = add i64 %83, 1
store i64 %84, i64* %8
%85 = getelementptr inbounds i8, i8* %82, i64 %83
store i8 27, i8* %85
br label %139
86: ; preds = %37
%87 = load i64, i64* %9
%88 = add i64 %87, 1
store i64 %88, i64* %9
%89 = load i8*, i8** %5
%90 = load i64, i64* %8
%91 = add i64 %90, 1
store i64 %91, i64* %8
%92 = getelementptr inbounds i8, i8* %89, i64 %90
store i8 12, i8* %92
br label %139
93: ; preds = %37
%94 = load i64, i64* %9
%95 = add i64 %94, 1
store i64 %95, i64* %9
%96 = load i8*, i8** %5
%97 = load i64, i64* %8
%98 = add i64 %97, 1
store i64 %98, i64* %8
%99 = getelementptr inbounds i8, i8* %96, i64 %97
store i8 10, i8* %99
br label %139
100: ; preds = %37
%101 = load i64, i64* %9
%102 = add i64 %101, 1
store i64 %102, i64* %9
%103 = load i8*, i8** %5
%104 = load i64, i64* %8
%105 = add i64 %104, 1
store i64 %105, i64* %8
%106 = getelementptr inbounds i8, i8* %103, i64 %104
store i8 13, i8* %106
br label %139
107: ; preds = %37
%108 = load i64, i64* %9
%109 = add i64 %108, 1
store i64 %109, i64* %9
%110 = load i8*, i8** %5
%111 = load i64, i64* %8
%112 = add i64 %111, 1
store i64 %112, i64* %8
%113 = getelementptr inbounds i8, i8* %110, i64 %111
store i8 9, i8* %113
br label %139
114: ; preds = %37
%115 = load i64, i64* %9
%116 = add i64 %115, 1
store i64 %116, i64* %9
%117 = load i8*, i8** %5
%118 = load i64, i64* %8
%119 = add i64 %118, 1
store i64 %119, i64* %8
%120 = getelementptr inbounds i8, i8* %117, i64 %118
store i8 11, i8* %120
br label %139
121: ; preds = %37
%122 = load i8*, i8** %6
%123 = load i64, i64* %9
%124 = add i64 %123, 1
store i64 %124, i64* %9
%125 = getelementptr inbounds i8, i8* %122, i64 %123
%126 = load i8, i8* %125
%127 = load i8*, i8** %5
%128 = load i64, i64* %8
%129 = add i64 %128, 1
store i64 %129, i64* %8
%130 = getelementptr inbounds i8, i8* %127, i64 %128
store i8 %126, i8* %130
%131 = load i8*, i8** %6
%132 = load i64, i64* %9
%133 = getelementptr inbounds i8, i8* %131, i64 %132
%134 = load i8, i8* %133
%135 = load i8*, i8** %5
%136 = load i64, i64* %8
%137 = add i64 %136, 1
store i64 %137, i64* %8
%138 = getelementptr inbounds i8, i8* %135, i64 %136
store i8 %134, i8* %138
br label %139
139: ; preds = %121, %114, %107, %100, %93, %86, %79, %72, %65, %58, %51, %44
br label %149
140: ; preds = %30
%141 = load i8*, i8** %6
%142 = load i64, i64* %9
%143 = getelementptr inbounds i8, i8* %141, i64 %142
%144 = load i8, i8* %143
%145 = load i8*, i8** %5
%146 = load i64, i64* %8
%147 = add i64 %146, 1
store i64 %147, i64* %8
%148 = getelementptr inbounds i8, i8* %145, i64 %146
store i8 %144, i8* %148
br label %149
149: ; preds = %140, %139
br label %150
150: ; preds = %149
%151 = load i64, i64* %9
%152 = add i64 %151, 1
store i64 %152, i64* %9
br label %17
153: ; preds = %28
store i32 0, i32* %4
br label %154
154: ; preds = %153, %15
%155 = load i32, i32* %4
ret i32 %155
}

LLVM IR (-O2):
define i32 @descape(i8* writeonly %0, i8* %1, i64 %2) {
%4 = icmp ne i8* %0, null
%5 = icmp ne i8* %1, null
%6 = and i1 %4, %5
br i1 %6, label %7, label %44
7: ; preds = %3
%8 = icmp eq i64 %2, 0
br i1 %8, label %44, label %9
9: ; preds = %7, %36
%10 = phi i64 [ %42, %36 ], [ 0, %7 ]
%11 = phi i64 [ %41, %36 ], [ 0, %7 ]
%12 = getelementptr inbounds i8, i8* %1, i64 %10
%13 = load i8, i8* %12
%14 = icmp sgt i8 %13, 0
br i1 %14, label %15, label %44
15: ; preds = %9
%16 = icmp eq i8 %13, 92
br i1 %16, label %17, label %36
17: ; preds = %15
%18 = add i64 %10, 1
%19 = getelementptr inbounds i8, i8* %1, i64 %18
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
switch i32 %21, label %32 [
i32 92, label %36
i32 39, label %22
i32 34, label %23
i32 97, label %24
i32 98, label %25
i32 101, label %26
i32 102, label %27
i32 110, label %28
i32 114, label %29
i32 116, label %30
i32 118, label %31
]
22: ; preds = %17
br label %36
23: ; preds = %17
br label %36
24: ; preds = %17
br label %36
25: ; preds = %17
br label %36
26: ; preds = %17
br label %36
27: ; preds = %17
br label %36
28: ; preds = %17
br label %36
29: ; preds = %17
br label %36
30: ; preds = %17
br label %36
31: ; preds = %17
br label %36
32: ; preds = %17
%33 = add nuw i64 %11, 1
%34 = getelementptr inbounds i8, i8* %0, i64 %11
store i8 92, i8* %34
%35 = load i8, i8* %19
br label %36
36: ; preds = %15, %17, %32, %31, %30, %29, %28, %27, %26, %25, %24, %23, %22
%37 = phi i64 [ %33, %32 ], [ %11, %31 ], [ %11, %30 ], [ %11, %29 ], [ %11, %28 ], [ %11, %27 ], [ %11, %26 ], [ %11, %25 ], [ %11, %24 ], [ %11, %23 ], [ %11, %22 ], [ %11, %17 ], [ %11, %15 ]
%38 = phi i8 [ %35, %32 ], [ 11, %31 ], [ 9, %30 ], [ 13, %29 ], [ 10, %28 ], [ 12, %27 ], [ 27, %26 ], [ 8, %25 ], [ 7, %24 ], [ 34, %23 ], [ 39, %22 ], [ 92, %17 ], [ %13, %15 ]
%39 = phi i64 [ %18, %32 ], [ %18, %31 ], [ %18, %30 ], [ %18, %29 ], [ %18, %28 ], [ %18, %27 ], [ %18, %26 ], [ %18, %25 ], [ %18, %24 ], [ %18, %23 ], [ %18, %22 ], [ %18, %17 ], [ %10, %15 ]
%40 = getelementptr inbounds i8, i8* %0, i64 %37
store i8 %38, i8* %40
%41 = add i64 %37, 1
%42 = add i64 %39, 1
%43 = icmp ult i64 %41, %2
br i1 %43, label %9, label %44
44: ; preds = %36, %9, %7, %3
%45 = phi i32 [ 1, %3 ], [ 0, %7 ], [ 0, %9 ], [ 0, %36 ]
ret i32 %45
}