user: What is the c source code of the assembly code below?

```asm
<gdb_cmd_delete_breakpoint>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x28(%rbp)
  xor    %eax,%eax
  test   %esi,%esi
  jle    L20
  xor    %eax,%eax
  cmpb   $0x2c,(%rdi)
  mov    %rdi,%rbx
  mov    $0x10,%ecx
  sete   %al
  lea    -0x40(%rbp),%r12
  mov    $0x2c,%edx
  mov    %rsp,%r14
  add    %rax,%rbx
  mov    %r12,%rdi
  mov    %rbx,%rsi
  call   <util_cpy_substr@plt>
  mov    %r12,%rdi
  cltq
  lea    0x1(%rbx,%rax,1),%r13
  call   <util_hex_to_word@plt>
  mov    %r13,%rdi
  mov    %eax,%ebx
  call   <util_hex_to_word@plt>
  cmp    $0x2,%eax
  je     L30
  cmp    $0x4,%eax
  je     L99
  xor    %eax,%eax
  call   <gdb_response_not_supported@plt>
L17:
  mov    %r14,%rsp
L91:
  mov    -0x28(%rbp),%rax
  sub    %fs:0x28,%rax
  jne    L36
  lea    -0x20(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %rbp
  ret
  nopl   (%rax)
L99:
  movslq %ebx,%rdi
  mov    $0x1,%esi
  call   <dgb_unset_trap@plt>
  test   %eax,%eax
  je     L27
L50:
  lea    D48(%rip),%r12
  cmp    $0x2,%eax
  je     L82
  lea    D34(%rip),%r12
  cmp    $0x3,%eax
  je     L82
  cmp    $0x1,%eax
  lea    D45(%rip),%r12
  lea    D18(%rip),%rax
  cmove  %rax,%r12
L82:
  mov    %r12,%rdi
  call   <util_str_len@plt>
  mov    %r12,%rdi
  mov    %eax,%esi
  call   <gdb_send_packet@plt>
  jmp    L17
  nopw   0x0(%rax,%rax,1)
L30:
  movslq %ebx,%rdi
  mov    $0x2,%esi
  call   <dgb_unset_trap@plt>
  test   %eax,%eax
  jne    L50
L27:
  lea    D33(%rip),%r12
  jmp    L82
  nopw   0x0(%rax,%rax,1)
L20:
  lea    D18(%rip),%rdi
  call   <util_str_len@plt>
  lea    D18(%rip),%rdi
  mov    %eax,%esi
  call   <gdb_send_packet@plt>
  jmp    L91
L36:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: tag: D48
datatype: string
name: read_data
arguments: tag: D34
datatype: string
name: read_data
arguments: tag: D45
datatype: string
name: read_data
arguments: tag: D18
datatype: string
name: read_data
arguments: tag: D33
datatype: string

tool: D48: E02

tool: D34: E03

tool: D45: E04

tool: D18: E01

tool: D33: OK

assistant: ```c
void gdb_cmd_delete_breakpoint(char *gdb_in_packet, int packet_len) {
  int len;
  uint32_t addr;
  uint32_t kind;
  uint32_t errval;
  char *err = "E01";
  char *okresp = "OK";
  const int scratch_len = 16;
  char scratchpad[scratch_len];
  if (packet_len < 1) {
    gdb_send_packet(err, util_str_len(err));
    return;
  }
  if (*gdb_in_packet == ',')
    gdb_in_packet++;
  len = util_cpy_substr(scratchpad, (char *)gdb_in_packet, ',', scratch_len);
  gdb_in_packet += len + 1;
  addr = util_hex_to_word(scratchpad);
  kind = util_hex_to_word((char *)gdb_in_packet);
  if (kind == 2) {
    if ((errval = dgb_unset_trap((void *)addr, 2)) != 0) {
      if (errval == 1)
        err = "E01";
      else if (errval == 2)
        err = "E02";
      else if (errval == 3)
        err = "E03";
      else
        err = "E04";
      gdb_send_packet(err, util_str_len(err));
    } else {
      gdb_send_packet(okresp, util_str_len(okresp));
    }
  } else if (kind == 4) {
    if ((errval = dgb_unset_trap((void *)addr, 1)) != 0) {
      if (errval == 1)
        err = "E01";
      else if (errval == 2)
        err = "E02";
      else if (errval == 3)
        err = "E03";
      else
        err = "E04";
      gdb_send_packet(err, util_str_len(err));
    } else {
      gdb_send_packet(okresp, util_str_len(okresp));
    }
  } else {
    gdb_response_not_supported();
  }
}
```