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

```asm
<parse_options>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x140,%rsp
  mov    %rdi,-0x138(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  call   <create_cnfnode@plt>
  mov    %rax,-0x120(%rbp)
  mov    -0x138(%rbp),%rax
  mov    %rax,-0x130(%rbp)
  jmp    L2
L32:
  lea    -0x110(%rbp),%rax
  mov    %rax,-0x128(%rbp)
  jmp    L16
L17:
  mov    -0x130(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x130(%rbp)
  mov    -0x128(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x128(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L16:
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L133
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  je     L133
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L133
  lea    -0x110(%rbp),%rax
  add    $0xff,%rax
  cmp    %rax,-0x128(%rbp)
  jb     L17
L133:
  mov    -0x128(%rbp),%rax
  movb   $0x0,(%rax)
  lea    -0x110(%rbp),%rax
  mov    %rax,%rdi
  call   <create_cnfnode@plt>
  mov    %rax,-0x118(%rbp)
  mov    -0x118(%rbp),%rdx
  mov    -0x120(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <append_node@plt>
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L24
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3d,%al
  jne    L24
  addq   $0x1,-0x130(%rbp)
  lea    -0x110(%rbp),%rax
  mov    %rax,-0x128(%rbp)
  jmp    L5
L147:
  mov    -0x130(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x130(%rbp)
  mov    -0x128(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x128(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L5:
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L132
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x2c,%al
  je     L132
  lea    -0x110(%rbp),%rax
  add    $0xff,%rax
  cmp    %rax,-0x128(%rbp)
  jb     L147
L132:
  mov    -0x128(%rbp),%rax
  movb   $0x0,(%rax)
  lea    -0x110(%rbp),%rdx
  mov    -0x118(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <cnfnode_setval@plt>
  jmp    L14
L24:
  mov    -0x118(%rbp),%rax
  lea    D16(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <cnfnode_setval@plt>
L14:
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L2
  addq   $0x1,-0x130(%rbp)
L2:
  mov    -0x130(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  jne    L32
  mov    -0x120(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L8
  call   <__stack_chk_fail@plt>
L8:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D2
datatype: string
name: extract_symbolic_data
arguments: tag: D16
datatype: string

tool: D2: (root)

tool: 

assistant: ```c
struct cnfnode *parse_options(const char *string) {
  struct cnfnode *cn_top, *cn;
  const char *p;
  char *q, buf[256];
  cn_top = create_cnfnode("(root)");
  p = string;
  while (*p) {
    q = buf;
    while (*p && *p != '=' && *p != ',' && q < buf + 255)
      *q++ = *p++;
    *q = 0;
    cn = create_cnfnode(buf);
    append_node(cn_top, cn);
    if (*p && *p == '=') {
      p++;
      q = buf;
      while (*p && *p != ',' && q < buf + 255)
        *q++ = *p++;
      *q = 0;
      cnfnode_setval(cn, buf);
    } else
      cnfnode_setval(cn, "");
    if (*p)
      p++;
  }
  return cn_top;
}
```