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

```asm
<dtn_strerror>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  cmpl   $0x8d,-0x4(%rbp)
  jg     L33
  cmpl   $0x81,-0x4(%rbp)
  jge    L20
  cmpl   $0xffffffff,-0x4(%rbp)
  je     L27
  cmpl   $0x0,-0x4(%rbp)
  je     L197
  jmp    L33
L20:
  mov    -0x4(%rbp),%eax
  sub    $0x81,%eax
  cmp    $0xc,%eax
  ja     L33
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D115(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D115(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L197:
  lea    D0(%rip),%rax
  jmp    L7
  lea    D91(%rip),%rax
  jmp    L7
  lea    D43(%rip),%rax
  jmp    L7
  lea    D96(%rip),%rax
  jmp    L7
  lea    D177(%rip),%rax
  jmp    L7
  lea    D36(%rip),%rax
  jmp    L7
  lea    D78(%rip),%rax
  jmp    L7
  lea    D161(%rip),%rax
  jmp    L7
  lea    D126(%rip),%rax
  jmp    L7
  lea    D27(%rip),%rax
  jmp    L7
  lea    D184(%rip),%rax
  jmp    L7
  lea    D76(%rip),%rax
  jmp    L7
  lea    D105(%rip),%rax
  jmp    L7
  lea    D185(%rip),%rax
  jmp    L7
L27:
  lea    D90(%rip),%rax
  jmp    L7
L33:
  mov    -0x4(%rbp),%eax
  mov    %eax,%ecx
  lea    D12(%rip),%rax
  mov    %rax,%rdx
  mov    $0x80,%esi
  lea    D149(%rip),%rax
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    D149(%rip),%rax
L7:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D0
datatype: string
name: extract_symbolic_data
arguments: data_tag: D91
datatype: string
name: extract_symbolic_data
arguments: data_tag: D43
datatype: string
name: extract_symbolic_data
arguments: data_tag: D96
datatype: string
name: extract_symbolic_data
arguments: data_tag: D177
datatype: string
name: extract_symbolic_data
arguments: data_tag: D36
datatype: string
name: extract_symbolic_data
arguments: data_tag: D78
datatype: string
name: extract_symbolic_data
arguments: data_tag: D161
datatype: string
name: extract_symbolic_data
arguments: data_tag: D126
datatype: string
name: extract_symbolic_data
arguments: data_tag: D27
datatype: string
name: extract_symbolic_data
arguments: data_tag: D184
datatype: string
name: extract_symbolic_data
arguments: data_tag: D76
datatype: string
name: extract_symbolic_data
arguments: data_tag: D105
datatype: string
name: extract_symbolic_data
arguments: data_tag: D185
datatype: string
name: extract_symbolic_data
arguments: data_tag: D90
datatype: string
name: extract_symbolic_data
arguments: data_tag: D12
datatype: string

tool: D0: success

tool: D91: invalid argument

tool: D43: error in xdr routines

tool: D96: error in ipc communication

tool: D177: error connecting to server

tool: D36: operation timed out

tool: D78: payload too large

tool: D161: not found

tool: D126: internal error

tool: D27: illegal operation called after dtn_poll

tool: D184: registration already in use

tool: D76: ipc version mismatch

tool: D105: unknown ipc message type

tool: D185: no storage space

tool: D90: (invalid error code -1)

tool: D12: (unknown error %d)

assistant: ```c
char *dtn_strerror(int err) {
  switch (err) {
  case 0:
    return "success";
  case (128 + 1):
    return "invalid argument";
  case (128 + 2):
    return "error in xdr routines";
  case (128 + 3):
    return "error in ipc communication";
  case (128 + 4):
    return "error connecting to server";
  case (128 + 5):
    return "operation timed out";
  case (128 + 6):
    return "payload too large";
  case (128 + 7):
    return "not found";
  case (128 + 8):
    return "internal error";
  case (128 + 9):
    return "illegal operation called after dtn_poll";
  case (128 + 10):
    return "registration already in use";
  case (128 + 11):
    return "ipc version mismatch";
  case (128 + 12):
    return "unknown ipc message type";
  case (128 + 13):
    return "no storage space";
  case -1:
    return "(invalid error code -1)";
  }
  static char buf[128];
  snprintf(buf, sizeof(buf), "(unknown error %d)", err);
  return buf;
}
```