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

```asm
<ResolveDouble>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edi,%eax
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %al,-0x24(%rbp)
  movb   $0xff,-0x11(%rbp)
  movsbl -0x24(%rbp),%eax
  sub    $0x21,%eax
  cmp    $0x5b,%eax
  ja     L53
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D1(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D1(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movq   $0x1,-0x8(%rbp)
  movq   $0x1,-0x10(%rbp)
  jmp    L23
L117:
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x8(%rbp),%rdx
  imul   %rdx,%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x10(%rbp)
L23:
  mov    -0x10(%rbp),%rax
  cmp    -0x38(%rbp),%rax
  jle    L117
  mov    -0x30(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x38(%rbp),%rdx
  mov    %edx,%ecx
  shl    %cl,%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  mov    -0x38(%rbp),%rdx
  mov    %edx,%ecx
  sar    %cl,%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  cqto
  idivq  -0x38(%rbp)
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x38(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  sub    -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  and    -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  or     -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  xor    -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  cqto
  idivq  -0x38(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L51
L53:
  movb   $0x0,-0x11(%rbp)
  nop
L51:
  movzbl -0x11(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
char ResolveDouble(char Token, long int *Value, long int Operand) {
  long int Count;
  long int This;
  char Result;
  Result = (char)~0;
  switch (Token) {
  case '!':
    This = 1;
    for (Count = 1; Count <= Operand; Count++)
      This *= *Value;
    *Value = This;
    break;
  case '<':
    *Value <<= Operand;
    break;
  case '>':
    *Value >>= Operand;
    break;
  case '*':
    *Value *= Operand;
    break;
  case '/':
  case '\\':
    *Value /= Operand;
    break;
  case '+':
    *Value += Operand;
    break;
  case '-':
    *Value -= Operand;
    break;
  case '&':
    *Value &= Operand;
    break;
  case '|':
    *Value |= Operand;
    break;
  case '^':
    *Value ^= Operand;
    break;
  case '%':
    *Value %= Operand;
    break;
  default:
    Result = (char)0;
    break;
  }
  return (Result);
}
```