user: Converte this assembly snippet into its equivalent C code:

```asm
<heir10>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%r12
  lea    D86(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  test   %eax,%eax
  je     L183
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  mov    %eax,%ebx
  test   %eax,%eax
  je     L368
  cmpl   $0x0,0x4(%r12)
  jne    L629
L226:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  movslq (%r12),%rax
  cmpb   $0x3,0x9(%rax)
  jne    L243
  cmpb   $0x2,0xa(%rax)
  je     L329
L243:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  mov    $0x0,%ebx
L120:
  mov    %ebx,%eax
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L368:
  mov    $0x0,%eax
  call   <needlval@plt>
  jmp    L120
L629:
  mov    $0x0,%eax
  call   <zpush@plt>
  jmp    L226
L329:
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  jmp    L243
L183:
  mov    %eax,%ebx
  lea    D23(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  je     L417
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  mov    %eax,%ebp
  test   %eax,%eax
  je     L622
  cmpl   $0x0,0x4(%r12)
  jne    L434
L3:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  movslq (%r12),%rax
  cmpb   $0x3,0x9(%rax)
  jne    L584
  cmpb   $0x2,0xa(%rax)
  je     L278
L584:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  jmp    L120
L622:
  mov    $0x0,%eax
  call   <needlval@plt>
  mov    %ebp,%ebx
  jmp    L120
L434:
  mov    $0x0,%eax
  call   <zpush@plt>
  jmp    L3
L278:
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  jmp    L584
L417:
  lea    D9(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  test   %eax,%eax
  jne    L261
  lea    D71(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  jne    L51
  lea    D114(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  jne    L326
  lea    D24(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%ebx
  test   %eax,%eax
  jne    L236
  lea    D37(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%ebp
  test   %eax,%eax
  je     L341
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  mov    %eax,%ebp
  test   %eax,%eax
  je     L388
  mov    0x4(%r12),%ebp
  test   %ebp,%ebp
  jne    L120
  mov    $0x0,%eax
  call   <immed@plt>
  lea    D17(%rip),%rdi
  mov    $0x0,%eax
  call   <ot@plt>
  movslq (%r12),%rbx
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <outasm@plt>
  lea    D18(%rip),%rdi
  mov    $0x0,%eax
  call   <outasm@plt>
  mov    $0x0,%eax
  call   <nl@plt>
  movsbl 0xa(%rbx),%eax
  mov    %eax,0x4(%r12)
  mov    %ebp,%ebx
  jmp    L120
L261:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  test   %eax,%eax
  jne    L633
L71:
  mov    $0x0,%eax
  call   <neg@plt>
  mov    %ebp,%ebx
  jmp    L120
L633:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  jmp    L71
L51:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  test   %eax,%eax
  jne    L587
L12:
  movl   $0x2,0x4(%r12)
  mov    (%r12),%eax
  test   %eax,%eax
  je     L383
  cltq
  movsbl 0xa(%rax),%eax
  mov    %eax,0x4(%r12)
L383:
  movl   $0x0,(%r12)
  mov    $0x1,%ebx
  jmp    L120
L587:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  jmp    L12
L326:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  test   %eax,%eax
  jne    L531
L398:
  mov    $0x0,%eax
  call   <lnot@plt>
  jmp    L120
L531:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  jmp    L398
L236:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir10>
  test   %eax,%eax
  jne    L94
L347:
  mov    $0x0,%eax
  call   <bnot@plt>
  mov    %ebp,%ebx
  jmp    L120
L94:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  jmp    L347
L388:
  lea    D27(%rip),%rdi
  mov    $0x0,%eax
  call   <error@plt>
  mov    %ebp,%ebx
  jmp    L120
L341:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <heir11@plt>
  mov    %eax,%ebx
  lea    D86(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  mov    %eax,%r13d
  test   %eax,%eax
  je     L524
  test   %ebx,%ebx
  je     L155
  cmpl   $0x0,0x4(%r12)
  jne    L118
L451:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  mov    (%r12),%ebx
  test   %ebx,%ebx
  je     L578
  movslq %ebx,%rbx
  cmpb   $0x3,0x9(%rbx)
  jne    L495
  cmpb   $0x2,0xa(%rbx)
  je     L440
L495:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  cmpb   $0x3,0x9(%rbx)
  jne    L205
  cmpb   $0x2,0xa(%rbx)
  je     L430
L205:
  mov    %ebp,%ebx
  jmp    L120
L155:
  mov    $0x0,%eax
  call   <needlval@plt>
  jmp    L120
L118:
  mov    $0x0,%eax
  call   <zpush@plt>
  jmp    L451
L440:
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  jmp    L495
L430:
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  mov    %ebp,%ebx
  jmp    L120
L524:
  lea    D23(%rip),%rdi
  mov    $0x0,%eax
  call   <match@plt>
  test   %eax,%eax
  je     L120
  test   %ebx,%ebx
  je     L632
  cmpl   $0x0,0x4(%r12)
  jne    L619
L514:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <rvalue@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  mov    (%r12),%ebx
  test   %ebx,%ebx
  je     L618
  movslq %ebx,%rbx
  cmpb   $0x3,0x9(%rbx)
  jne    L149
  cmpb   $0x2,0xa(%rbx)
  je     L655
L149:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  cmpb   $0x3,0x9(%rbx)
  jne    L624
  cmpb   $0x2,0xa(%rbx)
  je     L522
L624:
  mov    %r13d,%ebx
  jmp    L120
L632:
  mov    $0x0,%eax
  call   <needlval@plt>
  jmp    L120
L619:
  mov    $0x0,%eax
  call   <zpush@plt>
  jmp    L514
L655:
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  jmp    L149
L522:
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  mov    %r13d,%ebx
  jmp    L120
L578:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  mov    $0x0,%eax
  call   <dec@plt>
  jmp    L120
L618:
  mov    %r12,%rdi
  mov    $0x0,%eax
  call   <store@plt>
  mov    $0x0,%eax
  call   <inc@plt>
  jmp    L120
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D86
datatype: string
name: extract_symbolic_data
arguments: data_tag: D23
datatype: string
name: extract_symbolic_data
arguments: data_tag: D9
datatype: string
name: extract_symbolic_data
arguments: data_tag: D71
datatype: string
name: extract_symbolic_data
arguments: data_tag: D114
datatype: string
name: extract_symbolic_data
arguments: data_tag: D24
datatype: string
name: extract_symbolic_data
arguments: data_tag: D37
datatype: string
name: extract_symbolic_data
arguments: data_tag: D17
datatype: string
name: extract_symbolic_data
arguments: data_tag: D18
datatype: string
name: extract_symbolic_data
arguments: data_tag: D27
datatype: string

tool: D86: ++

tool: D23: --

tool: D9: -

tool: D71: *

tool: D114: !

tool: D24: ~

tool: D37: &

tool: D17: $

tool: D18: , %eax

tool: D27: illegal address

assistant: ```c
heir10(lval) int lval[];
{
  int k;
  char *ptr;
  if (match("++")) {
    if ((k = heir10(lval)) == 0) {
      needlval();
      return 0;
    }
    if (lval[1])
      zpush();
    rvalue(lval);
    inc();
    ptr = lval[0];
    if ((ptr[9] == 3) & (ptr[10] == 2)) {
      inc();
      inc();
      inc();
    }
    store(lval);
    return 0;
  } else if (match("--")) {
    if ((k = heir10(lval)) == 0) {
      needlval();
      return 0;
    }
    if (lval[1])
      zpush();
    rvalue(lval);
    dec();
    ptr = lval[0];
    if ((ptr[9] == 3) & (ptr[10] == 2)) {
      dec();
      dec();
      dec();
    }
    store(lval);
    return 0;
  } else if (match("-")) {
    k = heir10(lval);
    if (k)
      rvalue(lval);
    neg();
    return 0;
  } else if (match("*")) {
    k = heir10(lval);
    if (k)
      rvalue(lval);
    lval[1] = 2;
    if (ptr = lval[0])
      lval[1] = ptr[10];
    lval[0] = 0;
    return 1;
  } else if (match("!")) {
    k = heir10(lval);
    if (k)
      rvalue(lval);
    lnot();
    return 0;
  } else if (match("~")) {
    k = heir10(lval);
    if (k)
      rvalue(lval);
    bnot();
    return 0;
  } else if (match("&")) {
    k = heir10(lval);
    if (k == 0) {
      error("illegal address");
      return 0;
    } else if (lval[1])
      return 0;
    else {
      immed();
      ot("$");
      outasm(ptr = lval[0]);
      outasm(", %eax");
      nl();
      lval[1] = ptr[10];
      return 0;
    }
  } else {
    k = heir11(lval);
    if (match("++")) {
      if (k == 0) {
        needlval();
        return 0;
      }
      if (lval[1])
        zpush();
      rvalue(lval);
      inc();
      ptr = lval[0];
      if (ptr)
        if ((ptr[9] == 3) & (ptr[10] == 2)) {
          inc();
          inc();
          inc();
        }
      store(lval);
      dec();
      if (ptr)
        if ((ptr[9] == 3) & (ptr[10] == 2)) {
          dec();
          dec();
          dec();
        }
      return 0;
    } else if (match("--")) {
      if (k == 0) {
        needlval();
        return 0;
      }
      if (lval[1])
        zpush();
      rvalue(lval);
      dec();
      ptr = lval[0];
      if (ptr)
        if ((ptr[9] == 3) & (ptr[10] == 2)) {
          dec();
          dec();
          dec();
        }
      store(lval);
      inc();
      if (ptr)
        if ((ptr[9] == 3) & (ptr[10] == 2)) {
          inc();
          inc();
          inc();
        }
      return 0;
    } else
      return k;
  }
}
```