user: 请将以下的汇编代码转换成C语言代码:

```asm
<xml_parse_entity>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  jne    L219
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x78,%al
  jne    L198
  mov    -0x20(%rbp),%rax
  lea    0x3(%rax),%rcx
  lea    -0x10(%rbp),%rax
  mov    $0x10,%edx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <strtol@plt>
  mov    -0x18(%rbp),%rdx
  mov    %eax,(%rdx)
  jmp    L28
L198:
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rcx
  lea    -0x10(%rbp),%rax
  mov    $0xa,%edx
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <strtol@plt>
  mov    -0x18(%rbp),%rdx
  mov    %eax,(%rdx)
L28:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L265
  mov    -0x10(%rbp),%rax
  sub    -0x20(%rbp),%rax
  add    $0x1,%eax
  jmp    L131
L219:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x6c,%al
  jne    L233
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x74,%al
  jne    L233
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L233
  mov    -0x18(%rbp),%rax
  movl   $0x3c,(%rax)
  mov    $0x4,%eax
  jmp    L131
L233:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x67,%al
  jne    L204
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x74,%al
  jne    L204
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L204
  mov    -0x18(%rbp),%rax
  movl   $0x3e,(%rax)
  mov    $0x4,%eax
  jmp    L131
L204:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L267
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x6d,%al
  jne    L267
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x70,%al
  jne    L267
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L267
  mov    -0x18(%rbp),%rax
  movl   $0x26,(%rax)
  mov    $0x5,%eax
  jmp    L131
L267:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x61,%al
  jne    L301
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x70,%al
  jne    L301
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x6f,%al
  jne    L301
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x73,%al
  jne    L301
  mov    -0x20(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L301
  mov    -0x18(%rbp),%rax
  movl   $0x27,(%rax)
  mov    $0x6,%eax
  jmp    L131
L301:
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x71,%al
  jne    L265
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    $0x75,%al
  jne    L265
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  cmp    $0x6f,%al
  jne    L265
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    $0x74,%al
  jne    L265
  mov    -0x20(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L265
  mov    -0x18(%rbp),%rax
  movl   $0x22,(%rax)
  mov    $0x6,%eax
  jmp    L131
L265:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,(%rax)
  mov    $0x1,%eax
L131:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L2
  call   <__stack_chk_fail@plt>
L2:
  leave
  ret
```

assistant: ```c
int xml_parse_entity(int *c, char *a) {
  char *b;
  if (a[1] == '#') {
    if (a[2] == 'x')
      *c = strtol(a + 3, &b, 16);
    else
      *c = strtol(a + 2, &b, 10);
    if (*b == ';')
      return b - a + 1;
  } else if (a[1] == 'l' && a[2] == 't' && a[3] == ';') {
    *c = '<';
    return 4;
  } else if (a[1] == 'g' && a[2] == 't' && a[3] == ';') {
    *c = '>';
    return 4;
  } else if (a[1] == 'a' && a[2] == 'm' && a[3] == 'p' && a[4] == ';') {
    *c = '&';
    return 5;
  } else if (a[1] == 'a' && a[2] == 'p' && a[3] == 'o' && a[4] == 's' && a[5] == ';') {
    *c = '\'';
    return 6;
  } else if (a[1] == 'q' && a[2] == 'u' && a[3] == 'o' && a[4] == 't' && a[5] == ';') {
    *c = '"';
    return 6;
  }
  *c = *a++;
  return 1;
}
```