user: Please show me the C implementation that matches the assembly code listed below:

```asm
<printScreen>:
  endbr64
  push   %r15
  xor    %eax,%eax
  mov    %edi,%r15d
  push   %r14
  mov    %edx,%r14d
  push   %r13
  mov    %ecx,%r13d
  push   %r12
  mov    %esi,%r12d
  push   %rbp
  sar    $0x1f,%r12d
  mov    %esi,%ebp
  push   %rbx
  mov    %edi,%ebx
  and    $0x2,%r12d
  lea    D151(%rip),%rdi
  sar    $0x1f,%ebx
  add    $0x2b,%r12d
  and    $0x2,%ebx
  sub    $0x28,%rsp
  add    $0x2b,%ebx
  mov    %r8d,0x14(%rsp)
  movsd  %xmm0,0x8(%rsp)
  movsd  %xmm1,0x18(%rsp)
  test   %edx,%edx
  js     L184
  call   <printf@plt>
  cmp    $0x2,%r13d
  je     L281
  cmp    $0x3,%r13d
  je     L137
  mov    $0x2b,%r8d
  cmp    $0x1,%r13d
  je     L72
L168:
  add    $0x28,%rsp
  lea    D215(%rip),%rdi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1060 <puts@plt>
  nopl   0x0(%rax)
L184:
  call   <printf@plt>
  cmp    $0x2,%r13d
  je     L363
  cmp    $0x3,%r13d
  je     L137
  cmp    $0x1,%r13d
  jne    L168
  mov    $0x2d,%r8d
L72:
  mov    %r15d,%esi
  mov    %ebp,%eax
  neg    %esi
  cmovs  %r15d,%esi
  neg    %eax
  cmovs  %ebp,%eax
  mov    %eax,%r10d
  cmp    $0x1,%esi
  je     L112
  cmp    $0x1,%eax
  je     L238
  mov    %ebp,%eax
  or     %r14d,%eax
  je     L234
  test   %ebp,%ebp
  je     L57
  movsbl %r12b,%edx
  test   %r14d,%r14d
  jne    L159
  mov    %r10d,%ecx
  mov    %r15d,%esi
  lea    D34(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  cs nopw 0x0(%rax,%rax,1)
L160:
  cmp    $0x2d,%bl
  jne    L150
L65:
  lea    D192(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L63
  nopl   0x0(%rax)
L137:
  mov    %r14d,%esi
  lea    D50(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  lea    D100(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L168
  nopl   0x0(%rax)
L281:
  test   %r14d,%r14d
  jne    L66
  mov    %ebp,%esi
  lea    D182(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L44:
  movsd  0x8(%rsp),%xmm0
  lea    D129(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  jmp    L168
  nopl   (%rax)
L363:
  mov    $0x2d,%edx
L166:
  mov    %r14d,%ecx
  mov    %ebp,%esi
  lea    D139(%rip),%rdi
  neg    %ecx
  cmovs  %r14d,%ecx
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L44
L238:
  cmp    %r15d,%esi
  je     L228
  test   %r15d,%r15d
  js     L170
  je     L160
  movsbl %r8b,%ecx
  mov    %r14d,%r8d
  movsbl %r12b,%esi
  mov    %r10d,%edx
  neg    %r8d
  lea    D206(%rip),%rdi
  cmovs  %r14d,%r8d
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
L112:
  cmp    $0x1,%eax
  jne    L238
  mov    %r14d,%ecx
  movsbl %r12b,%esi
  movsbl %r8b,%edx
  neg    %ecx
  cmovs  %r14d,%ecx
  cmp    $0x2d,%bl
  je     L338
  lea    D209(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  nopl   (%rax)
L150:
  lea    D187(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L63:
  cmpl   $0x1,0x14(%rsp)
  je     L377
  xor    %eax,%eax
  lea    D236(%rip),%rdi
  call   <printf@plt>
  or     %ebp,%r14d
  jne    L282
  movsd  0x8(%rsp),%xmm0
  lea    D1(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  jmp    L168
  nopl   0x0(%rax)
L57:
  mov    %r14d,%ecx
  movsbl %r8b,%edx
  mov    %r15d,%esi
  neg    %ecx
  lea    D83(%rip),%rdi
  cmovs  %r14d,%ecx
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
  nopl   0x0(%rax,%rax,1)
L228:
  cmp    %r10d,%ebp
  je     L160
  test   %ebp,%ebp
  js     L319
  je     L160
  mov    %r14d,%ecx
  movsbl %r8b,%edx
  lea    D78(%rip),%rdi
  neg    %ecx
  cmovs  %r14d,%ecx
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
  nop
L377:
  lea    D149(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  movsd  0x18(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm0
  lea    D99(%rip),%rdi
  mov    $0x2,%eax
  call   <printf@plt>
  jmp    L168
L282:
  movsd  0x18(%rsp),%xmm1
  movsd  0x8(%rsp),%xmm2
  mov    $0x4,%eax
  lea    D246(%rip),%rdi
  andpd  D95(%rip),%xmm1
  movapd %xmm2,%xmm0
  movapd %xmm1,%xmm3
  call   <printf@plt>
  jmp    L168
  nopw   0x0(%rax,%rax,1)
L234:
  mov    %r15d,%esi
  lea    D136(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
  xchg   %ax,%ax
L159:
  mov    %r14d,%r9d
  mov    %r10d,%ecx
  lea    D128(%rip),%rdi
  mov    %r15d,%esi
  neg    %r9d
  cmovs  %r14d,%r9d
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
  nopl   0x0(%rax,%rax,1)
L66:
  mov    $0x2b,%edx
  jmp    L166
  nopw   0x0(%rax,%rax,1)
L170:
  movsbl %r8b,%ecx
  mov    %r14d,%r8d
  movsbl %r12b,%esi
  mov    %r10d,%edx
  neg    %r8d
  lea    D174(%rip),%rdi
  cmovs  %r14d,%r8d
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
L319:
  mov    %r14d,%ecx
  movsbl %r8b,%edx
  lea    D16(%rip),%rdi
  neg    %ecx
  cmovs  %r14d,%ecx
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L160
L338:
  lea    D147(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L65
```

tool_calls: name: retrieve_data
arguments: tag: D151
type_infered: string
name: retrieve_data
arguments: tag: D215
type_infered: string
name: retrieve_data
arguments: tag: D34
type_infered: string
name: retrieve_data
arguments: tag: D192
type_infered: string
name: retrieve_data
arguments: tag: D50
type_infered: string
name: retrieve_data
arguments: tag: D100
type_infered: string
name: retrieve_data
arguments: tag: D182
type_infered: string
name: retrieve_data
arguments: tag: D129
type_infered: string
name: retrieve_data
arguments: tag: D139
type_infered: string
name: retrieve_data
arguments: tag: D206
type_infered: string
name: retrieve_data
arguments: tag: D209
type_infered: string
name: retrieve_data
arguments: tag: D187
type_infered: string
name: retrieve_data
arguments: tag: D236
type_infered: string
name: retrieve_data
arguments: tag: D1
type_infered: string
name: retrieve_data
arguments: tag: D83
type_infered: string
name: retrieve_data
arguments: tag: D78
type_infered: string
name: retrieve_data
arguments: tag: D149
type_infered: string
name: retrieve_data
arguments: tag: D99
type_infered: string
name: retrieve_data
arguments: tag: D246
type_infered: string
name: retrieve_data
arguments: tag: D95
type_infered: qword[2]
name: retrieve_data
arguments: tag: D136
type_infered: string
name: retrieve_data
arguments: tag: D128
type_infered: string
name: retrieve_data
arguments: tag: D174
type_infered: string
name: retrieve_data
arguments: tag: D16
type_infered: string
name: retrieve_data
arguments: tag: D147
type_infered: string

tool: D151: 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

tool: D215: 
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-


tool: D34: 
The equation is y = %dx^2 %c %dx

tool: D192: 
The parabola opens downward.

tool: D50: 
The equation is y = %d

tool: D100: 
The line has no zeros.

tool: D182: 
The equation is y = %dx

tool: D129: 
The line has a zero at x = %.3f

tool: D139: 
The equation is y = %dx %c %d

tool: D206: 
The equation is y = x^2 %c %dx %c %d

tool: D209: 
The equation is y = x^2 %c x %c %d

tool: D187: 
The parabola opens upward.

tool: D236: 
The parabola has two complex roots.

tool: D1: 
Root at x = %.3f

tool: D83: 
The equation is y = %dx^2 %c %d

tool: D78: 
The equation is y = %dx^2 + x %c %d

tool: D149: 
The parabola has two real roots.

tool: D99: 
Roots are %.3f and %.3f

tool: D246: 
Roots are %.3f + %.3fi and %.3f - %.3fi

tool: {"D95": [0x7fffffffffffffff,0x0000000000000000]}

tool: D136: 
The equation is y = %dx^2

tool: D128: 
The equation is y = %dx^2 %c %dx %c %d

tool: D174: 
The equation is y = -x^2 %c %dx %c %d

tool: D16: 
The equation is y = %dx^2 - x %c %d

tool: D147: 
The equation is y = -x^2 %c x %c %d

assistant: ```c
void printScreen(int a, int b, int c, int curTyp, int rcRoot, double r1, double r2) {
  char ac = (a < 0) ? '-' : '+';
  char bc = (b < 0) ? '-' : '+';
  char cc = (c < 0) ? '-' : '+';
  printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-");
  switch (curTyp) {
  case 1:
    if (abs(a) != 1 && abs(b) != 1) {
      if (b == 0 && c == 0)
        printf("\nThe equation is y = %dx^2", a);
      else if (b == 0)
        printf("\nThe equation is y = %dx^2 %c %d", a, cc, abs(c));
      else if (c == 0)
        printf("\nThe equation is y = %dx^2 %c %dx", a, bc, abs(b));
      else
        printf("\nThe equation is y = %dx^2 %c %dx %c %d", a, bc, abs(b), cc, abs(c));
    } else if (abs(a) == 1 || abs(b) == 1) {
      if (abs(a) == 1 && abs(b) == 1) {
        if (ac == '-')
          printf("\nThe equation is y = -x^2 %c x %c %d", bc, cc, abs(c));
        else
          printf("\nThe equation is y = x^2 %c x %c %d", bc, cc, abs(c));
      } else if (abs(a) != a) {
        if (a < 0)
          printf("\nThe equation is y = -x^2 %c %dx %c %d", bc, abs(b), cc, abs(c));
        else if (a > 0)
          printf("\nThe equation is y = x^2 %c %dx %c %d", bc, abs(b), cc, abs(c));
      } else if (abs(b) != b) {
        if (b < 0)
          printf("\nThe equation is y = %dx^2 - x %c %d", a, cc, abs(c));
        else if (b > 0)
          printf("\nThe equation is y = %dx^2 + x %c %d", a, cc, abs(c));
      }
    }
    if (ac == '-')
      printf("\nThe parabola opens downward.");
    else if (ac == '+')
      printf("\nThe parabola opens upward.");
    if (rcRoot == 1) {
      printf("\nThe parabola has two real roots.");
      printf("\nRoots are %.3f and %.3f", r1, r2);
    } else {
      printf("\nThe parabola has two complex roots.");
      if (b == 0 && c == 0)
        printf("\nRoot at x = %.3f", r1);
      else
        printf("\nRoots are %.3f + %.3fi and %.3f - %.3fi", r1, fabs(r2), r1, fabs(r2));
    }
    break;
  case 2:
    if (c == 0)
      printf("\nThe equation is y = %dx", b);
    else
      printf("\nThe equation is y = %dx %c %d", b, cc, abs(c));
    printf("\nThe line has a zero at x = %.3f", r1);
    break;
  case 3:
    printf("\nThe equation is y = %d", c);
    printf("\nThe line has no zeros.");
    break;
  }
  printf("\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\n\n");
  return;
}
```