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

```asm
<parseUTF8char>:
  endbr64
  push   %r14
  movq   $0x0,(%rsi)
  push   %r13
  mov    %rsi,%r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  push   %rbx
  movsbl (%rdi),%edi
  call   <hexDigitToValue@plt>
  movsbl 0x1(%r12),%edi
  mov    %eax,%ebp
  call   <hexDigitToValue@plt>
  movsbl 0x2(%r12),%edi
  shl    $0x4,%ebp
  add    %eax,%ebp
  call   <hexDigitToValue@plt>
  movsbl 0x3(%r12),%edi
  mov    %eax,%ebx
  call   <hexDigitToValue@plt>
  mov    %eax,%r8d
  mov    %ebx,%eax
  shl    $0x4,%eax
  add    %r8b,%al
  mov    %eax,%ebx
  js     L30
  test   %bpl,%bpl
  jne    L47
  xor    %eax,%eax
  test   %bl,%bl
  setne  %al
  mov    %rax,0x0(%r13)
  jne    L53
  pop    %rbx
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L47:
  mov    %eax,%r12d
  shr    $0x6,%al
  and    $0x3f,%r12d
  or     $0xffffff80,%r12d
L6:
  lea    0x0(,%rbp,4),%ebx
  and    $0x3c,%ebx
  or     %eax,%ebx
  mov    %ebx,%r14d
  or     $0xffffff80,%r14d
  cmp    $0xf,%bpl
  jbe    L54
  movq   $0x3,0x0(%r13)
  mov    $0x3,%edi
  shr    $0x4,%bpl
  or     $0xffffffe0,%ebp
  call   <malloc@plt>
  mov    %bpl,(%rax)
  mov    %r14b,0x1(%rax)
  mov    %r12b,0x2(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L30:
  mov    %eax,%r12d
  shr    $0x6,%al
  and    $0x3f,%r12d
  mov    %eax,%ebx
  or     $0xffffff80,%r12d
  or     $0xffffffc0,%ebx
  test   %bpl,%bpl
  jne    L6
L49:
  movq   $0x2,0x0(%r13)
  mov    $0x2,%edi
  call   <malloc@plt>
  mov    %bl,(%rax)
  mov    %r12b,0x1(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L54:
  or     $0xffffffc0,%ebx
  jmp    L49
L53:
  mov    $0x1,%edi
  call   <malloc@plt>
  mov    %bl,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
char *parseUTF8char(const char *str, size_t *len) {
  unsigned char plane[2] = {0, 0};
  unsigned char utf8Value[3] = {0, 0, 0};
  char *utf8char = NULL;
  *len = 0;
  plane[0] = hexDigitToValue(str[0]) * 16 + hexDigitToValue(str[1]);
  plane[1] = hexDigitToValue(str[2]) * 16 + hexDigitToValue(str[3]);
  if (plane[1] > 127 || plane[0] != 0) {
    utf8Value[2] = plane[1] & 63;
    utf8Value[2] |= 128;
    utf8Value[1] = plane[1] >> 6;
    if (plane[0] != 0) {
      unsigned char tmp = (plane[0] << 2) & 63;
      utf8Value[1] |= tmp;
      utf8Value[1] |= 128;
      if (plane[0] > 15) {
        utf8Value[0] = plane[0] >> 4;
        utf8Value[0] |= 224;
      } else {
        utf8Value[1] |= 64;
      }
    } else {
      utf8Value[1] |= 192;
    }
  } else {
    utf8Value[2] = plane[1];
  }
  *len = (utf8Value[0] != 0) + (utf8Value[1] != 0) + (utf8Value[2] != 0);
  if (*len == 0) {
    return NULL;
  }
  utf8char = malloc(sizeof(char) * *len);
  if (utf8Value[0] != 0) {
    utf8char[0] = utf8Value[0];
    utf8char[1] = utf8Value[1];
    utf8char[2] = utf8Value[2];
  } else if (utf8Value[1] != 0) {
    utf8char[0] = utf8Value[1];
    utf8char[1] = utf8Value[2];
  } else {
    utf8char[0] = utf8Value[2];
  }
  return utf8char;
}
```