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

```asm
<PRStringConstructorInt>:
  endbr64
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  test   %edi,%edi
  js     L174
  je     L5
  xor    %r11d,%r11d
L121:
  mov    %rsp,%r9
  xor    %edx,%edx
  mov    $0xcccccccd,%r10d
  mov    %r9,%r8
  nopw   0x0(%rax,%rax,1)
L152:
  mov    %edi,%eax
  mov    %edx,%esi
  add    $0x1,%r8
  add    $0x1,%edx
  imul   %r10,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%ecx
  add    %ecx,%ecx
  sub    %ecx,%edi
  add    $0x30,%edi
  mov    %dil,-0x1(%r8)
  mov    %eax,%edi
  test   %eax,%eax
  jne    L152
  test   %r11d,%r11d
  je     L57
  movslq %edx,%rcx
  lea    0x2(%rsi),%eax
  mov    %edx,%esi
  movb   $0x2d,(%rsp,%rcx,1)
  mov    %eax,%edx
L131:
  movslq %esi,%rax
  movzbl (%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %cl,(%rsp,%rax,1)
  lea    -0x1(%rsi),%eax
  mov    %dil,(%rsp)
  cmp    $0x1,%eax
  jle    L64
  cltq
  movzbl 0x1(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x1(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x2(%rsi),%eax
  cmp    $0x2,%eax
  jle    L64
  cltq
  movzbl 0x2(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x2(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x3(%rsi),%eax
  cmp    $0x3,%eax
  jle    L64
  cltq
  movzbl 0x3(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x3(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x4(%rsi),%eax
  cmp    $0x4,%eax
  jle    L64
  cltq
  movzbl 0x4(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x4(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x5(%rsi),%eax
  cmp    $0x5,%eax
  jle    L64
  cltq
  movzbl 0x5(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x5(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x6(%rsi),%eax
  cmp    $0x6,%eax
  jle    L64
  cltq
  movzbl 0x6(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x6(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x7(%rsi),%eax
  cmp    $0x7,%eax
  jle    L64
  cltq
  movzbl 0x7(%rsp),%ecx
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x7(%rsp)
  mov    %cl,(%rsp,%rax,1)
  lea    -0x8(%rsi),%eax
  cmp    $0x8,%eax
  jle    L64
  cltq
  movzbl 0x8(%rsp),%ecx
  sub    $0x9,%esi
  movzbl (%rsp,%rax,1),%edi
  mov    %dil,0x8(%rsp)
  mov    %cl,(%rsp,%rax,1)
  cmp    $0x9,%esi
  jle    L64
  movslq %esi,%rsi
  movzbl 0x9(%rsp),%eax
  movzbl (%rsp,%rsi,1),%ecx
  mov    %cl,0x9(%rsp)
  mov    %al,(%rsp,%rsi,1)
L64:
  movslq %edx,%rdx
  mov    %r9,%rdi
  movb   $0x0,(%rsp,%rdx,1)
  call   <PRStringConstructorCStr@plt>
  mov    0x18(%rsp),%rdx
  sub    %fs:0x28,%rdx
  jne    L73
  add    $0x28,%rsp
  ret
  nopw   0x0(%rax,%rax,1)
L5:
  movb   $0x30,(%rsp)
  mov    $0x1,%edx
  mov    %rsp,%r9
  jmp    L64
  xchg   %ax,%ax
L174:
  neg    %edi
  mov    $0x1,%r11d
  jmp    L121
  nopl   (%rax)
L57:
  test   %esi,%esi
  jne    L131
  jmp    L64
L73:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
struct String *PRStringConstructorInt(int num) {
  char str[20], tmp = 0;
  int len = 0, isNeg = 0, i = 0, j = 0;
  ;
  if (num < 0) {
    isNeg = 1;
    num = -num;
  }
  if (num == 0) {
    str[len++] = '0';
  } else {
    while (num > 0) {
      str[len++] = (char)(num % 10) + '0';
      num /= 10;
    }
  }
  if (isNeg)
    str[len++] = '-';
  for (i = 0, j = len - 1; i < j; ++i, --j) {
    tmp = str[i];
    str[i] = str[j];
    str[j] = tmp;
  }
  str[len] = 0;
  ;
  return PRStringConstructorCStr((char *)str);
}
```