user: Translate the below assembly code into C programming language:

```asm
<icmpTypeCode2String>:
  endbr64
  sub    $0x138,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x128(%rsp)
  xor    %eax,%eax
  lea    D180(%rip),%rax
  mov    %rax,0xb0(%rsp)
  lea    D377(%rip),%rax
  mov    %rax,0xb8(%rsp)
  lea    D257(%rip),%rax
  mov    %rax,0xc0(%rsp)
  lea    D117(%rip),%rax
  mov    %rax,0xc8(%rsp)
  lea    D154(%rip),%rax
  mov    %rax,0xd0(%rsp)
  lea    D464(%rip),%rax
  mov    %rax,0xd8(%rsp)
  lea    D385(%rip),%rax
  mov    %rax,0xe0(%rsp)
  lea    D61(%rip),%rax
  mov    %rax,0xe8(%rsp)
  lea    D412(%rip),%rax
  mov    %rax,0xf0(%rsp)
  lea    D422(%rip),%rax
  mov    %rax,0xf8(%rsp)
  lea    D406(%rip),%rax
  mov    %rax,0x100(%rsp)
  lea    D72(%rip),%rax
  mov    %rax,0x108(%rsp)
  lea    D374(%rip),%rax
  mov    %rax,0x110(%rsp)
  lea    D477(%rip),%rax
  mov    %rax,0x118(%rsp)
  lea    D1(%rip),%rax
  mov    %rax,0x20(%rsp)
  lea    D170(%rip),%rax
  mov    %rax,0x28(%rsp)
  lea    D66(%rip),%rax
  mov    %rax,0x30(%rsp)
  lea    D303(%rip),%rax
  mov    %rax,0x38(%rsp)
  lea    D357(%rip),%rax
  mov    %rax,(%rsp)
  lea    D28(%rip),%rax
  mov    %rax,0x8(%rsp)
  lea    D110(%rip),%rcx
  mov    %rcx,0x70(%rsp)
  lea    D249(%rip),%rcx
  mov    %rcx,0x78(%rsp)
  lea    D67(%rip),%rcx
  mov    %rcx,0x80(%rsp)
  lea    D95(%rip),%rcx
  mov    %rcx,0x88(%rsp)
  lea    D234(%rip),%rcx
  mov    %rcx,0x90(%rsp)
  lea    D288(%rip),%rcx
  mov    %rcx,0x98(%rsp)
  lea    D56(%rip),%rcx
  mov    %rcx,0xa0(%rsp)
  lea    D42(%rip),%rcx
  mov    %rcx,0x10(%rsp)
  mov    %rax,0x18(%rsp)
  lea    D133(%rip),%rax
  mov    %rax,0x40(%rsp)
  lea    D54(%rip),%rax
  mov    %rax,0x48(%rsp)
  lea    D315(%rip),%rax
  mov    %rax,0x50(%rsp)
  lea    D47(%rip),%rax
  mov    %rax,0x58(%rsp)
  lea    D167(%rip),%rax
  mov    %rax,0x60(%rsp)
  cmp    $0x4,%edi
  je     L206
  lea    D31(%rip),%rax
  cmp    $0x6,%edi
  je     L71
L81:
  mov    0x128(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L94
  add    $0x138,%rsp
  ret
L206:
  cmp    $0xb,%esi
  ja     L6
  mov    %esi,%esi
  lea    D79(%rip),%rcx
  movslq (%rcx,%rsi,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  lea    D89(%rip),%rax
  jmp    L81
  lea    D100(%rip),%rax
  jmp    L81
  lea    D31(%rip),%rax
  cmp    $0xd,%edx
  jg     L81
  movslq %edx,%rdx
  mov    0xb0(%rsp,%rdx,8),%rax
  jmp    L81
  lea    D31(%rip),%rax
  cmp    $0x3,%edx
  jg     L81
  movslq %edx,%rdx
  mov    0x20(%rsp,%rdx,8),%rax
  jmp    L81
  lea    D31(%rip),%rax
  cmp    $0x1,%edx
  jg     L81
  movslq %edx,%rdx
  mov    (%rsp,%rdx,8),%rax
  jmp    L81
L71:
  lea    D235(%rip),%rax
  cmp    $0x80,%esi
  je     L81
  jg     L88
  lea    D333(%rip),%rax
  cmp    $0x2,%esi
  je     L81
  cmp    $0x3,%esi
  jne    L135
  lea    D31(%rip),%rax
  cmp    $0x1,%edx
  jg     L81
  movslq %edx,%rdx
  mov    0x10(%rsp,%rdx,8),%rax
  jmp    L81
L135:
  lea    D31(%rip),%rax
  cmp    $0x1,%esi
  jne    L81
  lea    D31(%rip),%rax
  cmp    $0x6,%edx
  jg     L81
  movslq %edx,%rdx
  mov    0x70(%rsp,%rdx,8),%rax
  jmp    L81
L88:
  lea    D255(%rip),%rax
  cmp    $0x81,%esi
  je     L81
  lea    -0x85(%rsi),%edx
  lea    D31(%rip),%rax
  cmp    $0x4,%edx
  ja     L81
  movslq %edx,%rsi
  mov    0x40(%rsp,%rsi,8),%rax
  jmp    L81
L6:
  lea    D31(%rip),%rax
  jmp    L81
L94:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D180
data_type: string
name: parse_data
arguments: label: D377
data_type: string
name: parse_data
arguments: label: D257
data_type: string
name: parse_data
arguments: label: D117
data_type: string
name: parse_data
arguments: label: D154
data_type: string
name: parse_data
arguments: label: D464
data_type: string
name: parse_data
arguments: label: D385
data_type: string
name: parse_data
arguments: label: D61
data_type: string
name: parse_data
arguments: label: D412
data_type: string
name: parse_data
arguments: label: D422
data_type: string
name: parse_data
arguments: label: D406
data_type: string
name: parse_data
arguments: label: D72
data_type: string
name: parse_data
arguments: label: D374
data_type: string
name: parse_data
arguments: label: D477
data_type: string
name: parse_data
arguments: label: D1
data_type: string
name: parse_data
arguments: label: D170
data_type: string
name: parse_data
arguments: label: D66
data_type: string
name: parse_data
arguments: label: D303
data_type: string
name: parse_data
arguments: label: D357
data_type: string
name: parse_data
arguments: label: D28
data_type: string
name: parse_data
arguments: label: D110
data_type: string
name: parse_data
arguments: label: D249
data_type: string
name: parse_data
arguments: label: D67
data_type: string
name: parse_data
arguments: label: D95
data_type: string
name: parse_data
arguments: label: D234
data_type: string
name: parse_data
arguments: label: D288
data_type: string
name: parse_data
arguments: label: D56
data_type: string
name: parse_data
arguments: label: D42
data_type: string
name: parse_data
arguments: label: D133
data_type: string
name: parse_data
arguments: label: D54
data_type: string
name: parse_data
arguments: label: D315
data_type: string
name: parse_data
arguments: label: D47
data_type: string
name: parse_data
arguments: label: D167
data_type: string
name: parse_data
arguments: label: D31
data_type: string
name: parse_data
arguments: label: D89
data_type: string
name: parse_data
arguments: label: D100
data_type: string
name: parse_data
arguments: label: D235
data_type: string
name: parse_data
arguments: label: D333
data_type: string
name: parse_data
arguments: label: D255
data_type: string

tool: D180: Destination network unreachable

tool: D377: Destination host unreachable

tool: D257: Destination protocol unreachable

tool: D117: Destination port unreachable

tool: D154: Fragmentation required, and DF flag set

tool: D464: Source route failed

tool: D385: Destination network unknown

tool: D61: Destination host unknown

tool: D412: Source host isolated

tool: D422: Network administratively prohibited

tool: D406: Host administratively prohibited

tool: D72: Network unreachable for TOS

tool: D374: Host unreachable for TOS

tool: D477: Communication administratively prohibited

tool: D1: Redirect Datagram for the Network

tool: D170: Redirect Datagram for the Host

tool: D66: Redirect Datagram for the TOS & network

tool: D303: Redirect Datagram for the TOS & host

tool: D357: TTL expired in transit

tool: D28: Fragment reassembly time exceeded

tool: D110: No route to destination

tool: D249: Communication with destination administratively prohibited

tool: D67: Beyond scope of source address

tool: D95: Address unreachable

tool: D234: Port unreachable

tool: D288: Source address failed ingress/egress policy

tool: D56: Reject route to destination

tool: D42: Hop limit exceeded in transit

tool: D133: ICMPv6 router solicitation

tool: D54: ICMPv6 router advertisement

tool: D315: ICMPv6 neighbor solicitation

tool: D47: ICMPv6 neighbor advertisement

tool: D167: ICMPv6 redirect

tool: 

tool: D89: Echo reply

tool: D100: Echo

tool: D235: ICMPv6 echo request

tool: D333: ICMPv6 packet too big

tool: D255: 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;
}
```