user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<c1_look_ahead_test>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,0x28(%rsp)
  mov    %esi,%r15d
  mov    %edx,0x20(%rsp)
  mov    %r8d,0x1c(%rsp)
  cmp    $0x1,%ecx
  je     L234
  cmp    $0x4,%ecx
  je     L325
  jle    L639
  cmp    $0x5,%ecx
  je     L705
  cmp    $0x6,%ecx
  jne    L44
  movss  D224(%rip),%xmm0
  pxor   %xmm4,%xmm4
  movss  %xmm4,0x18(%rsp)
  movss  D136(%rip),%xmm2
  movss  %xmm2,0xc(%rsp)
  movss  %xmm2,0x14(%rsp)
  movss  %xmm2,0x10(%rsp)
  jmp    L530
L639:
  cmp    $0x2,%ecx
  jne    L752
  movss  D224(%rip),%xmm0
  movss  D246(%rip),%xmm7
  movss  %xmm7,0x18(%rsp)
  movss  D136(%rip),%xmm5
  movss  %xmm5,0xc(%rsp)
  movss  %xmm5,0x14(%rsp)
  pxor   %xmm3,%xmm3
  movss  %xmm3,0x10(%rsp)
L530:
  mov    0x20(%rsp),%r12d
  cmp    %r15d,%r12d
  jge    L242
  lea    0x8(%r12),%r13d
  movslq %r12d,%rbp
  add    0x28(%rsp),%rbp
  jmp    L580
L234:
  pxor   %xmm0,%xmm0
  movss  D136(%rip),%xmm6
  movss  %xmm6,0x18(%rsp)
  movss  D224(%rip),%xmm7
  movss  %xmm7,0xc(%rsp)
  movss  %xmm7,0x14(%rsp)
  movss  %xmm7,0x10(%rsp)
  jmp    L530
L325:
  movss  D224(%rip),%xmm0
  movss  D246(%rip),%xmm5
  movss  %xmm5,0x18(%rsp)
  movss  D136(%rip),%xmm2
  movss  %xmm2,0xc(%rsp)
  pxor   %xmm4,%xmm4
  movss  %xmm4,0x14(%rsp)
  movss  %xmm2,0x10(%rsp)
  jmp    L530
L752:
  movss  D224(%rip),%xmm0
  movss  D246(%rip),%xmm6
  movss  %xmm6,0x18(%rsp)
  movss  D136(%rip),%xmm5
  movss  %xmm5,0xc(%rsp)
  movss  %xmm5,0x14(%rsp)
  movss  %xmm5,0x10(%rsp)
  jmp    L530
L705:
  movss  D224(%rip),%xmm0
  movss  D246(%rip),%xmm3
  movss  %xmm3,0x18(%rsp)
  pxor   %xmm2,%xmm2
  movss  %xmm2,0xc(%rsp)
  movss  D136(%rip),%xmm4
  movss  %xmm4,0x14(%rsp)
  movss  %xmm4,0x10(%rsp)
  jmp    L530
L44:
  movss  D224(%rip),%xmm0
  movss  D246(%rip),%xmm6
  movss  %xmm6,0x18(%rsp)
  movss  D136(%rip),%xmm4
  movss  %xmm4,0xc(%rsp)
  movss  %xmm4,0x14(%rsp)
  movss  %xmm4,0x10(%rsp)
  jmp    L530
L630:
  lea    -0x7f(%rax),%ebx
L353:
  call   <froundup@plt>
  cmpb   $0x0,(%r14)
  js     L206
  addss  D224(%rip),%xmm0
  jmp    L220
L206:
  addss  D136(%rip),%xmm0
  jmp    L220
L474:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm1,%xmm7
  movss  %xmm7,0x10(%rsp)
  mov    $0xfffffff0,%ecx
  mov    $0x20,%edi
  mov    $0x1,%esi
  jmp    L746
L651:
  lea    -0x41(%rbx),%eax
  cmp    $0x19,%al
  ja     L215
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm1,%xmm5
  movss  %xmm5,0x10(%rsp)
  movzbl (%r14),%eax
  mov    %eax,%edx
  mov    $0x0,%esi
  test   %al,%al
  jns    L604
  mov    $0x1,%r8d
  mov    $0x0,%esi
  jmp    L198
L215:
  mov    $0x0,%esi
  jmp    L746
L710:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm4,%xmm4
  cvtsd2ss %xmm1,%xmm4
  movss  %xmm4,0x14(%rsp)
  cmp    $0x9,%cl
  ja     L673
L436:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm1,%xmm7
  movss  %xmm7,0x14(%rsp)
L673:
  test   %dl,%dl
  js     L290
  test   %esi,%esi
  jne    L417
L182:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D222(%rip),%xmm1
  pxor   %xmm4,%xmm4
  cvtsd2ss %xmm1,%xmm4
  movss  %xmm4,0x14(%rsp)
L417:
  cmp    $0xd,%al
  je     L505
L156:
  cmp    $0x2a,%al
  jne    L10
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm1,%xmm6
  movss  %xmm6,0xc(%rsp)
  mov    $0x1,%ecx
L327:
  lea    -0x30(%rax),%esi
  cmp    $0x9,%sil
  ja     L53
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm1,%xmm5
  movss  %xmm5,0xc(%rsp)
  test   %dl,%dl
  jns    L150
L767:
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D60(%rip),%xmm1
  pxor   %xmm2,%xmm2
  cvtsd2ss %xmm1,%xmm2
  movss  %xmm2,0xc(%rsp)
L261:
  movss  0x18(%rsp),%xmm3
  addss  D224(%rip),%xmm3
  movss  %xmm3,0x18(%rsp)
L509:
  add    $0x1,%r12d
  cmp    %r12d,%r15d
  je     L226
  add    $0x1,%rbp
  cmp    %r13d,%r12d
  jg     L23
L580:
  mov    %rbp,%r14
  movzbl 0x0(%rbp),%eax
  mov    %eax,%ebx
  test   %al,%al
  js     L630
  sub    $0x30,%eax
  cmp    $0x9,%al
  ja     L353
  addss  D218(%rip),%xmm0
L220:
  cmp    $0x20,%bl
  je     L474
  mov    %ebx,%edi
  lea    -0x30(%rbx),%ecx
  cmp    $0x9,%cl
  ja     L651
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm4,%xmm4
  cvtsd2ss %xmm1,%xmm4
  movss  %xmm4,0x10(%rsp)
  mov    $0x1,%esi
L746:
  movzbl (%r14),%eax
  mov    %eax,%edx
  mov    %esi,%r8d
  test   %al,%al
  jns    L565
L198:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  addsd  D222(%rip),%xmm1
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm1,%xmm7
  movss  %xmm7,0x10(%rsp)
L565:
  test   %r8d,%r8d
  jne    L604
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  addsd  D222(%rip),%xmm1
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm1,%xmm6
  movss  %xmm6,0x10(%rsp)
L604:
  cmp    $0x20,%bl
  je     L710
  cmp    $0x9,%cl
  jbe    L436
  sub    $0x61,%edi
  cmp    $0x19,%dil
  ja     L673
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm2,%xmm2
  cvtsd2ss %xmm1,%xmm2
  movss  %xmm2,0x14(%rsp)
  test   %dl,%dl
  jns    L417
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D222(%rip),%xmm1
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm1,%xmm6
  movss  %xmm6,0x14(%rsp)
  jmp    L156
L290:
  pxor   %xmm1,%xmm1
  cvtss2sd 0x14(%rsp),%xmm1
  addsd  D222(%rip),%xmm1
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm1,%xmm5
  movss  %xmm5,0x14(%rsp)
  test   %esi,%esi
  je     L182
  jmp    L156
L505:
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm5,%xmm5
  cvtsd2ss %xmm1,%xmm5
  movss  %xmm5,0xc(%rsp)
  mov    $0x1,%ecx
L506:
  cmp    $0x20,%al
  jne    L327
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm3,%xmm3
  cvtsd2ss %xmm1,%xmm3
  movss  %xmm3,0xc(%rsp)
  mov    $0x1,%ecx
L527:
  test   %dl,%dl
  js     L767
  test   %ecx,%ecx
  jne    L150
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D456(%rip),%xmm1
  pxor   %xmm7,%xmm7
  cvtsd2ss %xmm1,%xmm7
  movss  %xmm7,0xc(%rsp)
L150:
  cmp    $0x5b,%al
  jne    L261
  cmpl   $0x0,0x1c(%rsp)
  je     L261
  movss  0x18(%rsp),%xmm4
  addss  D246(%rip),%xmm4
  movss  %xmm4,0x18(%rsp)
  jmp    L509
L10:
  cmp    $0x3e,%al
  jne    L170
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm2,%xmm2
  cvtsd2ss %xmm1,%xmm2
  movss  %xmm2,0xc(%rsp)
  mov    $0x1,%ecx
L53:
  lea    -0x41(%rax),%esi
  cmp    $0x19,%sil
  ja     L527
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  addsd  D310(%rip),%xmm1
  pxor   %xmm6,%xmm6
  cvtsd2ss %xmm1,%xmm6
  movss  %xmm6,0xc(%rsp)
  test   %dl,%dl
  jns    L261
  jmp    L767
L170:
  mov    $0x0,%ecx
  jmp    L506
L242:
  call   <froundup@plt>
  movss  %xmm0,0x24(%rsp)
  movss  0x10(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x1c(%rsp)
  movss  0x14(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x10(%rsp)
  movss  0xc(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x14(%rsp)
  movss  0x18(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0xc(%rsp)
  cmp    %r15d,0x20(%rsp)
  jne    L410
  jmp    L140
L627:
  mov    $0x2,%eax
L540:
  pxor   %xmm2,%xmm2
  cvtss2sd 0x10(%rsp),%xmm2
  movapd %xmm2,%xmm0
  addsd  D86(%rip),%xmm0
  movq   %rbx,%xmm6
  comisd %xmm0,%xmm6
  jb     L543
  movq   %rbp,%xmm5
  comisd %xmm0,%xmm5
  jb     L543
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  comisd %xmm0,%xmm1
  jb     L543
  movq   %r12,%xmm7
  ucomisd %xmm0,%xmm7
  mov    $0x4,%edx
  cmovae %edx,%eax
L543:
  movq   %rbx,%xmm1
  addsd  D86(%rip),%xmm1
  pxor   %xmm0,%xmm0
  cvtss2sd 0xc(%rsp),%xmm0
  comisd %xmm1,%xmm0
  jb     L229
  movq   %rbp,%xmm7
  comisd %xmm1,%xmm7
  jb     L229
  comisd %xmm1,%xmm2
  jb     L229
  movq   %r12,%xmm7
  ucomisd %xmm1,%xmm7
  mov    $0x1,%edx
  cmovae %edx,%eax
L229:
  addsd  D86(%rip),%xmm0
  movq   %rbx,%xmm3
  comisd %xmm0,%xmm3
  jb     L465
  movq   %rbp,%xmm6
  comisd %xmm0,%xmm6
  jb     L465
  comisd %xmm0,%xmm2
  jb     L465
  movq   %r12,%xmm7
  ucomisd %xmm0,%xmm7
  mov    $0x6,%edx
  cmovae %edx,%eax
  jmp    L465
L23:
  call   <froundup@plt>
  movss  %xmm0,0x24(%rsp)
  movss  0x10(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x1c(%rsp)
  movss  0x14(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x10(%rsp)
  movss  0xc(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x14(%rsp)
  movss  0x18(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0xc(%rsp)
L410:
  pxor   %xmm3,%xmm3
  cvtss2sd 0x14(%rsp),%xmm3
  movq   %xmm3,%r12
  movapd %xmm3,%xmm0
  addsd  D86(%rip),%xmm0
  pxor   %xmm4,%xmm4
  cvtss2sd 0x24(%rsp),%xmm4
  movq   %xmm4,%rbx
  mov    $0x1,%eax
  comisd %xmm0,%xmm4
  jb     L250
  pxor   %xmm1,%xmm1
  cvtss2sd 0x1c(%rsp),%xmm1
  mov    $0x1,%eax
  comisd %xmm0,%xmm1
  jb     L250
  pxor   %xmm1,%xmm1
  cvtss2sd 0xc(%rsp),%xmm1
  mov    $0x1,%eax
  comisd %xmm0,%xmm1
  jb     L250
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  comisd %xmm0,%xmm1
  sbb    %eax,%eax
  and    $0xfffffffc,%eax
  add    $0x5,%eax
L250:
  movss  0x1c(%rsp),%xmm6
  pxor   %xmm3,%xmm3
  cvtss2sd %xmm6,%xmm3
  movq   %xmm3,%rbp
  movapd %xmm3,%xmm0
  addsd  D86(%rip),%xmm0
  movq   %rbx,%xmm4
  comisd %xmm0,%xmm4
  jb     L540
  pxor   %xmm1,%xmm1
  cvtss2sd 0x10(%rsp),%xmm1
  comisd %xmm0,%xmm1
  jb     L540
  movss  0x14(%rsp),%xmm3
  comiss %xmm6,%xmm3
  ja     L627
  ucomiss %xmm3,%xmm6
  jp     L540
  jne    L540
  mov    0x20(%rsp),%edx
  mov    %r15d,%esi
  mov    0x28(%rsp),%rdi
  call   <dq4bi@plt>
  cmp    $0x1,%rax
  sbb    %eax,%eax
  and    $0xfffffffd,%eax
  add    $0x5,%eax
  jmp    L540
L226:
  call   <froundup@plt>
  movss  %xmm0,0x24(%rsp)
  movss  0x10(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x1c(%rsp)
  movss  0x14(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x10(%rsp)
  movss  0xc(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0x14(%rsp)
  movss  0x18(%rsp),%xmm0
  call   <froundup@plt>
  movss  %xmm0,0xc(%rsp)
L140:
  cvttss2si 0x14(%rsp),%edx
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  movss  0x10(%rsp),%xmm6
  mov    $0x1,%eax
  comiss %xmm6,%xmm0
  jb     L512
  cvttss2si %xmm6,%edx
  mov    $0x4,%eax
L512:
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  movss  0x1c(%rsp),%xmm5
  comiss %xmm5,%xmm0
  jb     L643
  cvttss2si %xmm5,%edx
  mov    $0x2,%eax
L643:
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  movss  0x24(%rsp),%xmm7
  comiss %xmm7,%xmm0
  jb     L427
  cvttss2si %xmm7,%edx
  mov    $0x1,%eax
L427:
  pxor   %xmm0,%xmm0
  cvtsi2ss %edx,%xmm0
  ucomiss 0xc(%rsp),%xmm0
  mov    $0x6,%edx
  cmovae %edx,%eax
L465:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D224
type: f32
name: disassemble_data
arguments: data_label: D136
type: f32
name: disassemble_data
arguments: data_label: D246
type: f32
name: disassemble_data
arguments: data_label: D310
type: byte[8]
name: disassemble_data
arguments: data_label: D222
type: byte[8]
name: disassemble_data
arguments: data_label: D60
type: byte[8]
name: disassemble_data
arguments: data_label: D218
type: f32
name: disassemble_data
arguments: data_label: D456
type: byte[8]
name: disassemble_data
arguments: data_label: D86
type: f32[2]

tool: D224: 1

tool: D136: 2

tool: D246: 3

tool: {"D310": [0x55,0x55,0x55,0x55,0x55,0x55,0xe5,0x3f]}

tool: {"D222": [0x55,0x55,0x55,0x55,0x55,0x55,0xf5,0x3f]}

tool: {"D60": [0x55,0x55,0x55,0x55,0x55,0x55,0x11,0x40]}

tool: D218: 0.5

tool: {"D456": [0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0x0a,0x40]}

tool: {"D86": [0.0,1.875]}

assistant: ```c
int c1_look_ahead_test(unsigned char source[], int sourcelen, int position, int current_mode, int gs1) {
  float ascii_count, c40_count, text_count, edi_count, byte_count;
  char reduced_char;
  int done, best_scheme, best_count, sp;
  if (current_mode == 1) {
    ascii_count = 0.0;
    c40_count = 1.0;
    text_count = 1.0;
    edi_count = 1.0;
    byte_count = 2.0;
  } else {
    ascii_count = 1.0;
    c40_count = 2.0;
    text_count = 2.0;
    edi_count = 2.0;
    byte_count = 3.0;
  }
  switch (current_mode) {
  case 2:
    c40_count = 0.0;
    break;
  case 4:
    text_count = 0.0;
    break;
  case 6:
    byte_count = 0.0;
    break;
  case 5:
    edi_count = 0.0;
    break;
  }
  for (sp = position; (sp < sourcelen) && (sp <= (position + 8)); sp++) {
    if (source[sp] <= 127) {
      reduced_char = source[sp];
    } else {
      reduced_char = source[sp] - 127;
    }
    if ((source[sp] >= '0') && (source[sp] <= '9')) {
      ascii_count += 0.5;
    } else {
      ascii_count = froundup(ascii_count);
      if (source[sp] > 127) {
        ascii_count += 2.0;
      } else {
        ascii_count += 1.0;
      }
    }
    done = 0;
    if (reduced_char == ' ') {
      c40_count += (2.0 / 3.0);
      done = 1;
    }
    if ((reduced_char >= '0') && (reduced_char <= '9')) {
      c40_count += (2.0 / 3.0);
      done = 1;
    }
    if ((reduced_char >= 'A') && (reduced_char <= 'Z')) {
      c40_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] > 127) {
      c40_count += (4.0 / 3.0);
    }
    if (done == 0) {
      c40_count += (4.0 / 3.0);
    }
    done = 0;
    if (reduced_char == ' ') {
      text_count += (2.0 / 3.0);
      done = 1;
    }
    if ((reduced_char >= '0') && (reduced_char <= '9')) {
      text_count += (2.0 / 3.0);
      done = 1;
    }
    if ((reduced_char >= 'a') && (reduced_char <= 'z')) {
      text_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] > 127) {
      text_count += (4.0 / 3.0);
    }
    if (done == 0) {
      text_count += (4.0 / 3.0);
    }
    done = 0;
    if (source[sp] == 13) {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] == '*') {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] == '>') {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] == ' ') {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if ((source[sp] >= '0') && (source[sp] <= '9')) {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if ((source[sp] >= 'A') && (source[sp] <= 'Z')) {
      edi_count += (2.0 / 3.0);
      done = 1;
    }
    if (source[sp] > 127) {
      edi_count += (13.0 / 3.0);
    } else {
      if (done == 0) {
        edi_count += (10.0 / 3.0);
      }
    }
    if (gs1 && (source[sp] == '[')) {
      byte_count += 3.0;
    } else {
      byte_count += 1.0;
    }
  }
  ascii_count = froundup(ascii_count);
  c40_count = froundup(c40_count);
  text_count = froundup(text_count);
  edi_count = froundup(edi_count);
  byte_count = froundup(byte_count);
  best_scheme = 1;
  if (sp == sourcelen) {
    best_count = edi_count;
    if (text_count <= best_count) {
      best_count = text_count;
      best_scheme = 4;
    }
    if (c40_count <= best_count) {
      best_count = c40_count;
      best_scheme = 2;
    }
    if (ascii_count <= best_count) {
      best_count = ascii_count;
      best_scheme = 1;
    }
    if (byte_count <= best_count) {
      best_count = byte_count;
      best_scheme = 6;
    }
  } else {
    if (((edi_count + 1.0 <= ascii_count) && (edi_count + 1.0 <= c40_count)) && ((edi_count + 1.0 <= byte_count) && (edi_count + 1.0 <= text_count))) {
      best_scheme = 5;
    }
    if ((c40_count + 1.0 <= ascii_count) && (c40_count + 1.0 <= text_count)) {
      if (c40_count < edi_count) {
        best_scheme = 2;
      } else {
        done = 0;
        if (c40_count == edi_count) {
          if (dq4bi(source, sourcelen, position)) {
            best_scheme = 5;
          } else {
            best_scheme = 2;
          }
        }
      }
    }
    if (((text_count + 1.0 <= ascii_count) && (text_count + 1.0 <= c40_count)) && ((text_count + 1.0 <= byte_count) && (text_count + 1.0 <= edi_count))) {
      best_scheme = 4;
    }
    if (((ascii_count + 1.0 <= byte_count) && (ascii_count + 1.0 <= c40_count)) && ((ascii_count + 1.0 <= text_count) && (ascii_count + 1.0 <= edi_count))) {
      best_scheme = 1;
    }
    if (((byte_count + 1.0 <= ascii_count) && (byte_count + 1.0 <= c40_count)) && ((byte_count + 1.0 <= text_count) && (byte_count + 1.0 <= edi_count))) {
      best_scheme = 6;
    }
  }
  return best_scheme;
}
```