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

```asm
<pd_getline>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    %r9,-0x50(%rbp)
  movl   $0x400,-0x14(%rbp)
  movl   $0x0,-0x18(%rbp)
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    0x18(%rbp),%rdx
  mov    %rax,(%rdx)
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L195
  cmpq   $0x0,-0x50(%rbp)
  je     L123
  mov    0x28(%rbp),%edx
  mov    0x20(%rbp),%rax
  mov    -0x50(%rbp),%rcx
  mov    %rax,%rsi
  mov    0x10(%rbp),%edi
  call   *%rcx
L123:
  mov    $0x0,%eax
  jmp    L93
L195:
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  movb   $0x0,(%rax)
L43:
  jmp    L110
L186:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  mov    $0xa,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L22
  mov    -0x40(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  sub    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rcx
  mov    -0x28(%rbp),%rax
  add    %rcx,%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L133
  mov    -0x40(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L154
L133:
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  add    $0x1,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L154
L22:
  mov    -0x10(%rbp),%rax
  sub    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  add    $0x1,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x10(%rbp),%rax
  movb   $0x0,(%rax)
  jmp    L154
L73:
  shll   -0x14(%rbp)
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x14(%rbp),%edx
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <realloc@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L83
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    0x18(%rbp),%rax
  movq   $0x0,(%rax)
  mov    0x18(%rbp),%rax
  movq   $0x0,(%rax)
  cmpq   $0x0,-0x50(%rbp)
  je     L57
  mov    0x28(%rbp),%edx
  mov    0x20(%rbp),%rax
  mov    -0x50(%rbp),%rcx
  mov    %rax,%rsi
  mov    0x10(%rbp),%edi
  call   *%rcx
L57:
  mov    $0x0,%eax
  jmp    L93
L83:
  mov    0x18(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
L154:
  mov    -0x14(%rbp),%eax
  sub    -0x18(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  cmp    %eax,%edx
  jl     L73
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    0x18(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  cltq
  lea    (%rdx,%rax,1),%rcx
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    %rcx,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  cmpq   $0x0,-0x10(%rbp)
  je     L110
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    $0xd,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  je     L198
  mov    -0x10(%rbp),%rax
  movb   $0x0,(%rax)
L198:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L155
  mov    -0x38(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
L155:
  mov    $0x1,%eax
  jmp    L93
L110:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  cmp    %eax,%edx
  jl     L186
  mov    -0x38(%rbp),%rax
  movl   $0x0,(%rax)
  mov    -0x2c(%rbp),%eax
  lea    -0x1(%rax),%esi
  mov    0x28(%rbp),%ecx
  mov    0x20(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  mov    -0x48(%rbp),%r9
  mov    %ecx,%r8d
  mov    %rdx,%rcx
  mov    %esi,%edx
  mov    %rax,%rsi
  mov    0x10(%rbp),%edi
  call   *%r9
  mov    -0x40(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  test   %eax,%eax
  jg     L192
  mov    0x18(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    0x18(%rbp),%rax
  movq   $0x0,(%rax)
  mov    0x18(%rbp),%rax
  movq   $0x0,(%rax)
  cmpq   $0x0,-0x50(%rbp)
  je     L14
  mov    0x28(%rbp),%edx
  mov    0x20(%rbp),%rax
  mov    -0x50(%rbp),%rcx
  mov    %rax,%rsi
  mov    0x10(%rbp),%edi
  call   *%rcx
L14:
  mov    $0x0,%eax
  jmp    L93
L192:
  mov    -0x40(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L43
L93:
  leave
  ret
```

assistant: ```c
int pd_getline(char *buf, unsigned int bufsize, int *bufcur, int *buflen, int (*readfunc)(int, void *, unsigned int, char *, int), int (*closefunc)(int, char *, int), int readfd, char **line, char *errdesc, int errlen) {
  char *eol;
  unsigned int srcsize;
  int linelen;
  int linesize = 1024;
  linelen = 0;
  if (!(*line = malloc(linesize))) {
    if (closefunc)
      (void)closefunc(readfd, errdesc, errlen);
    return 0;
  }
  **line = 0;
top:
  while (*bufcur < *buflen) {
    if (!(eol = strchr(buf + *bufcur, '\n'))) {
      if (!(eol = memchr(buf + *bufcur, '\0', *buflen - *bufcur))) {
        srcsize = *buflen - *bufcur;
      } else {
        srcsize = eol - buf - *bufcur + 1;
      }
    } else {
      srcsize = eol - buf - *bufcur + 1;
      *eol = 0;
    }
    while ((int)srcsize > (linesize - linelen)) {
      char *newline;
      linesize *= 2;
      if ((newline = realloc(*line, linesize)) == NULL) {
        free(*line);
        *line = NULL;
        *line = NULL;
        if (closefunc)
          (void)closefunc(readfd, errdesc, errlen);
        return 0;
      }
      *line = newline;
    }
    memcpy(*line + linelen, buf + *bufcur, srcsize);
    linelen += srcsize;
    *bufcur += srcsize;
    if (eol) {
      if ((eol = strchr(*line, '\r')) != NULL)
        *eol = 0;
      if (!buf[*bufcur])
        (*bufcur)++;
      return 1;
    }
  }
  *bufcur = 0;
  if ((*buflen = readfunc(readfd, buf, bufsize - 1, errdesc, errlen)) <= 0) {
    free(*line);
    *line = NULL;
    *line = NULL;
    if (closefunc)
      (void)closefunc(readfd, errdesc, errlen);
    return 0;
  }
  buf[*buflen] = 0;
  goto top;
}
```