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

```asm
<string_format_size>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x180,%rsp
  mov    %rdi,-0x178(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D37(%rip),%rax
  mov    %rax,-0x150(%rbp)
  lea    D128(%rip),%rax
  mov    %rax,-0x148(%rbp)
  lea    D44(%rip),%rax
  mov    %rax,-0x140(%rbp)
  lea    D35(%rip),%rax
  mov    %rax,-0x138(%rbp)
  lea    D23(%rip),%rax
  mov    %rax,-0x130(%rbp)
  lea    D92(%rip),%rax
  mov    %rax,-0x128(%rbp)
  lea    D133(%rip),%rax
  mov    %rax,-0x120(%rbp)
  lea    D133(%rip),%rax
  mov    %rax,-0x118(%rbp)
  movss  D80(%rip),%xmm0
  movss  %xmm0,-0x160(%rbp)
  movss  D63(%rip),%xmm0
  movss  %xmm0,-0x15c(%rbp)
  movss  D139(%rip),%xmm0
  movss  %xmm0,-0x158(%rbp)
  movss  D134(%rip),%xmm0
  movss  %xmm0,-0x154(%rbp)
  movb   $0x0,-0x90(%rbp)
  cmpq   $0x27ff,-0x178(%rbp)
  ja     L19
  movl   $0x0,-0x164(%rbp)
  jmp    L88
L19:
  cmpq   $0xfffff,-0x178(%rbp)
  ja     L11
  movl   $0x1,-0x164(%rbp)
  jmp    L88
L11:
  cmpq   $0x3fffffff,-0x178(%rbp)
  ja     L5
  movl   $0x2,-0x164(%rbp)
  jmp    L88
L5:
  movl   $0x3,-0x164(%rbp)
L88:
  mov    -0x164(%rbp),%eax
  cltq
  mov    -0x130(%rbp,%rax,8),%rdx
  lea    -0x110(%rbp),%rax
  mov    %rdx,%rcx
  lea    D100(%rip),%rdx
  mov    $0x80,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <snprintf@plt>
  cmpq   $0x1,-0x178(%rbp)
  jbe    L103
  mov    -0x164(%rbp),%eax
  cltq
  mov    -0x150(%rbp,%rax,8),%rdx
  jmp    L102
L103:
  lea    D48(%rip),%rdx
L102:
  mov    -0x178(%rbp),%rax
  test   %rax,%rax
  js     L93
  pxor   %xmm0,%xmm0
  cvtsi2ss %rax,%xmm0
  jmp    L2
L93:
  mov    %rax,%rcx
  shr    %rcx
  and    $0x1,%eax
  or     %rax,%rcx
  pxor   %xmm0,%xmm0
  cvtsi2ss %rcx,%xmm0
  addss  %xmm0,%xmm0
L2:
  mov    -0x164(%rbp),%eax
  cltq
  movss  -0x160(%rbp,%rax,4),%xmm1
  divss  %xmm1,%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm0,%xmm2
  movq   %xmm2,%rdi
  lea    -0x110(%rbp),%rsi
  lea    -0x90(%rbp),%rax
  mov    %rdx,%rcx
  movq   %rdi,%xmm0
  mov    %rsi,%rdx
  mov    $0x80,%esi
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <snprintf@plt>
  lea    -0x90(%rbp),%rax
  mov    %rax,%rdi
  call   <strdup@plt>
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L36
  call   <__stack_chk_fail@plt>
L36:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D37
data_type: string
name: read_data
arguments: data_tag: D128
data_type: string
name: read_data
arguments: data_tag: D44
data_type: string
name: read_data
arguments: data_tag: D35
data_type: string
name: read_data
arguments: data_tag: D23
data_type: string
name: read_data
arguments: data_tag: D92
data_type: string
name: read_data
arguments: data_tag: D133
data_type: string
name: read_data
arguments: data_tag: D80
data_type: byte[4]
name: read_data
arguments: data_tag: D63
data_type: byte[4]
name: read_data
arguments: data_tag: D139
data_type: byte[4]
name: read_data
arguments: data_tag: D134
data_type: byte[4]
name: read_data
arguments: data_tag: D100
data_type: string
name: read_data
arguments: data_tag: D48
data_type: string

tool: D37: bytes

tool: D128: KB

tool: D44: MB

tool: D35: GB

tool: D23: %.0f

tool: D92: %.1f

tool: D133: %.02f

tool: {"D80": [0x00,0x00,0x80,0x3f]}

tool: {"D63": [0x00,0x00,0x80,0x44]}

tool: {"D139": [0x00,0x00,0x80,0x49]}

tool: {"D134": [0x00,0x00,0x80,0x4e]}

tool: D100: %s %%s

tool: D48: byte

assistant: ```c
char *string_format_size(unsigned long size) {
  char *unit_name[] = {("bytes"), ("KB"), ("MB"), ("GB")};
  char *unit_format[] = {"%.0f", "%.1f", "%.02f", "%.02f"};
  float unit_divide[] = {1, 1024, 1024 * 1024, 1024 * 1024 * 1024};
  char format_size[128], str_size[128];
  int num_unit;
  str_size[0] = '\0';
  if (size < 1024 * 10)
    num_unit = 0;
  else if (size < 1024 * 1024)
    num_unit = 1;
  else if (size < 1024 * 1024 * 1024)
    num_unit = 2;
  else
    num_unit = 3;
  snprintf(format_size, sizeof(format_size), "%s %%s", unit_format[num_unit]);
  snprintf(str_size, sizeof(str_size), format_size, ((float)size) / ((float)(unit_divide[num_unit])), (size <= 1) ? ("byte") : (unit_name[num_unit]));
  return strdup(str_size);
}
```