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

```asm
<return_javascript_body_len>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x18(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <custom_strlen@plt>
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  jmp    L11
L116:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0x5c,%eax
  je     L194
  cmp    $0x5c,%eax
  jg     L97
  cmp    $0x5b,%eax
  je     L51
  cmp    $0x5b,%eax
  jg     L97
  cmp    $0x3c,%eax
  je     L135
  cmp    $0x3c,%eax
  jg     L97
  cmp    $0x2f,%eax
  je     L26
  cmp    $0x2f,%eax
  jg     L97
  cmp    $0x22,%eax
  je     L51
  cmp    $0x27,%eax
  je     L51
  jmp    L97
L135:
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L306
  mov    -0x8(%rbp),%rax
  add    $0x2,%rax
  mov    $0x6,%edx
  lea    D7(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <compare_tag@plt>
  test   %eax,%eax
  jne    L93
  mov    -0x18(%rbp),%eax
  jmp    L198
L306:
  cmpl   $0x8,-0x14(%rbp)
  jle    L93
  mov    -0x8(%rbp),%rax
  mov    $0x9,%edx
  mov    %rax,%rsi
  lea    D16(%rip),%rax
  mov    %rax,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L93
  addl   $0x9,-0x18(%rbp)
  subl   $0x9,-0x14(%rbp)
  addq   $0x9,-0x8(%rbp)
  jmp    L304
L9:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5d,%al
  jne    L64
  mov    -0x8(%rbp),%rax
  mov    $0x3,%edx
  mov    %rax,%rsi
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  call   <custom_strncmp@plt>
  test   %eax,%eax
  jne    L64
  addl   $0x3,-0x18(%rbp)
  subl   $0x3,-0x14(%rbp)
  addq   $0x3,-0x8(%rbp)
  jmp    L455
L64:
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
L304:
  cmpl   $0x0,-0x14(%rbp)
  jne    L9
L455:
  jmp    L11
L93:
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
  jmp    L11
L51:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    $0x5b,%eax
  je     L394
  cmp    $0x5b,%eax
  jg     L188
  cmp    $0x22,%eax
  je     L257
  cmp    $0x27,%eax
  jne    L188
L257:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x19(%rbp)
  jmp    L188
L394:
  movb   $0x5d,-0x19(%rbp)
  nop
L188:
  movl   $0x0,-0x10(%rbp)
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
  jmp    L23
L161:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x5c,%al
  jne    L354
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
  jmp    L200
L354:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x19(%rbp)
  jne    L200
  movl   $0x1,-0x10(%rbp)
L200:
  cmpl   $0x0,-0x14(%rbp)
  je     L23
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
L23:
  cmpl   $0x0,-0x14(%rbp)
  je     L11
  cmpl   $0x0,-0x10(%rbp)
  je     L161
  jmp    L11
L194:
  cmpl   $0x1,-0x14(%rbp)
  jle    L357
  addl   $0x2,-0x18(%rbp)
  addq   $0x2,-0x8(%rbp)
  subl   $0x2,-0x14(%rbp)
  jmp    L11
L357:
  addl   $0x1,-0x18(%rbp)
  addq   $0x1,-0x8(%rbp)
  subl   $0x1,-0x14(%rbp)
  jmp    L11
L26:
  mov    -0x8(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L281
  movl   $0x0,-0x10(%rbp)
  addl   $0x2,-0x18(%rbp)
  subl   $0x2,-0x14(%rbp)
  addq   $0x2,-0x8(%rbp)
  jmp    L7
L119:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x29,%al
  jne    L34
  movl   $0x1,-0x10(%rbp)
L34:
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
L7:
  cmpl   $0x0,-0x14(%rbp)
  je     L11
  cmpl   $0x0,-0x10(%rbp)
  je     L119
  jmp    L11
L281:
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
  jmp    L11
L97:
  addl   $0x1,-0x18(%rbp)
  subl   $0x1,-0x14(%rbp)
  addq   $0x1,-0x8(%rbp)
L11:
  cmpl   $0x0,-0x14(%rbp)
  jne    L116
  mov    -0x18(%rbp),%eax
L198:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D7
datatype: string
name: disassemble_data
arguments: tag: D16
datatype: string
name: disassemble_data
arguments: tag: D17
datatype: string

tool: D7: SCRIPT

tool: D16: <![CDATA[

tool: D17: ]]>

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