user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<pdb_command>:
  endbr64
  push   %r15
  mov    %rdi,%rsi
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x358,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x348(%rsp)
  xor    %eax,%eax
  lea    0x1d0(%rsp),%rbp
  lea    0x190(%rsp),%r14
  mov    %rbp,%rdi
  lea    0x150(%rsp),%r15
  lea    0x10(%rsp),%r12
  call   <strcpy@plt>
  lea    0x110(%rsp),%r13
  mov    %rbp,%rdi
  call   <help_scanner@plt>
  xor    %eax,%eax
  mov    %r14,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  mov    %r12,%rdx
  lea    D68(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x4,%eax
  je     L94
  xor    %eax,%eax
  mov    %r14,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  mov    %r12,%rdx
  lea    D52(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x4,%eax
  je     L223
  xor    %eax,%eax
  mov    %r14,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  mov    %r12,%rdx
  lea    D71(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x4,%eax
  je     L70
  xor    %eax,%eax
  mov    %r14,%r8
  mov    %r13,%rcx
  mov    %r12,%rdx
  lea    D77(%rip),%rsi
  mov    %rbp,%rdi
  call   <sscanf@plt>
  cmp    $0x3,%eax
  je     L168
  lea    0x50(%rsp),%rbx
  lea    0xd0(%rsp),%r8
  xor    %eax,%eax
  mov    %rbp,%rdi
  lea    0x90(%rsp),%rcx
  mov    %rbx,%rdx
  mov    %r8,0x8(%rsp)
  lea    D39(%rip),%rsi
  mov    %rcx,(%rsp)
  call   <sscanf@plt>
  mov    0x8(%rsp),%r8
  cmp    $0x3,%eax
  je     L204
  mov    (%rsp),%rcx
  xor    %eax,%eax
  mov    %rbx,%rdx
  lea    D80(%rip),%rsi
  mov    %rbp,%rdi
  mov    %r8,0x8(%rsp)
  call   <sscanf@plt>
  mov    0x8(%rsp),%r8
  cmp    $0x3,%eax
  je     L99
  mov    (%rsp),%rcx
  xor    %eax,%eax
  mov    %rbx,%rdx
  lea    D79(%rip),%rsi
  mov    %rbp,%rdi
  mov    %r8,0x8(%rsp)
  call   <sscanf@plt>
  cmp    $0x3,%eax
  je     L97
  mov    %r12,%rdx
  mov    %r14,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  lea    D37(%rip),%rsi
  mov    %rbp,%rdi
  xor    %eax,%eax
  call   <sscanf@plt>
  mov    %eax,%edx
  cmp    $0x4,%eax
  je     L28
  xor    %eax,%eax
  cmp    $0x2,%edx
  jne    L166
  mov    %rbx,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    (%rsp),%rsi
  mov    %rbx,%rdi
  call   <simple_set_copy@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   (%rax)
L223:
  mov    %r12,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  je     L253
L165:
  lea    0x240(%rsp),%rbp
  lea    D3(%rip),%rsi
  mov    %rbp,%rdi
  call   <sprintf@plt>
  mov    %rbp,%rdi
  call   <set_error1@plt>
  xor    %eax,%eax
L166:
  mov    0x348(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L150
  add    $0x358,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L94:
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <times_equals@plt>
  mov    $0x1,%eax
  jmp    L166
L70:
  mov    %r12,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <minus_equals@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   (%rax)
L253:
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <plus_equals@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   0x0(%rax,%rax,1)
L204:
  mov    %rbx,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    0x8(%rsp),%rdx
  mov    (%rsp),%rsi
  mov    %rbx,%rdi
  call   <handle_intersection@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   0x0(%rax)
L168:
  mov    %r14,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <field_assignment@plt>
  mov    $0x1,%eax
  jmp    L166
L99:
  mov    %rbx,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    0x8(%rsp),%rdx
  mov    (%rsp),%rsi
  mov    %rbx,%rdi
  call   <handle_union@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   0x0(%rax)
L97:
  mov    %rbx,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    0x8(%rsp),%rdx
  mov    (%rsp),%rsi
  mov    %rbx,%rdi
  call   <handle_subtraction@plt>
  mov    $0x1,%eax
  jmp    L166
  nopl   0x0(%rax)
L28:
  mov    %r12,%rdi
  call   <protected_set@plt>
  test   %rax,%rax
  jne    L165
  mov    %r14,%rcx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <assignment@plt>
  mov    $0x1,%eax
  jmp    L166
L150:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_tag: D68
type_infered: string
name: retrieve_data
arguments: data_tag: D52
type_infered: string
name: retrieve_data
arguments: data_tag: D71
type_infered: string
name: retrieve_data
arguments: data_tag: D77
type_infered: string
name: retrieve_data
arguments: data_tag: D39
type_infered: string
name: retrieve_data
arguments: data_tag: D80
type_infered: string
name: retrieve_data
arguments: data_tag: D79
type_infered: string
name: retrieve_data
arguments: data_tag: D37
type_infered: string
name: retrieve_data
arguments: data_tag: D3
type_infered: string

tool: D68: %s *= %s %s %s

tool: D52: %s += %s %s %s

tool: D71: %s -= %s %s %s

tool: D77: %s %s = %s

tool: D39: %s = %s * %s

tool: D80: %s = %s + %s

tool: D79: %s = %s - %s

tool: D37: %s = %s %s %s

tool: D3: pdb_command: user not allowed to modify protected set

assistant: ```c
int pdb_command(char command_line[255]) {
  int nw;
  char command__line[100];
  char setname[64], setname1[64];
  char setname2[64], setname3[64];
  char field[64], operator[64];
  char value[64];
  char message[255];
  strcpy(command__line, command_line);
  help_scanner(command__line);
  nw = sscanf(command__line, "%s *= %s %s %s", setname, field, operator, value);
  if (nw == 4) {
    times_equals(setname, field, operator, value);
    return (1);
  }
  nw = sscanf(command__line, "%s += %s %s %s", setname, field, operator, value);
  if (nw == 4) {
    if (protected_set(setname)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    plus_equals(setname, field, operator, value);
    return (1);
  }
  nw = sscanf(command__line, "%s -= %s %s %s", setname, field, operator, value);
  if (nw == 4) {
    if (protected_set(setname)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    minus_equals(setname, field, operator, value);
    return (1);
  }
  nw = sscanf(command__line, "%s %s = %s", setname, field, value);
  if (nw == 3) {
    field_assignment(setname, field, value);
    return (1);
  }
  nw = sscanf(command__line, "%s = %s * %s", setname1, setname2, setname3);
  if (nw == 3) {
    if (protected_set(setname1)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    handle_intersection(setname1, setname2, setname3);
    return (1);
  }
  nw = sscanf(command__line, "%s = %s + %s", setname1, setname2, setname3);
  if (nw == 3) {
    if (protected_set(setname1)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    handle_union(setname1, setname2, setname3);
    return (1);
  }
  nw = sscanf(command__line, "%s = %s - %s", setname1, setname2, setname3);
  if (nw == 3) {
    if (protected_set(setname1)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    handle_subtraction(setname1, setname2, setname3);
    return (1);
  }
  nw = sscanf(command__line, "%s = %s %s %s", setname, field, operator, value);
  if (nw == 4) {
    if (protected_set(setname)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    assignment(setname, field, operator, value);
    return (1);
  } else if (nw == 2) {
    if (protected_set(setname1)) {
      sprintf(message, "pdb_command: user not allowed to modify protected set");
      set_error1(message);
      return (0);
    }
    simple_set_copy(setname1, setname2);
    return (1);
  }
  return (0);
}
```