int filename_valid(const char *fname) {
  char *tmp = (char *)fname;
  if (!tmp || !*tmp)
    return 0;
  while (*tmp) {
    switch (*tmp) {
    case 'A':
    case 'B':
    case 'C':
    case 'D':
    case 'E':
    case 'F':
    case 'G':
    case 'H':
    case 'I':
    case 'J':
    case 'K':
    case 'L':
    case 'M':
    case 'N':
    case 'O':
    case 'P':
    case 'Q':
    case 'R':
    case 'S':
    case 'T':
    case 'U':
    case 'V':
    case 'W':
    case 'X':
    case 'Y':
    case 'Z':
    case 'a':
    case 'b':
    case 'c':
    case 'd':
    case 'e':
    case 'f':
    case 'g':
    case 'h':
    case 'i':
    case 'j':
    case 'k':
    case 'l':
    case 'm':
    case 'n':
    case 'o':
    case 'p':
    case 'q':
    case 'r':
    case 's':
    case 't':
    case 'u':
    case 'v':
    case 'w':
    case 'x':
    case 'y':
    case 'z':
    case '\\':
    case '/':
    case '.':
    case '-':
    case '_':
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9':
      tmp++;
      break;
    default:
      return 0;
    }
  }
  return 1;
}


x86 assembly (clang, -O0):
<filename_valid>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x18(%rbp)
cmpq   $0x0,-0x18(%rbp)
je     1128 <filename_valid+0x28>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1134 <filename_valid+0x34>
movl   $0x0,-0x4(%rbp)
jmp    119c <filename_valid+0x9c>
jmp    1139 <filename_valid+0x39>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1195 <filename_valid+0x95>
mov    -0x18(%rbp),%rax
movsbl (%rax),%eax
add    $0xffffffd3,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x4d,%eax
ja     1184 <filename_valid+0x84>
mov    -0x20(%rbp),%rax
lea    0xe96(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1190 <filename_valid+0x90>
movl   $0x0,-0x4(%rbp)
jmp    119c <filename_valid+0x9c>
jmp    1139 <filename_valid+0x39>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<filename_valid>:
xor    %eax,%eax
test   %rdi,%rdi
je     1144 <filename_valid+0x44>
mov    (%rdi),%dl
test   %dl,%dl
je     1144 <filename_valid+0x44>
add    $0x1,%rdi
lea    0xee8(%rip),%rcx
nopl   0x0(%rax,%rax,1)
movsbl %dl,%edx
add    $0xffffffd3,%edx
cmp    $0x4d,%edx
ja     1144 <filename_valid+0x44>
movslq (%rcx,%rdx,4),%rdx
add    %rcx,%rdx
jmp    *%rdx
movzbl (%rdi),%edx
add    $0x1,%rdi
test   %dl,%dl
jne    1120 <filename_valid+0x20>
mov    $0x1,%eax
ret

LLVM IR (-O0):
define i32 @filename_valid(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
%4 = alloca i8*
store i8* %0, i8** %3
%5 = load i8*, i8** %3
store i8* %5, i8** %4
%6 = load i8*, i8** %4
%7 = icmp ne i8* %6, null
br i1 %7, label %8, label %12
8: ; preds = %1
%9 = load i8*, i8** %4
%10 = load i8, i8* %9
%11 = icmp ne i8 %10, 0
br i1 %11, label %13, label %12
12: ; preds = %8, %1
store i32 0, i32* %2
br label %28
13: ; preds = %8
br label %14
14: ; preds = %26, %13
%15 = load i8*, i8** %4
%16 = load i8, i8* %15
%17 = icmp ne i8 %16, 0
br i1 %17, label %18, label %27
18: ; preds = %14
%19 = load i8*, i8** %4
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
switch i32 %21, label %25 [
i32 65, label %22
i32 66, label %22
i32 67, label %22
i32 68, label %22
i32 69, label %22
i32 70, label %22
i32 71, label %22
i32 72, label %22
i32 73, label %22
i32 74, label %22
i32 75, label %22
i32 76, label %22
i32 77, label %22
i32 78, label %22
i32 79, label %22
i32 80, label %22
i32 81, label %22
i32 82, label %22
i32 83, label %22
i32 84, label %22
i32 85, label %22
i32 86, label %22
i32 87, label %22
i32 88, label %22
i32 89, label %22
i32 90, label %22
i32 97, label %22
i32 98, label %22
i32 99, label %22
i32 100, label %22
i32 101, label %22
i32 102, label %22
i32 103, label %22
i32 104, label %22
i32 105, label %22
i32 106, label %22
i32 107, label %22
i32 108, label %22
i32 109, label %22
i32 110, label %22
i32 111, label %22
i32 112, label %22
i32 113, label %22
i32 114, label %22
i32 115, label %22
i32 116, label %22
i32 117, label %22
i32 118, label %22
i32 119, label %22
i32 120, label %22
i32 121, label %22
i32 122, label %22
i32 92, label %22
i32 47, label %22
i32 46, label %22
i32 45, label %22
i32 95, label %22
i32 48, label %22
i32 49, label %22
i32 50, label %22
i32 51, label %22
i32 52, label %22
i32 53, label %22
i32 54, label %22
i32 55, label %22
i32 56, label %22
i32 57, label %22
]
22: ; preds = %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18, %18
%23 = load i8*, i8** %4
%24 = getelementptr inbounds i8, i8* %23, i32 1
store i8* %24, i8** %4
br label %26
25: ; preds = %18
store i32 0, i32* %2
br label %28
26: ; preds = %22
br label %14
27: ; preds = %14
store i32 1, i32* %2
br label %28
28: ; preds = %27, %25, %12
%29 = load i32, i32* %2
ret i32 %29
}

LLVM IR (-O2):
define i32 @filename_valid(i8* %0) {
%2 = icmp eq i8* %0, null
br i1 %2, label %14, label %3
3: ; preds = %1
%4 = load i8, i8* %0
%5 = icmp eq i8 %4, 0
br i1 %5, label %14, label %6
6: ; preds = %3, %10
%7 = phi i8* [ %11, %10 ], [ %0, %3 ]
%8 = phi i8 [ %12, %10 ], [ %4, %3 ]
%9 = sext i8 %8 to i32
switch i32 %9, label %14 [
i32 65, label %10
i32 66, label %10
i32 67, label %10
i32 68, label %10
i32 69, label %10
i32 70, label %10
i32 71, label %10
i32 72, label %10
i32 73, label %10
i32 74, label %10
i32 75, label %10
i32 76, label %10
i32 77, label %10
i32 78, label %10
i32 79, label %10
i32 80, label %10
i32 81, label %10
i32 82, label %10
i32 83, label %10
i32 84, label %10
i32 85, label %10
i32 86, label %10
i32 87, label %10
i32 88, label %10
i32 89, label %10
i32 90, label %10
i32 97, label %10
i32 98, label %10
i32 99, label %10
i32 100, label %10
i32 101, label %10
i32 102, label %10
i32 103, label %10
i32 104, label %10
i32 105, label %10
i32 106, label %10
i32 107, label %10
i32 108, label %10
i32 109, label %10
i32 110, label %10
i32 111, label %10
i32 112, label %10
i32 113, label %10
i32 114, label %10
i32 115, label %10
i32 116, label %10
i32 117, label %10
i32 118, label %10
i32 119, label %10
i32 120, label %10
i32 121, label %10
i32 122, label %10
i32 92, label %10
i32 47, label %10
i32 46, label %10
i32 45, label %10
i32 95, label %10
i32 48, label %10
i32 49, label %10
i32 50, label %10
i32 51, label %10
i32 52, label %10
i32 53, label %10
i32 54, label %10
i32 55, label %10
i32 56, label %10
i32 57, label %10
]
10: ; preds = %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6, %6
%11 = getelementptr inbounds i8, i8* %7, i64 1
%12 = load i8, i8* %11
%13 = icmp eq i8 %12, 0
br i1 %13, label %14, label %6
14: ; preds = %6, %10, %1, %3
%15 = phi i32 [ 0, %3 ], [ 0, %1 ], [ 0, %6 ], [ 1, %10 ]
ret i32 %15
}