#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 */
unsigned char *new_mem(int);
unsigned char *quote_string(unsigned char *str, int len) {
  unsigned char *qstr;
  int i, j;
  if (!str || !len)
    return NULL;
  qstr = new_mem(4 * len + 1);
  for (i = j = 0; i < len; i++) {
    if (str[i] == '\\' || str[i] == '"' || str[i] == '?') {
      qstr[j++] = '\\';
      qstr[j++] = str[i];
    } else if (str[i] == '\n') {
      qstr[j++] = '\\';
      qstr[j++] = 'n';
    } else if (str[i] == '\t') {
      qstr[j++] = '\\';
      qstr[j++] = 't';
    } else if (str[i] < ' ') {
      qstr[j++] = '\\';
      qstr[j++] = (str[i] >> 6) + '0';
      qstr[j++] = ((str[i] >> 3) & 7) + '0';
      qstr[j++] = (str[i] & 7) + '0';
    } else {
      qstr[j++] = str[i];
    }
  }
  return qstr;
}


x86 assembly (clang, -O0):
<quote_string>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpq   $0x0,-0x10(%rbp)
je     1134 <quote_string+0x24>
cmpl   $0x0,-0x14(%rbp)
jne    1141 <quote_string+0x31>
movq   $0x0,-0x8(%rbp)
jmp    136b <quote_string+0x25b>
mov    -0x14(%rbp),%edi
shl    $0x2,%edi
add    $0x1,%edi
call   1030 <new_mem@plt>
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1363 <quote_string+0x253>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
je     11ac <quote_string+0x9c>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x22,%eax
je     11ac <quote_string+0x9c>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x3f,%eax
jne    11e7 <quote_string+0xd7>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1350 <quote_string+0x240>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
jne    122d <quote_string+0x11d>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x6e,(%rax,%rcx,1)
jmp    134b <quote_string+0x23b>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
jne    1273 <quote_string+0x163>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x74,(%rax,%rcx,1)
jmp    1346 <quote_string+0x236>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
jge    1321 <quote_string+0x211>
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x28(%rbp)
movslq %ecx,%rcx
movb   $0x5c,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x6,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sar    $0x3,%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
and    $0x7,%eax
add    $0x30,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1341 <quote_string+0x231>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x28(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1346 <quote_string+0x236>
jmp    134b <quote_string+0x23b>
jmp    1350 <quote_string+0x240>
jmp    1355 <quote_string+0x245>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1161 <quote_string+0x51>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<quote_string>:
push   %r14
push   %rbx
push   %rax
xor    %eax,%eax
test   %rdi,%rdi
je     11f3 <quote_string+0xe3>
mov    %esi,%r14d
test   %esi,%esi
je     11f3 <quote_string+0xe3>
mov    %rdi,%rbx
lea    0x1(,%r14,4),%edi
call   1030 <new_mem@plt>
test   %r14d,%r14d
jle    11f3 <quote_string+0xe3>
mov    %r14d,%r8d
xor    %edx,%edx
xor    %esi,%esi
jmp    1174 <quote_string+0x64>
nopl   0x0(%rax)
movslq %esi,%rcx
add    $0x1,%esi
movb   $0x5c,(%rax,%rcx,1)
movzbl (%rbx,%rdx,1),%ecx
movslq %esi,%rsi
mov    %cl,(%rax,%rsi,1)
add    $0x1,%esi
add    $0x1,%rdx
cmp    %rdx,%r8
je     11f3 <quote_string+0xe3>
movzbl (%rbx,%rdx,1),%ecx
cmp    $0x21,%cl
jle    1190 <quote_string+0x80>
cmp    $0x22,%cl
je     1150 <quote_string+0x40>
cmp    $0x5c,%cl
je     1150 <quote_string+0x40>
cmp    $0x3f,%cl
je     1150 <quote_string+0x40>
jmp    11b6 <quote_string+0xa6>
xchg   %ax,%ax
cmp    $0x9,%cl
je     11a8 <quote_string+0x98>
cmp    $0xa,%cl
jne    11b6 <quote_string+0xa6>
movslq %esi,%rcx
add    $0x1,%esi
movb   $0x5c,(%rax,%rcx,1)
mov    $0x6e,%cl
jmp    115e <quote_string+0x4e>
movslq %esi,%rcx
add    $0x1,%esi
movb   $0x5c,(%rax,%rcx,1)
mov    $0x74,%cl
jmp    115e <quote_string+0x4e>
cmp    $0x1f,%cl
ja     115e <quote_string+0x4e>
movslq %esi,%rdi
movb   $0x5c,(%rax,%rdi,1)
movzbl (%rbx,%rdx,1),%ecx
shr    $0x6,%cl
or     $0x30,%cl
mov    %cl,0x1(%rax,%rdi,1)
movzbl (%rbx,%rdx,1),%ecx
shr    $0x3,%cl
and    $0x7,%cl
or     $0x30,%cl
add    $0x3,%esi
mov    %cl,0x2(%rax,%rdi,1)
movzbl (%rbx,%rdx,1),%ecx
and    $0x7,%cl
or     $0x30,%cl
jmp    115e <quote_string+0x4e>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

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