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

```asm
<ASN1_UTCTIME_cmp_time_t>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x30,%rsp
  mov    (%rdi),%rdx
  mov    %esi,0xc(%rsp)
  movzbl 0xc(%rdx),%ecx
  mov    %fs:0x28,%rax
  mov    %rax,0x28(%rsp)
  xor    %eax,%eax
  cmp    $0x5a,%cl
  je     L10
  movsbl 0xd(%rdx),%eax
  lea    -0xf0(%rax,%rax,4),%esi
  movsbl 0xe(%rdx),%eax
  lea    -0x30(%rax,%rsi,2),%eax
  movsbl 0xf(%rdx),%esi
  movsbl 0x10(%rdx),%edx
  imul   $0x3c,%eax,%eax
  lea    -0xf0(%rsi,%rsi,4),%esi
  lea    -0x30(%rdx,%rsi,2),%edx
  add    %edx,%eax
  cmp    $0x2d,%cl
  je     L64
  mov    %eax,%edx
  shl    $0x4,%edx
  sub    %edx,%eax
  shl    $0x2,%eax
L10:
  lea    0x10(%rsp),%rsi
  lea    0xc(%rsp),%rdi
  add    %eax,0xc(%rsp)
  call   <OPENSSL_gmtime@plt>
  mov    (%rbx),%rsi
  mov    $0xffffffff,%r8d
  mov    %rax,%rcx
  movsbl (%rsi),%eax
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x1(%rsi),%eax
  lea    (%rax,%rdx,2),%edx
  lea    -0x30(%rdx),%eax
  add    $0x34,%edx
  cmp    $0x32,%eax
  cmovl  %edx,%eax
  cmp    %eax,(%rcx)
  jg     L101
  mov    $0x1,%r8d
  jl     L101
  movsbl 0x2(%rsi),%eax
  mov    $0xffffffff,%r8d
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x3(%rsi),%eax
  lea    (%rax,%rdx,2),%eax
  mov    0x4(%rcx),%edx
  lea    -0x30(%rax),%edi
  cmp    %edx,%edi
  jle    L101
  sub    $0x31,%eax
  mov    $0x1,%r8d
  cmp    %eax,%edx
  jl     L101
  movsbl 0x4(%rsi),%eax
  mov    $0xffffffff,%r8d
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x5(%rsi),%eax
  lea    (%rax,%rdx,2),%eax
  mov    0x8(%rcx),%edx
  lea    -0x2f(%rax),%edi
  cmp    %edx,%edi
  jle    L101
  sub    $0x30,%eax
  mov    $0x1,%r8d
  cmp    %eax,%edx
  jl     L101
  movsbl 0x6(%rsi),%eax
  mov    $0xffffffff,%r8d
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x7(%rsi),%eax
  lea    (%rax,%rdx,2),%eax
  mov    0xc(%rcx),%edx
  lea    -0x2f(%rax),%edi
  cmp    %edx,%edi
  jle    L101
  sub    $0x30,%eax
  mov    $0x1,%r8d
  cmp    %eax,%edx
  jl     L101
  movsbl 0x8(%rsi),%eax
  mov    $0xffffffff,%r8d
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0x9(%rsi),%eax
  lea    (%rax,%rdx,2),%eax
  mov    0x10(%rcx),%edx
  lea    -0x2f(%rax),%edi
  cmp    %edx,%edi
  jle    L101
  sub    $0x30,%eax
  mov    $0x1,%r8d
  cmp    %eax,%edx
  jl     L101
  movsbl 0xa(%rsi),%eax
  mov    $0xffffffff,%r8d
  lea    -0xf0(%rax,%rax,4),%edx
  movsbl 0xb(%rsi),%eax
  lea    (%rax,%rdx,2),%eax
  mov    0x14(%rcx),%edx
  lea    -0x2f(%rax),%ecx
  cmp    %edx,%ecx
  jle    L101
  sub    $0x30,%eax
  xor    %r8d,%r8d
  cmp    %eax,%edx
  setl   %r8b
  nopl   0x0(%rax)
L101:
  mov    0x28(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L137
  add    $0x30,%rsp
  mov    %r8d,%eax
  pop    %rbx
  ret
  nopl   0x0(%rax)
L64:
  imul   $0x3c,%eax,%eax
  jmp    L10
L137:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int ASN1_UTCTIME_cmp_time_t(const ASN1_UTCTIME *s, time_t t) {
  struct tm *tm;
  struct tm data;
  int offset;
  int year;
  if (s->data[12] == 'Z')
    offset = 0;
  else {
    offset = (((s->data + 13)[0] - '0') * 10 + (s->data + 13)[1] - '0') * 60 + (((s->data + 15)[0] - '0') * 10 + (s->data + 15)[1] - '0');
    if (s->data[12] == '-')
      offset = -offset;
  }
  t -= offset * 60;
  tm = OPENSSL_gmtime(&t, &data);
  year = (((s->data)[0] - '0') * 10 + (s->data)[1] - '0');
  if (year < 50)
    year += 100;
  if ((year) < (tm->tm_year))
    return -1;
  else if ((year) > (tm->tm_year))
    return 1;
  if (((((s->data + 2)[0] - '0') * 10 + (s->data + 2)[1] - '0') - 1) < (tm->tm_mon))
    return -1;
  else if (((((s->data + 2)[0] - '0') * 10 + (s->data + 2)[1] - '0') - 1) > (tm->tm_mon))
    return 1;
  if (((((s->data + 4)[0] - '0') * 10 + (s->data + 4)[1] - '0')) < (tm->tm_mday))
    return -1;
  else if (((((s->data + 4)[0] - '0') * 10 + (s->data + 4)[1] - '0')) > (tm->tm_mday))
    return 1;
  if (((((s->data + 6)[0] - '0') * 10 + (s->data + 6)[1] - '0')) < (tm->tm_hour))
    return -1;
  else if (((((s->data + 6)[0] - '0') * 10 + (s->data + 6)[1] - '0')) > (tm->tm_hour))
    return 1;
  if (((((s->data + 8)[0] - '0') * 10 + (s->data + 8)[1] - '0')) < (tm->tm_min))
    return -1;
  else if (((((s->data + 8)[0] - '0') * 10 + (s->data + 8)[1] - '0')) > (tm->tm_min))
    return 1;
  if (((((s->data + 10)[0] - '0') * 10 + (s->data + 10)[1] - '0')) < (tm->tm_sec))
    return -1;
  else if (((((s->data + 10)[0] - '0') * 10 + (s->data + 10)[1] - '0')) > (tm->tm_sec))
    return 1;
  return 0;
}
```