user: What would the C source look like for the assembly code provided here?

```asm
<validatom>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  movl   $0x0,-0x2c(%rbp)
  jmp    L171
L398:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L117
  addl   $0x1,-0x2c(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x20(%rbp)
L117:
  addq   $0x1,-0x28(%rbp)
L171:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L398
  cmpl   $0x1,-0x2c(%rbp)
  je     L229
  mov    $0x0,%eax
  jmp    L132
L229:
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  addq   $0x1,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  addq   $0x1,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  addq   $0x1,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L166
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L378
  mov    $0x1,%eax
  jmp    L132
L378:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x79,%al
  jne    L169
  mov    $0x2,%eax
  jmp    L132
L169:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jne    L96
  mov    $0x3,%eax
  jmp    L132
L96:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x71,%al
  jne    L58
  mov    $0xd,%eax
  jmp    L132
L58:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L532
  mov    $0xe,%eax
  jmp    L132
L532:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x62,%al
  jne    L276
  mov    $0xf,%eax
  jmp    L132
L276:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x6d,%al
  jne    L359
  mov    $0x10,%eax
  jmp    L132
L359:
  mov    $0x0,%eax
  jmp    L132
L166:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L330
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x66,%al
  jne    L187
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L135
  mov    $0x4,%eax
  jmp    L132
L135:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x79,%al
  jne    L19
  mov    $0x5,%eax
  jmp    L132
L19:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jne    L187
  mov    $0x6,%eax
  jmp    L132
L187:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x64,%al
  jne    L270
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L94
  mov    $0x7,%eax
  jmp    L132
L94:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x79,%al
  jne    L415
  mov    $0x8,%eax
  jmp    L132
L415:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jne    L270
  mov    $0x9,%eax
  jmp    L132
L270:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x76,%al
  jne    L127
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L150
  mov    $0xa,%eax
  jmp    L132
L150:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x79,%al
  jne    L380
  mov    $0xb,%eax
  jmp    L132
L380:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jne    L127
  mov    $0xc,%eax
  jmp    L132
L127:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x6e,%al
  jne    L330
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L330
  mov    $0x13,%eax
  jmp    L132
L330:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L57
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x63,%al
  jne    L306
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x68,%al
  jne    L306
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x69,%al
  jne    L306
  mov    $0x11,%eax
  jmp    L132
L306:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x6a,%al
  jne    L535
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L535
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L535
  mov    $0x12,%eax
  jmp    L132
L535:
  mov    -0x28(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L57
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x65,%al
  jne    L57
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x72,%al
  jne    L57
  mov    $0x14,%eax
  jmp    L132
L57:
  mov    $0x0,%eax
L132:
  pop    %rbp
  ret
```

assistant: ```c
int validatom(who)
char *who;
{
  char *cp, *pp, *cp1, *cp2, *cp3;
  int i;
  cp = who;
  i = 0;
  while (*cp != '\0') {
    if (*cp == '.') {
      i++;
      pp = cp;
    }
    cp++;
  }
  if (i != 1)
    return (0);
  cp = pp;
  cp++;
  cp1 = cp;
  cp1++;
  cp2 = cp1;
  cp2++;
  cp3 = cp2;
  cp3++;
  *cp3 == '\0';
  if (*cp1 == '\0') {
    if (*cp == 'x')
      return (1);
    if (*cp == 'y')
      return (2);
    if (*cp == 'z')
      return (3);
    if (*cp == 'q')
      return (13);
    if (*cp == 'a')
      return (14);
    if (*cp == 'b')
      return (15);
    if (*cp == 'm')
      return (16);
    return (0);
  }
  if (*cp2 == '\0') {
    if (*cp == 'f') {
      if (*cp1 == 'x')
        return (4);
      if (*cp1 == 'y')
        return (5);
      if (*cp1 == 'z')
        return (6);
    }
    if (*cp == 'd') {
      if (*cp1 == 'x')
        return (7);
      if (*cp1 == 'y')
        return (8);
      if (*cp1 == 'z')
        return (9);
    }
    if (*cp == 'v') {
      if (*cp1 == 'x')
        return (10);
      if (*cp1 == 'y')
        return (11);
      if (*cp1 == 'z')
        return (12);
    }
    if (*cp == 'n') {
      if (*cp1 == 'a')
        return 19;
    }
  }
  if (*cp3 == '\0') {
    if (*cp == 'c' && *cp1 == 'h' && *cp2 == 'i')
      return 17;
    if (*cp == 'j' && *cp1 == 'a' && *cp2 == 'a')
      return 18;
    if (*cp == 's' && *cp1 == 'e' && *cp2 == 'r')
      return 20;
  }
  return (0);
}
```