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

```asm
<prs_decompress_size>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x48(%rbp)
  movl   $0x9,-0x34(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movq   $0x0,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  addq   $0x4,-0x18(%rbp)
L102:
  subl   $0x1,-0x34(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jne    L68
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  movl   $0x8,-0x34(%rbp)
  addq   $0x4,-0x18(%rbp)
L68:
  mov    -0x30(%rbp),%eax
  and    $0x1,%eax
  mov    %eax,-0x24(%rbp)
  sarl   -0x30(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  je     L14
  addq   $0x4,-0x18(%rbp)
  addq   $0x4,-0x10(%rbp)
  jmp    L23
L14:
  subl   $0x1,-0x34(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jne    L123
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  movl   $0x8,-0x34(%rbp)
  addq   $0x4,-0x18(%rbp)
L123:
  mov    -0x30(%rbp),%eax
  and    $0x1,%eax
  mov    %eax,-0x24(%rbp)
  sarl   -0x30(%rbp)
  cmpl   $0x0,-0x24(%rbp)
  je     L93
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  or     -0x3c(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  addq   $0x8,-0x18(%rbp)
  cmpl   $0x0,-0x20(%rbp)
  jne    L113
  mov    -0x10(%rbp),%rax
  sub    -0x8(%rbp),%rax
  sar    $0x2,%rax
  jmp    L149
L113:
  andl   $0x7,-0x3c(%rbp)
  mov    -0x20(%rbp),%eax
  sar    $0x3,%eax
  or     $0xffffe000,%eax
  mov    %eax,-0x38(%rbp)
  cmpl   $0x0,-0x3c(%rbp)
  jne    L69
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x3c(%rbp)
  addq   $0x4,-0x18(%rbp)
  addl   $0x1,-0x3c(%rbp)
  jmp    L56
L69:
  addl   $0x2,-0x3c(%rbp)
L56:
  mov    -0x10(%rbp),%rax
  add    %eax,-0x38(%rbp)
  jmp    L48
L93:
  movl   $0x0,-0x3c(%rbp)
  movl   $0x0,-0x2c(%rbp)
  jmp    L15
L81:
  subl   $0x1,-0x34(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  jne    L66
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  movl   $0x8,-0x34(%rbp)
  addq   $0x4,-0x18(%rbp)
L66:
  mov    -0x30(%rbp),%eax
  and    $0x1,%eax
  mov    %eax,-0x24(%rbp)
  sarl   -0x30(%rbp)
  mov    -0x3c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  or     -0x24(%rbp),%eax
  mov    %eax,-0x3c(%rbp)
  addl   $0x1,-0x2c(%rbp)
L15:
  cmpl   $0x1,-0x2c(%rbp)
  jle    L81
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  or     $0xffffff00,%eax
  mov    %eax,-0x20(%rbp)
  addl   $0x2,-0x3c(%rbp)
  addq   $0x4,-0x18(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %eax,%edx
  mov    -0x20(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x38(%rbp)
L48:
  cmpl   $0x0,-0x3c(%rbp)
  je     L36
  mov    -0x3c(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  movl   $0x0,-0x2c(%rbp)
  jmp    L112
L126:
  addl   $0x1,-0x38(%rbp)
  addl   $0x1,-0x3c(%rbp)
  addq   $0x4,-0x10(%rbp)
  addl   $0x1,-0x2c(%rbp)
L112:
  mov    -0x2c(%rbp),%eax
  cmp    -0x1c(%rbp),%eax
  jl     L126
  jmp    L102
L36:
  nop
L23:
  jmp    L102
L149:
  pop    %rbp
  ret
```

assistant: ```c
uint32_t prs_decompress_size(void *source) {
  uint32_t r0, r3, r5, r6, r9;
  uint32_t bitpos = 9;
  uint8_t *sourceptr = (uint8_t *)source;
  uint8_t *destptr = NULL;
  uint8_t *destptr_orig = NULL;
  uint8_t currentbyte, lastbyte;
  bool flag;
  int offset;
  uint32_t x, t;
  currentbyte = sourceptr[0];
  sourceptr++;
  for (;;) {
    bitpos--;
    if (bitpos == 0) {
      lastbyte = currentbyte = sourceptr[0];
      bitpos = 8;
      sourceptr++;
    }
    flag = currentbyte & 1;
    currentbyte = currentbyte >> 1;
    if (flag) {
      sourceptr++;
      destptr++;
      continue;
    }
    bitpos--;
    if (bitpos == 0) {
      lastbyte = currentbyte = sourceptr[0];
      bitpos = 8;
      sourceptr++;
    }
    flag = currentbyte & 1;
    currentbyte = currentbyte >> 1;
    if (flag) {
      r3 = sourceptr[0];
      offset = (sourceptr[1] << 8) | r3;
      sourceptr += 2;
      if (offset == 0) {
        return (uint32_t)(destptr - destptr_orig);
      }
      r3 = r3 & 0x00000007;
      r5 = (offset >> 3) | 0xFFFFE000;
      if (r3 == 0) {
        r3 = sourceptr[0];
        sourceptr++;
        r3++;
      } else {
        r3 += 2;
      }
      r5 += (uint32_t)destptr;
    } else {
      r3 = 0;
      for (x = 0; x < 2; x++) {
        bitpos--;
        if (bitpos == 0) {
          lastbyte = currentbyte = sourceptr[0];
          bitpos = 8;
          sourceptr++;
        }
        flag = currentbyte & 1;
        currentbyte = currentbyte >> 1;
        offset = r3 << 1;
        r3 = offset | flag;
      }
      offset = sourceptr[0] | 0xFFFFFF00;
      r3 += 2;
      sourceptr++;
      r5 = offset + (uint32_t)destptr;
    }
    if (r3 == 0) {
      continue;
    }
    t = r3;
    for (x = 0; x < t; x++) {
      r5++;
      r3++;
      destptr++;
    }
  }
}
```