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

```asm
<itoa2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %edx,-0x54(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x40(%rbp)
  jmp    L32
L22:
  lea    -0x20(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
  addq   $0x1,-0x40(%rbp)
L32:
  cmpq   $0xe,-0x40(%rbp)
  jle    L22
  movb   $0x0,-0x11(%rbp)
  cmpq   $0x0,-0x48(%rbp)
  jns    L130
  cmpl   $0xa,-0x54(%rbp)
  je     L30
L130:
  movq   $0x1,-0x30(%rbp)
  jmp    L73
L30:
  movq   $0xffffffffffffffff,-0x30(%rbp)
L73:
  mov    -0x48(%rbp),%rax
  imul   -0x30(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  movq   $0xe,-0x38(%rbp)
  jmp    L129
L132:
  mov    -0x54(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x28(%rbp),%rax
  mov    $0x0,%edx
  div    %rcx
  mov    %rdx,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x54(%rbp),%eax
  movslq %eax,%rsi
  mov    -0x28(%rbp),%rax
  mov    $0x0,%edx
  div    %rsi
  mov    %rax,-0x28(%rbp)
  cmpq   $0x9,-0x40(%rbp)
  jg     L106
  mov    -0x40(%rbp),%rax
  add    $0x30,%eax
  mov    %eax,%edx
  jmp    L76
L106:
  mov    -0x40(%rbp),%rax
  add    $0x57,%eax
  mov    %eax,%edx
L76:
  lea    -0x20(%rbp),%rcx
  mov    -0x38(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  cmpq   $0x0,-0x28(%rbp)
  jne    L152
  mov    $0xf,%eax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  jge    L162
L152:
  subq   $0x1,-0x38(%rbp)
L129:
  cmpq   $0x0,-0x38(%rbp)
  jns    L132
  jmp    L137
L162:
  nop
L137:
  cmpq   $0xffffffffffffffff,-0x30(%rbp)
  jne    L31
  subq   $0x1,-0x38(%rbp)
  lea    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rdx,%rax
  movb   $0x2d,(%rax)
L31:
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L113
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rdx
  mov    $0xf,%eax
  sub    -0x38(%rbp),%rax
  cmp    %rax,%rdx
  jge    L127
L113:
  lea    -0x20(%rbp),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy2@plt>
  mov    $0xf,%eax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x60(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L112
L127:
  mov    -0x60(%rbp),%rax
  mov    (%rax),%rax
  mov    $0xf,%edx
  sub    %rax,%rdx
  lea    -0x20(%rbp),%rax
  add    %rax,%rdx
  mov    -0x50(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy2@plt>
L112:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L161
  call   <__stack_chk_fail@plt>
L161:
  leave
  ret
```

assistant: ```c
void itoa2(long n, char *s, int base, long *digits) {
  long i, j, sign;
  unsigned long n2;
  char number[20];
  for (i = 0; i < 15; ++i) {
    number[i] = ' ';
  }
  number[15] = 0;
  if (n >= 0 || base != 10) {
    sign = 1;
  } else {
    sign = -1;
  }
  n2 = n * sign;
  for (j = 14; j >= 0; --j) {
    i = n2 % base;
    n2 /= base;
    number[j] = i < 10 ? '0' + i : 'a' + i - 10;
    if (n2 == 0 && 15 - j >= *digits) {
      break;
    }
  }
  if (sign == -1) {
    number[--j] = '-';
  }
  if (*digits == 0 || *digits < 15 - j) {
    strcpy2(s, &number[j]);
    *digits = 15 - j;
  } else {
    strcpy2(s, &number[15 - *digits]);
  }
}
```