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

```asm
<return_javascript_body_len>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x8,%rsp
  call   <custom_strlen@plt>
  test   %eax,%eax
  je     L384
  mov    %eax,%ebp
  xor    %r13d,%r13d
  lea    D2(%rip),%r12
  lea    D20(%rip),%r14
  jmp    L128
  nopw   0x0(%rax,%rax,1)
L32:
  add    $0x1,%r13d
  sub    $0x1,%ebp
  add    $0x1,%rbx
L196:
  test   %ebp,%ebp
  je     L141
L128:
  movzbl (%rbx),%eax
  cmp    $0x3c,%al
  je     L306
  ja     L16
  cmp    $0x2f,%al
  je     L208
  ja     L32
  cmp    $0x22,%al
  je     L273
  cmp    $0x27,%al
  jne    L32
L273:
  lea    0x1(%r13),%r15d
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jne    L23
  jmp    L369
  nopl   0x0(%rax)
L402:
  add    $0x1,%r15d
  add    $0x1,%rbx
  sub    $0x1,%ebp
  je     L109
  test   %ecx,%ecx
  jne    L109
L23:
  movzbl (%rbx),%edx
  xor    %ecx,%ecx
  cmp    %al,%dl
  sete   %cl
  cmp    $0x5c,%dl
  jne    L402
  add    $0x1,%r15d
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jne    L245
L369:
  add    $0x8,%rsp
  mov    %r15d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L16:
  cmp    $0x5b,%al
  je     L392
  cmp    $0x5c,%al
  jne    L32
  cmp    $0x1,%ebp
  jle    L189
  add    $0x2,%r13d
  add    $0x2,%rbx
  sub    $0x2,%ebp
  jmp    L196
  nopl   0x0(%rax)
L208:
  cmpb   $0x28,0x1(%rbx)
  jne    L32
  mov    %ebp,%eax
  lea    0x2(%r13),%r15d
  add    $0x2,%rbx
  sub    $0x2,%eax
  je     L369
  lea    0x1(%rbp,%r13,1),%esi
  jmp    L170
  nopl   0x0(%rax,%rax,1)
L344:
  cmp    $0x29,%dl
  je     L257
L170:
  mov    %esi,%ecx
  movzbl (%rbx),%edx
  add    $0x1,%rbx
  sub    %eax,%ecx
  sub    $0x1,%eax
  jne    L344
L257:
  mov    %eax,%ebp
  mov    %ecx,%r13d
  jmp    L196
  nop
L306:
  cmpb   $0x2f,0x1(%rbx)
  je     L94
  cmp    $0x8,%ebp
  jle    L32
  mov    $0x9,%edx
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L32
  lea    0x9(%r13),%r15d
  add    $0x9,%rbx
  sub    $0x9,%ebp
  jne    L398
  jmp    L369
  nopl   (%rax)
L161:
  add    $0x1,%r15d
  add    $0x1,%rbx
  sub    $0x1,%ebp
  je     L369
L398:
  cmpb   $0x5d,(%rbx)
  jne    L161
  mov    $0x3,%edx
  mov    %rbx,%rsi
  mov    %r14,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L161
  lea    0x3(%r15),%r13d
  sub    $0x3,%ebp
  add    $0x3,%rbx
  jmp    L196
  nopw   0x0(%rax,%rax,1)
L392:
  mov    $0x5d,%eax
  jmp    L273
  nopw   0x0(%rax,%rax,1)
L189:
  add    $0x1,%r13d
  add    $0x1,%rbx
  sub    $0x1,%ebp
  jmp    L196
L94:
  lea    0x2(%rbx),%rdi
  mov    $0x6,%edx
  lea    D23(%rip),%rsi
  call   <compare_tag@plt>
  test   %eax,%eax
  jne    L32
L141:
  mov    %r13d,%r15d
  jmp    L369
L384:
  xor    %r15d,%r15d
  jmp    L369
L109:
  mov    %r15d,%r13d
  jmp    L196
L245:
  xor    %ecx,%ecx
  jmp    L402
```

tool_calls: name: parse_data
arguments: tag: D2
datatype: string
name: parse_data
arguments: tag: D20
datatype: string
name: parse_data
arguments: tag: D23
datatype: string

tool: D2: <![CDATA[

tool: D20: ]]>

tool: D23: SCRIPT

assistant: ```c
int return_javascript_body_len(const unsigned char *src) {
  const unsigned char *rpos = src;
  int srclen;
  int junklen = 0;
  int count;
  unsigned char close_quote_char;
  int break_loop;
  srclen = custom_strlen(src);
  count = srclen;
  while (count) {
    switch (*rpos) {
    case '<':
      if (*(rpos + 1) == '/') {
        if (compare_tag(rpos + 2, "SCRIPT", 6) == 0) {
          return (junklen);
        }
      } else if (count >= 9) {
        if (!custom_strncmp("<![CDATA[", rpos, 9)) {
          junklen += 9;
          count -= 9;
          rpos += 9;
          while (count) {
            if (*rpos == ']') {
              if (!custom_strncmp("]]>", rpos, 3)) {
                junklen += 3;
                count -= 3;
                rpos += 3;
                break;
              }
            }
            junklen++;
            count--;
            rpos++;
          }
          break;
        }
      }
      junklen++;
      count--;
      rpos++;
      break;
    case '"':
    case '\'':
    case '[':
      switch (*rpos) {
      case '"':
      case '\'':
        close_quote_char = *rpos;
        break;
      case '[':
        close_quote_char = ']';
        break;
      }
      break_loop = 0;
      junklen++;
      count--;
      rpos++;
      while ((count) && (!break_loop)) {
        if (*rpos == '\\') {
          junklen++;
          count--;
          rpos++;
        } else if (*rpos == close_quote_char) {
          break_loop = 1;
        }
        if (count) {
          junklen++;
          count--;
          rpos++;
        }
      }
      break;
    case '\\':
      if (count > 1) {
        junklen += 2;
        rpos += 2;
        count -= 2;
      } else {
        junklen++;
        rpos++;
        count--;
      }
      break;
    case '/':
      if (*(rpos + 1) == '(') {
        break_loop = 0;
        junklen += 2;
        count -= 2;
        rpos += 2;
        while ((count) && (!break_loop)) {
          if (*rpos == ')')
            break_loop = 1;
          junklen++;
          count--;
          rpos++;
        }
      } else {
        junklen++;
        count--;
        rpos++;
      }
      break;
    default:
      junklen++;
      count--;
      rpos++;
    }
  }
  return (junklen);
}
```