#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 /*<<< orphan*/ index(char *, char);
int read_slashed(char **strp) {
  char *str;
  char c;
  str = *strp;
  if (*str != '\\') {
    *strp = (*strp) + 1;
    return (*str);
  }
  str++;
  c = *str;
  switch (c) {
  default:
    if (index("0123456789", c) == 0)
      break;
    c -= '0';
    if (index("0123456789", str[1]) == 0)
      break;
    str++;
    c = (c * 8) + (*str - '0');
    if (index("0123456789", str[1]) == 0)
      break;
    str++;
    c = (c * 8) + (*str - '0');
    break;
  case 'n':
    c = '\n';
    break;
  case 't':
    c = '\t';
    break;
  case 'E':
    c = '\033';
    break;
  case 'f':
    c = '\f';
    break;
  case 'r':
    c = '\r';
    break;
  }
  *strp = str + 1;
  return (c);
}


x86 assembly (clang, -O0):
<read_slashed>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
je     1158 <read_slashed+0x48>
mov    -0x10(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    128a <read_slashed+0x17a>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%al
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
add    $0xffffffbb,%eax
mov    %eax,%ecx
mov    %rcx,-0x28(%rbp)
sub    $0x2f,%eax
ja     1197 <read_slashed+0x87>
mov    -0x28(%rbp),%rax
lea    0xe72(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    0xf22(%rip),%rdi
movsbl -0x19(%rbp),%esi
call   1030 <index@plt>
cmp    $0x0,%eax
jne    11b5 <read_slashed+0xa5>
jmp    1274 <read_slashed+0x164>
movsbl -0x19(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x19(%rbp)
mov    -0x18(%rbp),%rax
lea    0xef6(%rip),%rdi
movsbl 0x1(%rax),%esi
call   1030 <index@plt>
cmp    $0x0,%eax
jne    11e1 <read_slashed+0xd1>
jmp    1274 <read_slashed+0x164>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movsbl -0x19(%rbp),%eax
shl    $0x3,%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x19(%rbp)
mov    -0x18(%rbp),%rax
lea    0xeb2(%rip),%rdi
movsbl 0x1(%rax),%esi
call   1030 <index@plt>
cmp    $0x0,%eax
jne    1225 <read_slashed+0x115>
jmp    1274 <read_slashed+0x164>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
movsbl -0x19(%rbp),%eax
shl    $0x3,%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
sub    $0x30,%ecx
add    %ecx,%eax
mov    %al,-0x19(%rbp)
jmp    1274 <read_slashed+0x164>
movb   $0xa,-0x19(%rbp)
jmp    1274 <read_slashed+0x164>
movb   $0x9,-0x19(%rbp)
jmp    1274 <read_slashed+0x164>
movb   $0x1b,-0x19(%rbp)
jmp    1274 <read_slashed+0x164>
movb   $0xc,-0x19(%rbp)
jmp    1274 <read_slashed+0x164>
movb   $0xd,-0x19(%rbp)
mov    -0x18(%rbp),%rcx
add    $0x1,%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
movsbl -0x19(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<read_slashed>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %rdi,%r14
mov    (%rdi),%rbx
lea    0x1(%rbx),%r15
cmpb   $0x5c,(%rbx)
jne    1150 <read_slashed+0x40>
movsbl (%r15),%r12d
lea    -0x45(%r12),%eax
cmp    $0x2f,%eax
ja     115b <read_slashed+0x4b>
mov    $0xa,%bpl
lea    0xec1(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    $0x1b,%bpl
jmp    11d6 <read_slashed+0xc6>
mov    %r15,(%r14)
mov    (%rbx),%bpl
jmp    11dd <read_slashed+0xcd>
movsbl %r12b,%esi
lea    0xf5a(%rip),%rdi
call   1030 <index@plt>
test   %eax,%eax
je     11ca <read_slashed+0xba>
add    $0xd0,%r12b
movsbl 0x2(%rbx),%esi
lea    0xf42(%rip),%rdi
call   1030 <index@plt>
test   %eax,%eax
je     11ca <read_slashed+0xba>
shl    $0x3,%r12b
add    0x2(%rbx),%r12b
mov    %r12d,%ebp
add    $0xd0,%bpl
movsbl 0x3(%rbx),%esi
lea    0xf1f(%rip),%rdi
call   1030 <index@plt>
test   %eax,%eax
je     11cf <read_slashed+0xbf>
add    $0x3,%rbx
shl    $0x3,%bpl
add    (%rbx),%bpl
add    $0xd0,%bpl
jmp    11d3 <read_slashed+0xc3>
mov    $0xc,%bpl
jmp    11d6 <read_slashed+0xc6>
mov    $0xd,%bpl
jmp    11d6 <read_slashed+0xc6>
mov    $0x9,%bpl
jmp    11d6 <read_slashed+0xc6>
mov    %r12d,%ebp
jmp    11d6 <read_slashed+0xc6>
add    $0x2,%rbx
mov    %rbx,%r15
add    $0x1,%r15
mov    %r15,(%r14)
movsbl %bpl,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [11 x i8] c"0123456789\00"
define i32 @read_slashed(i8** %0) {
%2 = alloca i32
%3 = alloca i8**
%4 = alloca i8*
%5 = alloca i8
store i8** %0, i8*** %3
%6 = load i8**, i8*** %3
%7 = load i8*, i8** %6
store i8* %7, i8** %4
%8 = load i8*, i8** %4
%9 = load i8, i8* %8
%10 = sext i8 %9 to i32
%11 = icmp ne i32 %10, 92
br i1 %11, label %12, label %20
12: ; preds = %1
%13 = load i8**, i8*** %3
%14 = load i8*, i8** %13
%15 = getelementptr inbounds i8, i8* %14, i64 1
%16 = load i8**, i8*** %3
store i8* %15, i8** %16
%17 = load i8*, i8** %4
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
store i32 %19, i32* %2
br label %84
20: ; preds = %1
%21 = load i8*, i8** %4
%22 = getelementptr inbounds i8, i8* %21, i32 1
store i8* %22, i8** %4
%23 = load i8*, i8** %4
%24 = load i8, i8* %23
store i8 %24, i8* %5
%25 = load i8, i8* %5
%26 = sext i8 %25 to i32
switch i32 %26, label %27 [
i32 110, label %73
i32 116, label %74
i32 69, label %75
i32 102, label %76
i32 114, label %77
]
27: ; preds = %20
%28 = load i8, i8* %5
%29 = call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %28)
%30 = icmp eq i32 %29, 0
br i1 %30, label %31, label %32
31: ; preds = %27
br label %78
32: ; preds = %27
%33 = load i8, i8* %5
%34 = sext i8 %33 to i32
%35 = sub nsw i32 %34, 48
%36 = trunc i32 %35 to i8
store i8 %36, i8* %5
%37 = load i8*, i8** %4
%38 = getelementptr inbounds i8, i8* %37, i64 1
%39 = load i8, i8* %38
%40 = call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %39)
%41 = icmp eq i32 %40, 0
br i1 %41, label %42, label %43
42: ; preds = %32
br label %78
43: ; preds = %32
%44 = load i8*, i8** %4
%45 = getelementptr inbounds i8, i8* %44, i32 1
store i8* %45, i8** %4
%46 = load i8, i8* %5
%47 = sext i8 %46 to i32
%48 = mul nsw i32 %47, 8
%49 = load i8*, i8** %4
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = sub nsw i32 %51, 48
%53 = add nsw i32 %48, %52
%54 = trunc i32 %53 to i8
store i8 %54, i8* %5
%55 = load i8*, i8** %4
%56 = getelementptr inbounds i8, i8* %55, i64 1
%57 = load i8, i8* %56
%58 = call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %57)
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %61
60: ; preds = %43
br label %78
61: ; preds = %43
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i32 1
store i8* %63, i8** %4
%64 = load i8, i8* %5
%65 = sext i8 %64 to i32
%66 = mul nsw i32 %65, 8
%67 = load i8*, i8** %4
%68 = load i8, i8* %67
%69 = sext i8 %68 to i32
%70 = sub nsw i32 %69, 48
%71 = add nsw i32 %66, %70
%72 = trunc i32 %71 to i8
store i8 %72, i8* %5
br label %78
73: ; preds = %20
store i8 10, i8* %5
br label %78
74: ; preds = %20
store i8 9, i8* %5
br label %78
75: ; preds = %20
store i8 27, i8* %5
br label %78
76: ; preds = %20
store i8 12, i8* %5
br label %78
77: ; preds = %20
store i8 13, i8* %5
br label %78
78: ; preds = %77, %76, %75, %74, %73, %61, %60, %42, %31
%79 = load i8*, i8** %4
%80 = getelementptr inbounds i8, i8* %79, i64 1
%81 = load i8**, i8*** %3
store i8* %80, i8** %81
%82 = load i8, i8* %5
%83 = sext i8 %82 to i32
store i32 %83, i32* %2
br label %84
84: ; preds = %78, %12
%85 = load i32, i32* %2
ret i32 %85
}

LLVM IR (-O2):
@.str = [11 x i8] c"0123456789\00"
define i32 @read_slashed(i8** nocapture %0) {
%2 = load i8*, i8** %0
%3 = load i8, i8* %2
%4 = icmp eq i8 %3, 92
%5 = getelementptr inbounds i8, i8* %2, i64 1
br i1 %4, label %8, label %6
6: ; preds = %1
store i8* %5, i8** %0
%7 = load i8, i8* %2
br label %42
8: ; preds = %1
%9 = load i8, i8* %5
%10 = sext i8 %9 to i32
switch i32 %10, label %11 [
i32 110, label %38
i32 116, label %34
i32 69, label %35
i32 102, label %36
i32 114, label %37
]
11: ; preds = %8
%12 = tail call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %9)
%13 = icmp eq i32 %12, 0
br i1 %13, label %38, label %14
14: ; preds = %11
%15 = add i8 %9, -48
%16 = getelementptr inbounds i8, i8* %2, i64 2
%17 = load i8, i8* %16
%18 = tail call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %17)
%19 = icmp eq i32 %18, 0
br i1 %19, label %38, label %20
20: ; preds = %14
%21 = shl i8 %15, 3
%22 = load i8, i8* %16
%23 = add i8 %21, -48
%24 = add i8 %23, %22
%25 = getelementptr inbounds i8, i8* %2, i64 3
%26 = load i8, i8* %25
%27 = tail call i32 @index(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8 signext %26)
%28 = icmp eq i32 %27, 0
br i1 %28, label %38, label %29
29: ; preds = %20
%30 = shl i8 %24, 3
%31 = load i8, i8* %25
%32 = add i8 %30, -48
%33 = add i8 %32, %31
br label %38
34: ; preds = %8
br label %38
35: ; preds = %8
br label %38
36: ; preds = %8
br label %38
37: ; preds = %8
br label %38
38: ; preds = %8, %20, %14, %11, %37, %36, %35, %34, %29
%39 = phi i8* [ %5, %11 ], [ %5, %14 ], [ %16, %20 ], [ %25, %29 ], [ %5, %37 ], [ %5, %36 ], [ %5, %35 ], [ %5, %34 ], [ %5, %8 ]
%40 = phi i8 [ %9, %11 ], [ %15, %14 ], [ %24, %20 ], [ %33, %29 ], [ 13, %37 ], [ 12, %36 ], [ 27, %35 ], [ 9, %34 ], [ 10, %8 ]
%41 = getelementptr inbounds i8, i8* %39, i64 1
store i8* %41, i8** %0
br label %42
42: ; preds = %38, %6
%43 = phi i8 [ %7, %6 ], [ %40, %38 ]
%44 = sext i8 %43 to i32
ret i32 %44
}