user: Please show me the C implementation that matches the assembly code listed below:

```asm
<icmpTypeCode2String>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x150,%rsp
  mov    %edi,-0x144(%rbp)
  mov    %esi,-0x148(%rbp)
  mov    %edx,-0x14c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D250(%rip),%rax
  mov    %rax,-0x80(%rbp)
  lea    D103(%rip),%rax
  mov    %rax,-0x78(%rbp)
  lea    D33(%rip),%rax
  mov    %rax,-0x70(%rbp)
  lea    D3(%rip),%rax
  mov    %rax,-0x68(%rbp)
  lea    D7(%rip),%rax
  mov    %rax,-0x60(%rbp)
  lea    D304(%rip),%rax
  mov    %rax,-0x58(%rbp)
  lea    D124(%rip),%rax
  mov    %rax,-0x50(%rbp)
  lea    D139(%rip),%rax
  mov    %rax,-0x48(%rbp)
  lea    D98(%rip),%rax
  mov    %rax,-0x40(%rbp)
  lea    D313(%rip),%rax
  mov    %rax,-0x38(%rbp)
  lea    D419(%rip),%rax
  mov    %rax,-0x30(%rbp)
  lea    D70(%rip),%rax
  mov    %rax,-0x28(%rbp)
  lea    D13(%rip),%rax
  mov    %rax,-0x20(%rbp)
  lea    D72(%rip),%rax
  mov    %rax,-0x18(%rbp)
  lea    D256(%rip),%rax
  mov    %rax,-0x110(%rbp)
  lea    D161(%rip),%rax
  mov    %rax,-0x108(%rbp)
  lea    D289(%rip),%rax
  mov    %rax,-0x100(%rbp)
  lea    D192(%rip),%rax
  mov    %rax,-0xf8(%rbp)
  lea    D331(%rip),%rax
  mov    %rax,-0x130(%rbp)
  lea    D347(%rip),%rax
  mov    %rax,-0x128(%rbp)
  lea    D383(%rip),%rax
  mov    %rax,-0xc0(%rbp)
  lea    D129(%rip),%rax
  mov    %rax,-0xb8(%rbp)
  lea    D182(%rip),%rax
  mov    %rax,-0xb0(%rbp)
  lea    D294(%rip),%rax
  mov    %rax,-0xa8(%rbp)
  lea    D215(%rip),%rax
  mov    %rax,-0xa0(%rbp)
  lea    D286(%rip),%rax
  mov    %rax,-0x98(%rbp)
  lea    D223(%rip),%rax
  mov    %rax,-0x90(%rbp)
  lea    D128(%rip),%rax
  mov    %rax,-0x120(%rbp)
  lea    D347(%rip),%rax
  mov    %rax,-0x118(%rbp)
  lea    D290(%rip),%rax
  mov    %rax,-0xf0(%rbp)
  lea    D132(%rip),%rax
  mov    %rax,-0xe8(%rbp)
  lea    D42(%rip),%rax
  mov    %rax,-0xe0(%rbp)
  lea    D276(%rip),%rax
  mov    %rax,-0xd8(%rbp)
  lea    D314(%rip),%rax
  mov    %rax,-0xd0(%rbp)
  lea    D324(%rip),%rax
  mov    %rax,-0x138(%rbp)
  cmpl   $0x4,-0x144(%rbp)
  jne    L271
  cmpl   $0xb,-0x148(%rbp)
  ja     L138
  mov    -0x148(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D47(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D47(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  lea    D342(%rip),%rax
  jmp    L110
  lea    D185(%rip),%rax
  jmp    L110
  cmpl   $0xd,-0x14c(%rbp)
  jg     L34
  mov    -0x14c(%rbp),%eax
  cltq
  mov    -0x80(%rbp,%rax,8),%rax
  jmp    L110
  cmpl   $0x3,-0x14c(%rbp)
  jg     L186
  mov    -0x14c(%rbp),%eax
  cltq
  mov    -0x110(%rbp,%rax,8),%rax
  jmp    L110
  cmpl   $0x1,-0x14c(%rbp)
  jg     L197
  mov    -0x14c(%rbp),%eax
  cltq
  mov    -0x130(%rbp,%rax,8),%rax
  jmp    L110
L271:
  cmpl   $0x6,-0x144(%rbp)
  jne    L184
  cmpl   $0x89,-0x148(%rbp)
  jg     L272
  cmpl   $0x85,-0x148(%rbp)
  jge    L52
  cmpl   $0x81,-0x148(%rbp)
  je     L274
  cmpl   $0x81,-0x148(%rbp)
  jg     L272
  cmpl   $0x80,-0x148(%rbp)
  je     L368
  cmpl   $0x80,-0x148(%rbp)
  jg     L272
  cmpl   $0x3,-0x148(%rbp)
  je     L142
  cmpl   $0x3,-0x148(%rbp)
  jg     L272
  cmpl   $0x1,-0x148(%rbp)
  je     L252
  cmpl   $0x2,-0x148(%rbp)
  je     L118
  jmp    L272
L252:
  cmpl   $0x6,-0x14c(%rbp)
  jg     L322
  mov    -0x14c(%rbp),%eax
  cltq
  mov    -0xc0(%rbp,%rax,8),%rax
  jmp    L110
L118:
  lea    D143(%rip),%rax
  jmp    L110
L142:
  cmpl   $0x1,-0x14c(%rbp)
  jg     L232
  mov    -0x14c(%rbp),%eax
  cltq
  mov    -0x120(%rbp,%rax,8),%rax
  jmp    L110
L368:
  lea    D415(%rip),%rax
  jmp    L110
L274:
  lea    D173(%rip),%rax
  jmp    L110
L52:
  mov    -0x148(%rbp),%eax
  sub    $0x85,%eax
  cltq
  mov    -0xf0(%rbp,%rax,8),%rax
  jmp    L110
L138:
  nop
  jmp    L184
L34:
  nop
  jmp    L184
L186:
  nop
  jmp    L184
L197:
  nop
  jmp    L184
L272:
  nop
  jmp    L184
L322:
  nop
  jmp    L184
L232:
  nop
L184:
  mov    -0x138(%rbp),%rax
L110:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L146
  call   <__stack_chk_fail@plt>
L146:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_label: D250
datatype: string
name: parse_data
arguments: data_label: D103
datatype: string
name: parse_data
arguments: data_label: D33
datatype: string
name: parse_data
arguments: data_label: D3
datatype: string
name: parse_data
arguments: data_label: D7
datatype: string
name: parse_data
arguments: data_label: D304
datatype: string
name: parse_data
arguments: data_label: D124
datatype: string
name: parse_data
arguments: data_label: D139
datatype: string
name: parse_data
arguments: data_label: D98
datatype: string
name: parse_data
arguments: data_label: D313
datatype: string
name: parse_data
arguments: data_label: D419
datatype: string
name: parse_data
arguments: data_label: D70
datatype: string
name: parse_data
arguments: data_label: D13
datatype: string
name: parse_data
arguments: data_label: D72
datatype: string
name: parse_data
arguments: data_label: D256
datatype: string
name: parse_data
arguments: data_label: D161
datatype: string
name: parse_data
arguments: data_label: D289
datatype: string
name: parse_data
arguments: data_label: D192
datatype: string
name: parse_data
arguments: data_label: D331
datatype: string
name: parse_data
arguments: data_label: D347
datatype: string
name: parse_data
arguments: data_label: D383
datatype: string
name: parse_data
arguments: data_label: D129
datatype: string
name: parse_data
arguments: data_label: D182
datatype: string
name: parse_data
arguments: data_label: D294
datatype: string
name: parse_data
arguments: data_label: D215
datatype: string
name: parse_data
arguments: data_label: D286
datatype: string
name: parse_data
arguments: data_label: D223
datatype: string
name: parse_data
arguments: data_label: D128
datatype: string
name: parse_data
arguments: data_label: D290
datatype: string
name: parse_data
arguments: data_label: D132
datatype: string
name: parse_data
arguments: data_label: D42
datatype: string
name: parse_data
arguments: data_label: D276
datatype: string
name: parse_data
arguments: data_label: D314
datatype: string
name: parse_data
arguments: data_label: D324
datatype: string
name: parse_data
arguments: data_label: D342
datatype: string
name: parse_data
arguments: data_label: D185
datatype: string
name: parse_data
arguments: data_label: D143
datatype: string
name: parse_data
arguments: data_label: D415
datatype: string
name: parse_data
arguments: data_label: D173
datatype: string

tool: D250: Destination network unreachable

tool: D103: Destination host unreachable

tool: D33: Destination protocol unreachable

tool: D3: Destination port unreachable

tool: D7: Fragmentation required, and DF flag set

tool: D304: Source route failed

tool: D124: Destination network unknown

tool: D139: Destination host unknown

tool: D98: Source host isolated

tool: D313: Network administratively prohibited

tool: D419: Host administratively prohibited

tool: D70: Network unreachable for TOS

tool: D13: Host unreachable for TOS

tool: D72: Communication administratively prohibited

tool: D256: Redirect Datagram for the Network

tool: D161: Redirect Datagram for the Host

tool: D289: Redirect Datagram for the TOS & network

tool: D192: Redirect Datagram for the TOS & host

tool: D331: TTL expired in transit

tool: D347: Fragment reassembly time exceeded

tool: D383: No route to destination

tool: D129: Communication with destination administratively prohibited

tool: D182: Beyond scope of source address

tool: D294: Address unreachable

tool: D215: Port unreachable

tool: D286: Source address failed ingress/egress policy

tool: D223: Reject route to destination

tool: D128: Hop limit exceeded in transit

tool: D290: ICMPv6 router solicitation

tool: D132: ICMPv6 router advertisement

tool: D42: ICMPv6 neighbor solicitation

tool: D276: ICMPv6 neighbor advertisement

tool: D314: ICMPv6 redirect

tool: 

tool: D342: Echo reply

tool: D185: Echo

tool: D143: ICMPv6 packet too big

tool: D415: ICMPv6 echo request

tool: D173: ICMPv6 echo reply

assistant: ```c
const char *icmpTypeCode2String(int ipv, u_int8_t type, u_int8_t code) {
  const char *DestUnreach[] = {"Destination network unreachable", "Destination host unreachable", "Destination protocol unreachable", "Destination port unreachable", "Fragmentation required, and DF flag set", "Source route failed", "Destination network unknown", "Destination host unknown", "Source host isolated", "Network administratively prohibited", "Host administratively prohibited", "Network unreachable for TOS", "Host unreachable for TOS", "Communication administratively prohibited"};
  const char *Redirect[] = {"Redirect Datagram for the Network", "Redirect Datagram for the Host", "Redirect Datagram for the TOS & network", "Redirect Datagram for the TOS & host"};
  const char *TimeExceed[] = {"TTL expired in transit", "Fragment reassembly time exceeded"};
  const char *Dest6Unreach[] = {"No route to destination", "Communication with destination administratively prohibited", "Beyond scope of source address", "Address unreachable", "Port unreachable", "Source address failed ingress/egress policy", "Reject route to destination"};
  const char *Time6Exceed[] = {"Hop limit exceeded in transit", "Fragment reassembly time exceeded"};
  const char *ND_messesg[] = {"ICMPv6 router solicitation", "ICMPv6 router advertisement", "ICMPv6 neighbor solicitation", "ICMPv6 neighbor advertisement", "ICMPv6 redirect"};
  const char *empty = "";
  if (ipv == 4) {
    switch (type) {
    case 0:
      return "Echo reply";
    case 8:
      return "Echo";
    case 3:
      if (code <= 13)
        return DestUnreach[code];
      break;
    case 5:
      if (code <= 3)
        return Redirect[code];
      break;
    case 11:
      if (code <= 1)
        return TimeExceed[code];
      break;
    default:
      break;
    }
  } else if (ipv == 6) {
    switch (type) {
    case 1:
      if (code <= 6)
        return Dest6Unreach[code];
      break;
    case 2:
      return "ICMPv6 packet too big";
    case 3:
      if (code <= 1)
        return Time6Exceed[code];
      break;
    case 128:
      return "ICMPv6 echo request";
    case 129:
      return "ICMPv6 echo reply";
    case 133:
    case 134:
    case 135:
    case 136:
    case 137:
      return ND_messesg[type - 133];
    default:
      break;
    }
  }
  return empty;
}
```