user: 请从给定的汇编指令推导出C源代码：

```asm
<return_javascript_body_len>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbp
  call   <custom_strlen@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L64
  mov    $0x0,%r12d
  lea    D8(%rip),%r13
  lea    D18(%rip),%r15
  lea    D4(%rip),%r14
  jmp    L7
L5:
  cmp    $0x22,%al
  je     L36
  cmp    $0x27,%al
  jne    L295
L36:
  add    $0x1,%r12d
  add    $0x1,%rbp
  sub    $0x1,%ebx
  je     L47
  mov    $0x0,%esi
  jmp    L62
L394:
  cmp    $0x5b,%al
  je     L203
  cmp    $0x5c,%al
  jne    L295
  cmp    $0x1,%ebx
  jle    L146
  add    $0x2,%r12d
  add    $0x2,%rbp
  sub    $0x2,%ebx
  jmp    L416
L313:
  cmpb   $0x2f,0x1(%rbp)
  je     L14
  cmp    $0x8,%ebx
  jg     L360
L248:
  add    $0x1,%r12d
  sub    $0x1,%ebx
  add    $0x1,%rbp
L416:
  test   %ebx,%ebx
  je     L47
L7:
  movzbl 0x0(%rbp),%eax
  cmp    $0x3c,%al
  je     L313
  ja     L394
  cmp    $0x2f,%al
  je     L141
  jbe    L5
L295:
  add    $0x1,%r12d
  sub    $0x1,%ebx
  add    $0x1,%rbp
  jmp    L416
L14:
  lea    0x2(%rbp),%rdi
  mov    $0x6,%edx
  mov    %r14,%rsi
  call   <compare_tag@plt>
  test   %eax,%eax
  jne    L248
  jmp    L47
L360:
  mov    $0x9,%edx
  mov    %rbp,%rsi
  mov    %r13,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L248
  add    $0x9,%r12d
  add    $0x9,%rbp
  sub    $0x9,%ebx
  jne    L325
  jmp    L47
L41:
  add    $0x1,%r12d
  add    $0x1,%rbp
  sub    $0x1,%ebx
  je     L47
L325:
  cmpb   $0x5d,0x0(%rbp)
  jne    L41
  mov    $0x3,%edx
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L41
  add    $0x3,%r12d
  sub    $0x3,%ebx
  add    $0x3,%rbp
  jmp    L416
L203:
  mov    $0x5d,%eax
  jmp    L36
L39:
  add    $0x1,%r12d
  sub    $0x1,%ebx
  add    $0x1,%rbp
  mov    %esi,%ecx
  jmp    L274
L265:
  add    $0x1,%r12d
  add    $0x1,%rbp
  sub    $0x1,%ebx
  je     L416
  test   %ecx,%ecx
  jne    L416
L62:
  movzbl 0x0(%rbp),%edx
  cmp    %al,%dl
  sete   %cl
  movzbl %cl,%ecx
  cmp    $0x5c,%dl
  je     L39
L274:
  test   %ebx,%ebx
  jne    L265
L47:
  mov    %r12d,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L146:
  add    $0x1,%r12d
  add    $0x1,%rbp
  sub    $0x1,%ebx
  jmp    L416
L141:
  cmpb   $0x28,0x1(%rbp)
  je     L182
  add    $0x1,%r12d
  sub    $0x1,%ebx
  add    $0x1,%rbp
  jmp    L416
L182:
  add    $0x2,%r12d
  add    $0x2,%rbp
  sub    $0x2,%ebx
  jne    L257
  jmp    L47
L221:
  add    $0x1,%r12d
  add    $0x1,%rbp
  sub    $0x1,%ebx
  je     L47
L257:
  cmpb   $0x29,0x0(%rbp)
  jne    L221
  add    $0x1,%r12d
  sub    $0x1,%ebx
  add    $0x1,%rbp
  jmp    L416
L64:
  mov    %eax,%r12d
  jmp    L47
```

tool_calls: name: unpack_data
arguments: data_tag: D8
type_infered: string
name: unpack_data
arguments: data_tag: D18
type_infered: string
name: unpack_data
arguments: data_tag: D4
type_infered: string

tool: D8: <![CDATA[

tool: D18: ]]>

tool: D4: 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);
}
```