user: Please show me the C implementation that matches the assembly code listed below:

```asm
<parse_relax>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    D28(%rip),%rbx
  sub    $0x8,%rsp
  call   <xstrdup@plt>
  mov    %rax,%r13
  mov    %rax,%rdi
  call   <assert@plt>
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <strtok@plt>
  test   %rax,%rax
  je     L43
  mov    %rax,%r15
  xor    %r12d,%r12d
  lea    D2(%rip),%rbp
  lea    D31(%rip),%r14
  jmp    L1
  nop
L96:
  or     $0x1,%r12d
L69:
  mov    %rbx,%rsi
  xor    %edi,%edi
  call   <strtok@plt>
  mov    %rax,%r15
  test   %rax,%rax
  je     L79
L1:
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L96
  mov    %r14,%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L33
L84:
  or     $0x2,%r12d
  jmp    L69
  nopl   0x0(%rax)
L43:
  xor    %r12d,%r12d
L79:
  mov    %r13,%rdi
  call   <free@plt>
  add    $0x8,%rsp
  mov    %r12d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L33:
  lea    D44(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L41
  lea    D39(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L31
  or     $0x4,%r12d
  jmp    L69
  nopl   0x0(%rax)
L41:
  lea    D87(%rip),%rdi
  call   <warnf@plt>
  jmp    L84
  cs nopw 0x0(%rax,%rax,1)
L31:
  lea    D10(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L56
  or     $0x8,%r12d
  jmp    L69
L56:
  lea    D1(%rip),%rsi
  mov    %r15,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L116
  or     $0x10,%r12d
  jmp    L69
L116:
  mov    %r15,%rsi
  lea    D51(%rip),%rdi
  call   <fatal@plt>
  jmp    L69
```

tool_calls: name: retrieve_data
arguments: tag: D28
data_type: string
name: retrieve_data
arguments: tag: D2
data_type: string
name: retrieve_data
arguments: tag: D31
data_type: string
name: retrieve_data
arguments: tag: D44
data_type: string
name: retrieve_data
arguments: tag: D39
data_type: string
name: retrieve_data
arguments: tag: D87
data_type: string
name: retrieve_data
arguments: tag: D10
data_type: string
name: retrieve_data
arguments: tag: D1
data_type: string
name: retrieve_data
arguments: tag: D51
data_type: string

tool: D28: ,

tool: D2: prefer-explicit

tool: D31: locally-static

tool: D44: generic-static

tool: D39: universal-bound

tool: D87: relax option 'generic-static' is deprecated: use 'locally-static' instead

tool: D10: pure-files

tool: D1: impure

tool: D51: invalid relax option '%s'

assistant: ```c
unsigned parse_relax(const char *str) {
  char *copy = xstrdup(str);
  assert(copy);
  unsigned mask = 0;
  char *token = strtok(copy, ",");
  while (token != NULL) {
    if (strcmp(token, "prefer-explicit") == 0)
      mask |= (1 << 0);
    else if (strcmp(token, "locally-static") == 0)
      mask |= (1 << 1);
    else if (strcmp(token, "generic-static") == 0) {
      warnf("relax option 'generic-static' is deprecated: use "
            "'locally-static' instead");
      mask |= (1 << 1);
    } else if (strcmp(token, "universal-bound") == 0)
      mask |= (1 << 2);
    else if (strcmp(token, "pure-files") == 0)
      mask |= (1 << 3);
    else if (strcmp(token, "impure") == 0)
      mask |= (1 << 4);
    else
      fatal("invalid relax option '%s'", token);
    token = strtok(NULL, ",");
  }
  free(copy);
  return mask;
}
```