user: 下面的汇编指令对应的C源代码是什么：

```asm
<ft_read>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,%eax
  mov    %ecx,-0x28(%rbp)
  mov    %al,-0x24(%rbp)
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L62
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L88
L62:
  mov    $0xffffffff,%eax
  jmp    L30
L88:
  movsbl -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <ft_strclen@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%edx
  mov    -0x28(%rbp),%eax
  cmp    %eax,%edx
  cmovbe %edx,%eax
  mov    %eax,-0x4(%rbp)
  movsbl -0x24(%rbp),%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <ft_strchr@plt>
  test   %eax,%eax
  jne    L104
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x4(%rbp),%edx
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <ft_strnjoinf@plt>
  mov    -0x18(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L51
  mov    $0xffffffd6,%eax
  jmp    L30
L51:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x1000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <ft_memset@plt>
  mov    $0xffffffff,%eax
  jmp    L30
L104:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <ft_strlen@plt>
  cmp    %eax,-0x4(%rbp)
  jne    L52
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x4(%rbp),%edx
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <ft_strnjoinf@plt>
  mov    -0x18(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L75
  mov    $0xffffffd6,%eax
  jmp    L30
L75:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x1000,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <ft_memset@plt>
  mov    $0x0,%eax
  jmp    L30
L52:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rsi
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x4(%rbp),%edx
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <ft_strnjoinf@plt>
  mov    -0x18(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L50
  mov    $0xffffffd6,%eax
  jmp    L30
L50:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x4(%rbp),%eax
  add    $0x1,%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <ft_memmove@plt>
  mov    $0x1000,%eax
  sub    -0x28(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rcx
  mov    -0x28(%rbp),%eax
  mov    -0x4(%rbp),%esi
  sub    %rsi,%rax
  add    %rcx,%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <ft_memset@plt>
  mov    $0x1,%eax
L30:
  leave
  ret
```

assistant: ```c
int ft_read(char **line, char **buf, char c, unsigned int max_s) {
  unsigned int size;
  if (!*buf || !**buf)
    return (-1);
  size = ft_strclen(*buf, c);
  size = (size > max_s) ? max_s : size;
  if (!ft_strchr(*buf, c)) {
    if (!(*line = ft_strnjoinf(*line, *buf, size, 1)))
      return (-42);
    ft_memset(*buf, '\0', 4096);
    return (-1);
  }
  if (size == ft_strlen(*buf)) {
    if (!(*line = ft_strnjoinf(*line, *buf, size, 1)))
      return (-42);
    ft_memset(*buf, '\0', 4096);
    return (0);
  }
  if (!(*line = ft_strnjoinf(*line, *buf, size, 1)))
    return (-42);
  ft_memmove(*buf, (*buf) + size + 1, max_s);
  ft_memset((*buf) + max_s - size, '\0', 4096 - max_s);
  return (1);
}
```