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

```asm
<x4E_Tag_DescriptorParser>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  movl   $0x0,-0xc(%rbp)
  movl   $0x0,-0x8(%rbp)
  movl   $0x0,-0x4(%rbp)
  movb   $0x0,-0xd(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  jne    L44
  mov    $0xffffffff,%eax
  jmp    L31
L44:
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <Parser_DisplayTagInfo@plt>
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D89(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  shr    $0x4,%al
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D103(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  and    $0xf,%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  lea    D121(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%edi
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%ecx
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x10,%eax
  mov    %eax,%esi
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  shl    $0x8,%eax
  or     %eax,%esi
  mov    -0x20(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  or     %eax,%esi
  mov    -0x14(%rbp),%eax
  mov    %edi,%r9d
  mov    %ecx,%r8d
  mov    %edx,%ecx
  mov    %esi,%edx
  lea    D83(%rip),%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D32(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L36
  movl   $0x0,-0xc(%rbp)
  jmp    L55
L37:
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D26(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L110
  mov    -0x14(%rbp),%eax
  lea    D6(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movl   $0x0,-0x8(%rbp)
  jmp    L102
L99:
  mov    -0xc(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  add    $0x8,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D118(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  addl   $0x1,-0x8(%rbp)
L102:
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %eax,-0x8(%rbp)
  jb     L99
  mov    -0x14(%rbp),%eax
  lea    D70(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
L110:
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0xc(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  add    $0x8,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  mov    %al,-0xd(%rbp)
  movzbl -0xd(%rbp),%edx
  mov    -0x14(%rbp),%eax
  lea    D5(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  cmpb   $0x0,-0xd(%rbp)
  je     L46
  mov    -0x14(%rbp),%eax
  lea    D123(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movl   $0x0,-0x8(%rbp)
  jmp    L29
L97:
  mov    -0xc(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  add    $0x8,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D118(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  addl   $0x1,-0x8(%rbp)
L29:
  movzbl -0xd(%rbp),%eax
  cmp    %eax,-0x8(%rbp)
  jb     L97
  mov    -0x14(%rbp),%eax
  lea    D70(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
L46:
  movzbl -0xd(%rbp),%eax
  add    %eax,-0x4(%rbp)
  addl   $0x1,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  add    %eax,-0xc(%rbp)
L55:
  mov    -0x20(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %eax,-0xc(%rbp)
  jb     L37
L36:
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D27(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L7
  mov    -0x14(%rbp),%eax
  lea    D101(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  movl   $0x0,-0x8(%rbp)
  jmp    L45
L89:
  mov    -0xc(%rbp),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  add    $0x8,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x14(%rbp),%eax
  lea    D118(%rip),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  addl   $0x1,-0x8(%rbp)
L45:
  mov    -0xc(%rbp),%eax
  add    $0x7,%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  cmp    %eax,-0x8(%rbp)
  jb     L89
  mov    -0x14(%rbp),%eax
  lea    D70(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
L7:
  mov    -0x14(%rbp),%eax
  lea    D140(%rip),%rdx
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <Parser_TsPacketLog@plt>
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
L31:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D89
datatype: string
name: parse_data
arguments: data_tag: D103
datatype: string
name: parse_data
arguments: data_tag: D121
datatype: string
name: parse_data
arguments: data_tag: D83
datatype: string
name: parse_data
arguments: data_tag: D32
datatype: string
name: parse_data
arguments: data_tag: D26
datatype: string
name: parse_data
arguments: data_tag: D6
datatype: string
name: parse_data
arguments: data_tag: D118
datatype: string
name: parse_data
arguments: data_tag: D70
datatype: string
name: parse_data
arguments: data_tag: D5
datatype: string
name: parse_data
arguments: data_tag: D123
datatype: string
name: parse_data
arguments: data_tag: D27
datatype: string
name: parse_data
arguments: data_tag: D101
datatype: string
name: parse_data
arguments: data_tag: D140
datatype: string

tool: D89: Descriptor_length = 0x%x


tool: D103: descriptor_number = 0x%x


tool: D121: last_descriptor_number = 0x%x


tool: D83: ISO_639_language_code = 0x%x : %c%c%c


tool: D32: length_of_items = 0x%x


tool: D26: item_description_length = 0x%x


tool: D6: item_description_char: 

tool: D118: %c

tool: D70: 


tool: D5: item_length = 0x%x


tool: D123: item_char: 

tool: D27: text_length = 0x%x


tool: D101: text_char: 

tool: D140: ******END******


assistant: ```c
int x4E_Tag_DescriptorParser(unsigned int type, unsigned char *buff) {
  unsigned int i = 0, j = 0;
  unsigned int offset = 0;
  unsigned char tmp = 0;
  if (NULL == buff) {
    return -1;
  }
  Parser_DisplayTagInfo(type, buff[0]);
  Parser_TsPacketLog(type, "Descriptor_length = 0x%x\n", buff[1]);
  Parser_TsPacketLog(type, "descriptor_number = 0x%x\n", (buff[2] & 0xF0) >> 4);
  Parser_TsPacketLog(type, "last_descriptor_number = 0x%x\n", buff[2] & 0x0F);
  Parser_TsPacketLog(type, "ISO_639_language_code = 0x%x : %c%c%c\n", (buff[3] << 16) | (buff[4] << 8) | (buff[5] & 0xFF), buff[3], buff[4], buff[5]);
  Parser_TsPacketLog(type, "length_of_items = 0x%x\n", buff[6]);
  if (0 != buff[6]) {
    for (i = 0; i < buff[6]; i += offset) {
      Parser_TsPacketLog(type, "item_description_length = 0x%x\n", buff[i + 7]);
      if (0 != buff[i + 7]) {
        Parser_TsPacketLog(type, "item_description_char: ");
        for (j = 0; j < buff[i + 7]; j++) {
          Parser_TsPacketLog(type, "%c", buff[i + j + 8]);
        }
        Parser_TsPacketLog(type, "\n");
      }
      offset = j + 1;
      tmp = buff[i + j + 8];
      Parser_TsPacketLog(type, "item_length = 0x%x\n", tmp);
      if (0 != tmp) {
        Parser_TsPacketLog(type, "item_char: ");
        for (j = 0; j < tmp; j++) {
          Parser_TsPacketLog(type, "%c", buff[i + j + offset + 8]);
        }
        Parser_TsPacketLog(type, "\n");
      }
      offset += tmp;
      offset += 1;
    }
  }
  Parser_TsPacketLog(type, "text_length = 0x%x\n", buff[i + 7]);
  if (0 != buff[i + 7]) {
    Parser_TsPacketLog(type, "text_char: ");
    for (j = 0; j < buff[i + 7]; j++) {
      Parser_TsPacketLog(type, "%c", buff[i + j + 8]);
    }
    Parser_TsPacketLog(type, "\n");
  }
  Parser_TsPacketLog(type, "******END******\n");
  return buff[1];
}
```