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

```asm
<twoway_wcsstr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  movq   $0x0,-0x58(%rbp)
  jmp    L271
L314:
  addq   $0x1,-0x58(%rbp)
L271:
  mov    -0x58(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L118
  mov    -0x58(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L314
L118:
  mov    -0x58(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L131
  mov    $0x0,%eax
  jmp    L302
L131:
  movq   $0xffffffffffffffff,-0x50(%rbp)
  movq   $0x0,-0x48(%rbp)
  movq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  jmp    L41
L292:
  mov    -0x50(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jne    L214
  mov    -0x40(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jne    L6
  mov    -0x38(%rbp),%rax
  add    %rax,-0x48(%rbp)
  movq   $0x1,-0x40(%rbp)
  jmp    L41
L6:
  addq   $0x1,-0x40(%rbp)
  jmp    L41
L214:
  mov    -0x50(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jle    L280
  mov    -0x40(%rbp),%rax
  add    %rax,-0x48(%rbp)
  movq   $0x1,-0x40(%rbp)
  mov    -0x48(%rbp),%rax
  sub    -0x50(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  jmp    L41
L280:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %rax,-0x50(%rbp)
  movq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L41:
  mov    -0x48(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x58(%rbp)
  ja     L292
  mov    -0x50(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movq   $0xffffffffffffffff,-0x50(%rbp)
  movq   $0x0,-0x48(%rbp)
  movq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  jmp    L381
L50:
  mov    -0x50(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jne    L45
  mov    -0x40(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jne    L283
  mov    -0x38(%rbp),%rax
  add    %rax,-0x48(%rbp)
  movq   $0x1,-0x40(%rbp)
  jmp    L381
L283:
  addq   $0x1,-0x40(%rbp)
  jmp    L381
L45:
  mov    -0x50(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rcx
  mov    -0x40(%rbp),%rax
  add    %rcx,%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x70(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jge    L86
  mov    -0x40(%rbp),%rax
  add    %rax,-0x48(%rbp)
  movq   $0x1,-0x40(%rbp)
  mov    -0x48(%rbp),%rax
  sub    -0x50(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  jmp    L381
L86:
  mov    -0x48(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x48(%rbp)
  mov    %rax,-0x50(%rbp)
  movq   $0x1,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x40(%rbp)
L381:
  mov    -0x48(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x58(%rbp)
  ja     L50
  mov    -0x50(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,%rdx
  jbe    L17
  mov    -0x50(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  jmp    L327
L17:
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x38(%rbp)
L327:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x70(%rbp),%rax
  add    %rax,%rcx
  mov    -0x70(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <wmemcmp@plt>
  test   %rax,%rax
  je     L218
  movq   $0x0,-0x20(%rbp)
  mov    -0x58(%rbp),%rax
  sub    -0x30(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    -0x30(%rbp),%rax
  cmp    %rax,%rdx
  cmovae %rdx,%rax
  add    $0x1,%rax
  mov    %rax,-0x38(%rbp)
  jmp    L295
L218:
  mov    -0x58(%rbp),%rax
  sub    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
L295:
  movq   $0x0,-0x28(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x60(%rbp)
L323:
  mov    -0x60(%rbp),%rax
  sub    -0x68(%rbp),%rax
  sar    $0x3,%rax
  cmp    %rax,-0x58(%rbp)
  jbe    L129
  mov    -0x58(%rbp),%rax
  or     $0x3f,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rdx
  mov    -0x60(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <wmemchr@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L367
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x60(%rbp),%rax
  sub    -0x68(%rbp),%rax
  sar    $0x3,%rax
  cmp    %rax,-0x58(%rbp)
  jbe    L129
  mov    $0x0,%eax
  jmp    L302
L367:
  mov    -0x10(%rbp),%rax
  shl    $0x3,%rax
  add    %rax,-0x60(%rbp)
L129:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  cmp    %rdx,%rax
  cmovb  %rdx,%rax
  mov    %rax,-0x40(%rbp)
  jmp    L359
L70:
  addq   $0x1,-0x40(%rbp)
L359:
  mov    -0x40(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L311
  mov    -0x40(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x40(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  mov    -0x68(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  je     L70
L311:
  mov    -0x40(%rbp),%rax
  lea    0x0(,%rax,8),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L10
  mov    -0x40(%rbp),%rax
  sub    -0x30(%rbp),%rax
  shl    $0x3,%rax
  add    %rax,-0x68(%rbp)
  movq   $0x0,-0x28(%rbp)
  jmp    L266
L10:
  mov    -0x30(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x40(%rbp)
  jmp    L219
L48:
  subq   $0x1,-0x40(%rbp)
L219:
  mov    -0x40(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jbe    L163
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x40(%rbp),%rax
  shl    $0x3,%rax
  lea    -0x8(%rax),%rcx
  mov    -0x68(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  je     L48
L163:
  mov    -0x40(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jne    L146
  mov    -0x68(%rbp),%rax
  jmp    L302
L146:
  mov    -0x38(%rbp),%rax
  shl    $0x3,%rax
  add    %rax,-0x68(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x28(%rbp)
L266:
  jmp    L323
L302:
  leave
  ret
```

assistant: ```c
wchar_t *twoway_wcsstr(const wchar_t *h, const wchar_t *n) {
  const wchar_t *z;
  size_t l, ip, jp, k, p, ms, p0, mem, mem0;
  for (l = 0; n[l] && h[l]; l++)
    ;
  if (n[l])
    return 0;
  ip = -1;
  jp = 0;
  k = p = 1;
  while (jp + k < l) {
    if (n[ip + k] == n[jp + k]) {
      if (k == p) {
        jp += p;
        k = 1;
      } else
        k++;
    } else if (n[ip + k] > n[jp + k]) {
      jp += k;
      k = 1;
      p = jp - ip;
    } else {
      ip = jp++;
      k = p = 1;
    }
  }
  ms = ip;
  p0 = p;
  ip = -1;
  jp = 0;
  k = p = 1;
  while (jp + k < l) {
    if (n[ip + k] == n[jp + k]) {
      if (k == p) {
        jp += p;
        k = 1;
      } else
        k++;
    } else if (n[ip + k] < n[jp + k]) {
      jp += k;
      k = 1;
      p = jp - ip;
    } else {
      ip = jp++;
      k = p = 1;
    }
  }
  if (ip + 1 > ms + 1)
    ms = ip;
  else
    p = p0;
  if (wmemcmp(n, n + p, ms + 1)) {
    mem0 = 0;
    p = ((ms) > (l - ms - 1) ? (ms) : (l - ms - 1)) + 1;
  } else
    mem0 = l - p;
  mem = 0;
  z = h;
  for (;;) {
    if (z - h < l) {
      size_t grow = l | 63;
      const wchar_t *z2 = wmemchr(z, 0, grow);
      if (z2) {
        z = z2;
        if (z - h < l)
          return 0;
      } else
        z += grow;
    }
    for (k = ((ms + 1) > (mem) ? (ms + 1) : (mem)); n[k] && n[k] == h[k]; k++)
      ;
    if (n[k]) {
      h += k - ms;
      mem = 0;
      continue;
    }
    for (k = ms + 1; k > mem && n[k - 1] == h[k - 1]; k--)
      ;
    if (k == mem)
      return (wchar_t *)h;
    h += p;
    mem = mem0;
  }
}
```