#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 strtol(char *, int /*<<< orphan*/ *, int);
int preproc_util_extractnumber(char *s) {
  int a = 0;
  int c = 0;
  while (s[a] != 0x0) {
    switch (s[a]) {
    case '&':
      return strtol(&s[a + 1], NULL, 16);
      break;
    case '#':
      return strtol(&s[a + 1], NULL, 16);
      break;
    case '$':
      return strtol(&s[a + 1], NULL, 16);
      break;
    case '%':
      return strtol(&s[a + 1], NULL, 2);
      break;
    case 'H':
      return strtol(&s[c], NULL, 16);
      break;
    case 'h':
      return strtol(&s[c], NULL, 16);
      break;
    case '0':
      if (s[a + 1] == 'x') {
        return strtol(&s[a], NULL, 16);
      } else {
        if (!c) {
          c = a;
        }
      }
      break;
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      if (!c) {
        c = a;
      }
      break;
    default:
      if (c) {
        return strtol(&s[c], NULL, 10);
        break;
      }
    };
    a++;
  }
  return -1;
}


x86 assembly (clang, -O0):
<preproc_util_extractnumber>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     12ef <preproc_util_extractnumber+0x1df>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
add    $0xffffffdd,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x45,%eax
ja     12b1 <preproc_util_extractnumber+0x1a1>
mov    -0x20(%rbp),%rax
lea    0xe98(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%eax
add    $0x1,%eax
cltq
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%eax
add    $0x1,%eax
cltq
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%eax
add    $0x1,%eax
cltq
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%eax
add    $0x1,%eax
cltq
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x2,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
mov    -0x10(%rbp),%rax
mov    -0x14(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x78,%eax
jne    1282 <preproc_util_extractnumber+0x172>
mov    -0x10(%rbp),%rdi
movslq -0x14(%rbp),%rax
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0x10,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
cmpl   $0x0,-0x18(%rbp)
jne    1292 <preproc_util_extractnumber+0x182>
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    1297 <preproc_util_extractnumber+0x187>
jmp    12e1 <preproc_util_extractnumber+0x1d1>
cmpl   $0x0,-0x18(%rbp)
jne    12ac <preproc_util_extractnumber+0x19c>
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
jmp    12e1 <preproc_util_extractnumber+0x1d1>
cmpl   $0x0,-0x18(%rbp)
je     12dc <preproc_util_extractnumber+0x1cc>
mov    -0x10(%rbp),%rdi
movslq -0x18(%rbp),%rax
add    %rax,%rdi
xor    %eax,%eax
mov    %eax,%esi
mov    $0xa,%edx
call   1030 <strtol@plt>
mov    %eax,-0x4(%rbp)
jmp    12f6 <preproc_util_extractnumber+0x1e6>
jmp    12e1 <preproc_util_extractnumber+0x1d1>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    112a <preproc_util_extractnumber+0x1a>
movl   $0xffffffff,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<preproc_util_extractnumber>:
mov    (%rdi),%cl
test   %cl,%cl
je     117d <preproc_util_extractnumber+0x6d>
xor    %eax,%eax
lea    0xee1(%rip),%r8
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsbl %cl,%ecx
lea    -0x31(%rcx),%edx
cmp    $0x9,%edx
jae    1153 <preproc_util_extractnumber+0x43>
test   %esi,%esi
mov    %eax,%edx
cmovne %esi,%edx
movzbl 0x1(%rdi,%rax,1),%ecx
add    $0x1,%rax
mov    %edx,%esi
test   %cl,%cl
jne    1130 <preproc_util_extractnumber+0x20>
jmp    117d <preproc_util_extractnumber+0x6d>
add    $0xffffffdd,%ecx
cmp    $0x45,%ecx
ja     116d <preproc_util_extractnumber+0x5d>
movslq (%r8,%rcx,4),%rcx
add    %r8,%rcx
jmp    *%rcx
cmpb   $0x78,0x1(%rdi,%rax,1)
jne    113b <preproc_util_extractnumber+0x2b>
jmp    1197 <preproc_util_extractnumber+0x87>
xor    %edx,%edx
test   %esi,%esi
je     1142 <preproc_util_extractnumber+0x32>
movslq %esi,%rax
mov    $0xa,%edx
jmp    119e <preproc_util_extractnumber+0x8e>
mov    $0xffffffff,%eax
ret
add    $0x1,%eax
jmp    1199 <preproc_util_extractnumber+0x89>
movslq %esi,%rax
jmp    1199 <preproc_util_extractnumber+0x89>
add    $0x1,%eax
mov    $0x2,%edx
jmp    119e <preproc_util_extractnumber+0x8e>
mov    %eax,%eax
mov    $0x10,%edx
add    %rax,%rdi
xor    %esi,%esi
jmp    1030 <strtol@plt>

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

LLVM IR (-O2):
define i32 @preproc_util_extractnumber(i8* nocapture %0) {
%2 = load i8, i8* %0
%3 = icmp eq i8 %2, 0
br i1 %3, label %55, label %4
4: ; preds = %1, %44
%5 = phi i64 [ %46, %44 ], [ 0, %1 ]
%6 = phi i8 [ %48, %44 ], [ %2, %1 ]
%7 = phi i32 [ %45, %44 ], [ 0, %1 ]
%8 = sext i8 %6 to i32
switch i32 %8, label %40 [
i32 38, label %9
i32 35, label %12
i32 36, label %15
i32 37, label %18
i32 72, label %21
i32 104, label %23
i32 48, label %25
i32 49, label %36
i32 50, label %36
i32 51, label %36
i32 52, label %36
i32 53, label %36
i32 54, label %36
i32 55, label %36
i32 56, label %36
i32 57, label %36
]
9: ; preds = %4
%10 = add i64 %5, 1
%11 = and i64 %10, 4294967295
br label %50
12: ; preds = %4
%13 = add i64 %5, 1
%14 = and i64 %13, 4294967295
br label %50
15: ; preds = %4
%16 = add i64 %5, 1
%17 = and i64 %16, 4294967295
br label %50
18: ; preds = %4
%19 = add i64 %5, 1
%20 = and i64 %19, 4294967295
br label %50
21: ; preds = %4
%22 = sext i32 %7 to i64
br label %50
23: ; preds = %4
%24 = sext i32 %7 to i64
br label %50
25: ; preds = %4
%26 = add nuw nsw i64 %5, 1
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, 120
br i1 %29, label %30, label %32
30: ; preds = %25
%31 = and i64 %5, 4294967295
br label %50
32: ; preds = %25
%33 = icmp eq i32 %7, 0
%34 = trunc i64 %5 to i32
%35 = select i1 %33, i32 %34, i32 %7
br label %44
36: ; preds = %4, %4, %4, %4, %4, %4, %4, %4, %4
%37 = icmp eq i32 %7, 0
%38 = trunc i64 %5 to i32
%39 = select i1 %37, i32 %38, i32 %7
br label %44
40: ; preds = %4
%41 = icmp eq i32 %7, 0
br i1 %41, label %44, label %42
42: ; preds = %40
%43 = sext i32 %7 to i64
br label %50
44: ; preds = %36, %32, %40
%45 = phi i32 [ 0, %40 ], [ %35, %32 ], [ %39, %36 ]
%46 = add nuw i64 %5, 1
%47 = getelementptr inbounds i8, i8* %0, i64 %46
%48 = load i8, i8* %47
%49 = icmp eq i8 %48, 0
br i1 %49, label %55, label %4
50: ; preds = %9, %12, %15, %18, %21, %23, %30, %42
%51 = phi i64 [ %43, %42 ], [ %31, %30 ], [ %24, %23 ], [ %22, %21 ], [ %20, %18 ], [ %17, %15 ], [ %14, %12 ], [ %11, %9 ]
%52 = phi i32 [ 10, %42 ], [ 16, %30 ], [ 16, %23 ], [ 16, %21 ], [ 2, %18 ], [ 16, %15 ], [ 16, %12 ], [ 16, %9 ]
%53 = getelementptr inbounds i8, i8* %0, i64 %51
%54 = tail call i32 @strtol(i8* nocapture %53, i32* null, i32 %52)
br label %55
55: ; preds = %44, %50, %1
%56 = phi i32 [ -1, %1 ], [ %54, %50 ], [ -1, %44 ]
ret i32 %56
}