user: What would the C source look like for the assembly code provided here?

```asm
<parse_edlf>:
  endbr64
  cmpb   $0xa,(%rdi)
  je     L48
  ret
  nopw   0x0(%rax,%rax,1)
L48:
  push   %r15
  movslq %esi,%rsi
  mov    %rdx,%rcx
  xor    %r15d,%r15d
  push   %r14
  lea    0x1(%rdi),%rdx
  movabs $0xcccccccccccccccd,%r14
  push   %r13
  movabs $0x1999999999999999,%r13
  push   %r12
  movabs $0x3333333333333332,%r12
  push   %rbp
  lea    (%rdi,%rsi,1),%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
L87:
  mov    %rdx,%rax
  sub    %rbx,%rax
  add    $0x1,%rax
  imul   %r14,%rax
  add    %r13,%rax
  cmp    %rax,%r12
  sbb    $0xffffffffffffffff,%rdx
  cmp    %rbp,%rdx
  jae    L128
  mov    %rdx,%rax
  xor    %r8d,%r8d
  movzbl (%rdx),%esi
  sub    %rbx,%rax
  add    $0x2,%rax
  imul   %r14,%rax
  add    %r13,%rax
  cmp    %r12,%rax
  setbe  %r8b
  lea    0x1(%rdx,%r8,1),%r8
  cmp    %rbp,%r8
  jae    L128
  movzbl (%r8),%edx
  cmp    $0x5a,%sil
  je     L65
  ja     L106
  cmp    $0x7,%sil
  je     L128
  cmp    $0x55,%sil
  jne    L63
  cmp    $0x7,%dl
  jne    L130
  add    $0x1,%r15d
  lea    0x1(%r8),%rdx
  jmp    L87
  nopl   0x0(%rax,%rax,1)
L106:
  cmp    $0xa5,%sil
  je     L54
  cmp    $0xaa,%sil
  jne    L63
  shl    $0x8,%edx
  mov    %r15d,%eax
  mov    %dh,%ah
  lea    0x1(%r8),%rdx
  mov    %eax,%r15d
  jmp    L87
L128:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L54:
  mov    %dl,%r15b
  lea    0x1(%r8),%rdx
  jmp    L87
L63:
  lea    D14(%rip),%rdi
L96:
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1060 <printf@plt>
  cs nopw 0x0(%rax,%rax,1)
L65:
  movzwl %r15w,%esi
  mov    %rcx,%rdi
  mov    %r8,0x8(%rsp)
  add    $0x1,%r15d
  mov    %rcx,(%rsp)
  call   <image_data_set@plt>
  mov    0x8(%rsp),%r8
  mov    (%rsp),%rcx
  lea    0x1(%r8),%rdx
  jmp    L87
L130:
  movzbl %dl,%esi
  lea    D19(%rip),%rdi
  jmp    L96
```

tool_calls: name: extract_symbolic_data
arguments: label: D14
datatype: string
name: extract_symbolic_data
arguments: label: D19
datatype: string

tool: D14: Illegal tag 0x%02x


tool: D19: Invalid NULL data byte 0x%02x


assistant: ```c
void parse_edlf(unsigned char *start, int bytes, struct image_data *idata) {
  unsigned char *s = start;
  unsigned char *end = start + bytes;
  unsigned short cci = 0;
  if (*s++ != 0x0a)
    return;
  while (1) {
    unsigned char tag, data;
    if ((s - start + 1) % 5 == 0)
      s++;
    if (s >= end)
      return;
    tag = *s++;
    if ((s - start + 1) % 5 == 0)
      s++;
    if (s >= end)
      return;
    data = *s++;
    switch (tag) {
    case 0x07:
      return;
    case 0xaa:
      cci = (cci & 0xff) | (((unsigned short)data) << 8);
      break;
    case 0xa5:
      cci = (cci & 0xff00) | data;
      break;
    case 0x5a:
      image_data_set(idata, cci, data);
      cci += 1;
      break;
    case 0x55:
      if (data != 0x07) {
        printf("Invalid NULL data byte 0x%02x\n", data);
        return;
      }
      cci += 1;
      break;
    default:
      printf("Illegal tag 0x%02x\n", tag);
      return;
    }
  }
}
```