user: Translate the below assembly code into C programming language:

```asm
<_glp_qmdupd>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    0xa0(%rsp),%rax
  mov    %rsi,0x8(%rsp)
  mov    %r9,0x10(%rsp)
  mov    0xa8(%rsp),%rbx
  mov    %rax,0x38(%rsp)
  mov    0xb0(%rsp),%rax
  mov    0xb8(%rsp),%r15
  mov    %rax,0x30(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x58(%rsp)
  xor    %eax,%eax
  mov    (%rdx),%eax
  test   %eax,%eax
  jle    L48
  lea    0x4(%rsi),%rax
  mov    %rdx,0x18(%rsp)
  mov    %rdi,%r12
  xor    %edi,%edi
  mov    %rax,0x28(%rsp)
  mov    %r8,%rbp
  xor    %r10d,%r10d
  xor    %r8d,%r8d
  mov    %rcx,0x20(%rsp)
  mov    $0x1,%r9d
  mov    %edi,%r14d
  movl   $0x0,0x48(%rsp)
  movl   $0x0,0x4c(%rsp)
  nopw   0x0(%rax,%rax,1)
L30:
  mov    0x20(%rsp),%rax
  mov    0x10(%rsp),%rdi
  movslq (%rax,%r9,4),%rax
  mov    (%r12,%rax,4),%ecx
  mov    0x4(%r12,%rax,4),%edx
  mov    %rax,%r11
  add    (%rdi,%rax,4),%r10d
  mov    %r10d,%r13d
  cmp    %ecx,%edx
  jle    L88
  sub    %ecx,%edx
  movslq %ecx,%rsi
  mov    0x8(%rsp),%rax
  mov    0x28(%rsp),%rdi
  sub    $0x1,%edx
  add    %rsi,%rdx
  lea    (%rax,%rsi,4),%rax
  lea    (%rdi,%rdx,4),%rdi
  nopw   0x0(%rax,%rax,1)
L65:
  movslq (%rax),%rdx
  lea    (%rbx,%rdx,4),%rsi
  mov    %rdx,%rcx
  cmpl   $0x0,(%rsi)
  jne    L161
  mov    0x0(%rbp,%rdx,4),%edx
  test   %edx,%edx
  jns    L161
  add    $0x1,%r8d
  movl   $0xffffffff,(%rsi)
  mov    $0x1,%r14d
  movslq %r8d,%rdx
  mov    %ecx,(%r15,%rdx,4)
L161:
  add    $0x4,%rax
  cmp    %rax,%rdi
  jne    L65
L88:
  mov    0x18(%rsp),%rax
  add    $0x1,%r9
  mov    (%rax),%eax
  cmp    %r9d,%eax
  jge    L30
  mov    %r13d,%edi
  mov    %r14d,%esi
  mov    %r11d,0x50(%rsp)
  mov    0x20(%rsp),%r14
  mov    %edi,0x48(%rsp)
  mov    0x18(%rsp),%r13
  test   %sil,%sil
  je     L77
  mov    %r8d,0x4c(%rsp)
  test   %r8d,%r8d
  je     L77
  movslq %r8d,%r8
  sub    $0x8,%rsp
  mov    %rbx,%r9
  mov    %rbp,%rdx
  lea    0x4(%r15,%r8,4),%rax
  mov    %r12,%rdi
  push   %rax
  push   0x40(%rsp)
  push   %r15
  lea    0x6c(%rsp),%rax
  push   %rax
  lea    0x70(%rsp),%rax
  push   %rax
  mov    0x68(%rsp),%r8
  mov    0x40(%rsp),%rcx
  mov    0x38(%rsp),%rsi
  call   <_glp_qmdmrg@plt>
  mov    0x0(%r13),%eax
  add    $0x30,%rsp
L77:
  test   %eax,%eax
  jle    L48
  mov    $0x1,%r10d
  mov    %r15,%rax
  mov    %r12,%rsi
  mov    %rbp,%r15
  mov    0x10(%rsp),%r12
  mov    %rbx,%rbp
  lea    0x54(%rsp),%r9
  mov    %r10,%rbx
  mov    %rax,%r10
  jmp    L159
  nopl   0x0(%rax,%rax,1)
L18:
  add    $0x1,%rbx
  cmp    %ebx,0x0(%r13)
  jl     L48
L159:
  movslq (%r14,%rbx,4),%rax
  mov    %eax,0x50(%rsp)
  lea    0x0(%rbp,%rax,4),%rax
  cmpl   $0x1,(%rax)
  ja     L18
  lea    0x50(%rsp),%rdi
  sub    $0x8,%rsp
  movl   $0x2,(%rax)
  mov    %r15,%rcx
  push   %r10
  mov    %rbp,%r8
  lea    0x5c(%rsp),%rax
  mov    %r10,0x30(%rsp)
  push   %rax
  push   0x48(%rsp)
  mov    0x28(%rsp),%rdx
  mov    %r9,0x38(%rsp)
  mov    %rsi,0x30(%rsp)
  call   <_glp_qmdrch@plt>
  mov    0x74(%rsp),%ecx
  mov    0x68(%rsp),%edx
  add    $0x20,%rsp
  mov    0x10(%rsp),%rsi
  mov    0x18(%rsp),%r9
  test   %ecx,%ecx
  mov    0x20(%rsp),%r10
  jg     L34
L92:
  movslq 0x50(%rsp),%rax
  sub    $0x1,%edx
  mov    %edx,(%r15,%rax,4)
  mov    0x4c(%rsp),%edx
  test   %edx,%edx
  jle    L18
  sub    $0x1,%edx
  lea    0x4(%r10),%rax
  lea    0x8(%r10,%rdx,4),%rcx
  nopl   (%rax)
L83:
  movslq (%rax),%rdx
  add    $0x4,%rax
  movl   $0x0,0x0(%rbp,%rdx,4)
  cmp    %rax,%rcx
  jne    L83
  add    $0x1,%rbx
  cmp    %ebx,0x0(%r13)
  jge    L159
  nopw   0x0(%rax,%rax,1)
L48:
  mov    0x58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L25
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L34:
  mov    0x30(%rsp),%rdi
  sub    $0x1,%ecx
  lea    0x4(%rdi),%rax
  lea    0x8(%rdi,%rcx,4),%rdi
  nopl   0x0(%rax,%rax,1)
L17:
  movslq (%rax),%rcx
  add    $0x4,%rax
  add    (%r12,%rcx,4),%edx
  movl   $0x0,0x0(%rbp,%rcx,4)
  cmp    %rax,%rdi
  jne    L17
  jmp    L92
L25:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void _glp_qmdupd(int xadj[], int adjncy[], int *_nlist, int list[], int deg[], int qsize[], int qlink[], int marker[], int rchset[], int nbrhd[]) {
  int deg0, deg1, il, inhd, inode, irch, j, jstop, jstrt, mark, nabor, nhdsze, node, rchsze;
  if ((*_nlist) <= 0)
    return;
  deg0 = 0;
  nhdsze = 0;
  for (il = 1; il <= (*_nlist); il++) {
    node = list[il];
    deg0 += qsize[node];
    jstrt = xadj[node];
    jstop = xadj[node + 1] - 1;
    for (j = jstrt; j <= jstop; j++) {
      nabor = adjncy[j];
      if (marker[nabor] == 0 && deg[nabor] < 0) {
        marker[nabor] = -1;
        nhdsze++;
        nbrhd[nhdsze] = nabor;
      }
    }
  }
  if (nhdsze > 0)
    _glp_qmdmrg(xadj, adjncy, deg, qsize, qlink, marker, &deg0, &nhdsze, nbrhd, rchset, &nbrhd[nhdsze + 1]);
  for (il = 1; il <= (*_nlist); il++) {
    node = list[il];
    mark = marker[node];
    if (mark == 0 || mark == 1) {
      marker[node] = 2;
      _glp_qmdrch(&node, xadj, adjncy, deg, marker, &rchsze, rchset, &nhdsze, nbrhd);
      deg1 = deg0;
      if (rchsze > 0) {
        for (irch = 1; irch <= rchsze; irch++) {
          inode = rchset[irch];
          deg1 += qsize[inode];
          marker[inode] = 0;
        }
      }
      deg[node] = deg1 - 1;
      if (nhdsze > 0) {
        for (inhd = 1; inhd <= nhdsze; inhd++) {
          inode = nbrhd[inhd];
          marker[inode] = 0;
        }
      }
    }
  }
  return;
}
```