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

```asm
<ScaleData>:
  endbr64
  sub    $0x53,%esi
  cmp    $0x22,%sil
  ja     L98
  lea    D3(%rip),%rcx
  movzbl %sil,%esi
  mov    %edx,%eax
  movslq (%rcx,%rsi,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  nopl   0x0(%rax)
  ret
  nopl   0x0(%rax)
L98:
  sub    $0x8,%rsp
  lea    D16(%rip),%rdi
  call   <printf@plt>
  xor    %eax,%eax
  add    $0x8,%rsp
  jmp    1060 <abort@plt>
  nopl   0x0(%rax,%rax,1)
  test   %eax,%eax
  jle    L4
  sub    $0x1,%eax
  lea    0x4(%rdi,%rax,4),%rdx
L30:
  pxor   %xmm2,%xmm2
  add    $0x4,%rdi
  cvtsi2sdl -0x4(%rdi),%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvttsd2si %xmm2,%eax
  mov    %eax,-0x4(%rdi)
  cmp    %rdi,%rdx
  jne    L30
  ret
  nopw   0x0(%rax,%rax,1)
  test   %eax,%eax
  jle    L132
  sub    $0x1,%eax
  lea    0x8(%rdi,%rax,8),%rax
  nopl   0x0(%rax,%rax,1)
L88:
  movsd  (%rdi),%xmm2
  add    $0x8,%rdi
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  movsd  %xmm2,-0x8(%rdi)
  cmp    %rdi,%rax
  jne    L88
  ret
  nopl   0x0(%rax,%rax,1)
  test   %eax,%eax
  jle    L68
  sub    $0x1,%eax
  lea    0x4(%rdi,%rax,4),%rdx
L94:
  mov    (%rdi),%eax
  pxor   %xmm2,%xmm2
  add    $0x4,%rdi
  cvtsi2sd %rax,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvttsd2si %xmm2,%rax
  mov    %eax,-0x4(%rdi)
  cmp    %rdi,%rdx
  jne    L94
  ret
  nopl   (%rax)
  test   %eax,%eax
  jle    L126
  sub    $0x1,%eax
  lea    0x1(%rdi,%rax,1),%rdx
  nopl   0x0(%rax,%rax,1)
L120:
  movzbl (%rdi),%eax
  pxor   %xmm2,%xmm2
  add    $0x1,%rdi
  cvtsi2sd %eax,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvttsd2si %xmm2,%eax
  mov    %al,-0x1(%rdi)
  cmp    %rdi,%rdx
  jne    L120
  ret
  nopl   0x0(%rax)
  test   %eax,%eax
  jle    L147
  sub    $0x1,%eax
  lea    0x2(%rdi,%rax,2),%rdx
  nopl   0x0(%rax,%rax,1)
L75:
  movswl (%rdi),%eax
  pxor   %xmm2,%xmm2
  add    $0x2,%rdi
  cvtsi2sd %eax,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvttsd2si %xmm2,%eax
  mov    %ax,-0x2(%rdi)
  cmp    %rdx,%rdi
  jne    L75
  ret
  nopl   (%rax)
  test   %eax,%eax
  jle    L80
  sub    $0x1,%eax
  lea    0x2(%rdi,%rax,2),%rdx
  nopl   0x0(%rax)
L124:
  movzwl (%rdi),%eax
  pxor   %xmm2,%xmm2
  add    $0x2,%rdi
  cvtsi2sd %eax,%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvttsd2si %xmm2,%eax
  mov    %ax,-0x2(%rdi)
  cmp    %rdx,%rdi
  jne    L124
  ret
  nopl   (%rax)
  test   %eax,%eax
  jle    L78
  sub    $0x1,%eax
  lea    0x4(%rdi,%rax,4),%rax
  nopl   0x0(%rax)
L121:
  pxor   %xmm2,%xmm2
  add    $0x4,%rdi
  cvtss2sd -0x4(%rdi),%xmm2
  mulsd  %xmm0,%xmm2
  addsd  %xmm1,%xmm2
  cvtsd2ss %xmm2,%xmm2
  movss  %xmm2,-0x4(%rdi)
  cmp    %rdi,%rax
  jne    L121
  ret
  nopl   0x0(%rax)
L4:
  ret
  nopl   0x0(%rax)
L78:
  ret
  nopl   0x0(%rax)
L80:
  ret
  nopl   0x0(%rax)
L147:
  ret
  nopl   0x0(%rax)
L126:
  ret
  nopl   0x0(%rax)
L68:
  ret
  nopl   0x0(%rax)
L132:
  ret
```

tool_calls: name: unpack_data
arguments: tag: D16
type_infered: string

tool: D16: Another impossible error


assistant: ```c
void ScaleData(void *data, char type, int npts, double m, double b) {
  unsigned char *data_c;
  short *data_s;
  unsigned short *data_u;
  unsigned *data_U;
  int *data_i;
  float *data_f;
  double *data_d;
  int i;
  switch (type) {
  case 'n':
    break;
  case 'c':
    data_c = (unsigned char *)data;
    for (i = 0; i < npts; i++) {
      data_c[i] = (unsigned char)((double)data_c[i] * m + b);
    }
    break;
  case 's':
    data_s = (short *)data;
    for (i = 0; i < npts; i++) {
      data_s[i] = (short)((double)data_s[i] * m + b);
    }
    break;
  case 'u':
    data_u = (unsigned short *)data;
    for (i = 0; i < npts; i++) {
      data_u[i] = (unsigned short)((double)data_u[i] * m + b);
    }
    break;
  case 'S':
  case 'i':
    data_i = (int *)data;
    for (i = 0; i < npts; i++) {
      data_i[i] = (int)((double)data_i[i] * m + b);
    }
    break;
  case 'U':
    data_U = (unsigned *)data;
    for (i = 0; i < npts; i++) {
      data_U[i] = (unsigned)((double)data_U[i] * m + b);
    }
    break;
  case 'f':
    data_f = (float *)data;
    for (i = 0; i < npts; i++) {
      data_f[i] = (float)((double)data_f[i] * m + b);
    }
    break;
  case 'd':
    data_d = (double *)data;
    for (i = 0; i < npts; i++) {
      data_d[i] = data_d[i] * m + b;
    }
    break;
  default:
    printf("Another impossible error\n");
    abort();
    break;
  }
}
```