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

```asm
<generate_char_data_set>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  mov    %ecx,-0x30(%rbp)
  mov    %r8d,-0x34(%rbp)
  mov    %r9d,-0x38(%rbp)
  mov    0x10(%rbp),%eax
  cmp    0x20(%rbp),%eax
  jg     L99
  cmpl   $0x0,0x10(%rbp)
  jns    L69
L99:
  movl   $0xffffffff,0x10(%rbp)
L69:
  mov    -0x2c(%rbp),%eax
  mov    $0xf,%ecx
  mov    $0x0,%edx
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <offset_and_clip_value@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  mov    $0xf,%ecx
  mov    $0x0,%edx
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <offset_and_clip_value@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%eax
  mov    $0xf,%ecx
  mov    $0x0,%edx
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <offset_and_clip_value@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x38(%rbp),%eax
  mov    $0xf,%ecx
  mov    $0x0,%edx
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <offset_and_clip_value@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %al,-0x14(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %al,-0x13(%rbp)
  mov    -0x34(%rbp),%eax
  mov    %al,-0x12(%rbp)
  mov    -0x38(%rbp),%eax
  mov    %al,-0x11(%rbp)
  cmpl   $0x4,-0x24(%rbp)
  jne    L156
  mov    -0x28(%rbp),%eax
  mov    %eax,%edi
  call   <srand@plt>
L156:
  movl   $0x0,-0x10(%rbp)
  jmp    L168
L184:
  cmpl   $0x4,-0x24(%rbp)
  jne    L24
  cmpl   $0x0,0x30(%rbp)
  jne    L24
  mov    -0x28(%rbp),%eax
  mov    %eax,%edi
  call   <srand@plt>
L24:
  movl   $0x0,-0xc(%rbp)
  jmp    L176
L13:
  movl   $0x0,-0x8(%rbp)
  jmp    L199
L49:
  mov    -0x10(%rbp),%eax
  imul   0x20(%rbp),%eax
  imul   0x28(%rbp),%eax
  mov    %eax,%edx
  mov    -0xc(%rbp),%eax
  imul   0x28(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x4,-0x24(%rbp)
  je     L257
  cmpl   $0x4,-0x24(%rbp)
  jg     L98
  cmpl   $0x3,-0x24(%rbp)
  je     L181
  cmpl   $0x3,-0x24(%rbp)
  jg     L98
  cmpl   $0x1,-0x24(%rbp)
  je     L3
  cmpl   $0x2,-0x24(%rbp)
  je     L38
  jmp    L98
L3:
  movzbl -0x12(%rbp),%eax
  mov    %al,-0x16(%rbp)
  movzbl -0x11(%rbp),%eax
  mov    %al,-0x15(%rbp)
  jmp    L59
L38:
  movzbl -0x12(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x16(%rbp)
  movzbl -0x11(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x15(%rbp)
  jmp    L59
L181:
  movzbl -0x12(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x16(%rbp)
  movzbl -0x11(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  mov    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x15(%rbp)
  jmp    L59
L257:
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x16(%rbp)
  mov    $0x0,%eax
  call   <rand@plt>
  cltd
  shr    $0x1c,%edx
  add    %edx,%eax
  and    $0xf,%eax
  sub    %edx,%eax
  mov    %al,-0x15(%rbp)
  jmp    L59
L98:
  movzbl -0x14(%rbp),%eax
  mov    %al,-0x16(%rbp)
  movzbl -0x13(%rbp),%eax
  mov    %al,-0x15(%rbp)
  nop
L59:
  cmpl   $0xffffffff,0x10(%rbp)
  jne    L10
  movzbl -0x16(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  movzbl -0x15(%rbp),%eax
  and    $0xf,%eax
  add    %edx,%eax
  mov    %al,-0x17(%rbp)
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  mov    0x38(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x17(%rbp),%eax
  mov    %al,(%rdx)
  jmp    L16
L10:
  mov    -0xc(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jne    L45
  movzbl -0x16(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  movzbl -0x15(%rbp),%eax
  and    $0xf,%eax
  add    %edx,%eax
  mov    %al,-0x17(%rbp)
  jmp    L20
L45:
  movzbl -0x14(%rbp),%eax
  shl    $0x4,%eax
  mov    %eax,%edx
  movzbl -0x13(%rbp),%eax
  and    $0xf,%eax
  add    %edx,%eax
  mov    %al,-0x17(%rbp)
L20:
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  mov    0x38(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x17(%rbp),%eax
  mov    %al,(%rdx)
L16:
  addl   $0x1,-0x8(%rbp)
L199:
  mov    -0x8(%rbp),%eax
  cmp    0x28(%rbp),%eax
  jl     L49
  addl   $0x1,-0xc(%rbp)
L176:
  mov    -0xc(%rbp),%eax
  cmp    0x20(%rbp),%eax
  jl     L13
  addl   $0x1,-0x10(%rbp)
L168:
  mov    -0x10(%rbp),%eax
  cmp    0x18(%rbp),%eax
  jl     L184
  nop
  leave
  ret
```

assistant: ```c
void generate_char_data_set(int generation_Type, int random_seed, int default_real, int default_imaginary, int initial_real, int initial_imaginary, int single_frequency, int num_timesteps, int num_frequencies, int num_elements, int no_repeat_random, unsigned char *packed_data_set) {
  if (single_frequency > num_frequencies || single_frequency < 0)
    single_frequency = -1;
  default_real = offset_and_clip_value(default_real, 8, 0, 15);
  default_imaginary = offset_and_clip_value(default_imaginary, 8, 0, 15);
  initial_real = offset_and_clip_value(initial_real, 8, 0, 15);
  initial_imaginary = offset_and_clip_value(initial_imaginary, 8, 0, 15);
  unsigned char clipped_offset_default_real = (unsigned char)default_real;
  unsigned char clipped_offset_default_imaginary = (unsigned char)default_imaginary;
  unsigned char clipped_offset_initial_real = (unsigned char)initial_real;
  unsigned char clipped_offset_initial_imaginary = (unsigned char)initial_imaginary;
  unsigned char temp_output;
  if (generation_Type == 4u) {
    srand(random_seed);
  }
  for (int k = 0; k < num_timesteps; k++) {
    if (generation_Type == 4u && !no_repeat_random) {
      srand(random_seed);
    }
    for (int j = 0; j < num_frequencies; j++) {
      for (int i = 0; i < num_elements; i++) {
        int currentAddress = k * num_frequencies * num_elements + j * num_elements + i;
        unsigned char new_real;
        unsigned char new_imaginary;
        switch (generation_Type) {
        case 1u:
          new_real = clipped_offset_initial_real;
          new_imaginary = clipped_offset_initial_imaginary;
          break;
        case 2u:
          new_real = (j + clipped_offset_initial_real + i) % 16;
          new_imaginary = (j + clipped_offset_initial_imaginary + i) % 16;
          break;
        case 3u:
          new_real = 15 - ((j + clipped_offset_initial_real + i) % 16);
          new_imaginary = 15 - ((j + clipped_offset_initial_imaginary + i) % 16);
          break;
        case 4u:
          new_real = (unsigned char)(rand() % 16);
          new_imaginary = (unsigned char)(rand() % 16);
          break;
        default:
          new_real = clipped_offset_default_real;
          new_imaginary = clipped_offset_default_imaginary;
          break;
        }
        if (single_frequency == -1) {
          temp_output = ((new_real << 4) & 0xF0) + (new_imaginary & 0x0F);
          packed_data_set[currentAddress] = temp_output;
        } else {
          if (j == single_frequency) {
            temp_output = ((new_real << 4) & 0xF0) + (new_imaginary & 0x0F);
          } else {
            temp_output = ((clipped_offset_default_real << 4) & 0xF0) + (clipped_offset_default_imaginary & 0x0F);
          }
          packed_data_set[currentAddress] = temp_output;
        }
      }
    }
  }
  return;
}
```