int datum(char vstup[], int dlzka) {
  if (dlzka != 9)
    return 0;
  else {
    if (vstup[0] < 48 || vstup[0] > 58)
      return 0;
    if (vstup[1] < 48 || vstup[1] > 58)
      return 0;
    if (vstup[2] < 48 || vstup[2] > 58)
      return 0;
    if (vstup[3] < 48 || vstup[3] > 58)
      return 0;
    if (vstup[4] != '-')
      return 0;
    if (vstup[5] < 48 || vstup[5] > 49)
      return 0;
    else if ((vstup[6] > 47) && (vstup[6] < 58)) {
      if (vstup[5] == 48) {
        if (vstup[6] < 49)
          return 0;
      }
      if (vstup[5] == 49) {
        if (vstup[6] > 50)
          return 0;
      }
    }
    if (vstup[7] != '-')
      return 0;
    if (vstup[8] < 48 || vstup[8] > 51) {
      return 0;
    } else if ((vstup[9] > 47) && (vstup[9] < 58)) {
      if (vstup[8] == 48) {
        if (vstup[9] < 49)
          return 0;
      }
      if (vstup[8] == 51) {
        if (vstup[9] > 50)
          return 0;
      }
    } else {
      return 0;
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<datum>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
cmpl   $0x9,-0x14(%rbp)
je     1121 <datum+0x21>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jl     1141 <datum+0x41>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x3a,%eax
jle    114d <datum+0x4d>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
jl     116f <datum+0x6f>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x3a,%eax
jle    117b <datum+0x7b>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x30,%eax
jl     119d <datum+0x9d>
mov    -0x10(%rbp),%rax
movsbl 0x2(%rax),%eax
cmp    $0x3a,%eax
jle    11a9 <datum+0xa9>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x30,%eax
jl     11cb <datum+0xcb>
mov    -0x10(%rbp),%rax
movsbl 0x3(%rax),%eax
cmp    $0x3a,%eax
jle    11d7 <datum+0xd7>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x4(%rax),%eax
cmp    $0x2d,%eax
je     11f4 <datum+0xf4>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
cmp    $0x30,%eax
jl     1216 <datum+0x116>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
cmp    $0x31,%eax
jle    1222 <datum+0x122>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x2f,%eax
jle    12af <datum+0x1af>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x3a,%eax
jge    12af <datum+0x1af>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
cmp    $0x30,%eax
jne    1277 <datum+0x177>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x31,%eax
jge    1272 <datum+0x172>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
jmp    1277 <datum+0x177>
mov    -0x10(%rbp),%rax
movsbl 0x5(%rax),%eax
cmp    $0x31,%eax
jne    12aa <datum+0x1aa>
mov    -0x10(%rbp),%rax
movsbl 0x6(%rax),%eax
cmp    $0x32,%eax
jle    12a5 <datum+0x1a5>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
jmp    12aa <datum+0x1aa>
jmp    12af <datum+0x1af>
jmp    12b4 <datum+0x1b4>
mov    -0x10(%rbp),%rax
movsbl 0x7(%rax),%eax
cmp    $0x2d,%eax
je     12d1 <datum+0x1d1>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x30,%eax
jl     12f3 <datum+0x1f3>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x33,%eax
jle    12ff <datum+0x1ff>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
cmp    $0x2f,%eax
jle    138c <datum+0x28c>
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
cmp    $0x3a,%eax
jge    138c <datum+0x28c>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x30,%eax
jne    1354 <datum+0x254>
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
cmp    $0x31,%eax
jge    134f <datum+0x24f>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
jmp    1354 <datum+0x254>
mov    -0x10(%rbp),%rax
movsbl 0x8(%rax),%eax
cmp    $0x33,%eax
jne    1387 <datum+0x287>
mov    -0x10(%rbp),%rax
movsbl 0x9(%rax),%eax
cmp    $0x32,%eax
jle    1382 <datum+0x282>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
jmp    1387 <datum+0x287>
jmp    1398 <datum+0x298>
movl   $0x0,-0x4(%rbp)
jmp    13a9 <datum+0x2a9>
jmp    139d <datum+0x29d>
jmp    13a2 <datum+0x2a2>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<datum>:
xor    %eax,%eax
cmp    $0x9,%esi
jne    11a3 <datum+0xa3>
mov    (%rdi),%cl
add    $0xc5,%cl
cmp    $0xf5,%cl
jb     11a3 <datum+0xa3>
mov    0x1(%rdi),%cl
add    $0xc5,%cl
cmp    $0xf5,%cl
jb     11a3 <datum+0xa3>
mov    0x2(%rdi),%cl
add    $0xc5,%cl
cmp    $0xf5,%cl
jb     11a3 <datum+0xa3>
mov    0x3(%rdi),%cl
add    $0xc5,%cl
cmp    $0xf5,%cl
jb     11a3 <datum+0xa3>
cmpb   $0x2d,0x4(%rdi)
jne    11a3 <datum+0xa3>
mov    0x5(%rdi),%cl
lea    -0x32(%rcx),%edx
cmp    $0xfe,%dl
jb     11a3 <datum+0xa3>
mov    0x6(%rdi),%dl
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     116b <datum+0x6b>
cmp    $0x30,%cl
jne    1161 <datum+0x61>
cmp    $0x31,%dl
jb     11a3 <datum+0xa3>
cmp    $0x31,%cl
jne    116b <datum+0x6b>
cmp    $0x32,%dl
ja     11a3 <datum+0xa3>
cmpb   $0x2d,0x7(%rdi)
jne    11a3 <datum+0xa3>
mov    0x8(%rdi),%cl
lea    -0x34(%rcx),%edx
cmp    $0xfc,%dl
jb     11a3 <datum+0xa3>
mov    0x9(%rdi),%dl
lea    -0x30(%rdx),%esi
cmp    $0x9,%sil
ja     11a3 <datum+0xa3>
cmp    $0x30,%cl
jne    1192 <datum+0x92>
cmp    $0x31,%dl
jb     11a3 <datum+0xa3>
cmp    $0x33,%cl
setne  %al
cmp    $0x33,%dl
setb   %cl
or     %al,%cl
movzbl %cl,%eax
ret

LLVM IR (-O0):
define i32 @datum(i8* %0, i32 %1) {
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
%6 = load i32, i32* %5
%7 = icmp ne i32 %6, 9
br i1 %7, label %8, label %9
8: ; preds = %2
store i32 0, i32* %3
br label %188
9: ; preds = %2
%10 = load i8*, i8** %4
%11 = getelementptr inbounds i8, i8* %10, i64 0
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
%14 = icmp slt i32 %13, 48
br i1 %14, label %21, label %15
15: ; preds = %9
%16 = load i8*, i8** %4
%17 = getelementptr inbounds i8, i8* %16, i64 0
%18 = load i8, i8* %17
%19 = sext i8 %18 to i32
%20 = icmp sgt i32 %19, 58
br i1 %20, label %21, label %22
21: ; preds = %15, %9
store i32 0, i32* %3
br label %188
22: ; preds = %15
%23 = load i8*, i8** %4
%24 = getelementptr inbounds i8, i8* %23, i64 1
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = icmp slt i32 %26, 48
br i1 %27, label %34, label %28
28: ; preds = %22
%29 = load i8*, i8** %4
%30 = getelementptr inbounds i8, i8* %29, i64 1
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp sgt i32 %32, 58
br i1 %33, label %34, label %35
34: ; preds = %28, %22
store i32 0, i32* %3
br label %188
35: ; preds = %28
%36 = load i8*, i8** %4
%37 = getelementptr inbounds i8, i8* %36, i64 2
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp slt i32 %39, 48
br i1 %40, label %47, label %41
41: ; preds = %35
%42 = load i8*, i8** %4
%43 = getelementptr inbounds i8, i8* %42, i64 2
%44 = load i8, i8* %43
%45 = sext i8 %44 to i32
%46 = icmp sgt i32 %45, 58
br i1 %46, label %47, label %48
47: ; preds = %41, %35
store i32 0, i32* %3
br label %188
48: ; preds = %41
%49 = load i8*, i8** %4
%50 = getelementptr inbounds i8, i8* %49, i64 3
%51 = load i8, i8* %50
%52 = sext i8 %51 to i32
%53 = icmp slt i32 %52, 48
br i1 %53, label %60, label %54
54: ; preds = %48
%55 = load i8*, i8** %4
%56 = getelementptr inbounds i8, i8* %55, i64 3
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp sgt i32 %58, 58
br i1 %59, label %60, label %61
60: ; preds = %54, %48
store i32 0, i32* %3
br label %188
61: ; preds = %54
%62 = load i8*, i8** %4
%63 = getelementptr inbounds i8, i8* %62, i64 4
%64 = load i8, i8* %63
%65 = sext i8 %64 to i32
%66 = icmp ne i32 %65, 45
br i1 %66, label %67, label %68
67: ; preds = %61
store i32 0, i32* %3
br label %188
68: ; preds = %61
%69 = load i8*, i8** %4
%70 = getelementptr inbounds i8, i8* %69, i64 5
%71 = load i8, i8* %70
%72 = sext i8 %71 to i32
%73 = icmp slt i32 %72, 48
br i1 %73, label %80, label %74
74: ; preds = %68
%75 = load i8*, i8** %4
%76 = getelementptr inbounds i8, i8* %75, i64 5
%77 = load i8, i8* %76
%78 = sext i8 %77 to i32
%79 = icmp sgt i32 %78, 49
br i1 %79, label %80, label %81
80: ; preds = %74, %68
store i32 0, i32* %3
br label %188
81: ; preds = %74
%82 = load i8*, i8** %4
%83 = getelementptr inbounds i8, i8* %82, i64 6
%84 = load i8, i8* %83
%85 = sext i8 %84 to i32
%86 = icmp sgt i32 %85, 47
br i1 %86, label %87, label %122
87: ; preds = %81
%88 = load i8*, i8** %4
%89 = getelementptr inbounds i8, i8* %88, i64 6
%90 = load i8, i8* %89
%91 = sext i8 %90 to i32
%92 = icmp slt i32 %91, 58
br i1 %92, label %93, label %122
93: ; preds = %87
%94 = load i8*, i8** %4
%95 = getelementptr inbounds i8, i8* %94, i64 5
%96 = load i8, i8* %95
%97 = sext i8 %96 to i32
%98 = icmp eq i32 %97, 48
br i1 %98, label %99, label %107
99: ; preds = %93
%100 = load i8*, i8** %4
%101 = getelementptr inbounds i8, i8* %100, i64 6
%102 = load i8, i8* %101
%103 = sext i8 %102 to i32
%104 = icmp slt i32 %103, 49
br i1 %104, label %105, label %106
105: ; preds = %99
store i32 0, i32* %3
br label %188
106: ; preds = %99
br label %107
107: ; preds = %106, %93
%108 = load i8*, i8** %4
%109 = getelementptr inbounds i8, i8* %108, i64 5
%110 = load i8, i8* %109
%111 = sext i8 %110 to i32
%112 = icmp eq i32 %111, 49
br i1 %112, label %113, label %121
113: ; preds = %107
%114 = load i8*, i8** %4
%115 = getelementptr inbounds i8, i8* %114, i64 6
%116 = load i8, i8* %115
%117 = sext i8 %116 to i32
%118 = icmp sgt i32 %117, 50
br i1 %118, label %119, label %120
119: ; preds = %113
store i32 0, i32* %3
br label %188
120: ; preds = %113
br label %121
121: ; preds = %120, %107
br label %122
122: ; preds = %121, %87, %81
br label %123
123: ; preds = %122
%124 = load i8*, i8** %4
%125 = getelementptr inbounds i8, i8* %124, i64 7
%126 = load i8, i8* %125
%127 = sext i8 %126 to i32
%128 = icmp ne i32 %127, 45
br i1 %128, label %129, label %130
129: ; preds = %123
store i32 0, i32* %3
br label %188
130: ; preds = %123
%131 = load i8*, i8** %4
%132 = getelementptr inbounds i8, i8* %131, i64 8
%133 = load i8, i8* %132
%134 = sext i8 %133 to i32
%135 = icmp slt i32 %134, 48
br i1 %135, label %142, label %136
136: ; preds = %130
%137 = load i8*, i8** %4
%138 = getelementptr inbounds i8, i8* %137, i64 8
%139 = load i8, i8* %138
%140 = sext i8 %139 to i32
%141 = icmp sgt i32 %140, 51
br i1 %141, label %142, label %143
142: ; preds = %136, %130
store i32 0, i32* %3
br label %188
143: ; preds = %136
%144 = load i8*, i8** %4
%145 = getelementptr inbounds i8, i8* %144, i64 9
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp sgt i32 %147, 47
br i1 %148, label %149, label %184
149: ; preds = %143
%150 = load i8*, i8** %4
%151 = getelementptr inbounds i8, i8* %150, i64 9
%152 = load i8, i8* %151
%153 = sext i8 %152 to i32
%154 = icmp slt i32 %153, 58
br i1 %154, label %155, label %184
155: ; preds = %149
%156 = load i8*, i8** %4
%157 = getelementptr inbounds i8, i8* %156, i64 8
%158 = load i8, i8* %157
%159 = sext i8 %158 to i32
%160 = icmp eq i32 %159, 48
br i1 %160, label %161, label %169
161: ; preds = %155
%162 = load i8*, i8** %4
%163 = getelementptr inbounds i8, i8* %162, i64 9
%164 = load i8, i8* %163
%165 = sext i8 %164 to i32
%166 = icmp slt i32 %165, 49
br i1 %166, label %167, label %168
167: ; preds = %161
store i32 0, i32* %3
br label %188
168: ; preds = %161
br label %169
169: ; preds = %168, %155
%170 = load i8*, i8** %4
%171 = getelementptr inbounds i8, i8* %170, i64 8
%172 = load i8, i8* %171
%173 = sext i8 %172 to i32
%174 = icmp eq i32 %173, 51
br i1 %174, label %175, label %183
175: ; preds = %169
%176 = load i8*, i8** %4
%177 = getelementptr inbounds i8, i8* %176, i64 9
%178 = load i8, i8* %177
%179 = sext i8 %178 to i32
%180 = icmp sgt i32 %179, 50
br i1 %180, label %181, label %182
181: ; preds = %175
store i32 0, i32* %3
br label %188
182: ; preds = %175
br label %183
183: ; preds = %182, %169
br label %185
184: ; preds = %149, %143
store i32 0, i32* %3
br label %188
185: ; preds = %183
br label %186
186: ; preds = %185
br label %187
187: ; preds = %186
store i32 1, i32* %3
br label %188
188: ; preds = %187, %184, %181, %167, %142, %129, %119, %105, %80, %67, %60, %47, %34, %21, %8
%189 = load i32, i32* %3
ret i32 %189
}

LLVM IR (-O2):
define i32 @datum(i8* nocapture %0, i32 %1) {
%3 = icmp eq i32 %1, 9
br i1 %3, label %4, label %68
4: ; preds = %2
%5 = load i8, i8* %0
%6 = add i8 %5, -59
%7 = icmp ult i8 %6, -11
br i1 %7, label %68, label %8
8: ; preds = %4
%9 = getelementptr inbounds i8, i8* %0, i64 1
%10 = load i8, i8* %9
%11 = add i8 %10, -59
%12 = icmp ult i8 %11, -11
br i1 %12, label %68, label %13
13: ; preds = %8
%14 = getelementptr inbounds i8, i8* %0, i64 2
%15 = load i8, i8* %14
%16 = add i8 %15, -59
%17 = icmp ult i8 %16, -11
br i1 %17, label %68, label %18
18: ; preds = %13
%19 = getelementptr inbounds i8, i8* %0, i64 3
%20 = load i8, i8* %19
%21 = add i8 %20, -59
%22 = icmp ult i8 %21, -11
br i1 %22, label %68, label %23
23: ; preds = %18
%24 = getelementptr inbounds i8, i8* %0, i64 4
%25 = load i8, i8* %24
%26 = icmp eq i8 %25, 45
br i1 %26, label %27, label %68
27: ; preds = %23
%28 = getelementptr inbounds i8, i8* %0, i64 5
%29 = load i8, i8* %28
%30 = add i8 %29, -50
%31 = icmp ult i8 %30, -2
br i1 %31, label %68, label %32
32: ; preds = %27
%33 = getelementptr inbounds i8, i8* %0, i64 6
%34 = load i8, i8* %33
%35 = add i8 %34, -48
%36 = icmp ult i8 %35, 10
br i1 %36, label %37, label %45
37: ; preds = %32
%38 = icmp eq i8 %29, 48
%39 = icmp ult i8 %34, 49
%40 = select i1 %38, i1 %39, i1 false
br i1 %40, label %68, label %41
41: ; preds = %37
%42 = icmp eq i8 %29, 49
%43 = icmp ugt i8 %34, 50
%44 = select i1 %42, i1 %43, i1 false
br i1 %44, label %68, label %45
45: ; preds = %32, %41
%46 = getelementptr inbounds i8, i8* %0, i64 7
%47 = load i8, i8* %46
%48 = icmp eq i8 %47, 45
br i1 %48, label %49, label %68
49: ; preds = %45
%50 = getelementptr inbounds i8, i8* %0, i64 8
%51 = load i8, i8* %50
%52 = add i8 %51, -52
%53 = icmp ult i8 %52, -4
br i1 %53, label %68, label %54
54: ; preds = %49
%55 = getelementptr inbounds i8, i8* %0, i64 9
%56 = load i8, i8* %55
%57 = add i8 %56, -48
%58 = icmp ult i8 %57, 10
br i1 %58, label %59, label %68
59: ; preds = %54
%60 = icmp eq i8 %51, 48
%61 = icmp ult i8 %56, 49
%62 = select i1 %60, i1 %61, i1 false
br i1 %62, label %68, label %63
63: ; preds = %59
%64 = icmp ne i8 %51, 51
%65 = icmp ult i8 %56, 51
%66 = select i1 %64, i1 true, i1 %65
%67 = zext i1 %66 to i32
br label %68
68: ; preds = %63, %41, %54, %59, %49, %45, %37, %27, %23, %18, %13, %8, %4, %2
%69 = phi i32 [ 0, %2 ], [ 0, %4 ], [ 0, %8 ], [ 0, %13 ], [ 0, %18 ], [ 0, %23 ], [ 0, %27 ], [ 0, %37 ], [ 0, %45 ], [ 0, %49 ], [ 0, %59 ], [ 0, %54 ], [ 0, %41 ], [ %67, %63 ]
ret i32 %69
}