user: 请将以下的汇编代码转换成C语言代码:

```asm
<string_decode_base64>:
  endbr64
  push   %r14
  push   %r13
  xor    %r13d,%r13d
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x70,%rsp
  movdqa D18(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  lea    0x9(%rsp),%r14
  movb   $0x0,0x60(%rsp)
  movaps %xmm0,0x10(%rsp)
  movdqa D43(%rip),%xmm0
  movb   $0x0,(%rsi)
  movaps %xmm0,0x20(%rsp)
  movdqa D41(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  movdqa D1(%rip),%xmm0
  movaps %xmm0,0x40(%rsp)
  movdqa D24(%rip),%xmm0
  movaps %xmm0,0x50(%rsp)
  test   %rdi,%rdi
  je     L130
L105:
  movzbl (%rbx),%edx
  test   %dl,%dl
  je     L130
L54:
  movl   $0x0,0xc(%rsp)
  xor    %ebp,%ebp
  nopl   (%rax)
L31:
  movzbl %dl,%eax
  add    $0x1,%rbx
  movzbl (%rbx),%edx
  lea    -0x2b(%rax),%ecx
  cmp    $0x4f,%cl
  ja     L85
  sub    $0x2b,%eax
  cltq
  movzbl 0x10(%rsp,%rax,1),%eax
  test   %al,%al
  je     L85
  cmp    $0x24,%al
  je     L85
  test   %dl,%dl
  je     L77
  cmp    $0x3d,%al
  je     L31
  movslq %ebp,%rcx
  sub    $0x3e,%eax
  lea    0x1(%rbp),%esi
  mov    %al,0xc(%rsp,%rcx,1)
  cmp    $0x3,%ebp
  je     L65
  mov    %esi,%ebp
  jmp    L31
  xchg   %ax,%ax
L85:
  test   %dl,%dl
  jne    L31
L77:
  movslq %ebp,%rax
  movb   $0x0,0xc(%rsp,%rax,1)
  test   %ebp,%ebp
  je     L105
  lea    0xc(%rsp),%rdi
  mov    %r14,%rsi
  call   <string_convbase64_6x4_to_8x3@plt>
  sub    $0x1,%ebp
  je     L105
L66:
  xor    %eax,%eax
L95:
  movzbl (%r14,%rax,1),%edx
  mov    %dl,(%r12,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%ebp
  jg     L95
  xor    %edx,%edx
  lea    -0x1(%rbp),%eax
  test   %ebp,%ebp
  cmovle %edx,%eax
  mov    $0x1,%edx
  lea    0x1(%r13,%rax,1),%r13d
  mov    %ebp,%eax
  cmovle %rdx,%rax
  movzbl (%rbx),%edx
  add    %rax,%r12
  test   %dl,%dl
  jne    L54
L130:
  movb   $0x0,(%r12)
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L151
  add    $0x70,%rsp
  mov    %r13d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  cs nopw 0x0(%rax,%rax,1)
L65:
  lea    0xc(%rsp),%rdi
  mov    %r14,%rsi
  call   <string_convbase64_6x4_to_8x3@plt>
  jmp    L66
L151:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D18
datatype: byte[16]
name: unpack_data
arguments: data_label: D43
datatype: byte[16]
name: unpack_data
arguments: data_label: D41
datatype: byte[16]
name: unpack_data
arguments: data_label: D1
datatype: byte[16]
name: unpack_data
arguments: data_label: D24
datatype: byte[16]

tool: {"D18": [0x7c,0x24,0x24,0x24,0x7d,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,0x7b,0x24]}

tool: {"D43": [0x24,0x24,0x24,0x24,0x24,0x24,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47]}

tool: {"D41": [0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57]}

tool: {"D1": [0x24,0x24,0x24,0x24,0x24,0x24,0x58,0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60,0x61]}

tool: {"D24": [0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71]}

assistant: ```c
int string_decode_base64(const char *from, char *to) {
  const char *ptr_from;
  int length, to_length, i;
  char *ptr_to;
  unsigned char c, in[4], out[3];
  unsigned char base64_table[] = "|$$$}rstuvwxyz{$$$$$$$>?"
                                 "@ABCDEFGHIJKLMNOPQRSTUVW$$$$$$XYZ[\\]^_`abcdefghijklmnopq";
  ptr_from = from;
  ptr_to = to;
  ptr_to[0] = '\0';
  to_length = 0;
  while (ptr_from && ptr_from[0]) {
    length = 0;
    for (i = 0; i < 4; i++) {
      in[i] = 0;
    }
    for (i = 0; i < 4; i++) {
      c = 0;
      while (ptr_from[0] && (c == 0)) {
        c = (unsigned char)ptr_from[0];
        ptr_from++;
        c = ((c < 43) || (c > 122)) ? 0 : base64_table[c - 43];
        if (c)
          c = (c == '$') ? 0 : c - 61;
      }
      if (ptr_from[0]) {
        length++;
        if (c)
          in[i] = c - 1;
      } else {
        in[i] = '\0';
        break;
      }
    }
    if (length) {
      string_convbase64_6x4_to_8x3(in, out);
      for (i = 0; i < length - 1; i++) {
        ptr_to[0] = out[i];
        ptr_to++;
        to_length++;
      }
    }
  }
  ptr_to[0] = '\0';
  return to_length;
}
```