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

```asm
<isstrstr>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x118,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x1108(%rsp)
  xor    %eax,%eax
  test   %rdi,%rdi
  je     L170
  mov    %rsi,%rbp
  test   %rsi,%rsi
  je     L170
  cmpb   $0x0,(%rdi)
  je     L170
  cmpb   $0x0,(%rsi)
  je     L170
  lea    0x100(%rsp),%r13
  mov    %rdi,%rsi
  mov    %edx,%ebx
  mov    $0xfe0,%edx
  mov    %r13,%rdi
  movb   $0x0,0x100(%rsp)
  call   <strncpy@plt>
  movb   $0x0,0x10e0(%rsp)
  test   %ebx,%ebx
  je     L231
L152:
  mov    %rsp,%r12
  jmp    L230
  nopw   0x0(%rax,%rax,1)
L218:
  mov    %rax,%r15
  mov    %rbp,%rsi
  mov    %r12,%rdi
  sub    %rbp,%r15
  lea    0x1(%r14),%rbp
  sub    $0x1,%r15d
  mov    %r15d,%edx
  movslq %r15d,%r15
  call   <memcpy@plt>
  movb   $0x0,(%rsp,%r15,1)
  test   %ebx,%ebx
  je     L244
L149:
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  jne    L27
L59:
  test   %rbp,%rbp
  je     L170
L230:
  mov    $0x2c,%esi
  mov    %rbp,%rdi
  call   <strchr@plt>
  mov    %rax,%r14
  test   %rax,%rax
  jne    L218
  mov    %rbp,%rsi
  mov    $0xff,%edx
  mov    %r12,%rdi
  movb   $0x0,(%rsp)
  call   <strncpy@plt>
  xor    %ebp,%ebp
  movb   $0x0,0xff(%rsp)
  test   %ebx,%ebx
  jne    L149
L244:
  movsbl (%rsp),%edi
  test   %dil,%dil
  je     L149
  mov    %r12,%r14
L157:
  call   <isupper@plt>
  test   %rax,%rax
  jne    L195
L116:
  movsbl 0x1(%r14),%edi
  add    $0x1,%r14
  test   %dil,%dil
  je     L149
  call   <isupper@plt>
  test   %rax,%rax
  je     L116
L195:
  movsbl (%r14),%edi
  add    $0x1,%r14
  call   <tolower@plt>
  mov    %al,-0x1(%r14)
  movsbl (%r14),%edi
  test   %dil,%dil
  jne    L157
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <strstr@plt>
  test   %rax,%rax
  je     L59
L27:
  mov    $0x1,%eax
  jmp    L67
  nopw   0x0(%rax,%rax,1)
L170:
  xor    %eax,%eax
L67:
  mov    0x1108(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L132
  add    $0x1118,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L231:
  movsbl 0x100(%rsp),%edi
  test   %dil,%dil
  je     L152
  mov    %r13,%r12
L90:
  call   <isupper@plt>
  test   %rax,%rax
  jne    L52
L174:
  movsbl 0x1(%r12),%edi
  add    $0x1,%r12
  test   %dil,%dil
  je     L152
  call   <isupper@plt>
  test   %rax,%rax
  je     L174
L52:
  movsbl (%r12),%edi
  add    $0x1,%r12
  call   <tolower@plt>
  mov    %al,-0x1(%r12)
  movsbl (%r12),%edi
  test   %dil,%dil
  jne    L90
  jmp    L152
L132:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int isstrstr(char *string, char *snippets, int iscase) {
  int status = 0;
  char snip[256], *snipptr = snippets, delim = ',', *delimptr = NULL;
  char stringcp[4096], *cp = stringcp;
  if (string == NULL || snippets == NULL)
    goto end_of_job;
  if (*string == '\000' || *snippets == '\000')
    goto end_of_job;
  if ((stringcp) != NULL && (4064) >= 0) {
    char *thissource = (string);
    (stringcp)[0] = '\000';
    if ((4064) > 0 && thissource != NULL) {
      strncpy((stringcp), thissource, (4064));
      (stringcp)[(4064)] = '\000';
    }
  };
  if (!iscase)
    for (cp = stringcp; *cp != '\000'; cp++)
      if (isupper(*cp))
        *cp = tolower(*cp);
  while (snipptr != NULL) {
    if ((delimptr = strchr(snipptr, delim)) == NULL) {
      if ((snip) != NULL && (255) >= 0) {
        char *thissource = (snipptr);
        (snip)[0] = '\000';
        if ((255) > 0 && thissource != NULL) {
          strncpy((snip), thissource, (255));
          (snip)[(255)] = '\000';
        }
      };
      snipptr = NULL;
    } else {
      int sniplen = (int)(delimptr - snipptr) - 1;
      memcpy(snip, snipptr, sniplen);
      snip[sniplen] = '\000';
      snipptr = delimptr + 1;
    }
    if (!iscase)
      for (cp = snip; *cp != '\000'; cp++)
        if (isupper(*cp))
          *cp = tolower(*cp);
    if (strstr(stringcp, snip) != NULL) {
      status = 1;
      break;
    }
  }
end_of_job:
  return (status);
}
```