user: Converte this assembly snippet into its equivalent C code:

```asm
<decode_refalt_rev>:
  endbr64
  mov    %edi,%eax
  push   %r14
  mov    %r8,%r14
  sar    $0x1b,%eax
  push   %r13
  mov    %rdx,%r13
  and    $0xf,%eax
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  mov    %rcx,%rbx
  mov    %rax,(%rdx)
  mov    %edi,%eax
  sar    $0x17,%eax
  and    $0xf,%eax
  mov    %rax,(%r8)
  mov    (%rdx),%rax
  cmp    $0xa,%rax
  ja     L16
  lea    D15(%rip),%rcx
  movslq (%rcx,%rax,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  xchg   %ax,%ax
  mov    $0x3,%esi
  call   <decode_base@plt>
  mov    %al,0x9(%r12)
  mov    $0x5,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x8(%r12)
  mov    $0x7,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x7(%r12)
  mov    $0x9,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x6(%r12)
  mov    $0xb,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x5(%r12)
  mov    $0xd,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x4(%r12)
  mov    $0xf,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x3(%r12)
  mov    $0x11,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x2(%r12)
  mov    $0x13,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,0x1(%r12)
  mov    $0x15,%esi
  mov    %ebp,%edi
  call   <decode_base@plt>
  mov    %al,(%r12)
  mov    0x0(%r13),%rax
L16:
  movb   $0x0,(%r12,%rax,1)
  mov    0x0(%r13),%eax
  lea    (%rax,%rax,1),%r12d
  mov    (%r14),%rax
  cmp    $0xa,%rax
  ja     L17
  lea    D4(%rip),%rcx
  movslq (%rcx,%rax,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  cs nopw 0x0(%rax,%rax,1)
  mov    $0x3,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x9(%rbx)
  mov    $0x5,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x8(%rbx)
  mov    $0x7,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x7(%rbx)
  mov    $0x9,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x6(%rbx)
  mov    $0xb,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x5(%rbx)
  mov    $0xd,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x4(%rbx)
  mov    $0xf,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x3(%rbx)
  mov    $0x11,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x2(%rbx)
  mov    $0x13,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,0x1(%rbx)
  mov    $0x15,%esi
  mov    %ebp,%edi
  sub    %r12d,%esi
  call   <decode_base@plt>
  mov    %al,(%rbx)
  mov    (%r14),%rax
L17:
  movb   $0x0,(%rbx,%rax,1)
  pop    %rbx
  mov    (%r14),%rax
  pop    %rbp
  add    0x0(%r13),%rax
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
size_t decode_refalt_rev(uint32_t code, char *ref, size_t *sizeref, char *alt, size_t *sizealt) {
  *sizeref = (size_t)((code & 0x78000000) >> 27);
  *sizealt = (size_t)((code & 0x07800000) >> 23);
  switch (*sizeref) {
  case 10:
    ref[9] = decode_base(code, (3 + (2 * 0)));
  case 9:
    ref[8] = decode_base(code, (3 + (2 * 1)));
  case 8:
    ref[7] = decode_base(code, (3 + (2 * 2)));
  case 7:
    ref[6] = decode_base(code, (3 + (2 * 3)));
  case 6:
    ref[5] = decode_base(code, (3 + (2 * 4)));
  case 5:
    ref[4] = decode_base(code, (3 + (2 * 5)));
  case 4:
    ref[3] = decode_base(code, (3 + (2 * 6)));
  case 3:
    ref[2] = decode_base(code, (3 + (2 * 7)));
  case 2:
    ref[1] = decode_base(code, (3 + (2 * 8)));
  case 1:
    ref[0] = decode_base(code, (3 + (2 * 9)));
  }
  ref[*sizeref] = 0;
  uint8_t bitpos = (23 - ((*sizeref) << 1));
  switch (*sizealt) {
  case 10:
    alt[9] = decode_base(code, bitpos - (2 * 10));
  case 9:
    alt[8] = decode_base(code, bitpos - (2 * 9));
  case 8:
    alt[7] = decode_base(code, bitpos - (2 * 8));
  case 7:
    alt[6] = decode_base(code, bitpos - (2 * 7));
  case 6:
    alt[5] = decode_base(code, bitpos - (2 * 6));
  case 5:
    alt[4] = decode_base(code, bitpos - (2 * 5));
  case 4:
    alt[3] = decode_base(code, bitpos - (2 * 4));
  case 3:
    alt[2] = decode_base(code, bitpos - (2 * 3));
  case 2:
    alt[1] = decode_base(code, bitpos - (2 * 2));
  case 1:
    alt[0] = decode_base(code, bitpos - (2 * 1));
  }
  alt[*sizealt] = 0;
  return (*sizeref + *sizealt);
}
```