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

```asm
<cdel_decode_from_base64_string>:
  endbr64
  push   %r15
  push   %r14
  mov    %rsi,%r14
  push   %r13
  push   %r12
  push   %rbp
  mov    %rdx,%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x38,%rsp
  mov    %rsi,0x28(%rsp)
  call   <strlen@plt>
  test   %r14,%r14
  je     L146
  lea    0x1(%rax),%r12d
  movslq %r12d,%r12
  mov    %r12,%rdi
  call   <malloc@plt>
  mov    %rax,0x18(%rsp)
  test   %rax,%rax
  je     L190
  mov    %r12,%rdi
  call   <malloc@plt>
  mov    %rax,0x20(%rsp)
  test   %rax,%rax
  je     L200
  mov    0x18(%rsp),%rdi
  mov    %r12,%rdx
  xor    %esi,%esi
  call   <memset@plt>
  mov    0x20(%rsp),%rdi
  mov    %r12,%rdx
  xor    %esi,%esi
  call   <memset@plt>
  movsbl (%rbx),%edi
  test   %dil,%dil
  je     L237
  xor    %r15d,%r15d
  xchg   %ax,%ax
L211:
  call   <is_base64@plt>
  cmp    $0x1,%eax
  je     L155
  movsbl 0x1(%rbx),%edi
  add    $0x1,%rbx
  test   %dil,%dil
  jne    L211
L92:
  test   %r15,%r15
  je     L107
  mov    0x18(%rsp),%rax
  mov    0x20(%rsp),%r14
  xor    %r13d,%r13d
  lea    0x3(%rax),%rsi
  jmp    L31
  nopw   0x0(%rax,%rax,1)
L262:
  movsbl -0x1(%rsi),%r12d
  lea    0x3(%r13),%rax
  mov    %r12d,%r10d
  cmp    %rax,%r15
  jbe    L24
L145:
  movsbl (%rsi),%r11d
  mov    %r11d,%r9d
L229:
  mov    %rsi,0x10(%rsp)
  mov    %r9b,0xb(%rsp)
  mov    %r10b,0xa(%rsp)
  mov    %r11d,0xc(%rsp)
  call   <base64_decode_byte@plt>
  mov    %ebp,%edi
  mov    %eax,%ebx
  call   <base64_decode_byte@plt>
  mov    %r12d,%edi
  shl    $0x2,%ebx
  mov    %eax,%ebp
  call   <base64_decode_byte@plt>
  mov    0xc(%rsp),%edi
  mov    %eax,%r12d
  call   <base64_decode_byte@plt>
  movzbl 0xa(%rsp),%r10d
  mov    %ebp,%edi
  movzbl 0xb(%rsp),%r9d
  shr    $0x4,%dil
  mov    0x10(%rsp),%rsi
  or     %edi,%ebx
  cmp    $0x3d,%r10b
  mov    %bl,(%r14)
  je     L53
  mov    %r12d,%edi
  shl    $0x4,%ebp
  add    $0x2,%r14
  shr    $0x2,%dil
  or     %edi,%ebp
  mov    %bpl,-0x1(%r14)
L99:
  cmp    $0x3d,%r9b
  je     L213
  shl    $0x6,%r12d
  add    $0x1,%r14
  or     %eax,%r12d
  mov    %r12b,-0x1(%r14)
L213:
  add    $0x4,%r13
  add    $0x4,%rsi
  cmp    %r13,%r15
  jbe    L28
L31:
  lea    0x1(%r13),%rax
  movsbl -0x3(%rsi),%edi
  mov    $0x41,%ebp
  cmp    %rax,%r15
  jbe    L38
  movsbl -0x2(%rsi),%ebp
L38:
  lea    0x2(%r13),%rax
  cmp    %rax,%r15
  ja     L262
  lea    0x3(%r13),%rax
  mov    $0x41,%r12d
  mov    $0x41,%r10d
  cmp    %rax,%r15
  ja     L145
L24:
  mov    $0x41,%r11d
  mov    $0x41,%r9d
  jmp    L229
  nopl   0x0(%rax)
L53:
  add    $0x1,%r14
  jmp    L99
  xchg   %ax,%ax
L155:
  movzbl (%rbx),%edx
  mov    0x18(%rsp),%rcx
  add    $0x1,%rbx
  lea    0x1(%r15),%rax
  mov    %dl,(%rcx,%r15,1)
  movsbl (%rbx),%edi
  mov    %rax,%r15
  test   %dil,%dil
  jne    L211
  jmp    L92
  nopl   0x0(%rax,%rax,1)
L28:
  mov    %r14,%r15
  sub    0x20(%rsp),%r15
L233:
  mov    0x18(%rsp),%rdi
  call   <free@plt>
  mov    0x28(%rsp),%rax
  mov    %r15,(%rax)
L208:
  add    $0x38,%rsp
  mov    %r14,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L190:
  test   %rbp,%rbp
  je     L220
  mov    D2(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,0x0(%rbp)
L220:
  xor    %r14d,%r14d
  jmp    L208
  cs nopw 0x0(%rax,%rax,1)
L200:
  test   %rbp,%rbp
  je     L8
  mov    D2(%rip),%rax
  mov    (%rax),%eax
  mov    %eax,0x0(%rbp)
L8:
  mov    0x18(%rsp),%rdi
  xor    %r14d,%r14d
  call   <free@plt>
  jmp    L208
L146:
  test   %rbp,%rbp
  je     L220
  mov    D0(%rip),%rax
  xor    %r14d,%r14d
  mov    (%rax),%eax
  mov    %eax,0x0(%rbp)
  jmp    L208
  cs nopw 0x0(%rax,%rax,1)
L237:
  mov    0x20(%rsp),%r14
  xor    %r15d,%r15d
  jmp    L233
L107:
  mov    0x20(%rsp),%r14
  jmp    L233
```

assistant: ```c
unsigned char *cdel_decode_from_base64_string(const char *in_string, size_t *buff_len, int *error) {
  char c1 = 0;
  char c2 = 0;
  char c3 = 0;
  char c4 = 0;
  unsigned char b1 = 0;
  unsigned char b2 = 0;
  unsigned char b3 = 0;
  unsigned char b4 = 0;
  unsigned char *buf = NULL;
  unsigned char *out_buffer = NULL;
  size_t k;
  size_t l = strlen(in_string) + 1;
  unsigned char *dest = NULL;
  if (buff_len == NULL) {
    if (error != NULL)
      *error = EINVAL;
    return NULL;
  }
  buf = (unsigned char *)malloc(l);
  if (buf == NULL) {
    if (error != NULL)
      *error = ENOMEM;
    return NULL;
  }
  out_buffer = (unsigned char *)malloc(l);
  if (out_buffer == NULL) {
    if (error != NULL)
      *error = ENOMEM;
    free(buf);
    return NULL;
  }
  memset(buf, 0, l);
  memset(out_buffer, 0, l);
  dest = out_buffer;
  for (k = 0, l = 0; in_string[k]; k++) {
    if (is_base64(in_string[k]) == 1)
      buf[l++] = in_string[k];
  }
  for (k = 0; k < l; k += 4) {
    c1 = 'A';
    c2 = 'A';
    c3 = 'A';
    c4 = 'A';
    b1 = 0;
    b2 = 0;
    b3 = 0;
    b4 = 0;
    c1 = buf[k];
    if (k + 1 < l) {
      c2 = buf[k + 1];
    }
    if (k + 2 < l) {
      c3 = buf[k + 2];
    }
    if (k + 3 < l) {
      c4 = buf[k + 3];
    }
    b1 = base64_decode_byte(c1);
    b2 = base64_decode_byte(c2);
    b3 = base64_decode_byte(c3);
    b4 = base64_decode_byte(c4);
    *out_buffer++ = ((b1 << 2) | (b2 >> 4));
    if (c3 != '=') {
      *out_buffer++ = (((b2 & 0xf) << 4) | (b3 >> 2));
    }
    if (c4 != '=') {
      *out_buffer++ = (((b3 & 0x3) << 6) | b4);
    }
  }
  free(buf);
  *buff_len = (size_t)(out_buffer - dest);
  return out_buffer;
}
```