user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<lily_lily_to_html>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  movl   $0x0,-0x3c(%rbp)
  movq   $0x0,-0x20(%rbp)
  movl   $0x0,-0x38(%rbp)
  movl   $0x0,-0x34(%rbp)
  movl   $0x0,-0x30(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  add    %rax,%rax
  lea    0x1(%rax),%rdx
  mov    D103(%rip),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <realloc@plt>
  mov    %rax,D168(%rip)
  mov    D168(%rip),%rax
  test   %rax,%rax
  jne    L36
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L36
L447:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    $0x20,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L488
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L488
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L488
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L194
L488:
  mov    $0x1,%eax
  jmp    L198
L194:
  mov    $0x0,%eax
L198:
  mov    %eax,-0x28(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  je     L600
  mov    -0x20(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L331
L600:
  mov    $0x1,%eax
  jmp    L630
L331:
  mov    $0x0,%eax
L630:
  mov    %eax,-0x24(%rbp)
  movl   $0x0,-0x2c(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L595
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    -0x48(%rbp),%rdx
  add    %rdx,%rax
  mov    %rax,-0x18(%rbp)
L595:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  cmp    $0x3e,%eax
  jg     L716
  cmp    $0x20,%eax
  jl     L611
  sub    $0x20,%eax
  cmp    $0x1e,%eax
  ja     L611
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D168(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D168(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
L716:
  cmp    $0x5f,%eax
  je     L564
  jmp    L611
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    $0x2a,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L741
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L591
L741:
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L34
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L34
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L34
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L19
L34:
  mov    $0x1,%eax
  jmp    L587
L19:
  mov    $0x0,%eax
L587:
  mov    %eax,-0x2c(%rbp)
L591:
  cmpl   $0x0,-0x38(%rbp)
  je     L722
  cmpl   $0x0,-0x24(%rbp)
  jne    L722
  cmpl   $0x0,-0x28(%rbp)
  je     L722
  movl   $0x0,-0x38(%rbp)
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D293(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  jmp    L355
L722:
  cmpl   $0x0,-0x38(%rbp)
  jne    L443
  cmpl   $0x0,-0x24(%rbp)
  je     L443
  cmpl   $0x0,-0x28(%rbp)
  jne    L443
  mov    -0x10(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L443
  cmpl   $0x0,-0x2c(%rbp)
  je     L443
  movl   $0x1,-0x38(%rbp)
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x3,%edx
  lea    D225(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x3,-0x3c(%rbp)
  jmp    L355
L443:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    D168(%rip),%rsi
  mov    -0x3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x3c(%rbp)
  cltq
  lea    (%rsi,%rax,1),%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  jmp    L168
L355:
  jmp    L168
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    $0x2f,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L781
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L683
L781:
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L20
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L20
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L20
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L161
L20:
  mov    $0x1,%eax
  jmp    L717
L161:
  mov    $0x0,%eax
L717:
  mov    %eax,-0x2c(%rbp)
L683:
  cmpl   $0x0,-0x24(%rbp)
  je     L771
  cmpl   $0x0,-0x28(%rbp)
  je     L771
  addq   $0x1,-0x20(%rbp)
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D36(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  jmp    L270
L771:
  cmpl   $0x0,-0x34(%rbp)
  je     L68
  cmpl   $0x0,-0x28(%rbp)
  je     L68
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D113(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  movl   $0x0,-0x34(%rbp)
  jmp    L270
L68:
  cmpl   $0x0,-0x34(%rbp)
  jne    L375
  cmpl   $0x0,-0x24(%rbp)
  je     L375
  mov    -0x10(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L375
  cmpl   $0x0,-0x2c(%rbp)
  je     L375
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x3,%edx
  lea    D12(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x3,-0x3c(%rbp)
  movl   $0x1,-0x34(%rbp)
  jmp    L270
L375:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    D168(%rip),%rsi
  mov    -0x3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x3c(%rbp)
  cltq
  lea    (%rsi,%rax,1),%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  jmp    L168
L270:
  jmp    L168
L564:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    $0x5f,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L165
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L52
L165:
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L71
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L71
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L71
  mov    -0x10(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L428
L71:
  mov    $0x1,%eax
  jmp    L729
L428:
  mov    $0x0,%eax
L729:
  mov    %eax,-0x2c(%rbp)
L52:
  cmpl   $0x0,-0x30(%rbp)
  je     L558
  cmpl   $0x0,-0x28(%rbp)
  je     L558
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D316(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L588
L558:
  cmpl   $0x0,-0x30(%rbp)
  jne    L115
  cmpl   $0x0,-0x24(%rbp)
  je     L115
  mov    -0x10(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jae    L115
  cmpl   $0x0,-0x2c(%rbp)
  je     L115
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x3,%edx
  lea    D291(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x3,-0x3c(%rbp)
  movl   $0x1,-0x30(%rbp)
  jmp    L588
L115:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    D168(%rip),%rsi
  mov    -0x3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x3c(%rbp)
  cltq
  lea    (%rsi,%rax,1),%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  jmp    L168
L588:
  jmp    L168
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x5,%edx
  lea    D33(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x5,-0x3c(%rbp)
  jmp    L168
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D268(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  jmp    L168
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x4,%edx
  lea    D61(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x4,-0x3c(%rbp)
  jmp    L168
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L87
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  mov    $0x6,%edx
  lea    D212(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  addl   $0x6,-0x3c(%rbp)
  jmp    L168
L87:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    D168(%rip),%rsi
  mov    -0x3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x3c(%rbp)
  cltq
  lea    (%rsi,%rax,1),%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  jmp    L168
L611:
  mov    -0x48(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    D168(%rip),%rsi
  mov    -0x3c(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x3c(%rbp)
  cltq
  lea    (%rsi,%rax,1),%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  nop
L168:
  addq   $0x1,-0x20(%rbp)
L36:
  mov    -0x20(%rbp),%rax
  cmp    -0x8(%rbp),%rax
  jb     L447
  mov    D168(%rip),%rdx
  mov    -0x3c(%rbp),%eax
  cltq
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    D168(%rip),%rax
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D293
type_infered: string
name: unpack_data
arguments: label: D225
type_infered: string
name: unpack_data
arguments: label: D36
type_infered: string
name: unpack_data
arguments: label: D113
type_infered: string
name: unpack_data
arguments: label: D12
type_infered: string
name: unpack_data
arguments: label: D316
type_infered: string
name: unpack_data
arguments: label: D291
type_infered: string
name: unpack_data
arguments: label: D33
type_infered: string
name: unpack_data
arguments: label: D268
type_infered: string
name: unpack_data
arguments: label: D61
type_infered: string
name: unpack_data
arguments: label: D212
type_infered: string

tool: D293: </b>

tool: D225: <b>

tool: D36: <br>

tool: D113: </i>

tool: D12: <i>

tool: D316: </u>

tool: D291: <u>

tool: D33: &amp;

tool: D268: &lt;

tool: D61: &gt;

tool: D212: &nbsp;

assistant: ```c
char *lily_lily_to_html(const char *const string) {
  static char *output = NULL;
  int o = 0;
  size_t l, i = 0;
  int inbold = 0, initalics = 0, inunderline = 0;
  l = strlen(string);
  output = realloc(output, (l * 6) + 1);
  if (output == NULL)
    abort();
  while (i < l) {
    const char *sp = strchr(string + i, ' '), *ch;
    int word_end = ((string[i + 1] == ' ') || (string[i + 1] == ',') || (string[i + 1] == '.') || (string[i + 1] == 0)), word_begin = ((i == 0) || (string[i - 1] == ' ')), ch_end = 0;
    if (sp == NULL)
      sp = string + strlen(string);
    switch (string[i]) {
    case '*':
      if ((ch = strchr(string + i + 1, '*')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (inbold && !word_begin && word_end) {
        inbold = 0;
        memcpy(&output[o], "</b>", 4);
        o += 4;
      } else if (!inbold && word_begin && !word_end && (ch < sp) && ch_end) {
        inbold = 1;
        memcpy(&output[o], "<b>", 3);
        o += 3;
      } else
        output[o++] = string[i];
      break;
    case '/':
      if ((ch = strchr(string + i + 1, '/')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (word_begin && word_end) {
        i++;
        memcpy(&output[o], "<br>", 4);
        o += 4;
      } else if (initalics && word_end) {
        memcpy(&output[o], "</i>", 4);
        o += 4;
        initalics = 0;
      } else if (!initalics && word_begin && (ch < sp) && ch_end) {
        memcpy(&output[o], "<i>", 3);
        o += 3;
        initalics = 1;
      } else
        output[o++] = string[i];
      break;
    case '_':
      if ((ch = strchr(string + i + 1, '_')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (inunderline && word_end) {
        memcpy(&output[o], "</u>", 4);
        o += 4;
        inunderline = 0;
      } else if (!inunderline && word_begin && (ch < sp) && ch_end) {
        memcpy(&output[o], "<u>", 3);
        o += 3;
        inunderline = 1;
      } else
        output[o++] = string[i];
      break;
    case '&':
      memcpy(&output[o], "&amp;", 5);
      o += 5;
      break;
    case '<':
      memcpy(&output[o], "&lt;", 4);
      o += 4;
      break;
    case '>':
      memcpy(&output[o], "&gt;", 4);
      o += 4;
      break;
    case ' ':
      if (string[i + 1] == ' ') {
        memcpy(&output[o], "&nbsp;", 6);
        o += 6;
      } else
        output[o++] = string[i];
      break;
    default:
      output[o++] = string[i];
      break;
    }
    i++;
  }
  output[o] = '\0';
  return (output);
}
```