user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<parsegroup>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x200,%rsp
  mov    %rdi,-0x1e8(%rbp)
  mov    %rsi,-0x1f0(%rbp)
  mov    %rdx,-0x1f8(%rbp)
  mov    %rcx,-0x200(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x1c0(%rbp)
  movq   $0x0,-0x1b8(%rbp)
  movl   $0x0,-0x1b0(%rbp)
  lea    -0x1a0(%rbp),%rdx
  mov    $0x0,%eax
  mov    $0x32,%ecx
  mov    %rdx,%rdi
  rep stos %rax,%es:(%rdi)
  mov    -0x1e8(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  mov    %eax,-0x1b0(%rbp)
  mov    -0x1b0(%rbp),%eax
  mov    -0x200(%rbp),%rdx
  cmp    %edx,%eax
  jle    L97
  mov    D14(%rip),%rax
  mov    (%rax),%eax
  jmp    L138
L97:
  movl   $0x1,-0x1d0(%rbp)
  movl   $0x0,-0x1d4(%rbp)
  jmp    L137
L31:
  mov    -0x1d4(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x1e8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3a,%al
  jne    L8
  mov    -0x1d0(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1d0(%rbp)
  mov    -0x1d4(%rbp),%edx
  add    $0x1,%edx
  cltq
  mov    %edx,-0x1c0(%rbp,%rax,4)
L8:
  addl   $0x1,-0x1d4(%rbp)
L137:
  mov    -0x1b0(%rbp),%eax
  cmp    %eax,-0x1d4(%rbp)
  jl     L31
  cmpl   $0x4,-0x1d0(%rbp)
  je     L19
  mov    D10(%rip),%rax
  mov    (%rax),%eax
  jmp    L138
L19:
  mov    -0x1b4(%rbp),%eax
  mov    %eax,-0x1a0(%rbp)
  movl   $0x1,-0x1d0(%rbp)
  mov    -0x1b4(%rbp),%eax
  mov    %eax,-0x1d4(%rbp)
  jmp    L107
L102:
  mov    -0x1d4(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x1e8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L124
  mov    -0x1d0(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x1d0(%rbp)
  mov    -0x1d4(%rbp),%edx
  add    $0x1,%edx
  cltq
  mov    %edx,-0x1a0(%rbp,%rax,4)
L124:
  addl   $0x1,-0x1d4(%rbp)
L107:
  mov    -0x1b0(%rbp),%eax
  cmp    %eax,-0x1d4(%rbp)
  jl     L102
  mov    -0x1b0(%rbp),%edx
  mov    -0x1d0(%rbp),%eax
  cltq
  mov    %edx,-0x1a0(%rbp,%rax,4)
  mov    -0x1b0(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x1d0(%rbp),%eax
  add    $0x1,%eax
  cltq
  shl    $0x3,%rax
  add    %rdx,%rax
  cmp    %rax,-0x200(%rbp)
  jae    L126
  mov    D14(%rip),%rax
  mov    (%rax),%eax
  jmp    L138
L126:
  mov    -0x200(%rbp),%rax
  mov    %eax,%edx
  mov    -0x1f8(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x1b4(%rbp),%eax
  mov    -0x1b8(%rbp),%edx
  sub    %edx,%eax
  lea    -0x1(%rax),%edx
  mov    -0x1b8(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x1e8(%rbp),%rax
  add    %rax,%rcx
  mov    -0x1f8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x1b4(%rbp),%eax
  mov    -0x1b8(%rbp),%edx
  sub    %edx,%eax
  sub    $0x1,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x1f8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x1f8(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    -0x1f0(%rbp),%rdx
  mov    %eax,0x18(%rdx)
  mov    -0x1b0(%rbp),%edx
  mov    -0x1f8(%rbp),%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x1f0(%rbp),%rax
  mov    -0x1f8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x1bc(%rbp),%eax
  mov    -0x1c0(%rbp),%edx
  sub    %edx,%eax
  lea    -0x1(%rax),%edx
  mov    -0x1c0(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x1e8(%rbp),%rax
  add    %rax,%rcx
  mov    -0x1f8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x1bc(%rbp),%eax
  mov    -0x1c0(%rbp),%edx
  sub    %edx,%eax
  sub    $0x1,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x1f8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x1bc(%rbp),%eax
  mov    -0x1c0(%rbp),%edx
  sub    %edx,%eax
  sub    $0x1,%eax
  cltq
  add    $0x1,%rax
  add    %rax,-0x1f8(%rbp)
  mov    -0x1f0(%rbp),%rax
  mov    -0x1f8(%rbp),%rdx
  mov    %rdx,0x8(%rax)
  mov    -0x1b8(%rbp),%eax
  mov    -0x1bc(%rbp),%edx
  sub    %edx,%eax
  lea    -0x1(%rax),%edx
  mov    -0x1bc(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x1e8(%rbp),%rax
  add    %rax,%rcx
  mov    -0x1f8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x1b8(%rbp),%eax
  mov    -0x1bc(%rbp),%edx
  sub    %edx,%eax
  sub    $0x1,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x1f8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x1b8(%rbp),%eax
  mov    -0x1bc(%rbp),%edx
  sub    %edx,%eax
  sub    $0x1,%eax
  cltq
  add    $0x1,%rax
  add    %rax,-0x1f8(%rbp)
  mov    -0x1f8(%rbp),%rax
  mov    %rax,-0x1c8(%rbp)
  mov    -0x1f0(%rbp),%rax
  mov    -0x1c8(%rbp),%rdx
  mov    %rdx,0x10(%rax)
  mov    -0x1d0(%rbp),%eax
  add    $0x1,%eax
  cltq
  shl    $0x3,%rax
  add    %rax,-0x1f8(%rbp)
  movl   $0x0,-0x1d4(%rbp)
  jmp    L14
L130:
  mov    -0x1d4(%rbp),%eax
  add    $0x1,%eax
  cltq
  mov    -0x1a0(%rbp,%rax,4),%edx
  mov    -0x1d4(%rbp),%eax
  cltq
  mov    -0x1a0(%rbp,%rax,4),%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  sub    $0x1,%eax
  mov    %eax,-0x1cc(%rbp)
  mov    -0x1d4(%rbp),%eax
  cltq
  mov    -0x1a0(%rbp,%rax,4),%eax
  movslq %eax,%rdx
  mov    -0x1e8(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x1cc(%rbp),%edx
  mov    -0x1f8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x1cc(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x1f8(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0x1c8(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x1c8(%rbp)
  mov    -0x1f8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x1cc(%rbp),%eax
  cltq
  add    $0x1,%rax
  add    %rax,-0x1f8(%rbp)
  addl   $0x1,-0x1d4(%rbp)
L14:
  mov    -0x1d4(%rbp),%eax
  cmp    -0x1d0(%rbp),%eax
  jl     L130
  mov    -0x1c8(%rbp),%rax
  movq   $0x0,(%rax)
  mov    $0x0,%eax
L138:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L16
  call   <__stack_chk_fail@plt>
L16:
  leave
  ret
```

assistant: ```c
int parsegroup(char *str, struct group *result, char *buffer, size_t buflen) {
  int fields[4 + 1] = {0};
  int members[100] = {0};
  int i, field, len;
  char **bufp;
  fields[4] = strlen(str) + 1;
  if (fields[4] > (int)buflen) {
    return ERANGE;
  }
  for (field = 1, i = 0; i < fields[4]; i++) {
    if (str[i] == ':') {
      fields[field++] = i + 1;
    }
  }
  if (field != 4) {
    return ENOENT;
  }
  members[0] = fields[3];
  for (field = 1, i = fields[3]; i < fields[4]; i++) {
    if (str[i] == ',') {
      members[field++] = i + 1;
    }
  }
  members[field] = fields[4];
  if ((fields[4] + ((field + 1) * sizeof(char *))) > buflen) {
    return ERANGE;
  }
  do {
    memset(buffer, 0, buflen);
    memcpy(buffer, &str[fields[2]], ((fields[2 + 1] - fields[2]) - 1));
    buffer[((fields[2 + 1] - fields[2]) - 1) + 1] = '\0';
    result->gr_gid = atoi(buffer);
  } while (0);
  memset(buffer, 0, fields[4]);
  do {
    result->gr_name = buffer;
    memcpy(buffer, &str[fields[0]], ((fields[0 + 1] - fields[0]) - 1));
    buffer[((fields[0 + 1] - fields[0]) - 1) + 1] = '\0';
    buffer += ((fields[0 + 1] - fields[0]) - 1) + 1;
  } while (0);
  do {
    result->gr_passwd = buffer;
    memcpy(buffer, &str[fields[1]], ((fields[1 + 1] - fields[1]) - 1));
    buffer[((fields[1 + 1] - fields[1]) - 1) + 1] = '\0';
    buffer += ((fields[1 + 1] - fields[1]) - 1) + 1;
  } while (0);
  result->gr_mem = bufp = (char **)buffer;
  buffer += (sizeof(char *) * (field + 1));
  for (i = 0; i < field; i++) {
    len = ((members[i + 1] - members[i]) - 1);
    memcpy(buffer, &str[members[i]], len);
    buffer[len + 1] = '\0';
    *(bufp++) = buffer;
    buffer += len + 1;
  }
  *bufp = NULL;
  return 0;
}
```