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

```asm
<parse_app_opts>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  lea    D97(%rip),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x20(%rbp)
  movl   $0x0,-0x1c(%rbp)
  andl   $0xfffffb,-0x1c(%rbp)
  andl   $0xfffff7,-0x1c(%rbp)
  mov    -0x10(%rbp),%rdx
  lea    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strsep@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L118
L146:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L103
  mov    -0x18(%rbp),%rax
  mov    $0x23,%esi
  mov    %rax,%rdi
  call   <index@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L127
  mov    -0x8(%rbp),%rax
  movb   $0x0,(%rax)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L157
  movl   $0x1,-0x20(%rbp)
L127:
  mov    -0x18(%rbp),%rax
  lea    D61(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L140
  cmpl   $0x0,-0x2c(%rbp)
  je     L117
  lea    D87(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L117:
  orl    $0x1,-0x1c(%rbp)
  orl    $0x4,-0x1c(%rbp)
  jmp    L148
L140:
  mov    -0x18(%rbp),%rax
  lea    D13(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L32
  cmpl   $0x0,-0x2c(%rbp)
  je     L66
  lea    D41(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L66:
  orl    $0x2,-0x1c(%rbp)
  orl    $0x8,-0x1c(%rbp)
  jmp    L148
L32:
  mov    -0x18(%rbp),%rax
  lea    D6(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L96
  cmpl   $0x0,-0x2c(%rbp)
  je     L143
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L143:
  andl   $0xfffffd,-0x1c(%rbp)
  orl    $0x8,-0x1c(%rbp)
  jmp    L148
L96:
  mov    -0x18(%rbp),%rax
  lea    D44(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %eax,%eax
  jne    L9
  cmpl   $0x0,-0x2c(%rbp)
  je     L73
  lea    D37(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L73:
  andl   $0xfffffe,-0x1c(%rbp)
  orl    $0x4,-0x1c(%rbp)
  jmp    L148
L9:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rsi
  lea    D47(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L148:
  cmpl   $0x0,-0x20(%rbp)
  jne    L121
L103:
  mov    -0x10(%rbp),%rdx
  lea    -0x28(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strsep@plt>
  mov    %rax,-0x18(%rbp)
L118:
  cmpq   $0x0,-0x18(%rbp)
  jne    L146
  jmp    L110
L157:
  nop
  jmp    L110
L121:
  nop
L110:
  mov    -0x1c(%rbp),%eax
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D97
data_type: string
name: retrieve_data
arguments: label: D61
data_type: string
name: retrieve_data
arguments: label: D87
data_type: string
name: retrieve_data
arguments: label: D13
data_type: string
name: retrieve_data
arguments: label: D41
data_type: string
name: retrieve_data
arguments: label: D6
data_type: string
name: retrieve_data
arguments: label: D7
data_type: string
name: retrieve_data
arguments: label: D44
data_type: string
name: retrieve_data
arguments: label: D37
data_type: string
name: retrieve_data
arguments: label: D47
data_type: string

tool: D97:  	

tool: D61: PERMIT_APP

tool: D87: PERMIT_APP 

tool: D13: PERMIT_SERVER

tool: D41: PERMIT_SERVER 

tool: D6: DENY_SERVER

tool: D7: DENY_SERVER 

tool: D44: DENY_APP

tool: D37: DENY_APP 

tool: D47: (err parsing file: %s) 

assistant: ```c
int parse_app_opts(char *app_opts, int verbose_mode) {
  char *tok, *comment;
  const char *delim = " \t";
  int found_comment = 0;
  int opts = 0;
  opts = opts & 0xfffffb;
  opts = opts & 0xfffff7;
  tok = strsep(&app_opts, delim);
  while (tok) {
    if (tok[0] != '\0') {
      if (comment = index(tok, '#')) {
        comment[0] = '\0';
        if (tok[0] != '\0')
          found_comment = 1;
        else
          break;
      }
      if (!(strcmp(tok, "PERMIT_APP"))) {
        if (verbose_mode)
          printf("PERMIT_APP ");
        opts = opts | 1;
        opts = opts | 4;
      } else if (!(strcmp(tok, "PERMIT_SERVER"))) {
        if (verbose_mode)
          printf("PERMIT_SERVER ");
        opts = opts | 2;
        opts = opts | 8;
      } else if (!(strcmp(tok, "DENY_SERVER"))) {
        if (verbose_mode)
          printf("DENY_SERVER ");
        opts = opts & 0xfffffd;
        opts = opts | 8;
      } else if (!(strcmp(tok, "DENY_APP"))) {
        if (verbose_mode)
          printf("DENY_APP ");
        opts = opts & 0xfffffe;
        opts = opts | 4;
      } else
        printf("(err parsing file: %s) ", tok);
      if (found_comment)
        break;
    }
    tok = strsep(&app_opts, delim);
  }
  return opts;
}
```