user: What is the c source code of the assembly code below:

```asm
<write_ft_info>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,%eax
  mov    %al,-0x2c(%rbp)
  cmpb   $0x53,-0x2c(%rbp)
  jne    L2
  movl   $0x40,-0x14(%rbp)
  movl   $0x40,-0x10(%rbp)
  movl   $0x40,-0xc(%rbp)
  movl   $0x6,-0x4(%rbp)
  jmp    L51
L2:
  cmpb   $0x57,-0x2c(%rbp)
  jne    L148
  movl   $0x80,-0x14(%rbp)
  movl   $0x80,-0x10(%rbp)
  movl   $0x20,-0xc(%rbp)
  movl   $0x6,-0x4(%rbp)
  jmp    L51
L148:
  cmpb   $0x41,-0x2c(%rbp)
  jne    L81
  movl   $0x100,-0x14(%rbp)
  movl   $0x100,-0x10(%rbp)
  movl   $0x80,-0xc(%rbp)
  movl   $0x6,-0x4(%rbp)
  jmp    L51
L81:
  cmpb   $0x42,-0x2c(%rbp)
  jne    L75
  movl   $0x200,-0x14(%rbp)
  movl   $0x100,-0x10(%rbp)
  movl   $0x100,-0xc(%rbp)
  movl   $0x14,-0x4(%rbp)
  jmp    L51
L75:
  cmpb   $0x43,-0x2c(%rbp)
  jne    L128
  movl   $0x200,-0x14(%rbp)
  movl   $0x200,-0x10(%rbp)
  movl   $0x200,-0xc(%rbp)
  movl   $0x14,-0x4(%rbp)
  jmp    L51
L128:
  cmpb   $0x44,-0x2c(%rbp)
  jne    L46
  movl   $0x800,-0x14(%rbp)
  movl   $0x400,-0x10(%rbp)
  movl   $0x400,-0xc(%rbp)
  movl   $0x19,-0x4(%rbp)
  jmp    L51
L46:
  cmpb   $0x45,-0x2c(%rbp)
  jne    L15
  movl   $0x1000,-0x14(%rbp)
  movl   $0x800,-0x10(%rbp)
  movl   $0x800,-0xc(%rbp)
  movl   $0x19,-0x4(%rbp)
  jmp    L51
L15:
  movsbl -0x2c(%rbp),%eax
  mov    %eax,%esi
  lea    D106(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L51:
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jle    L130
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x8(%rbp)
L130:
  mov    -0xc(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jle    L158
  mov    -0xc(%rbp),%eax
  mov    %eax,-0x8(%rbp)
L158:
  movsbq -0x2c(%rbp),%rdx
  mov    -0x28(%rbp),%rax
  lea    D14(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D73(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D43(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0xc(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D53(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x8(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D61(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D42(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x14(%rbp),%eax
  add    $0x1,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D26(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D98(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D66(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  mov    -0x14(%rbp),%eax
  add    $0x1,%eax
  movslq %eax,%rdx
  mov    -0x10(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  imul   %rax,%rdx
  mov    -0x28(%rbp),%rax
  lea    D37(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fprintf@plt>
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D106
datatype: string
name: disassemble_data
arguments: label: D14
datatype: string
name: disassemble_data
arguments: label: D73
datatype: string
name: disassemble_data
arguments: label: D43
datatype: string
name: disassemble_data
arguments: label: D53
datatype: string
name: disassemble_data
arguments: label: D61
datatype: string
name: disassemble_data
arguments: label: D42
datatype: string
name: disassemble_data
arguments: label: D26
datatype: string
name: disassemble_data
arguments: label: D98
datatype: string
name: disassemble_data
arguments: label: D66
datatype: string
name: disassemble_data
arguments: label: D37
datatype: string

tool: D106: setparams: Internal error: invalid class type %c


tool: D14: #define CLASS          '%c'


tool: D73: #define NX             %d


tool: D43: #define NY             %d


tool: D53: #define NZ             %d


tool: D61: #define MAXDIM         %d


tool: D42: #define NITER_DEFAULT  %d


tool: D26: #define NXP            %d


tool: D98: #define NYP            %d


tool: D66: #define NTOTAL         %llu


tool: D37: #define NTOTALP        %llu


assistant: ```c
void write_ft_info(FILE *fp, char class) {
  int nx, ny, nz, maxdim, niter;
  if (class == 'S') {
    nx = 64;
    ny = 64;
    nz = 64;
    niter = 6;
  } else if (class == 'W') {
    nx = 128;
    ny = 128;
    nz = 32;
    niter = 6;
  } else if (class == 'A') {
    nx = 256;
    ny = 256;
    nz = 128;
    niter = 6;
  } else if (class == 'B') {
    nx = 512;
    ny = 256;
    nz = 256;
    niter = 20;
  } else if (class == 'C') {
    nx = 512;
    ny = 512;
    nz = 512;
    niter = 20;
  } else if (class == 'D') {
    nx = 2048;
    ny = 1024;
    nz = 1024;
    niter = 25;
  } else if (class == 'E') {
    nx = 4096;
    ny = 2048;
    nz = 2048;
    niter = 25;
  } else {
    printf("setparams: Internal error: invalid class type %c\n", class);
    exit(1);
  }
  maxdim = nx;
  if (ny > maxdim)
    maxdim = ny;
  if (nz > maxdim)
    maxdim = nz;
  fprintf(fp, "#define CLASS          \'%c\'\n", class);
  fprintf(fp, "#define NX             %d\n", nx);
  fprintf(fp, "#define NY             %d\n", ny);
  fprintf(fp, "#define NZ             %d\n", nz);
  fprintf(fp, "#define MAXDIM         %d\n", maxdim);
  fprintf(fp, "#define NITER_DEFAULT  %d\n", niter);
  fprintf(fp, "#define NXP            %d\n", nx + 1);
  fprintf(fp, "#define NYP            %d\n", ny);
  fprintf(fp, "#define NTOTAL         %llu\n", (unsigned long long)nx * ny * nz);
  fprintf(fp, "#define NTOTALP        %llu\n", (unsigned long long)(nx + 1) * ny * nz);
}
```