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

```asm
<do_state_29>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,%eax
  mov    %rsi,-0x10(%rbp)
  mov    %rdx,-0x18(%rbp)
  mov    %rcx,-0x20(%rbp)
  mov    %al,-0x4(%rbp)
  cmpb   $0x2f,-0x4(%rbp)
  jle    L36
  cmpb   $0x37,-0x4(%rbp)
  jg     L36
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x21,(%rax)
  mov    $0x0,%eax
  jmp    L90
L36:
  movsbl -0x4(%rbp),%eax
  sub    $0x2e,%eax
  cmp    $0x4a,%eax
  ja     L35
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D19(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D19(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x1e,(%rax)
  mov    $0x0,%eax
  jmp    L90
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x20,(%rax)
  mov    $0x0,%eax
  jmp    L90
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x1a,(%rax)
  mov    $0x0,%eax
  jmp    L90
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x19,(%rax)
  mov    $0x0,%eax
  jmp    L90
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x22,(%rax)
  mov    $0x0,%eax
  jmp    L90
  mov    -0x20(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%ecx
  mov    -0x20(%rbp),%rdx
  mov    %ecx,(%rdx)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x4(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%rax
  movl   $0x18,(%rax)
  mov    $0x0,%eax
  jmp    L90
L35:
  mov    $0x1,%eax
L90:
  pop    %rbp
  ret
```

assistant: ```c
int do_state_29(char c, int *state, char *word, int *length) {
  if (c >= '0' && c <= '7') {
    word[(*length)++] = c;
    *state = 33;
    return 0;
  }
  switch (c) {
  case 'x':
  case 'X':
    word[(*length)++] = c;
    *state = 30;
    return 0;
  case 'l':
  case 'L':
    word[(*length)++] = c;
    *state = 32;
    return 0;
  case 'e':
  case 'E':
    word[(*length)++] = c;
    *state = 26;
    return 0;
  case 'f':
  case 'F':
  case 'd':
  case 'D':
    word[(*length)++] = c;
    *state = 25;
    return 0;
  case '8':
  case '9':
    word[(*length)++] = c;
    *state = 34;
    return 0;
  case '.':
    word[(*length)++] = c;
    *state = 24;
    return 0;
  default:
    return 1;
  }
}
```