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

```asm
<draw_line>:
  endbr64
  push   %r15
  sub    %esi,%ecx
  mov    %edx,%r9d
  push   %r14
  mov    %ecx,%edx
  mov    %r8,%r14
  push   %r13
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  mov    %r9d,%ebx
  sub    $0x18,%rsp
  neg    %edx
  cmovs  %ecx,%edx
  sub    %edi,%ebx
  mov    %ebx,%eax
  neg    %eax
  cmovs  %ebx,%eax
  xor    %r8d,%r8d
  cmp    %eax,%edx
  jle    L101
  mov    %ecx,%esi
  mov    $0x1,%r8d
  mov    %ebx,%ecx
  mov    %esi,%ebx
L101:
  pxor   %xmm3,%xmm3
  mov    %ebx,%r13d
  cvtsi2ss %ebx,%xmm3
  sar    $0x1f,%r13d
  or     $0x1,%r13d
  movss  %xmm3,0x8(%rsp)
  test   %ecx,%ecx
  je     L123
  pxor   %xmm0,%xmm0
  cvtsi2ss %ecx,%xmm0
  divss  %xmm0,%xmm3
  movss  %xmm3,0x8(%rsp)
L123:
  test   %r8d,%r8d
  je     L76
  mov    $0x7c,%r15d
  cmp    $0x2,%eax
  jg     L122
  movsbl %r15b,%eax
  xor    %r15d,%r15d
  mov    %eax,0xc(%rsp)
  test   %ebx,%ebx
  je     L34
  nopw   0x0(%rax,%rax,1)
L132:
  pxor   %xmm0,%xmm0
  mov    0xc(%rsp),%edi
  lea    (%r12,%r15,1),%edx
  mov    %r14,%rcx
  cvtsi2ss %r15d,%xmm0
  divss  0x8(%rsp),%xmm0
  add    %r13d,%r15d
  cvttss2si %xmm0,%esi
  add    %ebp,%esi
  call   <put_char@plt>
  cmp    %r15d,%ebx
  jne    L132
L34:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L76:
  mov    $0x7c,%r15d
  cmp    $0x2,%eax
  jg     L40
  test   %ebx,%ebx
  je     L34
  nop
L17:
  pxor   %xmm0,%xmm0
  lea    (%r8,%rbp,1),%esi
  mov    %r14,%rcx
  mov    %r15d,%edi
  cvtsi2ss %r8d,%xmm0
  divss  0x8(%rsp),%xmm0
  mov    %r8d,0xc(%rsp)
  cvttss2si %xmm0,%edx
  add    %r12d,%edx
  call   <put_char@plt>
  mov    0xc(%rsp),%r8d
  add    %r13d,%r8d
  cmp    %r8d,%ebx
  jne    L17
  jmp    L34
  nopl   0x0(%rax)
L40:
  cmp    $0x3,%edx
  mov    $0x2d,%r15d
  mov    $0x5c,%eax
  cmovge %eax,%r15d
  test   %ebx,%ebx
  jne    L17
  jmp    L34
  nopl   0x0(%rax,%rax,1)
L122:
  cmp    $0x3,%edx
  setge  %r15b
  lea    0x2d(%r15,%r15,1),%r15d
  movsbl %r15b,%eax
  xor    %r15d,%r15d
  mov    %eax,0xc(%rsp)
  test   %ebx,%ebx
  jne    L132
  jmp    L34
```

assistant: ```c
void draw_line(int x1, int y1, int x2, int y2, char *buffer) {
  int yLonger = 0;
  int incrementVal;
  int i;
  int shortLen = y2 - y1;
  int a_shortLen = (shortLen >= 0 ? shortLen : shortLen * -1);
  int longLen = x2 - x1;
  int a_longLen = (longLen >= 0 ? longLen : longLen * -1);
  char c;
  float divDiff;
  if (a_shortLen > a_longLen) {
    int swap = shortLen;
    shortLen = longLen;
    longLen = swap;
    yLonger = 1;
  }
  incrementVal = (longLen < 0 ? -1 : 1);
  divDiff = (shortLen == 0 ? longLen : (float)longLen / (float)shortLen);
  if (yLonger) {
    if (a_longLen <= 2)
      c = '|';
    else if (a_shortLen <= 2)
      c = '-';
    else
      c = '/';
    for (i = 0; i != longLen; i += incrementVal)
      put_char(c, x1 + (int)((float)i / divDiff), y1 + i, buffer);
  } else {
    if (a_longLen <= 2)
      c = '|';
    else if (a_shortLen <= 2)
      c = '-';
    else
      c = '\\';
    for (i = 0; i != longLen; i += incrementVal)
      put_char(c, x1 + i, y1 + (int)((float)i / divDiff), buffer);
  }
}
```