user: Converte this assembly snippet into its equivalent C code:

```asm
<util_nstrcat>:
  endbr64
  sub    $0x28,%rsp
  mov    $0x7830,%ecx
  mov    %rsi,%rax
  mov    %fs:0x28,%rdx
  mov    %rdx,0x18(%rsp)
  xor    %edx,%edx
  mov    %esi,%edx
  mov    %cx,0xc(%rsp)
  shr    $0x1c,%edx
  je     L37
  cmp    $0xa,%edx
  lea    0x57(%rdx),%esi
  lea    0x30(%rdx),%ecx
  mov    %rax,%rdx
  cmovl  %ecx,%esi
  shr    $0x18,%rdx
  lea    0xf(%rsp),%r8
  and    $0xf,%edx
  mov    %sil,0xe(%rsp)
L45:
  cmp    $0xa,%edx
  lea    0x57(%rdx),%esi
  lea    0x30(%rdx),%ecx
  cmovl  %ecx,%esi
  mov    %esi,%edx
  lea    0x1(%r8),%rsi
  mov    %dl,(%r8)
  mov    %rax,%rdx
  shr    $0x14,%rdx
  and    $0xf,%edx
L43:
  lea    0x57(%rdx),%r8d
  cmp    $0xa,%edx
  lea    0x30(%rdx),%ecx
  mov    %r8d,%edx
  lea    0x1(%rsi),%r8
  cmovl  %ecx,%edx
  mov    %dl,(%rsi)
  mov    %rax,%rdx
  shr    $0x10,%rdx
  and    $0xf,%edx
L1:
  cmp    $0xa,%edx
  lea    0x57(%rdx),%esi
  lea    0x30(%rdx),%ecx
  cmovl  %ecx,%esi
  mov    %esi,%edx
  lea    0x1(%r8),%rsi
  mov    %dl,(%r8)
  mov    %rax,%rdx
  shr    $0xc,%rdx
  and    $0xf,%edx
L148:
  lea    0x57(%rdx),%r8d
  cmp    $0xa,%edx
  lea    0x30(%rdx),%ecx
  mov    %r8d,%edx
  lea    0x1(%rsi),%r8
  cmovl  %ecx,%edx
  mov    %dl,(%rsi)
  mov    %rax,%rdx
  shr    $0x8,%rdx
  and    $0xf,%edx
L113:
  cmp    $0xa,%edx
  lea    0x57(%rdx),%esi
  lea    0x30(%rdx),%ecx
  cmovl  %ecx,%esi
  mov    %esi,%edx
  lea    0x1(%r8),%rsi
  mov    %dl,(%r8)
  mov    %rax,%rdx
  shr    $0x4,%rdx
  and    $0xf,%edx
L88:
  lea    0x57(%rdx),%r8d
  lea    0x30(%rdx),%ecx
  cmp    $0xa,%edx
  mov    %r8d,%edx
  cmovl  %ecx,%edx
  lea    0x1(%rsi),%rcx
  and    $0xf,%eax
  mov    %dl,(%rsi)
L8:
  lea    0x30(%rax),%esi
  lea    0x57(%rax),%edx
  cmp    $0x9,%eax
  cmovle %esi,%edx
  lea    0x1(%rcx),%rax
  mov    %dl,(%rcx)
L80:
  mov    $0x20,%edx
  lea    0xc(%rsp),%rsi
  mov    %dx,(%rax)
  call   <strcat@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L94
  add    $0x28,%rsp
  ret
  nopl   0x0(%rax,%rax,1)
L37:
  mov    %rsi,%rdx
  shr    $0x18,%rdx
  and    $0xf,%edx
  jne    L100
  mov    %rsi,%rdx
  shr    $0x14,%rdx
  and    $0xf,%edx
  jne    L90
  mov    %rsi,%rdx
  shr    $0x10,%rdx
  and    $0xf,%edx
  jne    L158
  mov    %rsi,%rdx
  shr    $0xc,%rdx
  and    $0xf,%edx
  jne    L57
  mov    %rsi,%rdx
  shr    $0x8,%rdx
  and    $0xf,%edx
  jne    L72
  mov    %rsi,%rdx
  shr    $0x4,%rdx
  and    $0xf,%edx
  jne    L168
  and    $0xf,%eax
  jne    L121
  movb   $0x30,0xe(%rsp)
  lea    0xf(%rsp),%rax
  jmp    L80
L100:
  lea    0xe(%rsp),%r8
  jmp    L45
L90:
  lea    0xe(%rsp),%rsi
  jmp    L43
L158:
  lea    0xe(%rsp),%r8
  jmp    L1
L57:
  lea    0xe(%rsp),%rsi
  jmp    L148
L72:
  lea    0xe(%rsp),%r8
  jmp    L113
L168:
  lea    0xe(%rsp),%rsi
  jmp    L88
L121:
  lea    0xe(%rsp),%rcx
  jmp    L8
L94:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void util_nstrcat(char *str, unsigned long number) {
  int n = 10, lead = 1;
  char nbuf[12], *p;
  p = nbuf;
  *p++ = '0';
  *p++ = 'x';
  for (n = 0; n < 8; n++) {
    int i;
    i = (number >> ((7 - n) * 4)) & 0xF;
    if (!lead || i) {
      *p++ = i < 10 ? '0' + i : 'a' + i - 10;
      lead = 0;
    }
  }
  if (lead)
    *p++ = '0';
  *p++ = ' ';
  *p++ = '\0';
  strcat(str, nbuf);
}
```