user: 下面的汇编指令对应的C源代码是什么：

```asm
<path_cleancut>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    %r8,-0x48(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L90
  cmpq   $0x0,-0x28(%rbp)
  jne    L38
L90:
  lea    D15(%rip),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  call   <errx@plt>
L38:
  cmpq   $0x0,-0x30(%rbp)
  jne    L88
  lea    D22(%rip),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  call   <errx@plt>
L88:
  mov    -0x40(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,-0x38(%rbp)
  jae    L104
  lea    D4(%rip),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  call   <errx@plt>
L104:
  mov    -0x40(%rbp),%rax
  add    $0x1,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <wcslen@plt>
  cmp    %rax,-0x40(%rbp)
  jb     L55
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <wcslcpy@plt>
  jmp    L82
L55:
  mov    -0x38(%rbp),%rdx
  mov    -0x48(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <wcslcpy@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  cmp    -0x40(%rbp),%rax
  jae    L112
  mov    -0x40(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L120
L72:
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0x2f,%eax
  jne    L129
  addq   $0x4,-0x18(%rbp)
L129:
  mov    -0x18(%rbp),%rax
  mov    $0x2f,%esi
  mov    %rax,%rdi
  call   <wcschr@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L120
  mov    -0x48(%rbp),%rdi
  mov    -0x40(%rbp),%rcx
  mov    -0x38(%rbp),%rdx
  mov    -0x30(%rbp),%rsi
  mov    -0x28(%rbp),%rax
  mov    %rdi,%r8
  mov    %rax,%rdi
  call   <path_quickcut@plt>
  jmp    L82
L120:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <wcslen@plt>
  cmp    %rax,-0x8(%rbp)
  jb     L72
  mov    -0x38(%rbp),%rax
  sub    -0x10(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  lea    0x0(,%rax,4),%rcx
  mov    -0x28(%rbp),%rax
  add    %rax,%rcx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <wcsncpy@plt>
  jmp    L82
L112:
  nop
L82:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D15
data_type: string
name: extract_symbolic_data
arguments: tag: D22
data_type: string
name: extract_symbolic_data
arguments: tag: D4
data_type: string

tool: D15: path_cleancut: invalid output

tool: D22: path_cleancut: null input

tool: D4: path_cleancut: maxlen too long

assistant: ```c
void path_cleancut(wchar_t *out, wchar_t *path, size_t len, size_t maxlen, wchar_t *filler) {
  size_t maxplen, flen;
  wchar_t *c;
  if (len == 0 || out == NULL)
    errx(1, "path_cleancut: invalid output");
  if (path == NULL)
    errx(1, "path_cleancut: null input");
  if (maxlen + 1 > len)
    errx(1, "path_cleancut: maxlen too long");
  len = maxlen + 1;
  if (wcslen(path) <= maxlen) {
    wcslcpy(out, path, len);
    return;
  }
  flen = wcslcpy(out, filler, len);
  if (flen >= maxlen)
    return;
  maxplen = maxlen - flen;
  for (c = path; wcslen(c) > maxplen;) {
    if (*c == L'/')
      c++;
    c = wcschr(c, '/');
    if (c == NULL) {
      path_quickcut(out, path, len, maxlen, filler);
      return;
    }
  }
  wcsncpy(out + flen, c, len - flen);
}
```