// File: /workspace/github_c_makefile_star2_O1/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, %r14d
movq %rdx, %rbx
movq %rsi, %r12
movq %rdi, %r15
movl $0x0, 0x4(%rsp)
testq %r8, %r8
je 0x33981d
movq %r13, %rdi
callq 0x101a9a
testb %al, %al
jne 0x339978
movq 0x120(%r15), %rdi
callq 0x120d4c
movq %rax, %rbp
movq 0x120(%r15), %rdi
callq 0x120d23
movq %rax, %rdi
callq 0x120955
movq %rax, 0x10(%rsp)
movq %rax, %rdi
callq 0x120d23
movq %rax, %r15
movswq %r14w, %rdi
callq 0x338258
movq %r12, 0x8(%rsp)
subq %rbx, %r12
movq %r12, %rcx
negq %rcx
cmovsq %r12, %rcx
xorl %r12d, %r12d
cmpq $0x3, %rcx
jb 0x33995c
movl %eax, %r14d
testw %ax, %ax
js 0x339884
movb $0x1, %al
jmp 0x3398ad
negl %r14d
movq %r15, %rdi
movq %rbp, %rsi
movq %r13, %rdx
callq 0x21fe1c
notq %rbx
addq %rbp, %rbx
subq 0x8(%rsp), %rbp
testl %eax, %eax
sete %al
movq %rbx, 0x8(%rsp)
movq %rbp, %rbx
movl $0xffffffff, %r12d      # imm = 0xFFFFFFFF
testb %al, %al
je 0x33995c
movswq %r14w, %r13
movq 0x8(%rsp), %rsi
cmpq $0x2, %rsi
ja 0x3398cf
decq %r13
jmp 0x3398f8
movq %rsi, %rcx
subq %r13, %rcx
movabsq $-0x5555555555555555, %rdx # imm = 0xAAAAAAAAAAAAAAAB
movq %rcx, %rax
mulq %rdx
shrq %rdx
leaq (%rdx,%rdx,2), %rax
subq %rax, %rcx
notq %rcx
addq %rsi, %rcx
movq %rcx, %r13
addq $-0x2, %rbx
movl $0x0, %r12d
cmpq %rbx, %r13
ja 0x33995c
callq 0x17110
movq (%rax), %r12
addq $0x3, %r13
leaq 0x4(%rsp), %r14
movsbq -0x3(%r15,%r13), %rax
movb (%r12,%rax,4), %al
movb %al, 0x4(%rsp)
movsbq -0x2(%r15,%r13), %rax
movb (%r12,%rax,4), %al
movb %al, 0x5(%rsp)
movsbq -0x1(%r15,%r13), %rax
movb (%r12,%rax,4), %al
movb %al, 0x6(%rsp)
movq %r14, %rdi
callq 0x33973c
cmpq %rbx, %r13
ja 0x339958
addq $0x3, %r13
testw %ax, %ax
je 0x339918
movzwl %ax, %r12d
movq 0x10(%rsp), %rdi
callq 0x121b03
movl %r12d, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
callq 0x97f49