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

```asm
<protobuf_parse>:
  endbr64
  push   %r15
  push   %r14
  mov    %rdi,%r14
  push   %r13
  mov    %rcx,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %r12,%rdi
  push   %rbx
  mov    %edx,%ebx
  mov    %ebx,%esi
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x10(%rsp),%rdx
  movl   $0x0,0x10(%rsp)
  movl   $0x0,0x14(%rsp)
  call   <protobuf_read_varint@plt>
  xor    %edi,%edi
  test   %rax,%rax
  mov    %rax,%rbp
  sete   %dil
  xor    %esi,%esi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  jne    L6
  mov    0x10(%rsp),%eax
  mov    %eax,%r15d
  sar    $0x3,%eax
  mov    %eax,%r9d
  mov    %rbp,%rax
  and    $0x7,%r15d
  sub    %r12,%rax
  sub    %eax,%ebx
  cmp    $0x2,%r15d
  je     L61
  jg     L135
  test   %r15d,%r15d
  je     L35
  cmp    $0x1,%r15d
  jne    L6
L26:
  xor    %edi,%edi
  cmp    $0x3,%ebx
  mov    %r9d,(%rsp)
  setbe  %dil
  xor    %esi,%esi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  jne    L6
  mov    0x0(%rbp),%ecx
  mov    (%rsp),%r9d
  add    $0x4,%rbp
  xor    %r8d,%r8d
  mov    %ecx,0x14(%rsp)
L47:
  mov    %r9d,%esi
  mov    %r14,%rdi
  mov    %r15d,%edx
  call   *%r13
  xor    %edi,%edi
  mov    $0x1,%esi
  cmp    $0x1,%eax
  sete   %dil
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L6
  mov    %ebp,%eax
  sub    %r12d,%eax
L46:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L11
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L135:
  cmp    $0x5,%r15d
  je     L26
L6:
  mov    $0xffffffff,%eax
  jmp    L46
  nopl   0x0(%rax)
L35:
  mov    %rbp,%rdi
  mov    %ebx,%esi
  lea    0x14(%rsp),%rdx
  mov    %r9d,(%rsp)
  call   <protobuf_read_varint@plt>
  xor    %edi,%edi
  test   %rax,%rax
  mov    %rax,%rbp
  sete   %dil
  xor    %esi,%esi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  jne    L6
  mov    0x14(%rsp),%ecx
  mov    (%rsp),%r9d
  xor    %r8d,%r8d
  jmp    L47
  nopl   0x0(%rax,%rax,1)
L61:
  mov    %ebx,%esi
  mov    %rbp,%rdi
  lea    0x14(%rsp),%rdx
  mov    %r9d,0xc(%rsp)
  call   <protobuf_read_varint@plt>
  test   %rax,%rax
  mov    %rax,(%rsp)
  sete   %dil
  xor    %esi,%esi
  movzbl %dil,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  jne    L6
  movslq 0x14(%rsp),%rbp
  mov    (%rsp),%r8
  mov    0xc(%rsp),%r9d
  mov    %rbp,%rcx
  add    %r8,%rbp
  jmp    L47
L11:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int protobuf_parse(void *param, const char *restrict buf, int size, bool (*cb)(void *param, int field, int wire_type, uint64_t value, const char *restrict extra)) {
  uint64_t key = 0;
  uint64_t value = 0;
  const char *extra = NULL;
  const char *p = protobuf_read_varint(buf, size, &key);
  if (__builtin_expect(!!(p == NULL), 0)) {
    return -1;
  }
  int wire_type = key & 0x07;
  int field = key >> 3;
  size -= (p - buf);
  switch (wire_type) {
  case 0:
    p = protobuf_read_varint(p, size, &value);
    if (__builtin_expect(!!(p == NULL), 0)) {
      return -1;
    };
    break;
  case 1:
    if (__builtin_expect(!!(size < sizeof(uint64_t)), 0)) {
      return -1;
    }
    value = *(uint64_t *)p;
    p += sizeof(uint64_t);
    ;
    break;
  case 2:
    p = protobuf_read_varint(p, size, &value);
    if (__builtin_expect(!!(p == NULL), 0)) {
      return -1;
    };
    extra = p;
    p += value;
    break;
  case 5:
    if (__builtin_expect(!!(size < sizeof(uint32_t)), 0)) {
      return -1;
    }
    value = *(uint32_t *)p;
    p += sizeof(uint32_t);
    ;
    break;
  default:
    return -1;
  }
  return (__builtin_expect(!!(cb(param, field, wire_type, value, extra) == true), 1)) ? p - buf : -1;
}
```