user: Translate the below assembly code into C programming language:

```asm
<valid_email>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  call   <strlen@plt>
  test   %eax,%eax
  jle    L363
  xor    %r12d,%r12d
L215:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  ja     L315
  call   <strlen@plt>
  cmp    %ebp,%eax
  jle    L363
  movslq %ebp,%rbp
L299:
  cmpb   $0x20,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  je     L211
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jg     L299
L363:
  pop    %rbx
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L315:
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L215
  jmp    L363
L211:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L363
  movslq %r12d,%rbp
  mov    %rbx,%rdi
  cmpb   $0x3c,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L257
L91:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L363
  cmpb   $0x3c,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L91
L257:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L363
  movslq %r12d,%r12
L101:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L109
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L101
  jmp    L363
  nopl   0x0(%rax,%rax,1)
L109:
  call   <strlen@plt>
  cmp    %eax,%ebp
  jge    L363
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x40,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L213
L325:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L363
  cmpb   $0x40,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L325
L213:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L363
  movslq %r12d,%r12
L180:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L192
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L180
  jmp    L363
  nopl   0x0(%rax,%rax,1)
L192:
  call   <strlen@plt>
  cmp    %eax,%ebp
  jge    L363
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x2e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L66
L157:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L363
  cmpb   $0x2e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L157
L66:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L363
  movslq %r12d,%r12
L99:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L269
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L99
  jmp    L363
  nopl   0x0(%rax,%rax,1)
L269:
  call   <strlen@plt>
  cmp    %ebp,%eax
  jle    L363
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x3e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L322
L38:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L363
  cmpb   $0x3e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L38
L322:
  call   <strlen@plt>
  cmp    %r12d,%eax
  jle    L134
L230:
  mov    %rbx,%rdi
  add    $0x1,%r12d
  call   <strlen@plt>
  cmp    %eax,%r12d
  jl     L230
L134:
  pop    %rbx
  mov    $0x1,%eax
  pop    %rbp
  pop    %r12
  ret
```

assistant: ```c
int valid_email(char *email_address) {
  int i, state = 0;
  for (i = 0; i < strlen(email_address); i++) {
    switch (state) {
    case 0: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 1: {
      if (email_address[i] == ' ') {
        state++;
      }
      break;
    }
    case 2: {
      if (email_address[i] == '<') {
        state++;
      }
      break;
    }
    case 3: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 4: {
      if (email_address[i] == '@') {
        state++;
      }
      break;
    }
    case 5: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 6: {
      if (email_address[i] == '.') {
        state++;
      }
      break;
    }
    case 7: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 8: {
      if (email_address[i] == '>') {
        state++;
      }
      break;
    }
    }
  }
  if (state == 9)
    return 1;
  return 0;
}
```