user: What would the C source look like for the assembly code provided here:

```asm
<fossilize>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  test   %esi,%esi
  js     L59
  test   %esi,%esi
  jle    L210
L183:
  lea    -0x1(%rsi),%eax
  mov    %rbx,%rdx
  xor    %edi,%edi
  lea    0x1(%rbx,%rax,1),%r8
  nopw   0x0(%rax,%rax,1)
L104:
  movzbl (%rdx),%ecx
  test   $0xdf,%cl
  je     L102
  lea    -0x9(%rcx),%r9d
  cmp    $0x4,%r9b
  jbe    L102
  cmp    $0x5c,%cl
  jne    L61
  nop
L102:
  add    $0x1,%edi
L61:
  add    $0x1,%rdx
  cmp    %rdx,%r8
  jne    L104
  lea    0x1(%rdi,%rsi,1),%edi
  mov    %r8,(%rsp)
  xor    %ebp,%ebp
  call   <malloc@plt>
  mov    (%rsp),%r8
  test   %rax,%rax
  mov    %rax,%r13
  jne    L147
  jmp    L195
  nopl   0x0(%rax)
L77:
  movb   $0x5c,(%r12)
  add    $0x2,%ebp
  movb   $0x30,(%r15)
L105:
  add    $0x1,%rbx
  cmp    %rbx,%r8
  je     L136
L147:
  lea    0x1(%rbp),%r14d
  movsbl (%rbx),%edi
  movslq %r14d,%rax
  lea    0x0(%r13,%rax,1),%r15
  movslq %ebp,%rax
  lea    0x0(%r13,%rax,1),%r12
  test   %edi,%edi
  je     L77
  cmp    $0x5c,%edi
  jne    L11
  add    $0x1,%rbx
  movb   $0x5c,(%r12)
  add    $0x2,%ebp
  movb   $0x5c,(%r15)
  cmp    %rbx,%r8
  jne    L147
L136:
  movslq %ebp,%rbp
  add    %r13,%rbp
L64:
  movb   $0x0,0x0(%rbp)
L195:
  add    $0x18,%rsp
  mov    %r13,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cs nopw 0x0(%rax,%rax,1)
L11:
  mov    %r8,(%rsp)
  mov    %dil,0xf(%rsp)
  call   <fossil_isspace@plt>
  mov    (%rsp),%r8
  movzbl 0xf(%rsp),%edx
  test   %rax,%rax
  je     L173
  lea    -0x9(%rdx),%eax
  movb   $0x5c,(%r12)
  cmp    $0x17,%al
  ja     L161
  lea    D5(%rip),%rsi
  movzbl %al,%eax
  movslq (%rsi,%rax,4),%rax
  add    %rsi,%rax
  notrack jmp *%rax
  mov    $0x73,%edx
  nopl   0x0(%rax)
L161:
  mov    %dl,(%r15)
  add    $0x2,%ebp
  jmp    L105
  nopl   0x0(%rax,%rax,1)
L173:
  mov    %dl,(%r12)
  mov    %r14d,%ebp
  jmp    L105
  nopl   0x0(%rax)
L59:
  call   <strlen@plt>
  mov    %eax,%esi
  test   %esi,%esi
  jg     L183
L210:
  lea    0x1(%rsi),%edi
  call   <malloc@plt>
  mov    %rax,%r13
  mov    %rax,%rbp
  test   %rax,%rax
  jne    L64
  jmp    L195
  mov    $0x72,%edx
  jmp    L161
  mov    $0x66,%edx
  jmp    L161
  mov    $0x76,%edx
  jmp    L161
  mov    $0x74,%edx
  jmp    L161
  mov    $0x6e,%edx
  jmp    L161
```

assistant: ```c
char *fossilize(const char *zIn, int nIn) {
  int n, i, j, c;
  char *zOut;
  if (nIn < 0)
    nIn = strlen(zIn);
  for (i = n = 0; i < nIn; i++) {
    c = zIn[i];
    if (c == 0 || c == ' ' || c == '\n' || c == '\t' || c == '\r' || c == '\f' || c == '\v' || c == '\\')
      n++;
  }
  n += nIn;
  zOut = malloc(n + 1);
  if (zOut) {
    for (i = j = 0; i < nIn; i++) {
      int c = zIn[i];
      if (c == 0) {
        zOut[j++] = '\\';
        zOut[j++] = '0';
      } else if (c == '\\') {
        zOut[j++] = '\\';
        zOut[j++] = '\\';
      } else if (fossil_isspace(c)) {
        zOut[j++] = '\\';
        switch (c) {
        case '\n':
          c = 'n';
          break;
        case ' ':
          c = 's';
          break;
        case '\t':
          c = 't';
          break;
        case '\r':
          c = 'r';
          break;
        case '\v':
          c = 'v';
          break;
        case '\f':
          c = 'f';
          break;
        }
        zOut[j++] = c;
      } else {
        zOut[j++] = c;
      }
    }
    zOut[j] = 0;
  }
  return zOut;
}
```