user: Demonstrate the C code that generates the assembly output below:

```asm
<parseLine>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x4b0,%rsp
  mov    %rdi,-0x4a8(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x49c(%rbp)
  movl   $0x0,-0x498(%rbp)
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %al,-0x49d(%rbp)
  jmp    L19
L137:
  mov    -0x498(%rbp),%eax
  cltq
  movzbl -0x49d(%rbp),%edx
  mov    %dl,-0x90(%rbp,%rax,1)
  addl   $0x1,-0x498(%rbp)
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %al,-0x49d(%rbp)
L53:
  cmpb   $0x20,-0x49d(%rbp)
  je     L169
  cmpb   $0xa,-0x49d(%rbp)
  je     L169
  cmpb   $0x3d,-0x49d(%rbp)
  je     L169
  cmpb   $0x21,-0x49d(%rbp)
  jne    L137
L169:
  cmpb   $0x21,-0x49d(%rbp)
  jne    L190
  mov    -0x498(%rbp),%eax
  cltq
  movzbl -0x49d(%rbp),%edx
  mov    %dl,-0x90(%rbp,%rax,1)
  addl   $0x1,-0x498(%rbp)
L190:
  mov    -0x498(%rbp),%eax
  cltq
  movb   $0x0,-0x90(%rbp,%rax,1)
  lea    -0x90(%rbp),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  mov    %rax,%rdx
  mov    -0x49c(%rbp),%eax
  cltq
  mov    %rdx,-0x490(%rbp,%rax,8)
  addl   $0x1,-0x49c(%rbp)
  lea    -0x90(%rbp),%rax
  mov    $0x80,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movl   $0x0,-0x498(%rbp)
  cmpb   $0x21,-0x49d(%rbp)
  jne    L212
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %al,-0x49d(%rbp)
  jmp    L212
L26:
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %al,-0x49d(%rbp)
L212:
  cmpb   $0x20,-0x49d(%rbp)
  je     L26
  cmpb   $0x3d,-0x49d(%rbp)
  je     L26
  cmpb   $0xa,-0x49d(%rbp)
  jne    L1
  mov    -0x49c(%rbp),%eax
  cltq
  movq   $0x0,-0x490(%rbp,%rax,8)
  lea    -0x490(%rbp),%rax
  mov    %rax,%rdi
  call   <sysCall@plt>
  movl   $0x0,-0x49c(%rbp)
  movl   $0x0,-0x494(%rbp)
  jmp    L10
L51:
  mov    -0x494(%rbp),%eax
  cltq
  mov    -0x490(%rbp,%rax,8),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x494(%rbp),%eax
  cltq
  movq   $0x0,-0x490(%rbp,%rax,8)
  addl   $0x1,-0x494(%rbp)
L10:
  mov    -0x49c(%rbp),%eax
  cmp    -0x494(%rbp),%eax
  jg     L51
L1:
  cmpb   $0xa,-0x49d(%rbp)
  jne    L144
  mov    D0(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x4a8(%rbp)
  je     L162
  jmp    L144
L32:
  mov    -0x4a8(%rbp),%rax
  mov    %rax,%rdi
  call   <getc@plt>
  mov    %al,-0x49d(%rbp)
L144:
  cmpb   $0xa,-0x49d(%rbp)
  je     L32
  cmpb   $0x20,-0x49d(%rbp)
  je     L32
  mov    D3(%rip),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x49d(%rbp)
  jne    L19
  mov    D0(%rip),%rax
  mov    (%rax),%rax
  cmp    %rax,-0x4a8(%rbp)
  jne    L0
L19:
  mov    D3(%rip),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x49d(%rbp)
  jne    L53
  jmp    L183
L162:
  nop
  jmp    L183
L0:
  nop
L183:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L18
  call   <__stack_chk_fail@plt>
L18:
  leave
  ret
```

assistant: ```c
void parseLine(FILE *stream) {
  char *args[128];
  char buffer[128];
  int argc = 0;
  int i = 0;
  char c = getc(stream);
  while (c != EOF) {
    while (c != ' ' && c != '\n' && c != '=' && c != '!') {
      buffer[i] = c;
      i++;
      c = getc(stream);
    }
    if (c == '!') {
      buffer[i] = c;
      i++;
    }
    buffer[i] = '\0';
    args[argc] = strdup(buffer);
    argc++;
    memset(&buffer[0], 0, sizeof(buffer));
    i = 0;
    if (c == '!')
      c = getc(stream);
    while (c == ' ' || c == '=')
      c = getc(stream);
    if (c == '\n') {
      args[argc] = NULL;
      sysCall(args);
      argc = 0;
      int j = 0;
      while (j <= (argc - 1)) {
        free(args[j]);
        args[j] = NULL;
        j++;
      }
    }
    if (c == '\n' && stream == stdin)
      return;
    while (c == '\n' || c == ' ')
      c = getc(stream);
    if (c == EOF && stream != stdin)
      return;
  }
}
```