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

```asm
<path_concat>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  nop
L91:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  test   %al,%al
  jne    L91
  subq   $0x1,-0x8(%rbp)
  jmp    L199
L231:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L214
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L199
L214:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  je     L16
  jmp    L58
L76:
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L58:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L199
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L76
  jmp    L199
L16:
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  je     L164
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L190
L164:
  addq   $0x1,-0x20(%rbp)
  jmp    L199
L190:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2e,%al
  jne    L23
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  cmp    %rax,-0x8(%rbp)
  je     L199
  subq   $0x2,-0x8(%rbp)
  jmp    L49
L202:
  subq   $0x1,-0x8(%rbp)
L49:
  mov    -0x8(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  je     L142
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L202
L142:
  addq   $0x1,-0x8(%rbp)
  addq   $0x1,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L199
  addq   $0x1,-0x20(%rbp)
  jmp    L199
L23:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movb   $0x2e,(%rax)
  jmp    L212
L19:
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L212:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L199
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L19
L199:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L231
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x8(%rbp),%rax
  sub    $0x1,%rax
  cmp    %rax,-0x18(%rbp)
  je     L55
  mov    -0x8(%rbp),%rax
  sub    $0x1,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jne    L55
  mov    -0x8(%rbp),%rax
  sub    $0x1,%rax
  movb   $0x0,(%rax)
L55:
  mov    -0x18(%rbp),%rax
  pop    %rbp
  ret
```

assistant: ```c
char *path_concat(char *s, const char *t) {
  char *c;
  c = s;
  while (*c++)
    ;
  c--;
  while (*t)
    if (*t == '/')
      *c++ = *t++;
    else if (*t != '.')
      while (*t && (*t != '/'))
        *c++ = *t++;
    else {
      t++;
      if ((*t == '/') || !*t)
        t++;
      else if (*t == '.') {
        if (c != s + 1) {
          c -= 2;
          while ((c != s) && (*c != '/'))
            c--;
          c++;
          t++;
          if (*t == '/')
            t++;
        }
      } else {
        *c++ = '.';
        while (*t && (*t != '/'))
          *c++ = *t++;
      }
    }
  *c = 0;
  if (((c - 1) != s) && (c[-1] == '/'))
    c[-1] = 0;
  return s;
}
```