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

```asm
<nss_shadow_parse>:
  endbr64
  push   %r12
  mov    %rsi,%rax
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x20,%rsp
  mov    %rsi,0x8(%rsp)
  mov    %fs:0x28,%rdx
  mov    %rdx,0x18(%rsp)
  xor    %edx,%edx
  mov    %rsi,(%rdi)
  jmp    L14
  nopl   0x0(%rax)
L132:
  cmpb   $0x0,-0x1(%rax)
  je     L206
L14:
  movzbl (%rax),%edx
  mov    %rax,%rcx
  add    $0x1,%rax
  mov    %rax,0x8(%rsp)
  cmp    $0x3a,%dl
  jne    L132
  movb   $0x0,(%rcx)
  mov    (%rbx),%rax
  cmpb   $0x0,(%rax)
  je     L206
  mov    0x8(%rsp),%rax
  mov    %rax,0x8(%rbx)
  jmp    L202
  nopl   0x0(%rax,%rax,1)
L85:
  cmpb   $0x0,-0x1(%rax)
  je     L206
L202:
  movzbl (%rax),%edx
  mov    %rax,%rcx
  add    $0x1,%rax
  mov    %rax,0x8(%rsp)
  cmp    $0x3a,%dl
  jne    L85
  movb   $0x0,(%rcx)
  mov    0x8(%rsp),%rdi
  cmpb   $0x0,(%rdi)
  je     L206
  lea    0x10(%rsp),%rbp
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x10(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  cmp    0x8(%rsp),%rdi
  mov    $0xffffffffffffffff,%r12
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x10(%rbx)
  cmpb   $0x0,(%rdi)
  je     L206
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x18(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  cmp    0x8(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x18(%rbx)
  cmpb   $0x0,(%rdi)
  je     L206
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x20(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  cmp    0x8(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x20(%rbx)
  cmpb   $0x0,(%rdi)
  je     L206
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x28(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  cmp    0x8(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x28(%rbx)
  cmpb   $0x0,(%rdi)
  je     L206
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x30(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  or     $0xffffffffffffffff,%r12
  cmp    0x8(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x30(%rbx)
  cmpb   $0x0,(%rdi)
  je     L206
  mov    $0xa,%edx
  mov    %rbp,%rsi
  call   <strtoul@plt>
  mov    0x10(%rsp),%rdi
  mov    %rax,0x38(%rbx)
  cmpb   $0x3a,(%rdi)
  jne    L206
  cmp    0x8(%rsp),%rdi
  mov    %rdi,0x8(%rsp)
  cmove  %r12,%rax
  mov    %rax,0x38(%rbx)
  cmpb   $0x0,(%rdi)
  jne    L94
  movq   $0xffffffffffffffff,0x40(%rbx)
L77:
  mov    $0x1,%eax
  jmp    L87
L94:
  lea    0x8(%rsp),%rsi
  mov    $0xa,%edx
  call   <strtoul@plt>
  mov    %rax,0x40(%rbx)
  mov    0x8(%rsp),%rax
  cmpb   $0x0,(%rax)
  je     L77
  nopl   0x0(%rax,%rax,1)
L206:
  mov    $0xffffffff,%eax
L87:
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L111
  add    $0x20,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L111:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int nss_shadow_parse(struct spwd *result, char *buf, size_t bufl) {
  result->sp_namp = buf;
  while (*buf != ':')
    if (!*buf++)
      return -1;
  *buf++ = '\0';
  if (!result->sp_namp[0])
    return -1;
  result->sp_pwdp = buf;
  while (*buf != ':')
    if (!*buf++)
      return -1;
  *buf++ = '\0';
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_lstchg = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_lstchg = (long)(-1);
    buf = endp;
  };
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_min = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_min = (long)(-1);
    buf = endp;
  };
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_max = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_max = (long)(-1);
    buf = endp;
  };
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_warn = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_warn = (long)(-1);
    buf = endp;
  };
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_inact = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_inact = (long)(-1);
    buf = endp;
  };
  {
    char *endp;
    if (!*buf)
      return -1;
    result->sp_expire = (long)(strtoul(buf, &endp, 10));
    if (*endp != ':')
      return -1;
    if (endp == buf)
      result->sp_expire = (long)(-1);
    buf = endp;
  };
  if (*buf) {
    result->sp_flag = strtoul(buf, &buf, 10);
    if (*buf)
      return -1;
  } else
    result->sp_flag = ~0ul;
  bufl = bufl;
  return 1;
}
```