user: Please show me the C implementation that matches the assembly code listed below:

```asm
<IsPunct>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  mov    %esi,-0x8(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jne    L266
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <ispunct@plt>
  jmp    L390
L266:
  cmpl   $0x1,-0x4(%rbp)
  jne    L83
  cmpl   $0x24,-0x8(%rbp)
  je     L525
  cmpl   $0x2b,-0x8(%rbp)
  je     L525
  cmpl   $0x5e,-0x8(%rbp)
  je     L525
  cmpl   $0x60,-0x8(%rbp)
  je     L525
  cmpl   $0x7c,-0x8(%rbp)
  je     L525
  cmpl   $0x7e,-0x8(%rbp)
  jne    L161
L525:
  mov    $0x1,%eax
  jmp    L390
L161:
  cmpl   $0x3b,-0x8(%rbp)
  jle    L83
  cmpl   $0x3e,-0x8(%rbp)
  jg     L83
  mov    $0x1,%eax
  jmp    L390
L83:
  cmpl   $0x20,-0x8(%rbp)
  jle    L488
  cmpl   $0x2f,-0x8(%rbp)
  jg     L488
  mov    $0x1,%eax
  jmp    L390
L488:
  cmpl   $0x39,-0x8(%rbp)
  jle    L163
  cmpl   $0x40,-0x8(%rbp)
  jg     L163
  mov    $0x1,%eax
  jmp    L390
L163:
  cmpl   $0x5a,-0x8(%rbp)
  jle    L895
  cmpl   $0x60,-0x8(%rbp)
  jg     L895
  mov    $0x1,%eax
  jmp    L390
L895:
  cmpl   $0x7a,-0x8(%rbp)
  jle    L72
  cmpl   $0x7e,-0x8(%rbp)
  jg     L72
  mov    $0x1,%eax
  jmp    L390
L72:
  cmpl   $0x12,-0x4(%rbp)
  ja     L637
  mov    -0x4(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D8(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D8(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  cmpl   $0xad,-0x8(%rbp)
  jne    L1045
  mov    $0x1,%eax
  jmp    L390
L1045:
  cmpl   $0xa1,-0x8(%rbp)
  jne    L452
  mov    $0x1,%eax
  jmp    L390
L452:
  cmpl   $0xab,-0x8(%rbp)
  jne    L897
  mov    $0x1,%eax
  jmp    L390
L897:
  cmpl   $0xb7,-0x8(%rbp)
  jne    L781
  mov    $0x1,%eax
  jmp    L390
L781:
  cmpl   $0xbb,-0x8(%rbp)
  jne    L1083
  mov    $0x1,%eax
  jmp    L390
L1083:
  cmpl   $0xbf,-0x8(%rbp)
  jne    L305
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xad,-0x8(%rbp)
  jne    L505
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xad,-0x8(%rbp)
  jne    L580
  mov    $0x1,%eax
  jmp    L390
L580:
  cmpl   $0xb7,-0x8(%rbp)
  jne    L98
  mov    $0x1,%eax
  jmp    L390
L98:
  cmpl   $0xbd,-0x8(%rbp)
  jne    L915
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xac,-0x8(%rbp)
  jne    L678
  mov    $0x1,%eax
  jmp    L390
L678:
  cmpl   $0xad,-0x8(%rbp)
  jne    L451
  mov    $0x1,%eax
  jmp    L390
L451:
  cmpl   $0xbb,-0x8(%rbp)
  jne    L1037
  mov    $0x1,%eax
  jmp    L390
L1037:
  cmpl   $0xbf,-0x8(%rbp)
  jne    L776
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xa1,-0x8(%rbp)
  je     L889
  cmpl   $0xa2,-0x8(%rbp)
  jne    L708
L889:
  mov    $0x1,%eax
  jmp    L390
L708:
  cmpl   $0xab,-0x8(%rbp)
  jne    L657
  mov    $0x1,%eax
  jmp    L390
L657:
  cmpl   $0xaf,-0x8(%rbp)
  jne    L27
  mov    $0x1,%eax
  jmp    L390
L27:
  cmpl   $0xad,-0x8(%rbp)
  jne    L585
  mov    $0x1,%eax
  jmp    L390
L585:
  cmpl   $0xb7,-0x8(%rbp)
  je     L439
  cmpl   $0xbb,-0x8(%rbp)
  jne    L389
L439:
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xab,-0x8(%rbp)
  jne    L893
  mov    $0x1,%eax
  jmp    L390
L893:
  cmpl   $0xad,-0x8(%rbp)
  jne    L417
  mov    $0x1,%eax
  jmp    L390
L417:
  cmpl   $0xb7,-0x8(%rbp)
  jne    L1043
  mov    $0x1,%eax
  jmp    L390
L1043:
  cmpl   $0xbb,-0x8(%rbp)
  jne    L250
  mov    $0x1,%eax
  jmp    L390
L250:
  cmpl   $0xdf,-0x8(%rbp)
  jne    L484
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xa1,-0x8(%rbp)
  je     L198
  cmpl   $0xa5,-0x8(%rbp)
  jne    L771
L198:
  mov    $0x1,%eax
  jmp    L390
L771:
  cmpl   $0xab,-0x8(%rbp)
  je     L148
  cmpl   $0xad,-0x8(%rbp)
  jne    L936
L148:
  mov    $0x1,%eax
  jmp    L390
L936:
  cmpl   $0xb4,-0x8(%rbp)
  je     L310
  cmpl   $0xb7,-0x8(%rbp)
  jne    L490
L310:
  mov    $0x1,%eax
  jmp    L390
L490:
  cmpl   $0xbb,-0x8(%rbp)
  jne    L99
  mov    $0x1,%eax
  jmp    L390
L99:
  cmpl   $0xff,-0x8(%rbp)
  jne    L1003
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0xa5,-0x8(%rbp)
  jne    L834
  mov    $0x1,%eax
  jmp    L390
L834:
  cmpl   $0xab,-0x8(%rbp)
  jne    L826
  mov    $0x1,%eax
  jmp    L390
L826:
  cmpl   $0xad,-0x8(%rbp)
  jne    L130
  mov    $0x1,%eax
  jmp    L390
L130:
  cmpl   $0xb5,-0x8(%rbp)
  jne    L1056
  mov    $0x1,%eax
  jmp    L390
L1056:
  cmpl   $0xb7,-0x8(%rbp)
  jne    L867
  mov    $0x1,%eax
  jmp    L390
L867:
  cmpl   $0xbb,-0x8(%rbp)
  jne    L619
  mov    $0x1,%eax
  jmp    L390
  cmpl   $0x9e,-0x8(%rbp)
  jne    L699
  mov    $0x1,%eax
  jmp    L390
L637:
  mov    $0xffffffff,%edi
  call   <exit@plt>
  jmp    L991
  nop
  jmp    L991
L305:
  nop
  jmp    L991
L505:
  nop
  jmp    L991
L915:
  nop
  jmp    L991
L776:
  nop
  jmp    L991
L389:
  nop
  jmp    L991
L484:
  nop
  jmp    L991
L1003:
  nop
  jmp    L991
L619:
  nop
  jmp    L991
L699:
  nop
L991:
  mov    $0x0,%eax
L390:
  leave
  ret
```

assistant: ```c
int IsPunct(int enc, int c) {
  if (enc == 0)
    return ispunct(c);
  if (enc == 1) {
    if (c == 0x24 || c == 0x2b || c == 0x5e || c == 0x60 || c == 0x7c || c == 0x7e)
      return 1;
    if (c >= 0x3c && c <= 0x3e)
      return 1;
  }
  if (c >= 0x21 && c <= 0x2f)
    return 1;
  if (c >= 0x3a && c <= 0x40)
    return 1;
  if (c >= 0x5b && c <= 0x60)
    return 1;
  if (c >= 0x7b && c <= 0x7e)
    return 1;
  switch (enc) {
  case 2:
  case 10:
  case 15:
    if (c == 0xad)
      return 1;
  case 1:
    if (c == 0xa1)
      return 1;
    if (c == 0xab)
      return 1;
    if (c == 0xb7)
      return 1;
    if (c == 0xbb)
      return 1;
    if (c == 0xbf)
      return 1;
    break;
  case 3:
  case 5:
  case 6:
  case 14:
    if (c == 0xad)
      return 1;
    break;
  case 4:
  case 11:
    if (c == 0xad)
      return 1;
    if (c == 0xb7)
      return 1;
    if (c == 0xbd)
      return 1;
    break;
  case 7:
    if (c == 0xac)
      return 1;
    if (c == 0xad)
      return 1;
    if (c == 0xbb)
      return 1;
    if (c == 0xbf)
      return 1;
    break;
  case 8:
    if (c == 0xa1 || c == 0xa2)
      return 1;
    if (c == 0xab)
      return 1;
    if (c == 0xaf)
      return 1;
    if (c == 0xad)
      return 1;
    if (c == 0xb7 || c == 0xbb)
      return 1;
    break;
  case 9:
    if (c == 0xab)
      return 1;
    if (c == 0xad)
      return 1;
    if (c == 0xb7)
      return 1;
    if (c == 0xbb)
      return 1;
    if (c == 0xdf)
      return 1;
    break;
  case 13:
    if (c == 0xa1 || c == 0xa5)
      return 1;
    if (c == 0xab || c == 0xad)
      return 1;
    if (c == 0xb4 || c == 0xb7)
      return 1;
    if (c == 0xbb)
      return 1;
    if (c == 0xff)
      return 1;
    break;
  case 16:
    if (c == 0xa5)
      return 1;
    if (c == 0xab)
      return 1;
    if (c == 0xad)
      return 1;
    if (c == 0xb5)
      return 1;
    if (c == 0xb7)
      return 1;
    if (c == 0xbb)
      return 1;
    break;
  case 18:
    if (c == 0x9e)
      return 1;
    break;
  case 12:
  case 17:
    break;
  default:
    exit(-1);
  }
  return 0;
}
```