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

```asm
<next_word>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <skip_whitespace@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <peek_char@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x7d,-0x14(%rbp)
  je     L295
  cmpl   $0x7d,-0x14(%rbp)
  jg     L193
  cmpl   $0x7b,-0x14(%rbp)
  je     L295
  cmpl   $0x7b,-0x14(%rbp)
  jg     L193
  cmpl   $0x3b,-0x14(%rbp)
  je     L295
  cmpl   $0x3b,-0x14(%rbp)
  jg     L193
  cmpl   $0x2c,-0x14(%rbp)
  je     L295
  cmpl   $0x2c,-0x14(%rbp)
  jg     L193
  cmpl   $0x0,-0x14(%rbp)
  je     L148
  cmpl   $0x0,-0x14(%rbp)
  js     L193
  mov    -0x14(%rbp),%eax
  sub    $0x28,%eax
  cmp    $0x1,%eax
  ja     L193
L295:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <next_char@plt>
  mov    -0x14(%rbp),%edx
  mov    -0x38(%rbp),%rsi
  mov    -0x30(%rbp),%rax
  mov    %edx,%ecx
  lea    D9(%rip),%rdx
  mov    %rax,%rdi
  call   <snprintf@plt>
  mov    $0x1,%eax
  jmp    L263
L148:
  mov    $0x0,%eax
  jmp    L263
L193:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <next_char@plt>
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    -0x14(%rbp),%edx
  mov    %dl,(%rax)
  subq   $0x1,-0x38(%rbp)
  jmp    L281
L135:
  cmpl   $0x2f,-0x14(%rbp)
  jle    L108
  cmpl   $0x39,-0x14(%rbp)
  jg     L108
  mov    $0x1,%eax
  jmp    L299
L108:
  mov    $0x0,%eax
L299:
  mov    %eax,-0x10(%rbp)
  cmpl   $0x60,-0x14(%rbp)
  jle    L91
  cmpl   $0x7a,-0x14(%rbp)
  jg     L91
  mov    $0x1,%eax
  jmp    L248
L91:
  mov    $0x0,%eax
L248:
  mov    %eax,-0xc(%rbp)
  cmpl   $0x40,-0x14(%rbp)
  jle    L71
  cmpl   $0x5a,-0x14(%rbp)
  jg     L71
  mov    $0x1,%eax
  jmp    L235
L71:
  mov    $0x0,%eax
L235:
  mov    %eax,-0x8(%rbp)
  cmpl   $0x5f,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x10(%rbp)
  jne    L61
  cmpl   $0x0,-0xc(%rbp)
  jne    L61
  cmpl   $0x0,-0x8(%rbp)
  jne    L61
  cmpl   $0x0,-0x4(%rbp)
  je     L124
L61:
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <next_char@plt>
  mov    %eax,%ecx
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  subq   $0x1,-0x38(%rbp)
L281:
  cmpq   $0x1,-0x38(%rbp)
  jbe    L161
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <peek_char@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jne    L135
  jmp    L161
L124:
  nop
L161:
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movb   $0x0,(%rax)
  subq   $0x1,-0x38(%rbp)
  mov    $0x1,%eax
L263:
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D9
type_infered: string

tool: D9: %c

assistant: ```c
int next_word(struct stream *s, char *buffer, size_t size) {
  skip_whitespace(s);
  int ch = peek_char(s);
  switch (ch) {
  case '(':
  case ')':
  case '{':
  case '}':
  case ';':
  case ',':
    next_char(s);
    snprintf(buffer, size, "%c", ch);
    return 1;
  case 0:
    return 0;
  }
  next_char(s);
  *(buffer++) = ch;
  size--;
  while ((size > 1) && (ch = peek_char(s))) {
    int num = ch >= '0' && ch <= '9';
    int lowal = ch >= 'a' && ch <= 'z';
    int upal = ch >= 'A' && ch <= 'Z';
    int under = ch == '_';
    if (!num && !lowal && !upal && !under)
      break;
    *(buffer++) = next_char(s);
    size--;
  }
  *(buffer++) = '\0';
  size--;
  return 1;
}
```