user: What is the c source code of the assembly code below?

```asm
<grab_emails>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %esi,-0x9c(%rbp)
  mov    %rdx,-0xa8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x84(%rbp)
  lea    -0x40(%rbp),%rax
  mov    $0x32,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x80(%rbp),%rax
  mov    $0x32,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  jmp    L248
L334:
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x44,%al
  jne    L65
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x33,%al
  jne    L65
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x2(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x25,%al
  je     L122
L65:
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x84(%rbp),%eax
  cltq
  mov    %dl,-0x80(%rbp,%rax,1)
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3e,%al
  jne    L287
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x62,%al
  jne    L287
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x2(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L287
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x3(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3c,%al
  jne    L287
  subl   $0x4,-0x9c(%rbp)
L287:
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3e,%al
  jne    L103
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x62,%al
  jne    L103
  mov    -0x9c(%rbp),%eax
  cltq
  lea    -0x2(%rax),%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3c,%al
  jne    L103
  subl   $0x3,-0x9c(%rbp)
L103:
  addl   $0x1,-0x84(%rbp)
  subl   $0x1,-0x9c(%rbp)
L248:
  cmpl   $0x0,-0x9c(%rbp)
  js     L55
  cmpl   $0x31,-0x84(%rbp)
  jg     L55
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2d,%al
  je     L334
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  je     L334
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L334
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L150
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jle    L334
L150:
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x40,%al
  jle    L232
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5a,%al
  jle    L334
L232:
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L55
  mov    -0x9c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x98(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jle    L334
  jmp    L55
L122:
  nop
L55:
  lea    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x31,%eax
  jle    L197
  mov    $0x0,%eax
  jmp    L25
L197:
  lea    -0x80(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x84(%rbp)
  jmp    L246
L207:
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    -0x84(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x80(%rbp,%rdx,1),%edx
  cltq
  mov    %dl,-0x40(%rbp,%rax,1)
  subl   $0x1,-0x84(%rbp)
L246:
  cmpl   $0x0,-0x84(%rbp)
  jns    L207
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  je     L22
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  cmp    $0x31,%eax
  jg     L22
  movzbl -0x40(%rbp),%eax
  cmp    $0x40,%al
  je     L22
  lea    -0x40(%rbp),%rax
  lea    D8(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strstr@plt>
  test   %eax,%eax
  jne    L94
L22:
  mov    $0x0,%eax
  jmp    L25
L94:
  mov    -0xa8(%rbp),%rdx
  lea    -0x40(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <emaillist@plt>
  test   %rax,%rax
  je     L281
  mov    $0x1,%eax
  jmp    L25
L281:
  mov    $0x0,%eax
L25:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L302
  call   <__stack_chk_fail@plt>
L302:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D8
type_infered: string

tool: D8: @

assistant: ```c
int grab_emails(char *buff, int pointer, char *host) {
  int ctr = 0;
  char flippedemail[50];
  char email[50];
  memset(email, '\0', sizeof(email));
  memset(flippedemail, '\0', sizeof(flippedemail));
  while (pointer >= 0 && ctr < 50 && (buff[pointer] == '-' || buff[pointer] == 64 || buff[pointer] == 46 || (buff[pointer] >= 48 && buff[pointer] <= 57) || (buff[pointer] >= 65 && buff[pointer] <= 90) || (buff[pointer] >= 97 && buff[pointer] <= 122))) {
    if (buff[pointer] == 'D' && buff[pointer - 1] == '3' && buff[pointer - 2] == '%')
      break;
    flippedemail[ctr] = buff[pointer];
    if (buff[pointer] == '>' && buff[pointer - 1] == 'b' && buff[pointer - 2] == '/' && buff[pointer - 3] == '<')
      pointer -= 4;
    if (buff[pointer] == '>' && buff[pointer - 1] == 'b' && buff[pointer - 2] == '<')
      pointer -= 3;
    ctr++;
    pointer--;
  }
  if (strlen(flippedemail) >= 50)
    return 0;
  for (ctr = (int)strlen(flippedemail); ctr >= 0; ctr--) {
    email[strlen(email)] = flippedemail[ctr];
  }
  if (!strlen(email) || strlen(email) >= 50 || email[0] == '@' || !strstr(email, "@"))
    return 0;
  if (emaillist(email, host))
    return 1;
  return 0;
}
```