user: What is the c source code of the assembly code below?

```asm
<yalex_atoll_s>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbx
  mov    %rdi,-0x30(%rbp)
  mov    %rsi,-0x38(%rbp)
  mov    %edx,-0x3c(%rbp)
  movq   $0x0,-0x38(%rbp)
  mov    -0x30(%rbp),%r12
  mov    $0x0,%r15d
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%eax
  movsbl %al,%ebx
  cmp    $0x2d,%ebx
  jne    L154
  mov    $0x1,%r15d
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%eax
  movsbl %al,%ebx
  jmp    L266
L154:
  cmp    $0x2b,%ebx
  jne    L266
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%eax
  movsbl %al,%ebx
L266:
  cmpl   $0x0,-0x3c(%rbp)
  je     L158
  cmpl   $0x10,-0x3c(%rbp)
  jne    L192
L158:
  cmp    $0x30,%ebx
  jne    L192
  movzbl (%r12),%eax
  cmp    $0x78,%al
  je     L175
  movzbl (%r12),%eax
  cmp    $0x58,%al
  jne    L192
L175:
  lea    0x1(%r12),%rax
  movzbl (%rax),%eax
  movsbl %al,%ebx
  add    $0x2,%r12
  movl   $0x10,-0x3c(%rbp)
L192:
  cmpl   $0x0,-0x3c(%rbp)
  jne    L82
  cmp    $0x30,%ebx
  jne    L130
  mov    $0x8,%eax
  jmp    L218
L130:
  mov    $0xa,%eax
L218:
  mov    %eax,-0x3c(%rbp)
L82:
  test   %r15d,%r15d
  je     L2
  movabs $0x8000000000000000,%rax
  jmp    L358
L2:
  movabs $0x7fffffffffffffff,%rax
L358:
  mov    %rax,%r14
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rcx
  mov    %r14,%rax
  mov    $0x0,%edx
  div    %rcx
  mov    %rdx,%rax
  mov    %eax,%ecx
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdi
  mov    %r14,%rax
  mov    $0x0,%edx
  div    %rdi
  mov    %rax,%r14
  mov    $0x0,%r13d
  mov    $0x0,%esi
L142:
  cmp    $0x2f,%ebx
  jle    L213
  cmp    $0x39,%ebx
  jg     L213
  sub    $0x30,%ebx
  jmp    L52
L213:
  cmp    $0x40,%ebx
  jle    L246
  cmp    $0x5a,%ebx
  jle    L229
L246:
  cmp    $0x60,%ebx
  jle    L270
  cmp    $0x7a,%ebx
  jg     L270
L229:
  cmp    $0x40,%ebx
  jle    L173
  cmp    $0x5a,%ebx
  jg     L173
  mov    $0x37,%eax
  jmp    L250
L173:
  mov    $0x57,%eax
L250:
  sub    %eax,%ebx
L52:
  cmp    -0x3c(%rbp),%ebx
  jge    L288
  mov    %esi,%eax
  test   %eax,%eax
  js     L312
  cmp    %r14,%r13
  ja     L312
  cmp    %r14,%r13
  jne    L4
  mov    %ecx,%eax
  cmp    %eax,%ebx
  jle    L4
L312:
  mov    $0xffffffff,%esi
  jmp    L39
L4:
  mov    $0x1,%esi
  mov    -0x3c(%rbp),%eax
  cltq
  imul   %rax,%r13
  movslq %ebx,%rax
  add    %rax,%r13
L39:
  mov    %r12,%rax
  lea    0x1(%rax),%r12
  movzbl (%rax),%eax
  movsbl %al,%ebx
  jmp    L142
L288:
  nop
L270:
  mov    %esi,%eax
  test   %eax,%eax
  jns    L271
  test   %r15d,%r15d
  je     L80
  movabs $0x8000000000000000,%rax
  jmp    L146
L80:
  movabs $0x7fffffffffffffff,%rax
  jmp    L146
L271:
  test   %r15d,%r15d
  je     L122
  mov    %r13,%rax
  neg    %rax
  jmp    L146
L122:
  mov    %r13,%rax
L146:
  pop    %rbx
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  pop    %rbp
  ret
```

assistant: ```c
long long yalex_atoll_s(const char *buf, char **end, int radix) {
  end = 0;
  register const char *s = buf;
  register unsigned long long acc;
  register int c;
  register unsigned long long cutoff;
  register int neg = 0, any, cutlim;
  c = *s++;
  if (c == '-') {
    neg = 1;
    c = *s++;
  } else if (c == '+') {
    c = *s++;
  }
  if ((radix == 0 || radix == 16) && c == '0' && (*s == 'x' || *s == 'X')) {
    c = s[1];
    s += 2;
    radix = 16;
  }
  if (radix == 0)
    radix = c == '0' ? 8 : 10;
  cutoff = neg ? (0x8000000000000000) : (0x7FFFFFFFFFFFFFFF);
  cutlim = cutoff % (long long)radix;
  cutoff /= (long long)radix;
  for (acc = 0, any = 0;; c = *s++) {
    if ((c >= '0' && c <= '9'))
      c -= '0';
    else if (((c >= 'A' && c <= 'Z') || c >= 'a' && c <= 'z'))
      c -= (c >= 'A' && c <= 'Z') ? 'A' - 10 : 'a' - 10;
    else
      break;
    if (c >= radix)
      break;
    if (any < 0 || acc > cutoff || (acc == cutoff && c > cutlim))
      any = -1;
    else {
      any = 1;
      acc *= radix;
      acc += c;
    }
  }
  if (any < 0) {
    return neg ? (0x8000000000000000) : (0x7FFFFFFFFFFFFFFF);
  } else if (neg) {
    return -1 * ((long long)acc);
  }
  return (long long)acc;
}
```