// File: /workspace/github_c_makefile_star2_O2/genometools[P]genometools/src/mgth/mg_compute_gene_prediction.c
// Function: check_coding
static int check_coding(ParseStruct *parsestruct_ptr,
                        GtUword from,
                        GtUword to, short current_row, GtError * err)
{
  int had_err = 0;

  GtUword startpoint = 0,
    endpoint = 0,
    contig_len = 0;

  GtWord diff;

  short current_frame = 0,
    found = 0;

  GtStr *query_seq;

  char *contig_seq_ptr = NULL,
    contig_seq_tri[4] = { '\0', '\0', '\0', '\0' };

  gt_error_check(err);

  /* Start- und Endsequenzpositionen der in AS umzuwandelnden Sequenz */
  startpoint = from;
  endpoint = to;

  contig_len = gt_str_length(MATRIXSTRUCT(query_dna));
  query_seq = gt_str_new_cstr(gt_str_get(MATRIXSTRUCT(query_dna)));
  contig_seq_ptr = gt_str_get(query_seq);

  /* Bestimmung des aktuellen Frames aus der Zeilennummer */
  current_frame = get_current_frame(current_row);

  /* Bestimmen der Laenge der umzuwandelnden Sequenz */
  diff = startpoint - endpoint;
  if (diff < 0)
    diff = (-1) * diff;

  /* nur bei 3 oder mehr DNA-Basen ist eine Umwandlung in eine AS-Sequenz
     sinnvoll bzw. machbar */
  if (!(diff < 3))
  {
    /* if: aktueller Leserahmen ist -1, -2 oder -3 */
    if (current_frame < 0)
    {
      /* fuer die weiteren Berechnungen erfolgt eine Multiplikation mit -1
       */
      current_frame *= -1;
      /* das reverse Komplement der Sequenz wird gebildet - erweiterte
         reverse_complement-Funktion beruecksichtigt das erweiterte
         DNA-Alphabet */
      had_err = mg_reverse_complement(contig_seq_ptr, contig_len, err);

      /* Der Startpunkt muss im Fall negativer Leserahmen neu berechnet
         werden */
      startpoint = contig_len - 1 - to;
      endpoint = contig_len - from;
    }

    if (!had_err)
    {
      /* ist der Startpunkt < 3 ist die Startposition 0, 1 oder 2 */
      if (startpoint < 3)
      {
        startpoint = current_frame - 1;
      }
      /* sonst: Berechnung der Startposition anhand der gegebenen Formel */
      else
      {
        startpoint -= (((startpoint) - current_frame) % 3);
        startpoint -= 1;
      }

      /* abschreiten der Sequenz */
      while ((startpoint <= endpoint - 2) && !found)
      {
        /* DNA-Basen-Triplet einlesen */

        contig_seq_tri[0] = tolower(contig_seq_ptr[startpoint]);
        contig_seq_tri[1] =
          tolower(contig_seq_ptr[startpoint + 1]);
        contig_seq_tri[2] =
          tolower(contig_seq_ptr[startpoint + 2]);

        found = gt_check_stopcodon(contig_seq_tri);

        /* Startwert um 3 Basen weitersetzen */
        startpoint += 3;
      }
    }
    else
    {
      found = -1;
    }
  }
  gt_str_delete(query_seq);

  return found;

}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %r8, %r13
movl %ecx, %ebp
movq %rdx, %rbx
movq %rsi, %r12
movq %rdi, %r14
andl $0x0, 0x4(%rsp)
testq %r8, %r8
je 0x2d06ae
movq %r13, %rdi
callq 0x89eb7
testb %al, %al
jne 0x2d07da
movq 0x120(%r14), %rdi
callq 0xad289
movq %rax, 0x8(%rsp)
movq 0x120(%r14), %rdi
callq 0xad1fa
movq %rax, %rdi
callq 0xacbd1
movq %rax, 0x10(%rsp)
movq %rax, %rdi
callq 0xad1fa
movq %rax, %r15
movswq %bp, %rdi
callq 0x2cf195
movl %eax, %ebp
movq %r12, %rax
subq %rbx, %rax
movq %rax, %rcx
negq %rcx
cmovsq %rax, %rcx
xorl %r14d, %r14d
cmpq $0x3, %rcx
jb 0x2d07a8
testw %bp, %bp
js 0x2d078d
movswq %bp, %r13
cmpq $0x2, %r12
ja 0x2d071f
decq %r13
jmp 0x2d0736
movq %r12, %rax
subq %r13, %rax
pushq $0x3
popq %rcx
xorl %edx, %edx
divq %rcx
movq %rdx, %r13
notq %r13
addq %r12, %r13
addq $-0x2, %rbx
xorl %eax, %eax
leaq 0x4(%rsp), %r12
cmpq %rbx, %r13
ja 0x2d0787
testw %ax, %ax
jne 0x2d0787
callq 0x17100
movq (%rax), %rax
movsbq (%r15,%r13), %rcx
movb (%rax,%rcx,4), %cl
movb %cl, 0x4(%rsp)
movsbq 0x1(%r15,%r13), %rcx
movb (%rax,%rcx,4), %cl
movb %cl, 0x5(%rsp)
movsbq 0x2(%r15,%r13), %rcx
movb (%rax,%rcx,4), %al
movb %al, 0x6(%rsp)
movq %r12, %rdi
callq 0x2d05d1
addq $0x3, %r13
jmp 0x2d0741
movzwl %ax, %r14d
jmp 0x2d07a8
movq %r15, %rdi
movq 0x8(%rsp), %r14
movq %r14, %rsi
movq %r13, %rdx
callq 0x1caf90
testl %eax, %eax
je 0x2d07c4
pushq $-0x1
popq %r14
movq 0x10(%rsp), %rdi
callq 0xae103
movl %r14d, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
negl %ebp
notq %rbx
addq %r14, %rbx
subq %r12, %r14
movq %rbx, %r12
movq %r14, %rbx
jmp 0x2d0710
movq 0x167787(%rip), %rax    # 0x437f68
movq (%rax), %rdi
leaq 0x14828(%rip), %rsi     # 0x2e5013
leaq 0x149cd(%rip), %rdx     # 0x2e51bf
leaq 0xb5e6a(%rip), %rcx     # 0x386663
leaq 0xb5e18(%rip), %r8      # 0x386618
movl $0x357, %r9d            # imm = 0x357
xorl %eax, %eax
callq 0x17a50
callq 0x17390