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

```asm
<parse_name>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  mov    %rdi,%rsi
  sub    $0x88,%rsp
  mov    %rdx,0x8(%rsp)
  lea    0x20(%rsp),%r12
  mov    %rcx,0x10(%rsp)
  mov    %r12,%rdi
  mov    %r12,%r13
  mov    %r8,0x18(%rsp)
  mov    %r9,(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x78(%rsp)
  xor    %eax,%eax
  call   <strcpy@plt>
  cmpb   $0x0,0x20(%rsp)
  je     L22
  nopl   0x0(%rax)
L94:
  movsbl 0x0(%r13),%edi
  add    $0x1,%r13
  call   <tolower@plt>
  mov    %al,-0x1(%r13)
  cmpb   $0x0,0x0(%r13)
  jne    L94
  movzbl 0x20(%rsp),%r13d
  test   %r13b,%r13b
  je     L22
  mov    (%rsp),%rax
  xor    %r14d,%r14d
  mov    (%rax),%edx
  mov    %r12,%rax
  mov    %rbx,%r12
  mov    %rax,%rbx
  jmp    L41
  nopl   0x0(%rax)
L259:
  cmpb   $0x65,0x1(%r15)
  jne    L299
  cmpb   $0x64,0x2(%r15)
  jne    L299
  mov    0x8(%rsp),%rax
  orl    $0x1,(%r12)
  addl   $0xff,(%rax)
L211:
  mov    (%rsp),%rax
  mov    (%rax),%edx
  test   %edx,%edx
  je     L381
L314:
  test   %r13b,%r13b
  je     L22
L41:
  test   %edx,%edx
  jne    L22
L204:
  movslq %r14d,%rbp
  lea    (%rbx,%rbp,1),%r15
  cmpb   $0x72,(%r15)
  je     L259
L299:
  mov    $0x5,%edx
  lea    D58(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L224
  mov    0x10(%rsp),%rax
  orl    $0x2,(%r12)
  addl   $0xff,(%rax)
  mov    (%rsp),%rax
  mov    (%rax),%edx
  test   %edx,%edx
  jne    L314
L381:
  movzbl 0x20(%rsp,%rbp,1),%r13d
  cmp    $0x2c,%r13b
  je     L367
  cmp    $0x20,%r13b
  je     L367
  test   %r13b,%r13b
  je     L22
  lea    0x1(%r14),%eax
  cltq
  nopl   0x0(%rax)
L112:
  movzbl (%rbx,%rax,1),%r13d
  mov    %eax,%r14d
  cmp    $0x2c,%r13b
  je     L367
  cmp    $0x20,%r13b
  je     L367
  add    $0x1,%rax
  test   %r13b,%r13b
  jne    L112
L22:
  mov    $0x1,%eax
L180:
  mov    0x78(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L233
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L224:
  mov    $0x4,%edx
  lea    D21(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L198
  mov    0x18(%rsp),%rax
  orl    $0x4,(%r12)
  addl   $0xff,(%rax)
  jmp    L211
  nopl   (%rax)
L367:
  test   %r13b,%r13b
  je     L22
  cmp    $0x20,%r13b
  je     L38
  cmp    $0x2c,%r13b
  jne    L204
L38:
  lea    0x1(%r14),%eax
  cltq
  nopl   0x0(%rax,%rax,1)
L247:
  movzbl (%rbx,%rax,1),%r13d
  mov    %eax,%r14d
  add    $0x1,%rax
  cmp    $0x2c,%r13b
  je     L247
  cmp    $0x20,%r13b
  je     L247
  jmp    L314
  nopl   (%rax)
L198:
  mov    $0x5,%edx
  lea    D77(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L79
  mov    0x8(%rsp),%rax
  orl    $0x8,(%r12)
  addl   $0xff,(%rax)
  mov    0x10(%rsp),%rax
  addl   $0xff,(%rax)
  mov    0x18(%rsp),%rax
  addl   $0xff,(%rax)
  jmp    L211
  nopl   0x0(%rax,%rax,1)
L79:
  mov    $0x7,%edx
  lea    D29(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L343
  mov    0x8(%rsp),%rax
  orl    $0x10,(%r12)
  addl   $0xff,(%rax)
  mov    0x18(%rsp),%rax
  addl   $0xff,(%rax)
  jmp    L211
L343:
  mov    $0x6,%edx
  lea    D13(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L181
  mov    $0x4,%edx
  lea    D20(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  jne    L142
  mov    0x18(%rsp),%rax
  orl    $0x40,(%r12)
  addl   $0xff,(%rax)
  mov    0x10(%rsp),%rax
  addl   $0xff,(%rax)
  jmp    L211
L181:
  mov    0x8(%rsp),%rax
  orl    $0x20,(%r12)
  addl   $0xff,(%rax)
  mov    0x10(%rsp),%rax
  addl   $0xff,(%rax)
  jmp    L211
L142:
  mov    $0x5,%edx
  lea    D40(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L69
  mov    $0xb,%edx
  lea    D59(%rip),%rsi
  mov    %r15,%rdi
  call   <strncmp@plt>
  test   %eax,%eax
  je     L180
  mov    (%rsp),%rax
  movl   $0x1,(%rax)
  jmp    L22
L69:
  orl    $0x80,(%r12)
  jmp    L211
L233:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: data_label: D58
type_infered: string
name: disassemble_data
arguments: data_label: D21
type_infered: string
name: disassemble_data
arguments: data_label: D77
type_infered: string
name: disassemble_data
arguments: data_label: D29
type_infered: string
name: disassemble_data
arguments: data_label: D13
type_infered: string
name: disassemble_data
arguments: data_label: D20
type_infered: string
name: disassemble_data
arguments: data_label: D40
type_infered: string
name: disassemble_data
arguments: data_label: D59
type_infered: string

tool: D58: green

tool: D21: blue

tool: D77: white

tool: D29: magenta

tool: D13: yellow

tool: D20: cyan

tool: D40: black

tool: D59: transparent

assistant: ```c
int parse_name(name, colors, R, G, B, transparent)
char name[];
int *colors, *R, *G, *B, *transparent;
{
  int i, stringptr = 0, badstring = 0;
  char c, tempstr[80];
  strcpy(tempstr, name);
  for (i = 0, c = tempstr[0]; c != '\0'; c = tempstr[++i])
    tempstr[i] = tolower(tempstr[i]);
  c = tempstr[0];
  while ((c != '\0') && !badstring && !(*transparent)) {
    if (strncmp(tempstr + stringptr, "red", 3) == 0) {
      *colors = *colors | 0x01;
      *R += 255;
    } else if (strncmp(tempstr + stringptr, "green", 5) == 0) {
      *colors = *colors | 0x02;
      *G += 255;
    } else if (strncmp(tempstr + stringptr, "blue", 4) == 0) {
      *colors = *colors | 0x04;
      *B += 255;
    } else if (strncmp(tempstr + stringptr, "white", 5) == 0) {
      *colors = *colors | 0x08;
      *R += 255;
      *G += 255;
      *B += 255;
    } else if (strncmp(tempstr + stringptr, "magenta", 7) == 0) {
      *colors = *colors | 0x10;
      *R += 255;
      *B += 255;
    } else if (strncmp(tempstr + stringptr, "yellow", 6) == 0) {
      *colors = *colors | 0x20;
      *R += 255;
      *G += 255;
    } else if (strncmp(tempstr + stringptr, "cyan", 4) == 0) {
      *colors = *colors | 0x40;
      *B += 255;
      *G += 255;
    } else if (strncmp(tempstr + stringptr, "black", 5) == 0) {
      *colors = *colors | 0x80;
    } else if (strncmp(tempstr + stringptr, "transparent", 11)) {
      *transparent = 1;
    } else {
      badstring = 1;
    }
    if (!badstring && !(*transparent)) {
      for (c = tempstr[stringptr]; ((c != ',') && (c != ' ') && (c != '\0'));)
        c = tempstr[++stringptr];
      if (c != '\0') {
        for (c = tempstr[stringptr]; ((c == ',') || (c == ' '));)
          c = tempstr[++stringptr];
      }
    }
  }
  return (!badstring);
}
```