user: What would the C source look like for the assembly code provided here:

```asm
<get_config_file_name>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  mov    %rax,-0x20(%rbp)
  cmpq   $0x0,-0x20(%rbp)
  jne    L33
  lea    D49(%rip),%rax
  mov    %rax,%rdi
  call   <print_error@plt>
  mov    $0x0,%eax
  jmp    L12
L33:
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%ebx
  lea    D68(%rip),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    %eax,%ebx
  mov    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    %ebx,%eax
  add    $0x1,%eax
  mov    %eax,-0x24(%rbp)
  cmpq   $0x0,-0x38(%rbp)
  je     L76
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    $0x1,%eax
  add    %eax,-0x24(%rbp)
L76:
  cmpq   $0x0,-0x48(%rbp)
  je     L5
  mov    -0x48(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  add    %eax,-0x24(%rbp)
L5:
  mov    -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x18(%rbp)
  cmpq   $0x0,-0x18(%rbp)
  jne    L64
  lea    D63(%rip),%rax
  mov    %rax,%rdi
  call   <print_error@plt>
  mov    $0x0,%eax
  jmp    L12
L64:
  mov    -0x20(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcpy@plt>
  mov    -0x18(%rbp),%rax
  lea    D53(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x18(%rbp),%rax
  mov    $0x1fd,%esi
  mov    %rax,%rdi
  call   <mkdir@plt>
  cmpq   $0x0,-0x38(%rbp)
  je     L26
  mov    -0x18(%rbp),%rax
  lea    D42(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x38(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x18(%rbp),%rax
  mov    $0x1fd,%esi
  mov    %rax,%rdi
  call   <mkdir@plt>
L26:
  mov    -0x18(%rbp),%rax
  lea    D42(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  mov    -0x40(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
  cmpq   $0x0,-0x48(%rbp)
  je     L43
  mov    -0x48(%rbp),%rdx
  mov    -0x18(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcat@plt>
L43:
  mov    -0x18(%rbp),%rax
L12:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D21
data_type: string
name: read_data
arguments: label: D49
data_type: string
name: read_data
arguments: label: D68
data_type: string
name: read_data
arguments: label: D63
data_type: string
name: read_data
arguments: label: D53
data_type: string
name: read_data
arguments: label: D42
data_type: string

tool: D21: HOME

tool: D49: $HOME not defined

tool: D68: /.clamz/

tool: D63: Out of memory

tool: D53: /.clamz

tool: D42: /

assistant: ```c
char *get_config_file_name(const char *subdir, const char *base, const char *suffix) {
  char *home = getenv("HOME");
  char *s;
  int n;
  if (!home) {
    print_error("$HOME not defined");
    return NULL;
  }
  n = strlen(home) + strlen("/.clamz/") + strlen(base) + 1;
  if (subdir)
    n += strlen(subdir) + 1;
  if (suffix)
    n += strlen(suffix);
  s = malloc(n * sizeof(char));
  if (!s) {
    print_error("Out of memory");
    return NULL;
  }
  strcpy(s, home);
  strcat(s, "/.clamz");
  mkdir(s, 0775);
  if (subdir) {
    strcat(s, "/");
    strcat(s, subdir);
    mkdir(s, 0775);
  }
  strcat(s, "/");
  strcat(s, base);
  if (suffix)
    strcat(s, suffix);
  return s;
}
```