user: What is the c source code of the assembly code below?

```asm
<Prettify>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x1c(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jg     L15
  cmpl   $0x15,-0x8(%rbp)
  jg     L15
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  jmp    L59
L64:
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
  addl   $0x1,-0x10(%rbp)
L59:
  mov    -0x10(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jl     L64
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2e,(%rax)
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
  mov    -0x8(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L104
L15:
  cmpl   $0x0,-0x8(%rbp)
  jle    L2
  cmpl   $0x15,-0x8(%rbp)
  jg     L2
  mov    -0x1c(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    -0x8(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x18(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rsi
  mov    -0x8(%rbp),%edx
  movslq %edx,%rdx
  lea    0x1(%rdx),%rcx
  mov    -0x18(%rbp),%rdx
  add    %rdx,%rcx
  mov    %eax,%edx
  mov    %rcx,%rdi
  call   <memmove@plt>
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2e,(%rax)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L104
L2:
  cmpl   $0xfffffffb,-0x8(%rbp)
  jl     L44
  cmpl   $0x0,-0x8(%rbp)
  jg     L44
  mov    $0x2,%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x1c(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  mov    %rcx,%rdi
  call   <memmove@plt>
  mov    -0x18(%rbp),%rax
  movb   $0x30,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movb   $0x2e,(%rax)
  movl   $0x2,-0xc(%rbp)
  jmp    L97
L70:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
  addl   $0x1,-0xc(%rbp)
L97:
  mov    -0xc(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L70
  mov    -0x1c(%rbp),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  jmp    L104
L44:
  cmpl   $0x1,-0x1c(%rbp)
  jne    L21
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movb   $0x65,(%rax)
  mov    -0x18(%rbp),%rax
  lea    0x2(%rax),%rdx
  mov    -0x8(%rbp),%eax
  sub    $0x1,%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <WriteExponent@plt>
  jmp    L104
L21:
  mov    -0x1c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memmove@plt>
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movb   $0x2e,(%rax)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x65,(%rax)
  mov    -0x1c(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x8(%rbp),%eax
  sub    $0x1,%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <WriteExponent@plt>
  jmp    L104
L104:
  nop
  leave
  ret
```

assistant: ```c
void Prettify(char *buffer, int length, int k) {
  const int kk = length + k;
  if (length <= kk && kk <= 21) {
    for (int i = length; i < kk; i++)
      buffer[i] = '0';
    buffer[kk] = '.';
    buffer[kk + 1] = '0';
    buffer[kk + 2] = '\0';
  } else if (0 < kk && kk <= 21) {
    memmove(&buffer[kk + 1], &buffer[kk], length - kk);
    buffer[kk] = '.';
    buffer[length + 1] = '\0';
  } else if (-6 < kk && kk <= 0) {
    const int offset = 2 - kk;
    memmove(&buffer[offset], &buffer[0], length);
    buffer[0] = '0';
    buffer[1] = '.';
    for (int i = 2; i < offset; i++)
      buffer[i] = '0';
    buffer[length + offset] = '\0';
  } else if (length == 1) {
    buffer[1] = 'e';
    WriteExponent(kk - 1, &buffer[2]);
  } else {
    memmove(&buffer[2], &buffer[1], length - 1);
    buffer[1] = '.';
    buffer[length + 1] = 'e';
    WriteExponent(kk - 1, &buffer[0 + length + 2]);
  }
}
```