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

```asm
<proc_node_init>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xc88,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xc78(%rsp)
  xor    %eax,%eax
  call   <get_mem_rate@plt>
  mov    $0x0,%eax
  call   <get_mem_total@plt>
  mov    %rax,0x8(%rsp)
  lea    D59(%rip),%rdi
  call   <opendir@plt>
  test   %rax,%rax
  je     L86
  mov    %rax,%r12
  lea    D18(%rip),%r14
  lea    D14(%rip),%r13
  jmp    L53
L24:
  cmpb   $0x0,0x0(%rbp)
  jne    L53
  jmp    L64
L36:
  lea    0x870(%rsp),%r15
  lea    D16(%rip),%rsi
  mov    %r15,%rdi
  call   <stat@plt>
  mov    D16(%rip),%edi
  call   <getpwuid@plt>
  mov    %rax,%rbp
  lea    0x18(%rsp),%rcx
  lea    0x14(%rsp),%rdx
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdi
  call   <get_process_mem_rate@plt>
  movss  0x14(%rsp),%xmm1
  movss  %xmm1,0x4(%rsp)
  mov    0x18(%rsp),%r15
  mov    0x0(%rbp),%ebp
  mov    (%rbx),%rdi
  call   <atoi@plt>
  mov    %eax,%edi
  lea    0x20(%rsp),%rdx
  lea    0x470(%rsp),%rsi
  movss  0x4(%rsp),%xmm0
  mov    %r15,%r8
  mov    %ebp,%ecx
  call   <proc_node_add@plt>
L53:
  mov    %r12,%rdi
  call   <readdir@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L3
  mov    (%rbx),%rbp
  movzbl 0x0(%rbp),%edi
  test   %dil,%dil
  je     L64
L37:
  movsbl %dil,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  je     L24
  add    $0x1,%rbp
  movzbl 0x0(%rbp),%edi
  test   %dil,%dil
  jne    L37
L64:
  lea    0x870(%rsp),%rbp
  mov    (%rbx),%rdx
  mov    %r14,%rsi
  mov    %rbp,%rdi
  call   <sprintf@plt>
  lea    0x20(%rsp),%r15
  mov    $0x50,%ecx
  mov    %r15,%rdx
  mov    %r13,%rsi
  mov    %rbp,%rdi
  call   <file2str@plt>
  mov    $0xa,%esi
  mov    %r15,%rdi
  call   <strchr@plt>
  movb   $0x0,(%rax)
  lea    0x70(%rsp),%r15
  mov    %rbp,%rdx
  lea    D61(%rip),%rsi
  mov    %r15,%rdi
  call   <sprintf@plt>
  lea    0x470(%rsp),%rbp
  mov    $0x400,%edx
  mov    $0x0,%esi
  mov    %rbp,%rdi
  call   <memset@plt>
  mov    $0x400,%edx
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <readlink@plt>
  cmp    $0xffffffff,%eax
  jne    L36
  lea    0x20(%rsp),%rdx
  mov    %rbp,%rdi
  lea    D40(%rip),%rsi
  call   <sprintf@plt>
  jmp    L36
L3:
  mov    %r12,%rdi
  call   <closedir@plt>
L86:
  mov    0xc78(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L103
  add    $0xc88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L103:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D59
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D18
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D14
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D61
type_infered: string
name: extract_symbolic_data
arguments: data_tag: D40
type_infered: string

tool: D59: /proc/

tool: D18: /proc/%s

tool: D14: comm

tool: D61: %s/exe

tool: D40: [%s]

assistant: ```c
void proc_node_init(void) {
  char buf1[1024], buf2[1024];
  char ProcPath[1024], *ptr, comm[80];
  DIR *db, *directory;
  struct dirent *p;
  float MemUsedRate;
  unsigned long MemTotal;
  MemUsedRate = get_mem_rate();
  MemTotal = get_mem_total();
  db = opendir("/proc/");
  if (db == NULL)
    return;
  while (p = readdir(db)) {
    char *cs;
    for (cs = p->d_name; *cs; cs++)
      if (!isdigit(*cs))
        break;
    if (*cs)
      continue;
    sprintf(ProcPath, "/proc/%s", p->d_name);
    file2str(ProcPath, "comm", comm, sizeof comm);
    ptr = strstr(comm, "\n");
    *ptr = '\0';
    sprintf(buf1, "%s/exe", ProcPath);
    memset(buf2, 0, sizeof(buf2));
    if (readlink(buf1, buf2, sizeof(buf2)) == -1) {
      sprintf(buf2, "[%s]", comm);
    }
    static struct stat sb;
    stat(ProcPath, &sb);
    struct passwd *pw;
    pw = getpwuid(sb.st_uid);
    float ProcMemUsedRate;
    unsigned long ProcMemTotal;
    get_process_mem_rate(ProcPath, MemTotal, &ProcMemUsedRate, &ProcMemTotal);
    proc_node_add(atoi(p->d_name), buf2, comm, pw->pw_name, ProcMemTotal, ProcMemUsedRate);
  }
  closedir(db);
}
```