user: Please show me the C implementation that matches the assembly code listed below:

```asm
<main>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  cmp    $0x1,%edi
  jle    L79
L48:
  mov    0x8(%rbx),%rdi
  call   <getpwnam@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L25
L27:
  mov    (%rbx),%rsi
  lea    D68(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x8(%rbx),%rsi
  lea    D95(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x10(%rbx),%rsi
  lea    D12(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x18(%rbx),%rsi
  lea    D36(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x20(%rbx),%rsi
  lea    D100(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x28(%rbx),%esi
  lea    D5(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x2c(%rbx),%esi
  lea    D117(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D13(%rip),%rdi
  call   <puts@plt>
  lea    D25(%rip),%rbx
  jmp    L66
L79:
  mov    (%rsi),%rsi
  lea    D112(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L48
L25:
  lea    D69(%rip),%rdi
  call   <perror@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L27
L14:
  mov    0x20(%rax),%rcx
  mov    0x18(%rax),%rdx
  mov    0x2c(%rax),%r9d
  mov    0x28(%rax),%r8d
  mov    (%rax),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L66:
  mov    $0x0,%eax
  call   <getpwent@plt>
  test   %rax,%rax
  jne    L14
  lea    D49(%rip),%rdi
  call   <puts@plt>
  lea    D3(%rip),%rbx
  jmp    L31
L70:
  mov    0x8(%rax),%rdx
  mov    (%rax),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L31:
  mov    $0x0,%eax
  call   <getspent@plt>
  test   %rax,%rax
  jne    L70
  pop    %rbx
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D68
type_infered: string
name: extract_symbolic_data
arguments: data_label: D95
type_infered: string
name: extract_symbolic_data
arguments: data_label: D12
type_infered: string
name: extract_symbolic_data
arguments: data_label: D36
type_infered: string
name: extract_symbolic_data
arguments: data_label: D100
type_infered: string
name: extract_symbolic_data
arguments: data_label: D5
type_infered: string
name: extract_symbolic_data
arguments: data_label: D117
type_infered: string
name: extract_symbolic_data
arguments: data_label: D13
type_infered: string
name: extract_symbolic_data
arguments: data_label: D25
type_infered: string
name: extract_symbolic_data
arguments: data_label: D112
type_infered: string
name: extract_symbolic_data
arguments: data_label: D69
type_infered: string
name: extract_symbolic_data
arguments: data_label: D49
type_infered: string
name: extract_symbolic_data
arguments: data_label: D3
type_infered: string

tool: D68: pw_name: %s


tool: D95: pw_passwd: %s


tool: D12: pw_gecos: %s


tool: D36: pw_dir: %s


tool: D100: pw_shell: %s


tool: D5: pw_uid: %d


tool: D117: pw_gid: %d


tool: D13: ===================================

tool: D25: %20s : %32s : %32s : %6d : %6d


tool: D112: Usage: %s username


tool: D69: get user information error

tool: D49: shadow===================================

tool: D3: [%s] : [%s]


assistant: ```c
int main(int argc, char *argv[]) {
  struct passwd *pwd;
  struct spwd *spw;
  if (argc < 2) {
    printf("Usage: %s username\n", argv[0]);
    exit(1);
  }
  pwd = getpwnam(argv[1]);
  if (pwd == NULL) {
    perror("get user information error");
    exit(1);
  }
  printf("pw_name: %s\n", pwd->pw_name);
  printf("pw_passwd: %s\n", pwd->pw_passwd);
  printf("pw_gecos: %s\n", pwd->pw_gecos);
  printf("pw_dir: %s\n", pwd->pw_dir);
  printf("pw_shell: %s\n", pwd->pw_shell);
  printf("pw_uid: %d\n", pwd->pw_uid);
  printf("pw_gid: %d\n", pwd->pw_gid);
  printf("===================================\n");
  while ((pwd = getpwent()) != NULL) {
    printf("%20s : %32s : %32s : %6d : %6d\n", pwd->pw_name, pwd->pw_dir, pwd->pw_shell, pwd->pw_uid, pwd->pw_gid);
  }
  printf("shadow===================================\n");
  while ((spw = getspent()) != NULL) {
    printf("[%s] : [%s]\n", spw->sp_namp, spw->sp_pwdp);
  }
  return 0;
}
```