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

```asm
<digest_md5_getsubopt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  movl   $0x0,-0x14(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L367
  mov    $0xffffffff,%eax
  jmp    L133
L367:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L171
L53:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  jne    L260
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
L260:
  addq   $0x1,-0x10(%rbp)
L171:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L275
  cmpl   $0x0,-0x14(%rbp)
  jne    L53
  cmpl   $0x0,-0x14(%rbp)
  jne    L275
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  jne    L53
L275:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x10(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x3d,%esi
  mov    %rax,%rdi
  call   <memchr@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L242
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
L242:
  movl   $0x0,-0x18(%rbp)
  jmp    L9
L387:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x8(%rbp),%rax
  sub    %rdx,%rax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rcx
  mov    -0x30(%rbp),%rax
  add    %rcx,%rax
  mov    (%rax),%rcx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcmp@plt>
  test   %rax,%rax
  jne    L52
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rcx
  mov    -0x8(%rbp),%rax
  sub    %rcx,%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L52
  mov    -0x8(%rbp),%rax
  cmp    -0x10(%rbp),%rax
  je     L415
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  jmp    L202
L415:
  mov    $0x0,%edx
L202:
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L90
L311:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
L90:
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  test   %rax,%rax
  je     L355
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L311
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L311
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  je     L311
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L311
  mov    -0x38(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  je     L311
L355:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L163
  mov    -0x10(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
  jmp    L182
L163:
  mov    -0x28(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
L182:
  subq   $0x1,-0x10(%rbp)
  jmp    L173
L156:
  mov    -0x10(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x0,(%rax)
L173:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L156
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L156
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  je     L156
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L156
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x22,%al
  je     L156
  jmp    L326
L138:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
L326:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L138
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L138
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  je     L138
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L138
  mov    -0x18(%rbp),%eax
  jmp    L133
L52:
  addl   $0x1,-0x18(%rbp)
L9:
  mov    -0x18(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  test   %rax,%rax
  jne    L387
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x38(%rbp),%rax
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L100
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x0,(%rax)
L100:
  mov    -0x28(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  jmp    L94
L404:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  mov    %rdx,(%rax)
L94:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  je     L404
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L404
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xd,%al
  je     L404
  mov    -0x28(%rbp),%rax
  mov    (%rax),%rax
  movzbl (%rax),%eax
  cmp    $0xa,%al
  je     L404
  mov    $0xffffffff,%eax
L133:
  leave
  ret
```

assistant: ```c
int digest_md5_getsubopt(char **optionp, const char *const *tokens, char **valuep) {
  char *endp, *vstart;
  int cnt;
  int inside_quote = 0;
  if (**optionp == '\0')
    return -1;
  endp = *optionp;
  while (*endp != '\0' && (inside_quote || (!inside_quote && *endp != ','))) {
    if (*endp == '"')
      inside_quote = !inside_quote;
    endp++;
  }
  vstart = memchr(*optionp, '=', endp - *optionp);
  if (vstart == NULL)
    vstart = endp;
  for (cnt = 0; tokens[cnt] != NULL; ++cnt)
    if (memcmp(*optionp, tokens[cnt], vstart - *optionp) == 0 && tokens[cnt][vstart - *optionp] == '\0') {
      *valuep = vstart != endp ? vstart + 1 : NULL;
      while (*valuep && (**valuep == ' ' || **valuep == '\t' || **valuep == '\r' || **valuep == '\n' || **valuep == '"'))
        (*valuep)++;
      if (*endp != '\0') {
        *endp = '\0';
        *optionp = endp + 1;
      } else
        *optionp = endp;
      endp--;
      while (*endp == ' ' || *endp == '\t' || *endp == '\r' || *endp == '\n' || *endp == '"')
        *endp-- = '\0';
      while (**optionp == ' ' || **optionp == '\t' || **optionp == '\r' || **optionp == '\n')
        (*optionp)++;
      return cnt;
    }
  *valuep = *optionp;
  if (*endp != '\0')
    *endp++ = '\0';
  *optionp = endp;
  while (**optionp == ' ' || **optionp == '\t' || **optionp == '\r' || **optionp == '\n')
    (*optionp)++;
  return -1;
}
```