unsigned str_char_to_int(const char *str, unsigned f_char, unsigned l_char) {
  unsigned out = 0x00000000, i, off = 0;
  for (i = 0; i < l_char - f_char - 1; i++) {
    if (i - off > 3)
      continue;
    if (str[i + f_char + 1] == '\\') {
      off++;
      i++;
      if (str[i + f_char + 1] == 'n') {
        out |= '\n' << 8 * (i - off);
        continue;
      } else if (str[i + f_char + 1] == 't') {
        out |= '\t' << 8 * (i - off);
        continue;
      } else if (str[i + f_char + 1] == '0') {
        out |= '\0' << 8 * (i - off);
        continue;
      }
    }
    out |= str[i + f_char + 1] << 8 * (i - off);
  }
  return out;
}


x86 assembly (clang, -O0):
<str_char_to_int>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    -0xc(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jae    125c <str_char_to_int+0x15c>
mov    -0x18(%rbp),%eax
sub    -0x1c(%rbp),%eax
cmp    $0x3,%eax
jbe    114b <str_char_to_int+0x4b>
jmp    124e <str_char_to_int+0x14e>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0xc(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
jne    122a <str_char_to_int+0x12a>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0xc(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x6e,%eax
jne    11b0 <str_char_to_int+0xb0>
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
shl    $0x3,%ecx
mov    $0xa,%eax
shl    %cl,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    124e <str_char_to_int+0x14e>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0xc(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x74,%eax
jne    11e7 <str_char_to_int+0xe7>
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
shl    $0x3,%ecx
mov    $0x9,%eax
shl    %cl,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    124e <str_char_to_int+0x14e>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0xc(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jne    121b <str_char_to_int+0x11b>
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
shl    $0x3,%ecx
xor    %eax,%eax
shl    %cl,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
jmp    124e <str_char_to_int+0x14e>
jmp    1220 <str_char_to_int+0x120>
jmp    1225 <str_char_to_int+0x125>
jmp    122a <str_char_to_int+0x12a>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
add    -0xc(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%ecx
sub    -0x1c(%rbp),%ecx
shl    $0x3,%ecx
shl    %cl,%eax
or     -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1123 <str_char_to_int+0x23>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<str_char_to_int>:
mov    %esi,%r8d
not    %r8d
add    %edx,%r8d
je     1190 <str_char_to_int+0x90>
add    $0x1,%esi
xor    %r9d,%r9d
xor    %r11d,%r11d
xor    %eax,%eax
jmp    1134 <str_char_to_int+0x34>
nopl   0x0(%rax)
movsbl %r10b,%edx
shl    $0x3,%ecx
shl    %cl,%edx
or     %edx,%eax
add    $0x1,%r11d
cmp    %r8d,%r11d
jae    118f <str_char_to_int+0x8f>
mov    %r11d,%ecx
sub    %r9d,%ecx
cmp    $0x3,%ecx
ja     112b <str_char_to_int+0x2b>
lea    (%rsi,%r11,1),%edx
movzbl (%rdi,%rdx,1),%r10d
cmp    $0x5c,%r10b
jne    1120 <str_char_to_int+0x20>
add    $0x1,%r9d
mov    %r11d,%ecx
add    $0x1,%r11d
add    %esi,%ecx
add    $0x1,%ecx
movzbl (%rdi,%rcx,1),%r10d
cmp    $0x30,%r10b
je     112b <str_char_to_int+0x2b>
mov    %r11d,%ecx
sub    %r9d,%ecx
cmp    $0x6e,%r10b
je     1185 <str_char_to_int+0x85>
cmp    $0x74,%r10b
jne    1120 <str_char_to_int+0x20>
shl    $0x3,%ecx
mov    $0x9,%edx
jmp    1127 <str_char_to_int+0x27>
shl    $0x3,%ecx
mov    $0xa,%edx
jmp    1127 <str_char_to_int+0x27>
ret
xor    %eax,%eax
ret

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

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