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

```asm
<Barcode_upc_verify>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x58(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x40(%rbp)
  mov    -0x58(%rbp),%rax
  mov    $0x20,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x38(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L200
  mov    -0x38(%rbp),%rax
  sub    -0x58(%rbp),%rax
  mov    %eax,-0x44(%rbp)
  mov    -0x40(%rbp),%eax
  sub    -0x44(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x3c(%rbp)
  cmpl   $0x2,-0x3c(%rbp)
  je     L39
  cmpl   $0x5,-0x3c(%rbp)
  je     L39
  mov    $0xffffffff,%eax
  jmp    L36
L39:
  mov    -0x44(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x48(%rbp)
  jmp    L132
L40:
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  jne    L199
  mov    $0xffffffff,%eax
  jmp    L36
L199:
  addl   $0x1,-0x48(%rbp)
L132:
  mov    -0x48(%rbp),%eax
  cmp    -0x40(%rbp),%eax
  jl     L40
  jmp    L118
L200:
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x44(%rbp)
L118:
  movl   $0x0,-0x48(%rbp)
  jmp    L234
L210:
  mov    -0x48(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  jne    L64
  mov    $0xffffffff,%eax
  jmp    L36
L64:
  addl   $0x1,-0x48(%rbp)
L234:
  mov    -0x48(%rbp),%eax
  cmp    -0x44(%rbp),%eax
  jl     L210
  cmpl   $0xc,-0x44(%rbp)
  je     L8
  cmpl   $0xc,-0x44(%rbp)
  jg     L30
  cmpl   $0x8,-0x44(%rbp)
  jg     L267
  cmpl   $0x6,-0x44(%rbp)
  jge    L27
  jmp    L30
L267:
  cmpl   $0xb,-0x44(%rbp)
  je     L212
  jmp    L30
L27:
  mov    -0x44(%rbp),%edx
  mov    -0x58(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  mov    -0x44(%rbp),%eax
  cltq
  movb   $0x0,-0x30(%rbp,%rax,1)
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <upc_e_to_a@plt>
  test   %eax,%eax
  jne    L99
  mov    $0xffffffff,%eax
  jmp    L36
L8:
  mov    -0x58(%rbp),%rcx
  lea    -0x30(%rbp),%rax
  mov    $0xb,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movb   $0x0,-0x25(%rbp)
  mov    -0x58(%rbp),%rax
  add    $0xb,%rax
  movzbl (%rax),%eax
  movzbl %al,%ebx
  lea    -0x30(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <ean_make_checksum@plt>
  add    $0x30,%eax
  cmp    %eax,%ebx
  je     L212
  mov    $0xffffffff,%eax
  jmp    L36
L30:
  mov    $0xffffffff,%eax
  jmp    L36
L212:
  nop
  jmp    L115
L99:
  nop
L115:
  mov    $0x0,%eax
L36:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L21
  call   <__stack_chk_fail@plt>
L21:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int Barcode_upc_verify(unsigned char *text) {
  int i, len0, len, addon;
  unsigned char tmp[24], *spc;
  len = strlen(text);
  spc = strchr(text, ' ');
  if (spc) {
    len0 = spc - text;
    addon = len - len0 - 1;
    if (addon != 2 && addon != 5)
      return -1;
    for (i = len0 + 1; i < len; i++)
      if (!isdigit(text[i]))
        return -1;
  } else
    len0 = len;
  for (i = 0; i < len0; i++)
    if (!isdigit(text[i]))
      return -1;
  switch (len0) {
  case 6:
  case 7:
  case 8:
    strncpy(tmp, text, len0);
    tmp[len0] = '\0';
    if (!upc_e_to_a(tmp))
      return -1;
    break;
  case 12:
    strncpy(tmp, text, 11);
    tmp[11] = '\0';
    if (text[11] != (ean_make_checksum(tmp, 0) + '0'))
      return -1;
  case 11:
    break;
  default:
    return -1;
  }
  return 0;
}
```