user: Translate the below assembly code into C programming language:

```asm
<write_ft_info>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,%rbx
  mov    %esi,%r14d
  lea    -0x41(%rsi),%eax
  cmp    $0x16,%al
  ja     L55
  movzbl %al,%eax
  lea    D98(%rip),%rdx
  movslq (%rdx,%rax,4),%rax
  add    %rdx,%rax
  notrack jmp *%rax
  movl   $0x6,0xc(%rsp)
  mov    $0x20,%r13d
  mov    $0x80,%ebp
  mov    $0x80,%r12d
  jmp    L43
  movl   $0x6,0xc(%rsp)
  mov    $0x80,%r13d
  mov    $0x100,%ebp
  mov    $0x100,%r12d
L43:
  cmp    %ebp,%r12d
  mov    %ebp,%r15d
  cmovge %r12d,%r15d
  cmp    %r13d,%r15d
  cmovl  %r13d,%r15d
  movsbq %r14b,%rdx
  lea    D78(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  movslq %r12d,%r14
  mov    %r14,%rdx
  lea    D75(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  movslq %ebp,%rbp
  mov    %rbp,%rdx
  lea    D6(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  movslq %r13d,%r13
  mov    %r13,%rdx
  lea    D18(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  movslq %r15d,%rdx
  lea    D7(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  movslq 0xc(%rsp),%rdx
  lea    D90(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  add    $0x1,%r12d
  movslq %r12d,%r12
  mov    %r12,%rdx
  lea    D21(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  mov    %rbp,%rdx
  lea    D112(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  mov    %r14,%rdx
  imul   %rbp,%rdx
  imul   %r13,%rdx
  lea    D79(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  mov    %rbp,%rdx
  imul   %r13,%rdx
  imul   %r12,%rdx
  lea    D11(%rip),%rsi
  mov    %rbx,%rdi
  call   <fprintf@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  movl   $0x14,0xc(%rsp)
  mov    $0x100,%r13d
  mov    $0x100,%ebp
  mov    $0x200,%r12d
  jmp    L43
  movl   $0x14,0xc(%rsp)
  mov    $0x200,%r13d
  mov    $0x200,%ebp
  mov    $0x200,%r12d
  jmp    L43
  movl   $0x19,0xc(%rsp)
  mov    $0x400,%r13d
  mov    $0x400,%ebp
  mov    $0x800,%r12d
  jmp    L43
  movl   $0x19,0xc(%rsp)
  mov    $0x800,%r13d
  mov    $0x800,%ebp
  mov    $0x1000,%r12d
  jmp    L43
L55:
  movsbl %r14b,%esi
  lea    D31(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L43
  movl   $0x6,0xc(%rsp)
  mov    $0x40,%r13d
  mov    $0x40,%ebp
  mov    $0x40,%r12d
  jmp    L43
```

tool_calls: name: disassemble_data
arguments: data_label: D78
data_type: string
name: disassemble_data
arguments: data_label: D75
data_type: string
name: disassemble_data
arguments: data_label: D6
data_type: string
name: disassemble_data
arguments: data_label: D18
data_type: string
name: disassemble_data
arguments: data_label: D7
data_type: string
name: disassemble_data
arguments: data_label: D90
data_type: string
name: disassemble_data
arguments: data_label: D21
data_type: string
name: disassemble_data
arguments: data_label: D112
data_type: string
name: disassemble_data
arguments: data_label: D79
data_type: string
name: disassemble_data
arguments: data_label: D11
data_type: string
name: disassemble_data
arguments: data_label: D31
data_type: string

tool: D78: #define CLASS          '%c'


tool: D75: #define NX             %d


tool: D6: #define NY             %d


tool: D18: #define NZ             %d


tool: D7: #define MAXDIM         %d


tool: D90: #define NITER_DEFAULT  %d


tool: D21: #define NXP            %d


tool: D112: #define NYP            %d


tool: D79: #define NTOTAL         %llu


tool: D11: #define NTOTALP        %llu


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


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);
}
```