int Decode_date_timezone(char *text, struct tm *erg, int flag) {
  int i;
  static char tzs[][5] = {"GMT", "CET", "CEST", "0000", ""};
  for (i = 0; tzs[i][0] != 0; i++)
    if (strcmp(text, tzs[i]) == 0) {
      return (1);
    }
  if (text[0] == '+' || text[0] == '-') {
    for (i = 1; text[i] != 0; i++)
      if (!isdigit(text[i]))
        return (-1);
    if (i != 5)
      return (-1);
    return (1);
  } else {
    for (i = 0; text[i] != 0; i++)
      if (text[i] < 'A' || text[i] > 'Z')
        return (-1);
    if (i != 3 && i != 4)
      return (-1);
    return (2);
  }
}


x86 assembly (clang, -O0):
<Decode_date_timezone>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
movslq -0x20(%rbp),%rcx
lea    0x2efb(%rip),%rax
imul   $0x5,%rcx,%rcx
add    %rcx,%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
je     119b <Decode_date_timezone+0x7b>
mov    -0x10(%rbp),%rdi
movslq -0x20(%rbp),%rax
lea    0x2ed9(%rip),%rsi
imul   $0x5,%rax,%rax
add    %rax,%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%eax
jne    1188 <Decode_date_timezone+0x68>
movl   $0x1,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
jmp    118d <Decode_date_timezone+0x6d>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    113a <Decode_date_timezone+0x1a>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     11bb <Decode_date_timezone+0x9b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1232 <Decode_date_timezone+0x112>
movl   $0x1,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1210 <Decode_date_timezone+0xf0>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%eax
jne    11fd <Decode_date_timezone+0xdd>
movl   $0xffffffff,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
jmp    1202 <Decode_date_timezone+0xe2>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    11c2 <Decode_date_timezone+0xa2>
cmpl   $0x5,-0x20(%rbp)
je     1226 <Decode_date_timezone+0x106>
movl   $0xffffffff,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
movl   $0x1,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
movl   $0x0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1297 <Decode_date_timezone+0x177>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     1278 <Decode_date_timezone+0x158>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jle    1284 <Decode_date_timezone+0x164>
movl   $0xffffffff,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
jmp    1289 <Decode_date_timezone+0x169>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1239 <Decode_date_timezone+0x119>
cmpl   $0x3,-0x20(%rbp)
je     12b7 <Decode_date_timezone+0x197>
cmpl   $0x4,-0x20(%rbp)
je     12b7 <Decode_date_timezone+0x197>
movl   $0xffffffff,-0x4(%rbp)
jmp    12be <Decode_date_timezone+0x19e>
movl   $0x2,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<Decode_date_timezone>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%r14
cmpb   $0x0,0x2f12(%rip)
je     1149 <Decode_date_timezone+0x39>
lea    0x2f09(%rip),%rbx
nopw   0x0(%rax,%rax,1)
mov    %r14,%rdi
mov    %rbx,%rsi
call   1030 <strcmp@plt>
test   %eax,%eax
je     1198 <Decode_date_timezone+0x88>
cmpb   $0x0,0x5(%rbx)
lea    0x5(%rbx),%rbx
jne    1130 <Decode_date_timezone+0x20>
mov    (%r14),%cl
mov    $0xffffffff,%eax
test   %cl,%cl
je     11d5 <Decode_date_timezone+0xc5>
cmp    $0x2b,%cl
je     1163 <Decode_date_timezone+0x53>
cmp    $0x2d,%cl
jne    119f <Decode_date_timezone+0x8f>
mov    0x1(%r14),%dl
test   %dl,%dl
je     11d5 <Decode_date_timezone+0xc5>
xor    %ecx,%ecx
nopl   (%rax)
movsbl %dl,%edx
add    $0xffffffd0,%edx
cmp    $0x9,%edx
ja     11d5 <Decode_date_timezone+0xc5>
movzbl 0x2(%r14,%rcx,1),%edx
add    $0x1,%rcx
test   %dl,%dl
jne    1170 <Decode_date_timezone+0x60>
xor    %eax,%eax
cmp    $0x4,%ecx
sete   %al
add    %eax,%eax
add    $0xffffffff,%eax
jmp    11d5 <Decode_date_timezone+0xc5>
mov    $0x1,%eax
jmp    11d5 <Decode_date_timezone+0xc5>
add    $0x1,%r14
mov    $0xfffffffb,%edx
nopl   0x0(%rax,%rax,1)
add    $0xa5,%cl
cmp    $0xe6,%cl
jb     11d5 <Decode_date_timezone+0xc5>
movzbl (%r14),%ecx
add    $0x1,%edx
add    $0x1,%r14
test   %cl,%cl
jne    11b0 <Decode_date_timezone+0xa0>
xor    %eax,%eax
cmp    $0xfffffffe,%edx
setae  %al
lea    (%rax,%rax,2),%eax
add    $0xffffffff,%eax
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
%struct.tm = type opaque
@Decode_date_timezone.tzs = internal global [5 x [5 x i8]] [[5 x i8] c"GMT\00\00", [5 x i8] c"CET\00\00", [5 x i8] c"CEST\00", [5 x i8] c"0000\00", [5 x i8] zeroinitializer]
define i32 @Decode_date_timezone(i8* nocapture %0, %struct.tm* nocapture readnone %1, i32 %2) {
%4 = load i8, i8* getelementptr inbounds ([5 x [5 x i8]], [5 x [5 x i8]]* @Decode_date_timezone.tzs, i64 0, i64 0, i64 0)
%5 = icmp eq i8 %4, 0
br i1 %5, label %16, label %10
6: ; preds = %10
%7 = getelementptr inbounds [5 x [5 x i8]], [5 x [5 x i8]]* @Decode_date_timezone.tzs, i64 0, i64 %15, i64 0
%8 = load i8, i8* %7
%9 = icmp eq i8 %8, 0
br i1 %9, label %16, label %10
10: ; preds = %3, %6
%11 = phi i64 [ %15, %6 ], [ 0, %3 ]
%12 = phi i8* [ %7, %6 ], [ getelementptr inbounds ([5 x [5 x i8]], [5 x [5 x i8]]* @Decode_date_timezone.tzs, i64 0, i64 0, i64 0), %3 ]
%13 = tail call i32 @strcmp(i8* dereferenceable(1) %0, i8* %12)
%14 = icmp eq i32 %13, 0
%15 = add nuw i64 %11, 1
br i1 %14, label %52, label %6
16: ; preds = %6, %3
%17 = load i8, i8* %0
switch i8 %17, label %37 [
i8 43, label %18
i8 45, label %18
i8 0, label %52
]
18: ; preds = %16, %16
%19 = getelementptr inbounds i8, i8* %0, i64 1
%20 = load i8, i8* %19
%21 = icmp eq i8 %20, 0
br i1 %21, label %52, label %22
22: ; preds = %18, %28
%23 = phi i64 [ %29, %28 ], [ 1, %18 ]
%24 = phi i8 [ %31, %28 ], [ %20, %18 ]
%25 = sext i8 %24 to i32
%26 = add nsw i32 %25, -48
%27 = icmp ult i32 %26, 10
br i1 %27, label %28, label %52
28: ; preds = %22
%29 = add nuw i64 %23, 1
%30 = getelementptr inbounds i8, i8* %0, i64 %29
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 0
br i1 %32, label %33, label %22
33: ; preds = %28
%34 = trunc i64 %29 to i32
%35 = icmp eq i32 %34, 5
%36 = select i1 %35, i32 1, i32 -1
br label %52
37: ; preds = %16, %42
%38 = phi i64 [ %43, %42 ], [ 0, %16 ]
%39 = phi i8 [ %45, %42 ], [ %17, %16 ]
%40 = add i8 %39, -91
%41 = icmp ult i8 %40, -26
br i1 %41, label %52, label %42
42: ; preds = %37
%43 = add nuw i64 %38, 1
%44 = getelementptr inbounds i8, i8* %0, i64 %43
%45 = load i8, i8* %44
%46 = icmp eq i8 %45, 0
br i1 %46, label %47, label %37
47: ; preds = %42
%48 = trunc i64 %43 to i32
%49 = add i32 %48, -5
%50 = icmp ult i32 %49, -2
%51 = select i1 %50, i32 -1, i32 2
br label %52
52: ; preds = %10, %22, %37, %16, %47, %18, %33
%53 = phi i32 [ -1, %18 ], [ %36, %33 ], [ %51, %47 ], [ -1, %16 ], [ -1, %37 ], [ -1, %22 ], [ 1, %10 ]
ret i32 %53
}