#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*/ isdigit(char);
char sffe_donum(char **str) {
  unsigned char flag = 0;
  if (**str == '-') {
    flag = 0x80;
    *str += 1;
  }
  if (**str == '+') {
    *str += 1;
  }
  while (!((flag >> 4) & 0x07)) {
    switch ((flag & 0x0f) >> 2) {
    case 0:
      while (isdigit(**str)) {
        *str += 1;
      }
      switch (**str) {
      case '.':
        flag = (flag & 0xf3) | 4;
        break;
      case 'E':
        flag = (flag & 0xf3) | 8;
        break;
      default:
        flag = 0x10;
      };
      break;
    case 1:
      if (flag & 0x03) {
        flag = 0x20;
      } else {
        *str += 1;
      }
      flag = (flag & 0xf2) | 0x01;
      break;
    case 2:
      if (flag & 0x02) {
        flag = 0x30;
      } else {
        *str += 1;
      }
      if (!isdigit(**str)) {
        if (**str != '-' && **str != '+') {
          flag = 0x40;
        } else {
          *str += 1;
        }
      }
      flag = (flag & 0xf1) | 0x02;
      break;
    };
  };
  if (flag & 0x80) {
    flag ^= 0x80;
  }
  return flag >> 4;
}


x86 assembly (clang, -O0):
<sffe_donum>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
movb   $0x0,-0x9(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1145 <sffe_donum+0x35>
movb   $0x80,-0x9(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    1166 <sffe_donum+0x56>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    116b <sffe_donum+0x5b>
movzbl -0x9(%rbp),%eax
sar    $0x4,%eax
and    $0x7,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    118a <sffe_donum+0x7a>
jmp    1323 <sffe_donum+0x213>
movzbl -0x9(%rbp),%eax
and    $0xc,%eax
shr    $0x2,%eax
mov    %eax,-0x10(%rbp)
test   %eax,%eax
je     11c6 <sffe_donum+0xb6>
jmp    11a4 <sffe_donum+0x94>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
je     1253 <sffe_donum+0x143>
jmp    11b5 <sffe_donum+0xa5>
mov    -0x10(%rbp),%eax
sub    $0x2,%eax
je     128e <sffe_donum+0x17e>
jmp    131e <sffe_donum+0x20e>
jmp    11cb <sffe_donum+0xbb>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
je     11f6 <sffe_donum+0xe6>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    11cb <sffe_donum+0xbb>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
mov    %eax,-0x14(%rbp)
sub    $0x2e,%eax
je     1222 <sffe_donum+0x112>
jmp    1211 <sffe_donum+0x101>
mov    -0x14(%rbp),%eax
sub    $0x45,%eax
je     1236 <sffe_donum+0x126>
jmp    124a <sffe_donum+0x13a>
movzbl -0x9(%rbp),%eax
and    $0xf3,%eax
or     $0x4,%eax
mov    %al,-0x9(%rbp)
jmp    124e <sffe_donum+0x13e>
movzbl -0x9(%rbp),%eax
and    $0xf3,%eax
or     $0x8,%eax
mov    %al,-0x9(%rbp)
jmp    124e <sffe_donum+0x13e>
movb   $0x10,-0x9(%rbp)
jmp    131e <sffe_donum+0x20e>
movzbl -0x9(%rbp),%eax
and    $0x3,%eax
cmp    $0x0,%eax
je     126c <sffe_donum+0x15c>
movb   $0x20,-0x9(%rbp)
jmp    127a <sffe_donum+0x16a>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
movzbl -0x9(%rbp),%eax
and    $0xf2,%eax
or     $0x1,%eax
mov    %al,-0x9(%rbp)
jmp    131e <sffe_donum+0x20e>
movzbl -0x9(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     12a7 <sffe_donum+0x197>
movb   $0x30,-0x9(%rbp)
jmp    12b5 <sffe_donum+0x1a5>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
jne    130f <sffe_donum+0x1ff>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
je     12fc <sffe_donum+0x1ec>
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     12fc <sffe_donum+0x1ec>
movb   $0x40,-0x9(%rbp)
jmp    130a <sffe_donum+0x1fa>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
add    $0x1,%rcx
mov    %rcx,(%rax)
jmp    130f <sffe_donum+0x1ff>
movzbl -0x9(%rbp),%eax
and    $0xf1,%eax
or     $0x2,%eax
mov    %al,-0x9(%rbp)
jmp    116b <sffe_donum+0x5b>
movzbl -0x9(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     1341 <sffe_donum+0x231>
movzbl -0x9(%rbp),%eax
xor    $0x80,%eax
mov    %al,-0x9(%rbp)
movzbl -0x9(%rbp),%eax
sar    $0x4,%eax
movsbl %al,%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sffe_donum>:
push   %rbp
push   %rbx
push   %rax
mov    %rdi,%rbx
mov    (%rdi),%rax
mov    (%rax),%cl
cmp    $0x2d,%cl
jne    1137 <sffe_donum+0x27>
lea    0x1(%rax),%rdx
mov    %rdx,(%rbx)
mov    0x1(%rax),%cl
mov    $0x80,%bpl
mov    %rdx,%rax
cmp    $0x2b,%cl
je     113e <sffe_donum+0x2e>
jmp    1145 <sffe_donum+0x35>
xor    %ebp,%ebp
cmp    $0x2b,%cl
jne    1145 <sffe_donum+0x35>
add    $0x1,%rax
mov    %rax,(%rbx)
movzbl %bpl,%eax
jmp    116e <sffe_donum+0x5e>
nopl   0x0(%rax,%rax,1)
mov    $0x20,%cl
test   $0x3,%al
je     121b <sffe_donum+0x10b>
and    $0xf2,%cl
or     $0x1,%cl
mov    %ecx,%ebp
movzbl %bpl,%eax
test   $0x70,%al
jne    122e <sffe_donum+0x11e>
mov    %eax,%ecx
shr    $0x2,%ecx
and    $0x3,%ecx
cmp    $0x2,%ecx
je     11b0 <sffe_donum+0xa0>
cmp    $0x1,%ecx
je     1150 <sffe_donum+0x40>
test   %ecx,%ecx
jne    1162 <sffe_donum+0x52>
mov    (%rbx),%rax
movsbl (%rax),%edi
nopw   0x0(%rax,%rax,1)
call   1030 <isdigit@plt>
test   %eax,%eax
je     11c0 <sffe_donum+0xb0>
mov    (%rbx),%rax
lea    0x1(%rax),%rcx
mov    %rcx,(%rbx)
movsbl 0x1(%rax),%edi
jmp    1190 <sffe_donum+0x80>
nopl   0x0(%rax)
mov    (%rbx),%rcx
test   $0x2,%al
jne    11da <sffe_donum+0xca>
add    $0x1,%rcx
mov    %rcx,(%rbx)
jmp    11dd <sffe_donum+0xcd>
mov    (%rbx),%rax
movsbl (%rax),%eax
cmp    $0x45,%eax
je     120e <sffe_donum+0xfe>
cmp    $0x2e,%eax
jne    1226 <sffe_donum+0x116>
and    $0xf3,%bpl
or     $0x4,%bpl
jmp    1162 <sffe_donum+0x52>
mov    $0x30,%bpl
movsbl (%rcx),%edi
call   1030 <isdigit@plt>
test   %eax,%eax
jne    1201 <sffe_donum+0xf1>
mov    (%rbx),%rax
mov    (%rax),%dl
cmp    $0x2d,%dl
je     11fa <sffe_donum+0xea>
mov    $0x40,%cl
cmp    $0x2b,%dl
jne    1203 <sffe_donum+0xf3>
add    $0x1,%rax
mov    %rax,(%rbx)
mov    %ebp,%ecx
and    $0xf1,%cl
or     $0x2,%cl
jmp    1160 <sffe_donum+0x50>
and    $0xf3,%bpl
or     $0x8,%bpl
jmp    1162 <sffe_donum+0x52>
addq   $0x1,(%rbx)
mov    %ebp,%ecx
jmp    115a <sffe_donum+0x4a>
mov    $0x10,%bpl
mov    $0x10,%eax
shr    $0x4,%bpl
movzbl %bpl,%ecx
xor    $0x8,%bpl
test   $0x80,%al
movzbl %bpl,%eax
cmove  %ecx,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define signext i8 @sffe_donum(i8** nocapture %0) {
%2 = load i8*, i8** %0
%3 = load i8, i8* %2
%4 = icmp eq i8 %3, 45
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = getelementptr inbounds i8, i8* %2, i64 1
store i8* %6, i8** %0
%7 = load i8, i8* %6
br label %8
8: ; preds = %5, %1
%9 = phi i8 [ %7, %5 ], [ %3, %1 ]
%10 = phi i8* [ %6, %5 ], [ %2, %1 ]
%11 = phi i8 [ -128, %5 ], [ 0, %1 ]
%12 = icmp eq i8 %9, 43
br i1 %12, label %13, label %15
13: ; preds = %8
%14 = getelementptr inbounds i8, i8* %10, i64 1
store i8* %14, i8** %0
br label %15
15: ; preds = %8, %13
%16 = zext i8 %11 to i32
br label %17
17: ; preds = %15, %74
%18 = phi i32 [ %76, %74 ], [ %16, %15 ]
%19 = phi i8 [ %75, %74 ], [ %11, %15 ]
%20 = lshr i32 %18, 2
%21 = and i32 %20, 3
switch i32 %21, label %74 [
i32 0, label %22
i32 1, label %43
i32 2, label %53
]
22: ; preds = %17
%23 = load i8*, i8** %0
%24 = load i8, i8* %23
%25 = tail call i32 @isdigit(i8 signext %24)
%26 = icmp eq i32 %25, 0
br i1 %26, label %33, label %27
27: ; preds = %22, %27
%28 = load i8*, i8** %0
%29 = getelementptr inbounds i8, i8* %28, i64 1
store i8* %29, i8** %0
%30 = load i8, i8* %29
%31 = tail call i32 @isdigit(i8 signext %30)
%32 = icmp eq i32 %31, 0
br i1 %32, label %33, label %27
33: ; preds = %27, %22
%34 = load i8*, i8** %0
%35 = load i8, i8* %34
%36 = sext i8 %35 to i32
switch i32 %36, label %79 [
i32 46, label %37
i32 69, label %40
]
37: ; preds = %33
%38 = and i8 %19, -13
%39 = or i8 %38, 4
br label %74
40: ; preds = %33
%41 = and i8 %19, -13
%42 = or i8 %41, 8
br label %74
43: ; preds = %17
%44 = and i32 %18, 3
%45 = icmp eq i32 %44, 0
br i1 %45, label %46, label %49
46: ; preds = %43
%47 = load i8*, i8** %0
%48 = getelementptr inbounds i8, i8* %47, i64 1
store i8* %48, i8** %0
br label %49
49: ; preds = %43, %46
%50 = phi i8 [ %19, %46 ], [ 32, %43 ]
%51 = and i8 %50, -14
%52 = or i8 %51, 1
br label %74
53: ; preds = %17
%54 = and i32 %18, 2
%55 = icmp eq i32 %54, 0
%56 = load i8*, i8** %0
br i1 %55, label %57, label %59
57: ; preds = %53
%58 = getelementptr inbounds i8, i8* %56, i64 1
store i8* %58, i8** %0
br label %59
59: ; preds = %53, %57
%60 = phi i8* [ %58, %57 ], [ %56, %53 ]
%61 = phi i8 [ %19, %57 ], [ 48, %53 ]
%62 = load i8, i8* %60
%63 = tail call i32 @isdigit(i8 signext %62)
%64 = icmp eq i32 %63, 0
br i1 %64, label %65, label %70
65: ; preds = %59
%66 = load i8*, i8** %0
%67 = load i8, i8* %66
switch i8 %67, label %70 [
i8 45, label %68
i8 43, label %68
]
68: ; preds = %65, %65
%69 = getelementptr inbounds i8, i8* %66, i64 1
store i8* %69, i8** %0
br label %70
70: ; preds = %65, %68, %59
%71 = phi i8 [ %61, %59 ], [ %61, %68 ], [ 64, %65 ]
%72 = and i8 %71, -15
%73 = or i8 %72, 2
br label %74
74: ; preds = %37, %40, %17, %70, %49
%75 = phi i8 [ %19, %17 ], [ %73, %70 ], [ %52, %49 ], [ %42, %40 ], [ %39, %37 ]
%76 = zext i8 %75 to i32
%77 = and i32 %76, 112
%78 = icmp eq i32 %77, 0
br i1 %78, label %17, label %79
79: ; preds = %33, %74
%80 = phi i32 [ %76, %74 ], [ 16, %33 ]
%81 = phi i8 [ %75, %74 ], [ 16, %33 ]
%82 = and i32 %80, 128
%83 = icmp eq i32 %82, 0
%84 = lshr i8 %81, 4
%85 = xor i8 %84, 8
%86 = select i1 %83, i8 %84, i8 %85
ret i8 %86
}