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

```asm
<html_escape_str>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  lea    D2(%rip),%rax
  mov    %rax,-0x8(%rbp)
  movq   $0x0,-0x10(%rbp)
  jmp    L14
L206:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x11(%rbp)
  movzbl -0x11(%rbp),%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x71,%eax
  je     L116
  cmp    $0x71,%eax
  jg     L14
  cmp    $0x3e,%eax
  jg     L82
  cmp    $0x26,%eax
  jl     L14
  sub    $0x26,%eax
  cmp    $0x18,%eax
  ja     L14
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D1(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D1(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L82:
  cmp    $0x5a,%eax
  jne    L14
  jmp    L181
  addq   $0x1,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl -0x11(%rbp),%edx
  mov    %dl,(%rax)
  jmp    L14
  addq   $0x1,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x3f,(%rax)
  jmp    L14
  mov    -0x10(%rbp),%rax
  add    $0x5,%rax
  cmp    %rax,-0x38(%rbp)
  jb     L58
  addq   $0x5,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x26,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x61,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x6d,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x70,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x3b,(%rax)
  jmp    L14
  mov    -0x10(%rbp),%rax
  add    $0x4,%rax
  cmp    %rax,-0x38(%rbp)
  jb     L52
  addq   $0x4,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x26,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x6c,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x74,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x3b,(%rax)
  jmp    L14
  mov    -0x10(%rbp),%rax
  add    $0x4,%rax
  cmp    %rax,-0x38(%rbp)
  jb     L163
  addq   $0x4,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x26,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x67,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x74,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x3b,(%rax)
  jmp    L14
L116:
  mov    -0x10(%rbp),%rax
  add    $0x6,%rax
  cmp    %rax,-0x38(%rbp)
  jb     L205
  addq   $0x6,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x26,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x71,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x75,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x6f,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x74,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x3b,(%rax)
  nop
L14:
  mov    -0x10(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jb     L206
  jmp    L181
L58:
  nop
  jmp    L181
L52:
  nop
  jmp    L181
L163:
  nop
  jmp    L181
L205:
  nop
L181:
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movb   $0x0,(%rax)
  mov    -0x10(%rbp),%rax
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: label: D2
type_infered: string

tool: D2: Z-------------------------------**q***&*********************<*>****************************************************************---------------------------------************************************************************************************************

assistant: ```c
int html_escape_str(char *dst, const char *src, size_t n) {
  unsigned char c;
  size_t i;
  const char *codes = "Z-------------------------------"
                      "**q***&*********************<*>*"
                      "********************************"
                      "*******************************-"
                      "--------------------------------"
                      "********************************"
                      "********************************"
                      "********************************";
  for (i = 0; i < n;) {
    c = (unsigned char)*(src++);
    switch (codes[c]) {
    case 'Z':
      goto leave;
    case '*':
      i++;
      *(dst++) = c;
      break;
    case '-':
      i++;
      *(dst++) = '?';
      break;
    case '&':
      if (i + 5 > n)
        goto leave;
      i += 5;
      *(dst++) = '&';
      *(dst++) = 'a';
      *(dst++) = 'm';
      *(dst++) = 'p';
      *(dst++) = ';';
      break;
    case '<':
      if (i + 4 > n)
        goto leave;
      i += 4;
      *(dst++) = '&';
      *(dst++) = 'l';
      *(dst++) = 't';
      *(dst++) = ';';
      break;
    case '>':
      if (i + 4 > n)
        goto leave;
      i += 4;
      *(dst++) = '&';
      *(dst++) = 'g';
      *(dst++) = 't';
      *(dst++) = ';';
      break;
    case 'q':
      if (i + 6 > n)
        goto leave;
      i += 6;
      *(dst++) = '&';
      *(dst++) = 'q';
      *(dst++) = 'u';
      *(dst++) = 'o';
      *(dst++) = 't';
      *(dst++) = ';';
      break;
    }
  }
leave:
  *(dst++) = '\0';
  return i;
}
```