user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<compress_javascript_chunk>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %esi,%ebp
  mov    %fs:0x28,%rax
  mov    %rax,0x8(%rsp)
  xor    %eax,%eax
  movb   $0x0,0x7(%rsp)
  test   %esi,%esi
  je     L251
  mov    %rdi,%rbx
  mov    %rdx,%r13
  mov    $0x0,%r14d
  mov    $0x0,%r12d
  jmp    L880
L858:
  cmpb   $0x2d,0x1(%rbx)
  jne    L809
  cmp    $0x3,%ebp
  jg     L529
L809:
  cmp    $0x20,%r14b
  je     L599
L1038:
  cmp    $0x3b,%r14b
  ja     L1063
  movabs $0xc00000000000401,%rax
  bt     %r14,%rax
  jae    L842
L687:
  add    $0x1,%rbx
  sub    $0x1,%ebp
L922:
  test   %r12d,%r12d
  je     L577
L724:
  movzbl -0x1(%r13),%r14d
  cmp    $0x1,%r12d
  jle    L234
  movzbl -0x2(%r13),%eax
L255:
  mov    %al,0x7(%rsp)
  test   %ebp,%ebp
  je     L72
L880:
  movzbl (%rbx),%eax
  cmp    $0xa,%al
  je     L858
  cmp    $0x2f,%al
  je     L738
  jbe    L802
  cmp    $0x5c,%al
  je     L110
  jbe    L197
  lea    -0x7b(%rax),%edx
  test   $0xfd,%dl
  je     L169
L846:
  cmp    $0x20,%r14b
  je     L71
L894:
  movzbl (%rbx),%eax
  mov    %al,0x0(%r13)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  lea    0x1(%r13),%r13
  lea    0x1(%rbx),%rbx
  jmp    L922
L599:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  movzbl 0x7(%rsp),%r14d
  jmp    L1038
L529:
  mov    $0x4,%edx
  lea    D37(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <custom_strncmp@plt>
  test   %eax,%eax
  je     L270
  cmp    $0x20,%r14b
  je     L1065
L986:
  cmp    $0x3b,%r14b
  ja     L493
  movabs $0xc00000000000401,%rax
  bt     %r14,%rax
  jae    L909
L710:
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jmp    L148
L270:
  mov    $0x4,%edx
  mov    %r13,%rsi
  mov    %rbx,%rdi
  call   <strncpy_overlapping@plt>
  add    $0x4,%rbx
  add    $0x4,%r13
  sub    $0x4,%ebp
  add    $0x4,%r12d
  jmp    L922
L1065:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  movzbl 0x7(%rsp),%r14d
  jmp    L986
L802:
  cmp    $0x20,%al
  ja     L245
  cmp    $0x20,%r14b
  je     L488
  cmp    $0xa,%r14b
  je     L488
  movb   $0x20,0x0(%r13)
  add    $0x1,%r12d
  lea    0x1(%r13),%r13
L488:
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jmp    L922
L245:
  cmp    $0x22,%al
  je     L1057
  cmp    $0x27,%al
  jne    L846
  cmp    $0x20,%r14b
  je     L365
  mov    %eax,%r15d
  jmp    L22
L197:
  cmp    $0x5b,%al
  jne    L846
  cmp    $0x20,%r14b
  jne    L1018
L365:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  cmp    $0x27,%al
  je     L1016
  cmp    $0x5b,%al
  je     L289
  cmp    $0x22,%al
  cmove  %eax,%r15d
L22:
  add    $0x1,%rbx
  lea    0x1(%r13),%rdx
  mov    %al,0x0(%r13)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  jne    L563
  mov    %rdx,%r13
  jmp    L300
L169:
  cmp    $0x20,%r14b
  je     L104
  cmp    $0xa,%r14b
  je     L104
L12:
  add    $0x1,%r12d
  add    $0x1,%rbx
  mov    %al,0x0(%r13)
  sub    $0x1,%ebp
  lea    0x1(%r13),%r13
  jmp    L922
L104:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  jmp    L12
L110:
  lea    0x1(%rbx),%rdx
  movb   $0x5c,0x0(%r13)
  cmp    $0x1,%ebp
  jne    L13
  add    $0x1,%r13
  add    $0x1,%r12d
  mov    %rdx,%rbx
L300:
  test   %r12d,%r12d
  jne    L905
L72:
  mov    0x8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L294
  mov    %r12d,%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L13:
  movzbl 0x1(%rbx),%eax
  add    $0x2,%rbx
  lea    0x2(%r13),%rcx
  cmp    $0x20,%al
  je     L965
L27:
  mov    %al,0x1(%r13)
  sub    $0x2,%ebp
  add    $0x2,%r12d
  mov    %rcx,%r13
  jmp    L922
L965:
  mov    %rdx,%rbx
  mov    $0x9,%eax
  jmp    L27
L738:
  cmp    $0x1,%ebp
  jle    L269
  movzbl 0x1(%rbx),%eax
  cmp    $0x28,%al
  je     L519
  cmp    $0x2a,%al
  je     L825
  cmp    $0x2f,%al
  je     L85
  add    $0x1,%rbx
  movb   $0x2f,0x0(%r13)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  lea    0x1(%r13),%r13
L148:
  test   %r12d,%r12d
  jne    L724
  movb   $0x0,0x7(%rsp)
  mov    $0x0,%r14d
  jmp    L880
L519:
  movb   $0x2f,0x0(%r13)
  lea    0x2(%rbx),%rax
  lea    0x2(%r13),%rdx
  movzbl 0x1(%rbx),%ecx
  mov    %cl,0x1(%r13)
  add    $0x2,%r12d
  sub    $0x2,%ebp
  je     L1075
L668:
  movzbl (%rax),%ecx
  cmp    $0x29,%cl
  je     L1075
  add    $0x1,%rax
  add    $0x1,%rdx
  mov    %cl,-0x1(%rdx)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  jne    L668
L1075:
  lea    0x1(%rax),%rbx
  lea    0x1(%rdx),%r13
  movzbl (%rax),%eax
  mov    %al,(%rdx)
  sub    $0x1,%ebp
  add    $0x1,%r12d
  jmp    L922
L825:
  add    $0x2,%rbx
  sub    $0x2,%ebp
  cmp    $0x1,%ebp
  jg     L124
  jmp    L84
L559:
  add    $0x1,%rbx
  sub    $0x1,%ebp
  cmp    $0x1,%ebp
  je     L349
L124:
  cmpb   $0x2a,(%rbx)
  jne    L559
  cmpb   $0x2f,0x1(%rbx)
  jne    L559
L84:
  test   %ebp,%ebp
  je     L300
L349:
  cmp    $0x1,%ebp
  je     L18
  add    $0x2,%rbx
  sub    $0x2,%ebp
  jmp    L922
L18:
  add    $0x1,%rbx
  jmp    L300
L85:
  cmp    $0x20,%r14b
  je     L799
L290:
  cmp    $0xa,%ebp
  jg     L736
  cmp    $0x4,%ebp
  jg     L835
L132:
  cmpb   $0xa,(%rbx)
  je     L922
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jne    L132
  jmp    L300
L799:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  movb   $0x0,0x7(%rsp)
  jmp    L290
L736:
  mov    $0x9,%ecx
  lea    D10(%rip),%rdx
  mov    %ebp,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <is_str_present_in_ss_comment@plt>
  test   %eax,%eax
  jne    L325
L835:
  mov    $0x3,%ecx
  lea    D13(%rip),%rdx
  mov    %ebp,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <is_str_present_in_ss_comment@plt>
  test   %eax,%eax
  je     L807
  mov    $0x5,%edx
  mov    %r13,%rsi
  lea    D49(%rip),%rdi
  mov    $0x0,%eax
  call   <strncpy_overlapping@plt>
  add    $0x5,%r13
  add    $0x5,%r12d
  jmp    L132
L325:
  mov    $0xc,%edx
  mov    %r13,%rsi
  lea    D24(%rip),%rdi
  mov    $0x0,%eax
  call   <strncpy_overlapping@plt>
  add    $0xc,%r13
  add    $0xc,%r12d
  jmp    L132
L807:
  mov    $0x3,%ecx
  lea    D43(%rip),%rdx
  mov    %ebp,%esi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <is_str_present_in_ss_comment@plt>
  test   %eax,%eax
  je     L132
  mov    $0x6,%edx
  mov    %r13,%rsi
  lea    D47(%rip),%rdi
  mov    $0x0,%eax
  call   <strncpy_overlapping@plt>
  add    $0x6,%r13
  add    $0x6,%r12d
  jmp    L132
L269:
  add    $0x1,%rbx
  movb   $0x2f,0x0(%r13)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  lea    0x1(%r13),%r13
  jmp    L922
L1016:
  mov    %eax,%r15d
  jmp    L22
L289:
  mov    $0x5d,%r15d
  jmp    L22
L128:
  movb   $0x5c,(%rdx)
  cmp    $0x1,%ebp
  je     L1017
  movzbl 0x1(%rbx),%eax
  mov    %al,0x1(%rdx)
  add    $0x2,%r12d
  sub    $0x2,%ebp
  lea    0x2(%rdx),%rdx
  lea    0x2(%rbx),%rbx
L921:
  test   %ebp,%ebp
  je     L819
L563:
  movzbl (%rbx),%eax
  cmp    $0x5c,%al
  je     L128
  cmp    %r15b,%al
  je     L800
  add    $0x1,%rbx
  mov    %al,(%rdx)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  lea    0x1(%rdx),%rdx
  jmp    L921
L800:
  add    $0x1,%rbx
  lea    0x1(%rdx),%r13
  mov    %r15b,(%rdx)
  add    $0x1,%r12d
  sub    $0x1,%ebp
  jmp    L922
L819:
  mov    %rdx,%r13
  jmp    L300
L71:
  lea    0x7(%rsp),%rdi
  mov    $0x0,%eax
  call   <javascript_concatenable@plt>
  test   %eax,%eax
  je     L934
L607:
  sub    $0x1,%r13
  sub    $0x1,%r12d
  jmp    L894
L934:
  mov    %rbx,%rdi
  call   <javascript_concatenable@plt>
  test   %eax,%eax
  je     L894
  jmp    L607
L905:
  mov    $0x0,%ebp
  jmp    L724
L577:
  mov    $0x0,%r14d
  mov    $0x0,%eax
  jmp    L255
L234:
  mov    $0x0,%eax
  jmp    L255
L251:
  mov    %esi,%r12d
  jmp    L72
L1017:
  add    $0x1,%rbx
  lea    0x1(%rdx),%r13
  add    $0x1,%r12d
  mov    $0x0,%ebp
  jmp    L922
L1063:
  sub    $0x7b,%r14d
  test   $0xfd,%r14b
  je     L687
L842:
  movb   $0xa,0x0(%r13)
  add    $0x1,%r12d
  lea    0x1(%r13),%r13
  jmp    L687
L493:
  sub    $0x7b,%r14d
  test   $0xfd,%r14b
  je     L710
L909:
  movb   $0xa,0x0(%r13)
  add    $0x1,%r12d
  lea    0x1(%r13),%r13
  jmp    L710
L1018:
  mov    $0x5d,%r15d
  jmp    L22
L1057:
  cmp    $0x20,%r14b
  je     L365
  mov    %eax,%r15d
  jmp    L22
L294:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: tag: D37
type_infered: string
name: read_data
arguments: tag: D10
type_infered: string
name: read_data
arguments: tag: D13
type_infered: string
name: read_data
arguments: tag: D49
type_infered: string
name: read_data
arguments: tag: D24
type_infered: string
name: read_data
arguments: tag: D43
type_infered: string
name: read_data
arguments: tag: D47
type_infered: string

tool: D37: 
-->

tool: D10: <![CDATA[

tool: D13: -->

tool: D49: //-->

tool: D24: //<![CDATA[


tool: D43: ]]>

tool: D47: //]]>


assistant: ```c
int compress_javascript_chunk(const unsigned char *src, int srclen, unsigned char *dst) {
  const unsigned char *rpos = src;
  unsigned char *wpos = dst;
  int count;
  int dstlen = 0;
  unsigned char previous_char = '\0';
  unsigned char previous_char2 = '\0';
  unsigned char close_quote_char;
  int break_loop;
  count = srclen;
  while (count) {
    if (*rpos == '\n') {
      if (!((*(rpos + 1) == '-') && (count >= 4))) {
        if (previous_char == ' ') {
          wpos--;
          dstlen--;
          previous_char = previous_char2;
          previous_char2 = '\0';
        }
        if ((previous_char != '\0') && (previous_char != '\n') && (previous_char != ';') && (previous_char != ':') && (previous_char != '{') && (previous_char != '}')) {
          *(wpos++) = '\n';
          dstlen++;
        }
        rpos++;
        count--;
      } else {
        if (!custom_strncmp(rpos, "\n-->", 4)) {
          strncpy_overlapping(rpos, wpos, 4);
          rpos += 4;
          wpos += 4;
          count -= 4;
          dstlen += 4;
        } else {
          if (previous_char == ' ') {
            wpos--;
            dstlen--;
            previous_char = previous_char2;
            previous_char2 = '\0';
          }
          if ((previous_char != '\0') && (previous_char != '\n') && (previous_char != ';') && (previous_char != ':') && (previous_char != '{') && (previous_char != '}')) {
            *(wpos++) = '\n';
            dstlen++;
          }
          rpos++;
          count--;
        }
      }
    } else if ((*rpos == '{') || (*rpos == '}')) {
      if ((previous_char == ' ') || (previous_char == '\n')) {
        wpos--;
        dstlen--;
      }
      dstlen++;
      *(wpos++) = *(rpos++);
      count--;
    } else if (*rpos <= ' ') {
      if ((previous_char != ' ') && (previous_char != '\n')) {
        *(wpos++) = ' ';
        dstlen++;
      }
      rpos++;
      count--;
    } else if (*rpos == '\\') {
      *(wpos++) = *(rpos++);
      count--;
      dstlen++;
      if (count) {
        if (*rpos == ' ')
          *(wpos++) = '\t';
        else
          *(wpos++) = *(rpos++);
        count--;
        dstlen++;
      }
    } else if (*rpos == '/') {
      if (count >= 2) {
        if (*(rpos + 1) == '(') {
          *(wpos++) = *(rpos++);
          *(wpos++) = *(rpos++);
          count -= 2;
          dstlen += 2;
          while ((count) && (*rpos != ')')) {
            *(wpos++) = *(rpos++);
            count--;
            dstlen++;
          }
          *(wpos++) = *(rpos++);
          count--;
          dstlen++;
        } else if (*(rpos + 1) == '*') {
          rpos += 2;
          count -= 2;
          while ((count >= 2) && ((*rpos != '*') || (*(rpos + 1) != '/'))) {
            rpos++;
            count--;
          }
          if (count) {
            rpos++;
            count--;
          }
          if (count) {
            rpos++;
            count--;
          }
        } else if (*(rpos + 1) == '/') {
          int done_proc_comment = 0;
          if (previous_char == ' ') {
            wpos--;
            dstlen--;
            previous_char = previous_char2;
            previous_char2 = '\0';
          }
          if (count >= 11) {
            if (is_str_present_in_ss_comment(rpos, count, "<![CDATA[", 9)) {
              strncpy_overlapping("//<![CDATA[\n", wpos, 12);
              wpos += 12;
              dstlen += 12;
              done_proc_comment = 1;
            }
          }
          if ((done_proc_comment == 0) && (count >= 5)) {
            if (is_str_present_in_ss_comment(rpos, count, "-->", 3)) {
              strncpy_overlapping("//-->", wpos, 5);
              wpos += 5;
              dstlen += 5;
            } else if (is_str_present_in_ss_comment(rpos, count, "]]>", 3)) {
              strncpy_overlapping("//]]>\n", wpos, 6);
              wpos += 6;
              dstlen += 6;
            }
          }
          while (count && (*rpos != '\n')) {
            rpos++;
            count--;
          }
        } else {
          *(wpos++) = *(rpos++);
          dstlen++;
          count--;
        }
      } else {
        *(wpos++) = *(rpos++);
        dstlen++;
        count--;
      }
    } else if ((*rpos == '"') || (*rpos == '\'') || (*rpos == '[')) {
      if (previous_char == ' ') {
        wpos--;
        dstlen--;
      }
      switch (*rpos) {
      case '"':
      case '\'':
        close_quote_char = *rpos;
        break;
      case '[':
        close_quote_char = ']';
        break;
      }
      *(wpos++) = *(rpos++);
      dstlen++;
      count--;
      break_loop = 0;
      while ((count) && (!break_loop)) {
        if (*rpos == '\\') {
          *(wpos++) = *(rpos++);
          dstlen++;
          count--;
          if (count) {
            *(wpos++) = *(rpos++);
            dstlen++;
            count--;
          }
        } else if (*rpos == close_quote_char) {
          *(wpos++) = *(rpos++);
          dstlen++;
          count--;
          break_loop = 1;
        } else {
          *(wpos++) = *(rpos++);
          dstlen++;
          count--;
        }
      }
    } else {
      if (previous_char == ' ') {
        if (javascript_concatenable(&previous_char2) || javascript_concatenable(rpos)) {
          previous_char = previous_char2;
          previous_char2 = '\0';
          wpos--;
          dstlen--;
        }
      }
      *(wpos++) = *(rpos++);
      dstlen++;
      count--;
    }
    if (dstlen)
      previous_char = *(wpos - 1);
    else
      previous_char = '\0';
    if (dstlen >= 2)
      previous_char2 = *(wpos - 2);
    else
      previous_char2 = '\0';
  }
  return (dstlen);
}
```