#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*/ warning(char *, int);
int str_to_uint(unsigned int *dest, const char *src, int allow_time_fmt) {
  int in_time_fmt = 0, in_part = 0;
  unsigned int total = 0, part = 0;
  if (!src || *src == '\0') {
    warning("str_to_uint: NULL or empty src", -1);
    return 1;
  }
  for (; *src != '\0'; src++) {
    if (*src >= '0' && *src <= '9') {
      if (!in_part)
        in_part = 1;
      part *= 10;
      part += *src - '0';
    } else {
      if (!allow_time_fmt || !in_part) {
        return 1;
      }
      if (!in_time_fmt)
        in_time_fmt = 1;
      if (*src == 'w' || *src == 'W') {
        total += part * 86400 * 7;
      } else if (*src == 'd' || *src == 'D') {
        total += part * 86400;
      } else if (*src == 'h' || *src == 'H') {
        total += part * 60 * 60;
      } else if (*src == 'm' || *src == 'M') {
        total += part * 60;
      } else if (*src == 's' || *src == 'S') {
        total += part;
      } else {
        return 1;
      }
      part = 0;
      in_part = 0;
    }
  }
  if (in_time_fmt && in_part) {
    warning("str_to_uint: unfinished time string", -1);
    return 1;
  }
  if (!in_time_fmt)
    total = part;
  *dest = total;
  return 0;
}


x86 assembly (clang, -O0):
<str_to_uint>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movl   $0x0,-0x24(%rbp)
movl   $0x0,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     115a <str_to_uint+0x4a>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
jne    1177 <str_to_uint+0x67>
lea    0xe9f(%rip),%rdi
mov    $0xffffffff,%esi
call   1030 <warning@plt>
movl   $0x1,-0x4(%rbp)
jmp    1395 <str_to_uint+0x285>
jmp    117c <str_to_uint+0x6c>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     1344 <str_to_uint+0x234>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     11d9 <str_to_uint+0xc9>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x39,%eax
jg     11d9 <str_to_uint+0xc9>
cmpl   $0x0,-0x24(%rbp)
jne    11bd <str_to_uint+0xad>
movl   $0x1,-0x24(%rbp)
imul   $0xa,-0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
sub    $0x30,%eax
add    -0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    132e <str_to_uint+0x21e>
cmpl   $0x0,-0x1c(%rbp)
je     11ed <str_to_uint+0xdd>
cmpl   $0x0,-0x24(%rbp)
jne    11f9 <str_to_uint+0xe9>
movl   $0x1,-0x4(%rbp)
jmp    1395 <str_to_uint+0x285>
cmpl   $0x0,-0x20(%rbp)
jne    120a <str_to_uint+0xfa>
movl   $0x1,-0x20(%rbp)
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x77,%eax
je     122a <str_to_uint+0x11a>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x57,%eax
jne    123f <str_to_uint+0x12f>
imul   $0x15180,-0x2c(%rbp),%eax
imul   $0x7,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1320 <str_to_uint+0x210>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x64,%eax
je     125f <str_to_uint+0x14f>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x44,%eax
jne    1271 <str_to_uint+0x161>
imul   $0x15180,-0x2c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    131b <str_to_uint+0x20b>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x68,%eax
je     1291 <str_to_uint+0x181>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x48,%eax
jne    12a3 <str_to_uint+0x193>
imul   $0x3c,-0x2c(%rbp),%eax
imul   $0x3c,%eax,%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1316 <str_to_uint+0x206>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x6d,%eax
je     12c3 <str_to_uint+0x1b3>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x4d,%eax
jne    12d2 <str_to_uint+0x1c2>
imul   $0x3c,-0x2c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    1311 <str_to_uint+0x201>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x73,%eax
je     12f2 <str_to_uint+0x1e2>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x53,%eax
jne    1300 <str_to_uint+0x1f0>
mov    -0x2c(%rbp),%eax
add    -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    130c <str_to_uint+0x1fc>
movl   $0x1,-0x4(%rbp)
jmp    1395 <str_to_uint+0x285>
jmp    1311 <str_to_uint+0x201>
jmp    1316 <str_to_uint+0x206>
jmp    131b <str_to_uint+0x20b>
jmp    1320 <str_to_uint+0x210>
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x24(%rbp)
jmp    1333 <str_to_uint+0x223>
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    117c <str_to_uint+0x6c>
cmpl   $0x0,-0x20(%rbp)
je     1375 <str_to_uint+0x265>
cmpl   $0x0,-0x24(%rbp)
je     1375 <str_to_uint+0x265>
lea    0xcc0(%rip),%rdi
mov    $0xffffffff,%esi
call   1030 <warning@plt>
movl   $0x1,-0x4(%rbp)
jmp    1395 <str_to_uint+0x285>
cmpl   $0x0,-0x20(%rbp)
jne    1385 <str_to_uint+0x275>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<str_to_uint>:
push   %rbp
push   %rbx
push   %rax
test   %rsi,%rsi
je     11da <str_to_uint+0xca>
mov    (%rsi),%cl
test   %cl,%cl
je     11da <str_to_uint+0xca>
add    $0x1,%rsi
xor    %r9d,%r9d
mov    $0x1,%r10d
lea    0xec6(%rip),%r11
xor    %r8d,%r8d
xor    %ebx,%ebx
xor    %ebp,%ebp
jmp    1174 <str_to_uint+0x64>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl %cl,%eax
test   %ebx,%ebx
cmove  %r10d,%ebx
lea    (%r9,%r9,4),%ecx
lea    (%rax,%rcx,2),%r9d
add    $0xffffffd0,%r9d
movzbl (%rsi),%ecx
add    $0x1,%rsi
test   %cl,%cl
je     11f7 <str_to_uint+0xe7>
lea    -0x30(%rcx),%eax
cmp    $0x9,%al
jbe    1150 <str_to_uint+0x40>
mov    $0x1,%eax
test   %edx,%edx
je     11f0 <str_to_uint+0xe0>
test   %ebx,%ebx
je     11f0 <str_to_uint+0xe0>
test   %ebp,%ebp
mov    $0x1,%eax
cmove  %eax,%ebp
add    $0xbc,%cl
cmp    $0x33,%cl
ja     11f0 <str_to_uint+0xe0>
movzbl %cl,%ecx
movslq (%r11,%rcx,4),%rcx
add    %r11,%rcx
jmp    *%rcx
imul   $0x15180,%r9d,%r9d
jmp    11d0 <str_to_uint+0xc0>
imul   $0xe10,%r9d,%r9d
jmp    11d0 <str_to_uint+0xc0>
imul   $0x3c,%r9d,%r9d
jmp    11d0 <str_to_uint+0xc0>
imul   $0x93a80,%r9d,%r9d
cs nopw 0x0(%rax,%rax,1)
nop
add    %r9d,%r8d
xor    %ebx,%ebx
xor    %r9d,%r9d
jmp    1165 <str_to_uint+0x55>
lea    0xeef(%rip),%rdi
mov    $0xffffffff,%esi
call   1030 <warning@plt>
mov    $0x1,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret
test   %ebp,%ebp
je     1208 <str_to_uint+0xf8>
test   %ebx,%ebx
je     1208 <str_to_uint+0xf8>
lea    0xee9(%rip),%rdi
jmp    11e1 <str_to_uint+0xd1>
test   %ebp,%ebp
cmovne %r8d,%r9d
mov    %r9d,(%rdi)
xor    %eax,%eax
jmp    11f0 <str_to_uint+0xe0>

LLVM IR (-O0):
@.str = [31 x i8] c"str_to_uint: NULL or empty src\00"
@.str.1 = [36 x i8] c"str_to_uint: unfinished time string\00"
define i32 @str_to_uint(i32* %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32* %0, i32** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 0, i32* %8
store i32 0, i32* %9
store i32 0, i32* %10
store i32 0, i32* %11
%12 = load i8*, i8** %6
%13 = icmp ne i8* %12, null
br i1 %13, label %14, label %19
14: ; preds = %3
%15 = load i8*, i8** %6
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp eq i32 %17, 0
br i1 %18, label %19, label %21
19: ; preds = %14, %3
%20 = call i32 @warning(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), i32 -1)
store i32 1, i32* %4
br label %163
21: ; preds = %14
br label %22
22: ; preds = %144, %21
%23 = load i8*, i8** %6
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp ne i32 %25, 0
br i1 %26, label %27, label %147
27: ; preds = %22
%28 = load i8*, i8** %6
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp sge i32 %30, 48
br i1 %31, label %32, label %50
32: ; preds = %27
%33 = load i8*, i8** %6
%34 = load i8, i8* %33
%35 = sext i8 %34 to i32
%36 = icmp sle i32 %35, 57
br i1 %36, label %37, label %50
37: ; preds = %32
%38 = load i32, i32* %9
%39 = icmp ne i32 %38, 0
br i1 %39, label %41, label %40
40: ; preds = %37
store i32 1, i32* %9
br label %41
41: ; preds = %40, %37
%42 = load i32, i32* %11
%43 = mul i32 %42, 10
store i32 %43, i32* %11
%44 = load i8*, i8** %6
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = sub nsw i32 %46, 48
%48 = load i32, i32* %11
%49 = add i32 %48, %47
store i32 %49, i32* %11
br label %143
50: ; preds = %32, %27
%51 = load i32, i32* %7
%52 = icmp ne i32 %51, 0
br i1 %52, label %53, label %56
53: ; preds = %50
%54 = load i32, i32* %9
%55 = icmp ne i32 %54, 0
br i1 %55, label %57, label %56
56: ; preds = %53, %50
store i32 1, i32* %4
br label %163
57: ; preds = %53
%58 = load i32, i32* %8
%59 = icmp ne i32 %58, 0
br i1 %59, label %61, label %60
60: ; preds = %57
store i32 1, i32* %8
br label %61
61: ; preds = %60, %57
%62 = load i8*, i8** %6
%63 = load i8, i8* %62
%64 = sext i8 %63 to i32
%65 = icmp eq i32 %64, 119
br i1 %65, label %71, label %66
66: ; preds = %61
%67 = load i8*, i8** %6
%68 = load i8, i8* %67
%69 = sext i8 %68 to i32
%70 = icmp eq i32 %69, 87
br i1 %70, label %71, label %77
71: ; preds = %66, %61
%72 = load i32, i32* %11
%73 = mul i32 %72, 86400
%74 = mul i32 %73, 7
%75 = load i32, i32* %10
%76 = add i32 %75, %74
store i32 %76, i32* %10
br label %142
77: ; preds = %66
%78 = load i8*, i8** %6
%79 = load i8, i8* %78
%80 = sext i8 %79 to i32
%81 = icmp eq i32 %80, 100
br i1 %81, label %87, label %82
82: ; preds = %77
%83 = load i8*, i8** %6
%84 = load i8, i8* %83
%85 = sext i8 %84 to i32
%86 = icmp eq i32 %85, 68
br i1 %86, label %87, label %92
87: ; preds = %82, %77
%88 = load i32, i32* %11
%89 = mul i32 %88, 86400
%90 = load i32, i32* %10
%91 = add i32 %90, %89
store i32 %91, i32* %10
br label %141
92: ; preds = %82
%93 = load i8*, i8** %6
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %95, 104
br i1 %96, label %102, label %97
97: ; preds = %92
%98 = load i8*, i8** %6
%99 = load i8, i8* %98
%100 = sext i8 %99 to i32
%101 = icmp eq i32 %100, 72
br i1 %101, label %102, label %108
102: ; preds = %97, %92
%103 = load i32, i32* %11
%104 = mul i32 %103, 60
%105 = mul i32 %104, 60
%106 = load i32, i32* %10
%107 = add i32 %106, %105
store i32 %107, i32* %10
br label %140
108: ; preds = %97
%109 = load i8*, i8** %6
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 109
br i1 %112, label %118, label %113
113: ; preds = %108
%114 = load i8*, i8** %6
%115 = load i8, i8* %114
%116 = sext i8 %115 to i32
%117 = icmp eq i32 %116, 77
br i1 %117, label %118, label %123
118: ; preds = %113, %108
%119 = load i32, i32* %11
%120 = mul i32 %119, 60
%121 = load i32, i32* %10
%122 = add i32 %121, %120
store i32 %122, i32* %10
br label %139
123: ; preds = %113
%124 = load i8*, i8** %6
%125 = load i8, i8* %124
%126 = sext i8 %125 to i32
%127 = icmp eq i32 %126, 115
br i1 %127, label %133, label %128
128: ; preds = %123
%129 = load i8*, i8** %6
%130 = load i8, i8* %129
%131 = sext i8 %130 to i32
%132 = icmp eq i32 %131, 83
br i1 %132, label %133, label %137
133: ; preds = %128, %123
%134 = load i32, i32* %11
%135 = load i32, i32* %10
%136 = add i32 %135, %134
store i32 %136, i32* %10
br label %138
137: ; preds = %128
store i32 1, i32* %4
br label %163
138: ; preds = %133
br label %139
139: ; preds = %138, %118
br label %140
140: ; preds = %139, %102
br label %141
141: ; preds = %140, %87
br label %142
142: ; preds = %141, %71
store i32 0, i32* %11
store i32 0, i32* %9
br label %143
143: ; preds = %142, %41
br label %144
144: ; preds = %143
%145 = load i8*, i8** %6
%146 = getelementptr inbounds i8, i8* %145, i32 1
store i8* %146, i8** %6
br label %22
147: ; preds = %22
%148 = load i32, i32* %8
%149 = icmp ne i32 %148, 0
br i1 %149, label %150, label %155
150: ; preds = %147
%151 = load i32, i32* %9
%152 = icmp ne i32 %151, 0
br i1 %152, label %153, label %155
153: ; preds = %150
%154 = call i32 @warning(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.1, i64 0, i64 0), i32 -1)
store i32 1, i32* %4
br label %163
155: ; preds = %150, %147
%156 = load i32, i32* %8
%157 = icmp ne i32 %156, 0
br i1 %157, label %160, label %158
158: ; preds = %155
%159 = load i32, i32* %11
store i32 %159, i32* %10
br label %160
160: ; preds = %158, %155
%161 = load i32, i32* %10
%162 = load i32*, i32** %5
store i32 %161, i32* %162
store i32 0, i32* %4
br label %163
163: ; preds = %160, %153, %137, %56, %19
%164 = load i32, i32* %4
ret i32 %164
}

LLVM IR (-O2):
@.str = [31 x i8] c"str_to_uint: NULL or empty src\00"
@.str.1 = [36 x i8] c"str_to_uint: unfinished time string\00"
define i32 @str_to_uint(i32* nocapture writeonly %0, i8* %1, i32 %2) {
%4 = icmp eq i8* %1, null
br i1 %4, label %10, label %5
5: ; preds = %3
%6 = load i8, i8* %1
%7 = icmp eq i8 %6, 0
br i1 %7, label %10, label %8
8: ; preds = %5
%9 = icmp ne i32 %2, 0
br label %12
10: ; preds = %5, %3
%11 = tail call i32 @warning(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str, i64 0, i64 0), i32 -1)
br label %61
12: ; preds = %8, %45
%13 = phi i32 [ 0, %8 ], [ %49, %45 ]
%14 = phi i32 [ 0, %8 ], [ %48, %45 ]
%15 = phi i32 [ 0, %8 ], [ %47, %45 ]
%16 = phi i32 [ 0, %8 ], [ %46, %45 ]
%17 = phi i8* [ %1, %8 ], [ %50, %45 ]
%18 = phi i8 [ %6, %8 ], [ %51, %45 ]
%19 = add i8 %18, -48
%20 = icmp ult i8 %19, 10
br i1 %20, label %21, label %28
21: ; preds = %12
%22 = zext i8 %18 to i32
%23 = icmp eq i32 %15, 0
%24 = select i1 %23, i32 1, i32 %15
%25 = mul i32 %13, 10
%26 = add nsw i32 %22, -48
%27 = add i32 %26, %25
br label %45
28: ; preds = %12
%29 = icmp ne i32 %15, 0
%30 = select i1 %9, i1 %29, i1 false
br i1 %30, label %31, label %61
31: ; preds = %28
%32 = icmp eq i32 %16, 0
%33 = select i1 %32, i32 1, i32 %16
switch i8 %18, label %61 [
i8 119, label %34
i8 87, label %34
i8 100, label %36
i8 68, label %36
i8 104, label %38
i8 72, label %38
i8 109, label %40
i8 77, label %40
i8 115, label %42
i8 83, label %42
]
34: ; preds = %31, %31
%35 = mul i32 %13, 604800
br label %42
36: ; preds = %31, %31
%37 = mul i32 %13, 86400
br label %42
38: ; preds = %31, %31
%39 = mul i32 %13, 3600
br label %42
40: ; preds = %31, %31
%41 = mul i32 %13, 60
br label %42
42: ; preds = %31, %31, %36, %40, %38, %34
%43 = phi i32 [ %35, %34 ], [ %37, %36 ], [ %39, %38 ], [ %41, %40 ], [ %13, %31 ], [ %13, %31 ]
%44 = add i32 %43, %14
br label %45
45: ; preds = %21, %42
%46 = phi i32 [ %16, %21 ], [ %33, %42 ]
%47 = phi i32 [ %24, %21 ], [ 0, %42 ]
%48 = phi i32 [ %14, %21 ], [ %44, %42 ]
%49 = phi i32 [ %27, %21 ], [ 0, %42 ]
%50 = getelementptr inbounds i8, i8* %17, i64 1
%51 = load i8, i8* %50
%52 = icmp eq i8 %51, 0
br i1 %52, label %53, label %12
53: ; preds = %45
%54 = icmp ne i32 %46, 0
%55 = icmp ne i32 %47, 0
%56 = select i1 %54, i1 %55, i1 false
br i1 %56, label %57, label %59
57: ; preds = %53
%58 = tail call i32 @warning(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.1, i64 0, i64 0), i32 -1)
br label %61
59: ; preds = %53
%60 = select i1 %54, i32 %48, i32 %49
store i32 %60, i32* %0
br label %61
61: ; preds = %31, %28, %59, %57, %10
%62 = phi i32 [ 1, %10 ], [ 1, %57 ], [ 0, %59 ], [ 1, %28 ], [ 1, %31 ]
ret i32 %62
}