int try_backslash(char **cc, long *val) {
  long ret;
  char *c = *cc;
  if (*c++ != '\\')
    return 0;
  switch (*c) {
  case 0:
    return 0;
  case 'a':
    ret = '\a';
    c++;
    break;
  case 'b':
    ret = '\b';
    c++;
    break;
  case 'f':
    ret = '\f';
    c++;
    break;
  case 'n':
    ret = '\n';
    c++;
    break;
  case 'r':
    ret = '\r';
    c++;
    break;
  case 't':
    ret = '\t';
    c++;
    break;
  case 'v':
    ret = '\v';
    c++;
    break;
  case '\\':
  case '\'':
  case '\"':
    ret = *c++;
    break;
  default:
    if (*c >= '0' && *c <= '7') {
      ret = *c++ - '0';
      if (*c >= '0' && *c <= '7') {
        ret <<= 3;
        ret |= *c++ - '0';
        if (*c >= '0' && *c <= '7') {
          ret <<= 3;
          ret |= *c++ - '0';
        }
      }
    } else {
      ret = *c++;
    }
    break;
  }
  *cc = c;
  *val = ret;
  return 1;
}


x86 assembly (clang, -O0):
<try_backslash>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
cmp    $0x5c,%eax
je     113e <try_backslash+0x3e>
movl   $0x0,-0x4(%rbp)
jmp    13ea <try_backslash+0x2ea>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
test   %eax,%eax
je     11ff <try_backslash+0xff>
jmp    1155 <try_backslash+0x55>
mov    -0x2c(%rbp),%eax
sub    $0x22,%eax
je     12ba <try_backslash+0x1ba>
jmp    1166 <try_backslash+0x66>
mov    -0x2c(%rbp),%eax
sub    $0x27,%eax
je     12ba <try_backslash+0x1ba>
jmp    1177 <try_backslash+0x77>
mov    -0x2c(%rbp),%eax
sub    $0x5c,%eax
je     12ba <try_backslash+0x1ba>
jmp    1188 <try_backslash+0x88>
mov    -0x2c(%rbp),%eax
sub    $0x61,%eax
je     120b <try_backslash+0x10b>
jmp    1199 <try_backslash+0x99>
mov    -0x2c(%rbp),%eax
sub    $0x62,%eax
je     1224 <try_backslash+0x124>
jmp    11aa <try_backslash+0xaa>
mov    -0x2c(%rbp),%eax
sub    $0x66,%eax
je     123d <try_backslash+0x13d>
jmp    11bb <try_backslash+0xbb>
mov    -0x2c(%rbp),%eax
sub    $0x6e,%eax
je     1256 <try_backslash+0x156>
jmp    11cc <try_backslash+0xcc>
mov    -0x2c(%rbp),%eax
sub    $0x72,%eax
je     126f <try_backslash+0x16f>
jmp    11dd <try_backslash+0xdd>
mov    -0x2c(%rbp),%eax
sub    $0x74,%eax
je     1288 <try_backslash+0x188>
jmp    11ee <try_backslash+0xee>
mov    -0x2c(%rbp),%eax
sub    $0x76,%eax
je     12a1 <try_backslash+0x1a1>
jmp    12d6 <try_backslash+0x1d6>
movl   $0x0,-0x4(%rbp)
jmp    13ea <try_backslash+0x2ea>
movq   $0x7,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0x8,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0xc,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0xa,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0xd,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0x9,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
movq   $0xb,-0x20(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    13cd <try_backslash+0x2cd>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbq (%rax),%rax
mov    %rax,-0x20(%rbp)
jmp    13cd <try_backslash+0x2cd>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     13b1 <try_backslash+0x2b1>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x37,%eax
jg     13b1 <try_backslash+0x2b1>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
sub    $0x30,%eax
cltq
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     13ac <try_backslash+0x2ac>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x37,%eax
jg     13ac <try_backslash+0x2ac>
mov    -0x20(%rbp),%rax
shl    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
sub    $0x30,%eax
cltq
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     13a7 <try_backslash+0x2a7>
mov    -0x28(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x37,%eax
jg     13a7 <try_backslash+0x2a7>
mov    -0x20(%rbp),%rax
shl    $0x3,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbl (%rax),%eax
sub    $0x30,%eax
cltq
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    13ac <try_backslash+0x2ac>
jmp    13c8 <try_backslash+0x2c8>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
movsbq (%rax),%rax
mov    %rax,-0x20(%rbp)
jmp    13cd <try_backslash+0x2cd>
mov    -0x28(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<try_backslash>:
mov    (%rdi),%rcx
xor    %eax,%eax
cmpb   $0x5c,(%rcx)
jne    11fe <try_backslash+0xfe>
movsbl 0x1(%rcx),%eax
movslq %eax,%r8
lea    -0x22(%r8),%edx
cmp    $0x54,%edx
ja     1137 <try_backslash+0x37>
lea    0xedb(%rip),%r9
movslq (%r9,%rdx,4),%rdx
add    %r9,%rdx
jmp    *%rdx
add    $0x2,%rcx
jmp    11f0 <try_backslash+0xf0>
test   %eax,%eax
je     11fe <try_backslash+0xfe>
mov    %eax,%r9d
and    $0xf8,%r9b
lea    0x2(%rcx),%rdx
cmp    $0x30,%r9b
jne    11f3 <try_backslash+0xf3>
mov    %eax,%r8d
add    $0xffffffd0,%r8d
movzbl (%rdx),%r10d
mov    %r10d,%eax
and    $0xf8,%al
cmp    $0x30,%al
jne    11f3 <try_backslash+0xf3>
mov    $0xffffffd0,%r9d
mov    %r8,%rax
shl    $0x3,%rax
add    %r9d,%r10d
mov    %r10,%r8
or     %rax,%r8
movzbl 0x3(%rcx),%edx
mov    %edx,%eax
and    $0xf8,%al
cmp    $0x30,%al
jne    11ff <try_backslash+0xff>
shl    $0x3,%r8
add    $0x4,%rcx
add    %r9d,%edx
or     %rdx,%r8
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0x7,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0x8,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0xc,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0xa,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0xd,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0x9,%r8d
jmp    11f0 <try_backslash+0xf0>
add    $0x2,%rcx
mov    $0xb,%r8d
mov    %rcx,%rdx
mov    %rdx,(%rdi)
mov    %r8,(%rsi)
mov    $0x1,%eax
ret
add    $0x3,%rcx
jmp    11f0 <try_backslash+0xf0>

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

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