user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<decode_array>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r12
  mov    %rsi,%rbp
  mov    %rdx,0x8(%rsp)
  mov    %rcx,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  mov    %rsi,%rdi
  call   <decoded_dest_size@plt>
  mov    %rax,%rdx
  mov    $0xffffffffffffffff,%rax
  cmp    %rbx,%rdx
  ja     L125
  mov    $0x0,%ebx
  mov    $0x0,%r13d
  lea    0x28(%rsp),%r15
  test   %rbp,%rbp
  jne    L175
L137:
  movslq %r13d,%rax
  jmp    L125
L113:
  add    $0x1,%rax
  cmp    %rax,%rbp
  jbe    L170
L67:
  lea    0x1(%rax),%ebx
  movzbl (%r12,%rax,1),%edx
  cmp    $0xd,%dl
  je     L113
  cmp    $0xa,%dl
  je     L113
  mov    %dl,(%rcx)
  add    $0x1,%rcx
  cmp    %r15,%rcx
  je     L71
L128:
  movslq %ebx,%rax
  jmp    L67
L170:
  mov    $0xffffffffffffffff,%rax
L125:
  mov    0x28(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L79
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L71:
  movsbl 0x25(%rsp),%esi
  lea    0x1(%r13),%r14d
  movslq %r13d,%rax
  add    0x8(%rsp),%rax
  mov    %rax,0x10(%rsp)
  movsbl 0x24(%rsp),%edi
  mov    %esi,0x1c(%rsp)
  call   <decode_base64_pair1@plt>
  mov    0x10(%rsp),%rcx
  mov    %al,(%rcx)
  movzbl 0x26(%rsp),%eax
  mov    %al,0x10(%rsp)
  cmp    $0x3d,%al
  jne    L123
L51:
  movzbl 0x27(%rsp),%eax
  mov    %r14d,%r13d
  cmp    $0x3d,%al
  jne    L64
L180:
  movslq %ebx,%rax
  cmp    %rbp,%rax
  jae    L137
L175:
  movslq %ebx,%rsi
  movzbl (%r12,%rsi,1),%edx
  cmp    $0xd,%dl
  sete   %al
  cmp    $0xa,%dl
  sete   %dl
  or     %dl,%al
  je     L88
  cmp    %rsi,%rbp
  seta   %dl
  lea    0x1(%rbx),%eax
  cltq
  test   %dl,%dl
  je     L88
L41:
  mov    %eax,%ebx
  movzbl (%r12,%rax,1),%ecx
  cmp    $0xd,%cl
  sete   %dl
  cmp    $0xa,%cl
  sete   %cl
  or     %ecx,%edx
  cmp    %rax,%rbp
  seta   %cl
  mov    %rax,%rsi
  add    $0x1,%rax
  test   %cl,%dl
  jne    L41
L88:
  cmp    %rsi,%rbp
  je     L137
  lea    0x24(%rsp),%rcx
  jmp    L128
L123:
  add    $0x2,%r13d
  movslq %r14d,%r14
  add    0x8(%rsp),%r14
  movsbl %al,%esi
  mov    0x1c(%rsp),%edi
  call   <decode_base64_pair2@plt>
  mov    %al,(%r14)
  mov    %r13d,%r14d
  jmp    L51
L64:
  lea    0x1(%r14),%r13d
  movslq %r14d,%r14
  add    0x8(%rsp),%r14
  movsbl %al,%esi
  movsbl 0x10(%rsp),%edi
  call   <decode_base64_pair3@plt>
  mov    %al,(%r14)
  jmp    L180
L79:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
size_t decode_array(const char *src_array, const size_t src_len, char *dest_array, const size_t dest_size) {
  int cnt = 0;
  char ch[4];
  int i = 0;
  int j = 0;
  if (dest_size < decoded_dest_size(src_len))
    return -1;
  while (i < src_len) {
    while ((src_array[i] == '\r' || src_array[i] == '\n') && i < src_len) {
      ++i;
    }
    if (i == src_len)
      break;
    for (j = 0; j < 4; ++j) {
      do {
        ch[j] = src_array[i++];
      } while ((ch[j] == '\r' || ch[j] == '\n') && i < src_len);
      if (ch[j] == '\r' || ch[j] == '\n')
        return -1;
    }
    dest_array[cnt++] = decode_base64_pair1(ch[0], ch[1]);
    if (ch[2] != '=')
      dest_array[cnt++] = decode_base64_pair2(ch[1], ch[2]);
    if (ch[3] != '=')
      dest_array[cnt++] = decode_base64_pair3(ch[2], ch[3]);
  }
  return cnt;
}
```