user: 请将以下的汇编代码转换成C语言代码：

```asm
<get_colamd>:
  endbr64
  push   %r15
  mov    %r8,%r15
  push   %r14
  mov    %edx,%r14d
  mov    %esi,%edx
  push   %r13
  push   %r12
  mov    %r9,%r12
  push   %rbp
  push   %rbx
  mov    %esi,%ebx
  mov    %edi,%esi
  sub    $0x238,%rsp
  mov    %rcx,0x18(%rsp)
  mov    %edi,0x28(%rsp)
  mov    %r14d,%edi
  mov    %fs:0x28,%rax
  mov    %rax,0x228(%rsp)
  xor    %eax,%eax
  call   <colamd_recommended@plt>
  lea    0x80(%rsp),%rsi
  mov    %rsi,%rdi
  mov    %eax,%ebp
  mov    %rsi,0x10(%rsp)
  mov    %eax,0xc(%rsp)
  call   <colamd_set_defaults@plt>
  lea    0x0(,%rbp,4),%edi
  call   <superlu_malloc@plt>
  mov    0x18(%rsp),%r11
  test   %rax,%rax
  mov    %rax,%r13
  je     L204
L144:
  lea    0x1(%rbx),%r9d
  mov    %r11,0x20(%rsp)
  lea    0x0(,%r9,4),%edi
  mov    %r9d,0x18(%rsp)
  call   <superlu_malloc@plt>
  mov    0x18(%rsp),%r9d
  mov    0x20(%rsp),%r11
  test   %rax,%rax
  mov    %rax,%rbp
  je     L200
L163:
  test   %ebx,%ebx
  js     L214
  lea    0x4(%r11),%rdx
  mov    %rbp,%rax
  sub    %rdx,%rax
  cmp    $0x8,%rax
  jbe    L202
  cmp    $0x2,%ebx
  jbe    L202
  mov    %r9d,%edx
  mov    %r11,%rcx
  mov    %rbp,%rax
  shr    $0x2,%edx
  sub    %rbp,%rcx
  shl    $0x4,%rdx
  add    %rbp,%rdx
  nopl   0x0(%rax)
L246:
  movdqu (%rax,%rcx,1),%xmm0
  add    $0x10,%rax
  movups %xmm0,-0x10(%rax)
  cmp    %rdx,%rax
  jne    L246
  mov    %r9d,%eax
  and    $0xfffffffc,%eax
  and    $0x3,%r9d
  je     L214
  movslq %eax,%rcx
  mov    (%r11,%rcx,4),%esi
  lea    0x0(,%rcx,4),%rdx
  mov    %esi,0x0(%rbp,%rcx,4)
  lea    0x1(%rax),%ecx
  cmp    %ecx,%ebx
  jl     L214
  mov    0x4(%r11,%rdx,1),%ecx
  add    $0x2,%eax
  mov    %ecx,0x4(%rbp,%rdx,1)
  cmp    %eax,%ebx
  jl     L214
  mov    0x8(%r11,%rdx,1),%eax
  mov    %eax,0x8(%rbp,%rdx,1)
L214:
  test   %r14d,%r14d
  jle    L89
  lea    0x4(%r15),%rdx
  mov    %r13,%rax
  sub    %rdx,%rax
  cmp    $0x8,%rax
  jbe    L228
  lea    -0x1(%r14),%eax
  cmp    $0x2,%eax
  jbe    L228
  mov    %r14d,%edx
  mov    %r15,%rcx
  mov    %r13,%rax
  shr    $0x2,%edx
  sub    %r13,%rcx
  shl    $0x4,%rdx
  add    %r13,%rdx
  nopl   0x0(%rax)
L61:
  movdqu (%rax,%rcx,1),%xmm1
  add    $0x10,%rax
  movups %xmm1,-0x10(%rax)
  cmp    %rdx,%rax
  jne    L61
  mov    %r14d,%eax
  and    $0xfffffffc,%eax
  test   $0x3,%r14b
  je     L89
  mov    %eax,%ecx
  mov    (%r15,%rcx,4),%esi
  lea    0x0(,%rcx,4),%rdx
  mov    %esi,0x0(%r13,%rcx,4)
  lea    0x1(%rax),%ecx
  cmp    %r14d,%ecx
  jge    L89
  mov    0x4(%r15,%rdx,1),%ecx
  add    $0x2,%eax
  mov    %ecx,0x4(%r13,%rdx,1)
  cmp    %eax,%r14d
  jle    L89
  mov    0x8(%r15,%rdx,1),%eax
  mov    %eax,0x8(%r13,%rdx,1)
L89:
  sub    $0x8,%rsp
  mov    %r13,%rcx
  mov    %rbp,%r8
  mov    %ebx,%esi
  lea    0x38(%rsp),%rax
  push   %rax
  mov    0x20(%rsp),%r9
  mov    0x1c(%rsp),%edx
  mov    0x38(%rsp),%edi
  call   <colamd@plt>
  pop    %rdx
  pop    %rcx
  test   %eax,%eax
  je     L176
L16:
  test   %ebx,%ebx
  jle    L62
  mov    %rbp,%rdx
  xor    %eax,%eax
  nopl   0x0(%rax)
L31:
  movslq (%rdx),%rcx
  add    $0x4,%rdx
  mov    %eax,(%r12,%rcx,4)
  add    $0x1,%eax
  cmp    %eax,%ebx
  jne    L31
L62:
  mov    %r13,%rdi
  call   <superlu_free@plt>
  mov    %rbp,%rdi
  call   <superlu_free@plt>
  mov    0x228(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L213
  add    $0x238,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L200:
  lea    0x120(%rsp),%rdi
  lea    D34(%rip),%r8
  mov    $0x23,%ecx
  mov    %r9d,0x2c(%rsp)
  lea    D42(%rip),%rdx
  lea    D45(%rip),%rsi
  mov    %rdi,0x18(%rsp)
  call   <sprintf@plt>
  mov    0x18(%rsp),%rdi
  call   <superlu_abort_and_exit@plt>
  mov    0x2c(%rsp),%r9d
  mov    0x20(%rsp),%r11
  jmp    L163
  nopw   0x0(%rax,%rax,1)
L204:
  lea    0x120(%rsp),%rbp
  lea    D34(%rip),%r8
  mov    $0x21,%ecx
  lea    D31(%rip),%rdx
  lea    D45(%rip),%rsi
  mov    %rbp,%rdi
  call   <sprintf@plt>
  mov    %rbp,%rdi
  call   <superlu_abort_and_exit@plt>
  mov    0x18(%rsp),%r11
  jmp    L144
  nopl   0x0(%rax)
L176:
  lea    0x120(%rsp),%r14
  lea    D34(%rip),%r8
  mov    $0x27,%ecx
  mov    %r14,%rdi
  lea    D26(%rip),%rdx
  lea    D45(%rip),%rsi
  call   <sprintf@plt>
  mov    %r14,%rdi
  call   <superlu_abort_and_exit@plt>
  jmp    L16
  nop
L228:
  mov    %r14d,%r14d
  mov    %r15,%r10
  mov    %r13,%rax
  lea    0x0(%r13,%r14,4),%rcx
  sub    %r13,%r10
  nopl   0x0(%rax)
L34:
  mov    (%r10,%rax,1),%edx
  add    $0x4,%rax
  mov    %edx,-0x4(%rax)
  cmp    %rcx,%rax
  jne    L34
  jmp    L89
  nopl   (%rax)
L202:
  movslq %ebx,%rax
  sub    %rbp,%r11
  lea    0x4(%rbp,%rax,4),%rcx
  mov    %rbp,%rax
  xchg   %ax,%ax
L104:
  mov    (%r11,%rax,1),%edx
  add    $0x4,%rax
  mov    %edx,-0x4(%rax)
  cmp    %rcx,%rax
  jne    L104
  jmp    L214
L213:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D34
type: string
name: disassemble_data
arguments: label: D42
type: string
name: disassemble_data
arguments: label: D45
type: string
name: disassemble_data
arguments: label: D31
type: string
name: disassemble_data
arguments: label: D26
type: string

tool: D34: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/Narrat/eispice/refs/heads/master/libs/superlu/SRC/get_perm_c.c

tool: D42: Malloc fails for p[]

tool: D45: %s at line %d in file %s


tool: D31: Malloc fails for A[]

tool: D26: COLAMD failed

assistant: ```c
void get_colamd(const int m, const int n, const int nnz, int *colptr, int *rowind, int *perm_c) {
  int Alen, *A, i, info, *p;
  double knobs[20];
  int stats[20];
  Alen = colamd_recommended(nnz, m, n);
  colamd_set_defaults(knobs);
  if (!(A = (int *)superlu_malloc(Alen * sizeof(int)))) {
    char msg[256];
    sprintf(msg, "%s at line %d in file %s\n", "Malloc fails for A[]", 33, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/Narrat/eispice/refs/heads/master/libs/superlu/SRC/get_perm_c.c");
    superlu_abort_and_exit(msg);
  };
  if (!(p = (int *)superlu_malloc((n + 1) * sizeof(int)))) {
    char msg[256];
    sprintf(msg, "%s at line %d in file %s\n", "Malloc fails for p[]", 35, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/Narrat/eispice/refs/heads/master/libs/superlu/SRC/get_perm_c.c");
    superlu_abort_and_exit(msg);
  };
  for (i = 0; i <= n; ++i)
    p[i] = colptr[i];
  for (i = 0; i < nnz; ++i)
    A[i] = rowind[i];
  info = colamd(m, n, Alen, A, p, knobs, stats);
  if (info == 0) {
    char msg[256];
    sprintf(msg, "%s at line %d in file %s\n", "COLAMD failed", 39, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/Narrat/eispice/refs/heads/master/libs/superlu/SRC/get_perm_c.c");
    superlu_abort_and_exit(msg);
  };
  for (i = 0; i < n; ++i)
    perm_c[p[i]] = i;
  superlu_free(A);
  superlu_free(p);
}
```