user: 请将以下的汇编代码转换成C语言代码：

```asm
<_sconfig_parse_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  movl   $0x0,-0xc(%rbp)
  jmp    L353
L215:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  je     L112
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5f,%al
  je     L112
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L318
L112:
  mov    $0xffffffff,%eax
  jmp    L216
L318:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L329
  addl   $0x1,-0xc(%rbp)
L353:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L215
  jmp    L140
L329:
  nop
L140:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  je     L189
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  jne    L114
L189:
  mov    $0x0,%eax
  jmp    L216
L114:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  movl   $0x0,-0x8(%rbp)
  jmp    L180
L336:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  je     L191
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isupper@plt>
  test   %rax,%rax
  jne    L149
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <islower@plt>
  test   %rax,%rax
  je     L257
L149:
  movl   $0x1,-0x8(%rbp)
  jmp    L84
L257:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  jne    L61
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x5f,%al
  je     L61
  mov    $0xffffffff,%eax
  jmp    L216
L61:
  nop
L84:
  addl   $0x1,-0xc(%rbp)
L180:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L336
  jmp    L101
L191:
  nop
L101:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  je     L341
  cmpl   $0x0,-0x8(%rbp)
  jne    L0
L341:
  mov    $0xffffffff,%eax
  jmp    L216
L0:
  mov    -0xc(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0xc(%rbp)
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jne    L330
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  mov    $0x1,%eax
  jmp    L216
L330:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    %rdx,(%rax)
  movl   $0xffffffff,-0x4(%rbp)
  jmp    L24
L308:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x23,%al
  jne    L295
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  cmp    %rax,%rdx
  je     L295
  mov    -0xc(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L332
L295:
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L96
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x4(%rbp)
L96:
  addl   $0x1,-0xc(%rbp)
L24:
  mov    -0xc(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L308
L332:
  cmpl   $0xffffffff,-0x4(%rbp)
  jne    L256
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  movb   $0x0,(%rax)
  mov    $0x1,%eax
  jmp    L216
L256:
  mov    -0x30(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L285
  mov    $0xffffffff,%eax
  jmp    L216
L285:
  mov    -0x4(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  mov    $0x2,%eax
L216:
  leave
  ret
```

assistant: ```c
int _sconfig_parse_line(char *buffer, int len, char **name, char **value) {
  int i;
  for (i = 0; i < len; ++i) {
    if (buffer[i] == '=' || buffer[i] == '_' || isdigit(buffer[i]))
      return -1;
    if (!isspace(buffer[i]))
      break;
  }
  if (i == len || buffer[i] == '#')
    return 0;
  *name = buffer + i;
  int has_alpha = 0;
  for (; i < len; ++i) {
    if (buffer[i] == '=')
      break;
    else if (isupper(buffer[i]) || islower(buffer[i])) {
      has_alpha = 1;
      continue;
    } else if (isdigit(buffer[i]) || buffer[i] == '_')
      continue;
    else
      return -1;
  }
  if (i == len || !has_alpha)
    return -1;
  buffer[i++] = '\0';
  if (i == len) {
    *value = buffer + i;
    return 1;
  }
  *value = buffer + i;
  int last_char = -1;
  for (; i < len; ++i) {
    if (buffer[i] == '#' && buffer + i != *value && isspace(buffer[i - 1]))
      break;
    else if (!isspace(buffer[i]))
      last_char = i;
  }
  if (last_char == -1) {
    **value = '\0';
    return 1;
  }
  if (isspace(**value))
    return -1;
  buffer[last_char + 1] = '\0';
  return 2;
}
```