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

```asm
<fmtint>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  mov    %rcx,-0x80(%rbp)
  mov    %r8d,-0x84(%rbp)
  mov    %r9d,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movb   $0x0,-0x5e(%rbp)
  movb   $0x0,-0x5d(%rbp)
  movl   $0x0,-0x5c(%rbp)
  movl   $0x0,-0x58(%rbp)
  mov    0x18(%rbp),%eax
  and    $0x20,%eax
  mov    %eax,-0x50(%rbp)
  cmpl   $0xffffffff,0x10(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x4c(%rbp)
  mov    0x18(%rbp),%eax
  and    $0x80,%eax
  test   %eax,%eax
  je     L77
  mov    -0x80(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  jmp    L253
L77:
  mov    -0x80(%rbp),%rax
  mov    %rax,%rdx
  neg    %rdx
  cmovns %rdx,%rax
  mov    %rax,-0x48(%rbp)
  cmpq   $0x0,-0x80(%rbp)
  jns    L36
  movb   $0x2d,-0x5e(%rbp)
  jmp    L253
L36:
  mov    0x18(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L371
  movb   $0x2b,-0x5e(%rbp)
  jmp    L253
L371:
  mov    0x18(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L253
  movb   $0x20,-0x5e(%rbp)
L253:
  mov    0x18(%rbp),%eax
  and    $0x40,%eax
  mov    %eax,%ecx
  mov    -0x84(%rbp),%edx
  lea    -0x40(%rbp),%rsi
  mov    -0x48(%rbp),%rax
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    $0x2b,%edx
  mov    %rax,%rdi
  call   <convert@plt>
  mov    %eax,-0x54(%rbp)
  mov    0x18(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L32
  cmpq   $0x0,-0x48(%rbp)
  je     L32
  cmpl   $0x8,-0x84(%rbp)
  je     L47
  cmpl   $0x10,-0x84(%rbp)
  je     L314
  jmp    L32
L47:
  mov    0x10(%rbp),%eax
  cmp    -0x54(%rbp),%eax
  jg     L440
  mov    -0x54(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,0x10(%rbp)
  jmp    L440
L314:
  mov    0x18(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L316
  mov    $0x58,%eax
  jmp    L199
L316:
  mov    $0x78,%eax
L199:
  mov    %al,-0x5d(%rbp)
  jmp    L32
L440:
  nop
L32:
  cmpl   $0x0,-0x50(%rbp)
  je     L362
  mov    -0x54(%rbp),%eax
  mov    %eax,%edi
  call   <getnumsep@plt>
  mov    %eax,-0x50(%rbp)
L362:
  mov    0x10(%rbp),%eax
  sub    -0x54(%rbp),%eax
  sub    -0x50(%rbp),%eax
  mov    %eax,-0x58(%rbp)
  mov    -0x88(%rbp),%eax
  sub    -0x50(%rbp),%eax
  mov    %eax,%ecx
  mov    0x10(%rbp),%edx
  mov    -0x54(%rbp),%eax
  cmp    %eax,%edx
  cmovl  %eax,%edx
  mov    %ecx,%eax
  sub    %edx,%eax
  cmpb   $0x0,-0x5e(%rbp)
  setne  %dl
  movzbl %dl,%edx
  sub    %edx,%eax
  cmpb   $0x0,-0x5d(%rbp)
  je     L334
  mov    $0x2,%edx
  jmp    L343
L334:
  mov    $0x0,%edx
L343:
  sub    %edx,%eax
  mov    %eax,-0x5c(%rbp)
  cmpl   $0x0,-0x58(%rbp)
  jns    L217
  movl   $0x0,-0x58(%rbp)
L217:
  cmpl   $0x0,-0x5c(%rbp)
  jns    L177
  movl   $0x0,-0x5c(%rbp)
L177:
  mov    0x18(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L389
  negl   -0x5c(%rbp)
  jmp    L189
L389:
  mov    0x18(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L189
  cmpl   $0x0,-0x4c(%rbp)
  je     L189
  mov    -0x5c(%rbp),%eax
  add    %eax,-0x58(%rbp)
  movl   $0x0,-0x5c(%rbp)
  jmp    L189
L244:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L446
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
L446:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  subl   $0x1,-0x5c(%rbp)
L189:
  cmpl   $0x0,-0x5c(%rbp)
  jg     L244
  cmpb   $0x0,-0x5e(%rbp)
  je     L34
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L277
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x5e(%rbp),%eax
  mov    %al,(%rdx)
L277:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
L34:
  cmpb   $0x0,-0x5d(%rbp)
  je     L76
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L165
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
L165:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L442
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x5d(%rbp),%eax
  mov    %al,(%rdx)
L442:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L76
L293:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L149
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movb   $0x30,(%rax)
L149:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  subl   $0x1,-0x58(%rbp)
L76:
  cmpl   $0x0,-0x58(%rbp)
  jg     L293
  jmp    L169
L115:
  subl   $0x1,-0x54(%rbp)
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L51
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rax,%rdx
  mov    -0x54(%rbp),%eax
  cltq
  movzbl -0x40(%rbp,%rax,1),%eax
  mov    %al,(%rdx)
L51:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  cmpl   $0x0,-0x50(%rbp)
  jle    L169
  cmpl   $0x0,-0x54(%rbp)
  jle    L169
  mov    -0x54(%rbp),%edx
  movslq %edx,%rax
  imul   $0x55555556,%rax,%rax
  shr    $0x20,%rax
  mov    %edx,%ecx
  sar    $0x1f,%ecx
  sub    %ecx,%eax
  mov    %eax,%ecx
  add    %ecx,%ecx
  add    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  test   %eax,%eax
  jne    L169
  mov    -0x78(%rbp),%rdx
  mov    -0x70(%rbp),%rcx
  mov    -0x68(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <printsep@plt>
L169:
  cmpl   $0x0,-0x54(%rbp)
  jg     L115
  jmp    L291
L436:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  add    $0x1,%rax
  cmp    %rax,-0x78(%rbp)
  jbe    L292
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x68(%rbp),%rax
  add    %rdx,%rax
  movb   $0x20,(%rax)
L292:
  mov    -0x70(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x70(%rbp),%rax
  mov    %rdx,(%rax)
  addl   $0x1,-0x5c(%rbp)
L291:
  cmpl   $0x0,-0x5c(%rbp)
  js     L436
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L383
  call   <__stack_chk_fail@plt>
L383:
  leave
  ret
```

assistant: ```c
void fmtint(char *str, size_t *len, size_t size, long int value, int base, int width, int precision, int flags) {
  unsigned long int uvalue;
  char iconvert[43];
  char sign = 0;
  char hexprefix = 0;
  int spadlen = 0;
  int zpadlen = 0;
  int pos;
  int separators = (flags & (1 << 5));
  int noprecision = (precision == -1);
  if (flags & (1 << 7))
    uvalue = value;
  else {
    uvalue = (value >= 0) ? value : -value;
    if (value < 0)
      sign = '-';
    else if (flags & (1 << 1))
      sign = '+';
    else if (flags & (1 << 2))
      sign = ' ';
  }
  pos = convert(uvalue, iconvert, sizeof(iconvert), base, flags & (1 << 6));
  if (flags & (1 << 3) && uvalue != 0) {
    switch (base) {
    case 8:
      if (precision <= pos)
        precision = pos + 1;
      break;
    case 16:
      hexprefix = (flags & (1 << 6)) ? 'X' : 'x';
      break;
    }
  }
  if (separators)
    separators = getnumsep(pos);
  zpadlen = precision - pos - separators;
  spadlen = width - separators - ((precision >= pos) ? precision : pos) - ((sign != 0) ? 1 : 0) - ((hexprefix != 0) ? 2 : 0);
  if (zpadlen < 0)
    zpadlen = 0;
  if (spadlen < 0)
    spadlen = 0;
  if (flags & (1 << 0))
    spadlen = -spadlen;
  else if (flags & (1 << 4) && noprecision) {
    zpadlen += spadlen;
    spadlen = 0;
  }
  while (spadlen > 0) {
    do {
      if (*len + 1 < size)
        str[*len] = ' ';
      (*len)++;
    } while (0);
    spadlen--;
  }
  if (sign != 0)
    do {
      if (*len + 1 < size)
        str[*len] = sign;
      (*len)++;
    } while (0);
  if (hexprefix != 0) {
    do {
      if (*len + 1 < size)
        str[*len] = '0';
      (*len)++;
    } while (0);
    do {
      if (*len + 1 < size)
        str[*len] = hexprefix;
      (*len)++;
    } while (0);
  }
  while (zpadlen > 0) {
    do {
      if (*len + 1 < size)
        str[*len] = '0';
      (*len)++;
    } while (0);
    zpadlen--;
  }
  while (pos > 0) {
    pos--;
    do {
      if (*len + 1 < size)
        str[*len] = iconvert[pos];
      (*len)++;
    } while (0);
    if (separators > 0 && pos > 0 && pos % 3 == 0)
      printsep(str, len, size);
  }
  while (spadlen < 0) {
    do {
      if (*len + 1 < size)
        str[*len] = ' ';
      (*len)++;
    } while (0);
    spadlen++;
  }
}
```