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

```asm
<nextch>:
  endbr64
  cmp    $0x1,%esi
  ja     L90
  test   %rdi,%rdi
  je     L193
  movslq %esi,%rsi
  lea    D64(%rip),%rax
  mov    $0x1,%r8d
  mov    %rdi,(%rax,%rsi,8)
  lea    D27(%rip),%rax
  movl   $0x0,(%rax,%rsi,4)
L130:
  mov    %r8d,%eax
  ret
  nopl   0x0(%rax,%rax,1)
L193:
  movslq %esi,%r9
  lea    D64(%rip),%rax
  mov    (%rax,%r9,8),%rdi
  test   %rdi,%rdi
  je     L90
  lea    D27(%rip),%r10
  mov    (%r10,%r9,4),%ecx
  test   %ecx,%ecx
  je     L118
  movslq %ecx,%rax
  movzbl (%rdi,%rax,1),%r8d
  cmp    $0x2d,%r8b
  je     L15
L42:
  cmp    $0x5c,%r8b
  je     L76
  test   %r8b,%r8b
  je     L142
L218:
  add    $0x1,%ecx
  lea    D25(%rip),%rax
  mov    %r8b,(%rax,%r9,1)
  movslq %ecx,%rax
  mov    %ecx,(%r10,%r9,4)
  cmpb   $0x2d,(%rdi,%rax,1)
  jne    L130
  push   %rbx
  movsbl %r8b,%r11d
  lea    D8(%rip),%rbx
  cs nopw 0x0(%rax,%rax,1)
L9:
  lea    0x1(%rcx),%edx
  mov    $0x1,%esi
  movslq %edx,%rdx
  movsbl (%rdi,%rdx,1),%eax
  cmp    $0x5c,%al
  jne    L239
  lea    0x2(%rcx),%edx
  mov    $0x2,%esi
  movslq %edx,%rdx
  movsbl (%rdi,%rdx,1),%eax
L239:
  test   %al,%al
  je     L133
  cmpb   $0x2d,0x1(%rdi,%rdx,1)
  je     L110
  sub    %r11d,%eax
  test   %eax,%eax
  je     L227
  lea    D8(%rip),%rax
  jg     L214
  movl   $0xffffffff,(%rax,%r9,4)
L113:
  mov    %r8d,%eax
  pop    %rbx
  ret
  xchg   %ax,%ax
L118:
  cmpb   $0x2d,(%rdi)
  je     L90
  movzbl (%rdi),%r8d
  jmp    L42
  nopw   0x0(%rax,%rax,1)
L133:
  xor    %r8d,%r8d
  pop    %rbx
  mov    %r8d,%eax
  ret
L227:
  movl   $0x0,(%rbx,%r9,4)
  add    $0x2,%ecx
L109:
  movslq %ecx,%rax
  mov    %ecx,(%r10,%r9,4)
  cmpb   $0x2d,(%rdi,%rax,1)
  je     L9
  jmp    L113
  xchg   %ax,%ax
L110:
  lea    0x1(%rsi,%rcx,1),%ecx
  jmp    L109
  cs nopw 0x0(%rax,%rax,1)
L15:
  lea    D25(%rip),%rdx
  lea    D8(%rip),%rsi
  movzbl (%rdx,%r9,1),%r8d
  add    (%rsi,%r9,4),%r8b
  mov    %r8b,(%rdx,%r9,1)
  cmp    0x1(%rdi,%rax,1),%r8b
  jne    L130
  add    $0x2,%ecx
  mov    %ecx,(%r10,%r9,4)
  jmp    L130
  nopw   0x0(%rax,%rax,1)
L76:
  add    $0x1,%ecx
  movslq %ecx,%rax
  movzbl (%rdi,%rax,1),%r8d
  jmp    L218
  nopl   0x0(%rax,%rax,1)
L142:
  movzbl D45(%rip),%r8d
  test   %esi,%esi
  jne    L130
L90:
  xor    %r8d,%r8d
  jmp    L130
  nopl   0x0(%rax,%rax,1)
L214:
  movl   $0x1,(%rax,%r9,4)
  jmp    L113
```

assistant: ```c
char nextch(str, who)
char *str;
int who;
{
  static char *what[2] = {0, 0};
  static char last[2] = {0, 0};
  static int increment[2];
  static int pos[2];
  if (who < 0 || who > 1) {
    return 0;
  }
  if (str) {
    what[who] = str;
    pos[who] = 0;
    return 1;
  } else if (!what[who]) {
    return 0;
  }
  if (!pos[who] && what[who][0] == '-') {
    return 0;
  }
  switch (what[who][pos[who]]) {
  case '-': {
    last[who] += increment[who];
    if (what[who][pos[who] + 1] == last[who]) {
      pos[who] += 2;
    }
    return last[who];
  }
  case '\0': {
    if (who) {
      return last[1];
    }
    return 0;
  }
  case '\\': {
    pos[who]++;
  }
  default: {
    last[who] = what[who][pos[who]++];
    while (what[who][pos[who]] == '-') {
      int inc = 1;
      if (what[who][pos[who] + inc] == '\\') {
        inc++;
      }
      if (!what[who][pos[who] + inc]) {
        return 0;
      }
      if (what[who][pos[who] + inc + 1] == '-') {
        pos[who] += inc + 1;
        continue;
      }
      increment[who] = what[who][pos[who] + inc] - last[who];
      if (!increment[who]) {
        pos[who] += 2;
        continue;
      }
      if (increment[who] > 0) {
        increment[who] = 1;
        break;
      } else if (increment[who] < 0) {
        increment[who] = -1;
        break;
      }
    }
    return last[who];
  }
  }
}
```