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

```asm
<ki_dump>:
  endbr64
  movzbl (%rdi),%eax
  and    $0xf,%eax
  je     L8
  movzbl 0x1(%rdi),%r8d
  movzbl %al,%ecx
  lea    D20(%rip),%rdi
  movslq (%rdi,%rcx,4),%rcx
  add    %rdi,%rcx
  notrack jmp *%rcx
  nopl   (%rax)
L8:
  sub    $0x1,%esi
  add    $0x1,%rdi
  jmp    1070 <ax25_dump@plt>
  nopl   0x0(%rax)
  movzbl %al,%edx
  mov    %r8d,%ecx
  mov    $0x3,%edi
  xor    %eax,%eax
  lea    D34(%rip),%rsi
  jmp    1060 <lprintf@plt>
  nopl   0x0(%rax)
  lea    (%r8,%r8,4),%rdx
  lea    D25(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  add    %rdx,%rdx
  jmp    1060 <lprintf@plt>
  nopw   0x0(%rax,%rax,1)
  lea    0x1(%r8),%edx
  lea    D71(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  jmp    1060 <lprintf@plt>
  nop
  lea    (%r8,%r8,4),%rdx
  lea    D18(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  add    %rdx,%rdx
  jmp    1060 <lprintf@plt>
  nopw   0x0(%rax,%rax,1)
  lea    (%r8,%r8,4),%rdx
  lea    D58(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  add    %rdx,%rdx
  jmp    1060 <lprintf@plt>
  nopw   0x0(%rax,%rax,1)
  test   %r8d,%r8d
  lea    D45(%rip),%rax
  lea    D61(%rip),%rdx
  mov    $0x3,%edi
  cmovne %rax,%rdx
  lea    D99(%rip),%rsi
  xor    %eax,%eax
  jmp    1060 <lprintf@plt>
  nopl   0x0(%rax,%rax,1)
  mov    %r8d,%edx
  lea    D55(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  jmp    1060 <lprintf@plt>
  cs nopw 0x0(%rax,%rax,1)
  lea    D28(%rip),%rsi
  mov    $0x3,%edi
  xor    %eax,%eax
  jmp    1060 <lprintf@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D34
type_infered: string
name: extract_symbolic_data
arguments: data_label: D25
type_infered: string
name: extract_symbolic_data
arguments: data_label: D71
type_infered: string
name: extract_symbolic_data
arguments: data_label: D18
type_infered: string
name: extract_symbolic_data
arguments: data_label: D58
type_infered: string
name: extract_symbolic_data
arguments: data_label: D45
type_infered: string
name: extract_symbolic_data
arguments: data_label: D61
type_infered: string
name: extract_symbolic_data
arguments: data_label: D99
type_infered: string
name: extract_symbolic_data
arguments: data_label: D55
type_infered: string
name: extract_symbolic_data
arguments: data_label: D28
type_infered: string

tool: D34: code %u arg %u


tool: D25: TX Delay: %lu ms


tool: D71: Persistence: %u/256


tool: D18: Slot time: %lu ms


tool: D58: TX Tail time: %lu ms


tool: D45: Full

tool: D61: Half

tool: D99: Duplex: %s


tool: D55: Hardware %u


tool: D28: RETURN


assistant: ```c
void ki_dump(unsigned char *data, int length, int hexdump) {
  int type;
  int val;
  type = data[0] & 0xf;
  if (type == 0) {
    ax25_dump(data + 1, length - 1, hexdump);
    return;
  }
  val = data[1];
  switch (type) {
  case 1:
    lprintf(3, "TX Delay: %lu ms\n", val * 10L);
    break;
  case 2:
    lprintf(3, "Persistence: %u/256\n", val + 1);
    break;
  case 3:
    lprintf(3, "Slot time: %lu ms\n", val * 10L);
    break;
  case 4:
    lprintf(3, "TX Tail time: %lu ms\n", val * 10L);
    break;
  case 5:
    lprintf(3, "Duplex: %s\n", val == 0 ? "Half" : "Full");
    break;
  case 6:
    lprintf(3, "Hardware %u\n", val);
    break;
  case 15:
    lprintf(3, "RETURN\n");
    break;
  default:
    lprintf(3, "code %u arg %u\n", type, val);
    break;
  }
}
```