user: Converte this assembly snippet into its equivalent C code:

```asm
<main>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x660,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x658(%rsp)
  xor    %eax,%eax
  lea    D35(%rip),%rdi
  call   <printf@plt>
  mov    %rsp,%rsi
  lea    D5(%rip),%rbx
  mov    %rbx,%rdi
  call   <scanf@plt>
  lea    D58(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0x4(%rsp),%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  lea    D26(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0x8(%rsp),%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  lea    D52(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    0xc(%rsp),%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  lea    0x10(%rsp),%rbx
  lea    0x650(%rsp),%rdx
  mov    %rbx,%rax
L50:
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L50
  lea    0x630(%rbx),%rbp
  lea    D17(%rip),%r12
  jmp    L32
L29:
  add    $0x10,%rbx
  cmp    %rbx,%rbp
  je     L19
L32:
  movss  0x8(%rbx),%xmm2
  movss  0x10(%rbx),%xmm4
  ucomiss %xmm4,%xmm2
  jp     L29
  jne    L29
  movss  0xc(%rbx),%xmm3
  movss  0x14(%rbx),%xmm5
  ucomiss %xmm5,%xmm3
  jp     L29
  jne    L29
  pxor   %xmm0,%xmm0
  cvtss2sd (%rbx),%xmm0
  cvtss2sd %xmm5,%xmm5
  cvtss2sd %xmm4,%xmm4
  cvtss2sd %xmm3,%xmm3
  cvtss2sd %xmm2,%xmm2
  pxor   %xmm1,%xmm1
  cvtss2sd 0x4(%rbx),%xmm1
  mov    %r12,%rdi
  mov    $0x6,%eax
  call   <printf@plt>
  jmp    L29
L19:
  mov    0x658(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L67
  mov    $0x0,%eax
  add    $0x660,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L67:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D35
type: string
name: extract_symbolic_data
arguments: data_tag: D5
type: string
name: extract_symbolic_data
arguments: data_tag: D58
type: string
name: extract_symbolic_data
arguments: data_tag: D26
type: string
name: extract_symbolic_data
arguments: data_tag: D52
type: string
name: extract_symbolic_data
arguments: data_tag: D17
type: string

tool: D35: Inserire coordinata x del primo punto: 

tool: D5: %f

tool: D58: 
Inserire coordinata y del primo punto: 

tool: D26: Inserire coordinata x del secondo punto: 

tool: D52: 
Inserire coordinata y del secondo punto: 

tool: D17: (%f, %f)--(%f, %f)--(%f, %f)


assistant: ```c
int main() {
  typedef struct {
    float x;
    float y;
  } punto;
  typedef struct {
    punto a;
    punto b;
  } segmento;
  segmento dati[100];
  segmento s;
  segmento ris[100];
  int num_coincidenti;
  int i;
  printf("Inserire coordinata x del primo punto: ");
  scanf("%f", &s.a.x);
  printf("\nInserire coordinata y del primo punto: ");
  scanf("%f", &s.a.y);
  printf("Inserire coordinata x del secondo punto: ");
  scanf("%f", &s.b.x);
  printf("\nInserire coordinata y del secondo punto: ");
  scanf("%f", &s.b.y);
  num_coincidenti = 0;
  for (i = 0; i < 100; i++)
    if (dati[i].a.x == s.a.x && dati[i].a.y == s.a.y && dati[i].b.x == s.b.x && dati[i].b.y == s.b.y || dati[i].b.x == s.a.x && dati[i].b.y == s.a.y && dati[i].a.x == s.b.x && dati[i].a.y == s.b.y) {
      ris[num_coincidenti].a.x = s.a.x;
      ris[num_coincidenti].a.y = s.a.y;
      ris[num_coincidenti].b.x = s.b.x;
      ris[num_coincidenti].b.y = s.b.y;
      num_coincidenti++;
    }
  for (i = 0; i < 100 - 1; i++)
    if (dati[i].b.x == dati[i + 1].a.x && dati[i].b.y == dati[i + 1].a.y)
      printf("(%f, %f)--(%f, %f)--(%f, %f)\n", dati[i].a.x, dati[i].a.y, dati[i].b.x, dati[i].b.y, dati[i + 1].a.x, dati[i + 1].a.y);
  return 0;
}
```