user: Translate the below assembly code into C programming language:

```asm
<main>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xf8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xe8(%rsp)
  xor    %eax,%eax
  lea    D83(%rip),%rbp
  lea    D69(%rip),%r12
  lea    D49(%rip),%r14
  jmp    L258
L112:
  lea    0x80(%rsp),%rdi
  call   <atof@plt>
  call   <push@plt>
L51:
  lea    0x80(%rsp),%rdx
  lea    0x10(%rsp),%rdi
  mov    %ebx,%esi
  call   <getop@plt>
  mov    %eax,%ebx
  cmp    $0xffffffff,%eax
  je     L274
  lea    0x80(%rsp),%rdi
  call   <isnumfmt@plt>
  test   %rax,%rax
  jne    L112
  lea    0x80(%rsp),%rdi
  mov    %rbp,%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L212
  lea    0x80(%rsp),%rdi
  mov    %r12,%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L175
  lea    0x80(%rsp),%rdi
  mov    %r14,%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L148
  lea    0x80(%rsp),%rdi
  mov    %r13,%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L189
  lea    0x80(%rsp),%rdi
  lea    D99(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L19
  lea    0x80(%rsp),%rdi
  lea    D26(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L99
  lea    0x80(%rsp),%rdi
  lea    D28(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  je     L226
  lea    0x80(%rsp),%rdi
  lea    D29(%rip),%rsi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L36
  call   <pop@plt>
  call   <sin@plt>
  call   <push@plt>
  jmp    L51
L212:
  call   <pop@plt>
  movq   %xmm0,%r15
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %r15,%xmm2
  addsd  %xmm2,%xmm0
  call   <push@plt>
  jmp    L51
L175:
  call   <pop@plt>
  movq   %xmm0,%r15
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %r15,%xmm3
  mulsd  %xmm3,%xmm0
  call   <push@plt>
  jmp    L51
L148:
  call   <swap@plt>
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %xmm0,%r15
  mov    $0x0,%eax
  call   <pop@plt>
  movapd %xmm0,%xmm1
  movq   %r15,%xmm0
  subsd  %xmm1,%xmm0
  call   <push@plt>
  jmp    L51
L189:
  call   <pop@plt>
  movq   %xmm0,%r15
  ucomisd D15(%rip),%xmm0
  jp     L127
  jne    L127
  mov    $0x0,%eax
  call   <pop@plt>
  pxor   %xmm0,%xmm0
  call   <push@plt>
  lea    D79(%rip),%rdi
  call   <puts@plt>
  jmp    L51
L127:
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %r15,%xmm7
  divsd  %xmm7,%xmm0
  call   <push@plt>
  jmp    L51
L19:
  call   <pop@plt>
  movsd  %xmm0,0x8(%rsp)
  ucomisd D15(%rip),%xmm0
  jp     L222
  jne    L222
  mov    $0x0,%eax
  call   <pop@plt>
  pxor   %xmm0,%xmm0
  call   <push@plt>
  lea    D79(%rip),%rdi
  call   <puts@plt>
  jmp    L51
L222:
  mov    $0x0,%eax
  call   <pop@plt>
  cvttsd2si %xmm0,%eax
  cvttsd2si 0x8(%rsp),%ecx
  cltd
  idiv   %ecx
  pxor   %xmm0,%xmm0
  cvtsi2sd %edx,%xmm0
  call   <push@plt>
  jmp    L51
L99:
  call   <pop@plt>
  movq   %xmm0,%r15
  mov    $0x0,%eax
  call   <pop@plt>
  movq   %r15,%xmm1
  call   <pow@plt>
  call   <push@plt>
  jmp    L51
L226:
  call   <pop@plt>
  call   <exp@plt>
  call   <push@plt>
  jmp    L51
L36:
  lea    0x80(%rsp),%rsi
  lea    D90(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L51
L274:
  mov    $0x0,%eax
  call   <gettop@plt>
  lea    D13(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  call   <clearstack@plt>
L258:
  lea    0x10(%rsp),%rdi
  call   <getline2@plt>
  test   %rax,%rax
  je     L169
  mov    $0x0,%ebx
  lea    D74(%rip),%r13
  jmp    L51
L169:
  mov    0xe8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L275
  mov    $0x0,%eax
  add    $0xf8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L275:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D83
data_type: string
name: disassemble_data
arguments: tag: D69
data_type: string
name: disassemble_data
arguments: tag: D49
data_type: string
name: disassemble_data
arguments: tag: D99
data_type: string
name: disassemble_data
arguments: tag: D26
data_type: string
name: disassemble_data
arguments: tag: D28
data_type: string
name: disassemble_data
arguments: tag: D29
data_type: string
name: disassemble_data
arguments: tag: D15
data_type: f64
name: disassemble_data
arguments: tag: D79
data_type: string
name: disassemble_data
arguments: tag: D90
data_type: string
name: disassemble_data
arguments: tag: D13
data_type: string
name: disassemble_data
arguments: tag: D74
data_type: string

tool: D83: +

tool: D69: *

tool: D49: -

tool: D99: %

tool: D26: pow

tool: D28: exp

tool: D29: sin

tool: D15: 0

tool: D79: Error: divisor is 0

tool: D90: Error: unknown token %s


tool: D13: result: %g


tool: D74: /

assistant: ```c
int main(int argc, char *argv[]) {
  char line[100];
  char t[100];
  double tmp;
  while (getline2(line)) {
    int start = 0;
    while ((start = getop(line, start, t)) != -1) {
      if (isnumfmt(t)) {
        push(atof(t));
      } else if (!strcmp(t, "+")) {
        push(pop() + pop());
      } else if (!strcmp(t, "*")) {
        push(pop() * pop());
      } else if (!strcmp(t, "-")) {
        swap();
        push(pop() - pop());
      } else if (!strcmp(t, "/")) {
        tmp = pop();
        if (tmp != 0) {
          push(pop() / tmp);
        } else {
          pop();
          push(0.0);
          printf("Error: divisor is 0\n");
        }
      } else if (!strcmp(t, "%")) {
        tmp = pop();
        if (tmp != 0) {
          push((int)pop() % (int)tmp);
        } else {
          pop();
          push(0.0);
          printf("Error: divisor is 0\n");
        }
      } else if (!strcmp(t, "pow")) {
        double tmp = pop();
        push(pow(pop(), tmp));
      } else if (!strcmp(t, "exp")) {
        push(exp(pop()));
      } else if (!strcmp(t, "sin")) {
        push(sin(pop()));
      } else {
        printf("Error: unknown token %s\n", t);
      }
    }
    printf("result: %g\n", gettop());
    clearstack();
  }
  return 0;
}
```