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

```asm
<rxml_decode_string>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L211
L72:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x26,%al
  jne    L59
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x1c(%rbp)
  cmpl   $0x3,-0x1c(%rbp)
  jle    L215
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D23(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L215
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x3e,(%rax)
  addq   $0x4,-0x18(%rbp)
  jmp    L211
L215:
  cmpl   $0x3,-0x1c(%rbp)
  jle    L116
  mov    -0x18(%rbp),%rax
  mov    $0x4,%edx
  lea    D51(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L116
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x3c,(%rax)
  addq   $0x4,-0x18(%rbp)
  jmp    L211
L116:
  cmpl   $0x4,-0x1c(%rbp)
  jle    L128
  mov    -0x18(%rbp),%rax
  mov    $0x5,%edx
  lea    D44(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L128
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x26,(%rax)
  addq   $0x5,-0x18(%rbp)
  jmp    L211
L128:
  cmpl   $0x5,-0x1c(%rbp)
  jle    L130
  mov    -0x18(%rbp),%rax
  mov    $0x6,%edx
  lea    D4(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L130
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x22,(%rax)
  addq   $0x6,-0x18(%rbp)
  jmp    L211
L130:
  cmpl   $0x5,-0x1c(%rbp)
  jle    L54
  mov    -0x18(%rbp),%rax
  mov    $0x6,%edx
  lea    D10(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L54
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x27,(%rax)
  addq   $0x6,-0x18(%rbp)
  jmp    L211
L54:
  mov    -0x18(%rbp),%rax
  lea    0x2(%rax),%rcx
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdx
  lea    D54(%rip),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <sscanf@plt>
  test   %eax,%eax
  jne    L222
  mov    $0x0,%eax
  jmp    L82
L222:
  mov    -0x20(%rbp),%ecx
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L49
  addq   $0x4,-0x18(%rbp)
  jmp    L211
L49:
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L157
  addq   $0x5,-0x18(%rbp)
  jmp    L211
L157:
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L152
  addq   $0x6,-0x18(%rbp)
  jmp    L211
L152:
  mov    $0x0,%eax
  jmp    L82
L59:
  mov    -0x18(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x10(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L211:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L72
  mov    -0x10(%rbp),%rax
  movb   $0x0,(%rax)
  mov    $0x1,%eax
L82:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L34
  call   <__stack_chk_fail@plt>
L34:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D23
data_type: string
name: disassemble_data
arguments: label: D51
data_type: string
name: disassemble_data
arguments: label: D44
data_type: string
name: disassemble_data
arguments: label: D4
data_type: string
name: disassemble_data
arguments: label: D10
data_type: string
name: disassemble_data
arguments: label: D54
data_type: string

tool: D23: &gt;

tool: D51: &lt;

tool: D44: &amp;

tool: D4: &quot;

tool: D10: &apos;

tool: D54: %d;

assistant: ```c
int rxml_decode_string(char *string) {
  char *src, *dst;
  int len;
  int cval;
  src = dst = string;
  while (*src) {
    if ((*src) == '&') {
      len = (int)strlen(src);
      if ((len > 3) && (strncmp(src, "&gt;", 4) == 0)) {
        *dst++ = '>';
        src += 4;
      } else if ((len > 3) && (strncmp(src, "&lt;", 4) == 0)) {
        *dst++ = '<';
        src += 4;
      } else if ((len > 4) && (strncmp(src, "&amp;", 5) == 0)) {
        *dst++ = '&';
        src += 5;
      } else if ((len > 5) && (strncmp(src, "&quot;", 6) == 0)) {
        *dst++ = '"';
        src += 6;
      } else if ((len > 5) && (strncmp(src, "&apos;", 6) == 0)) {
        *dst++ = '\'';
        src += 6;
      } else {
        if (!sscanf((char *)&src[2], "%d;", &cval))
          return 0;
        *dst++ = cval;
        if (src[3] == ';') {
          src += 4;
        } else if (src[4] == ';') {
          src += 5;
        } else if (src[5] == ';') {
          src += 6;
        } else {
          return 0;
        }
      }
    } else {
      *dst++ = *src++;
    }
  }
  *dst = '\0';
  return 1;
}
```