// File: /workspace/github_c_makefile_star2_O3/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
movl $0x0, 0x4(%rsp)
testq %r8, %r8
je 0x32eab4
movq %r13, %rdi
callq 0xfcc32
testb %al, %al
jne 0x32ec09
movq 0x120(%r14), %rdi
callq 0x11b0ca
movq %rax, 0x8(%rsp)
movq 0x120(%r14), %rdi
callq 0x11b0a1
movq %rax, %rdi
callq 0x11acc9
movq %rax, 0x10(%rsp)
movq %rax, %rdi
callq 0x11b0a1
movq %rax, %r15
movswq %bp, %rdi
callq 0x32d655
movl %eax, %ebp
movq %r12, %rax
subq %rbx, %rax
movq %rax, %rcx
negq %rcx
cmovsq %rax, %rcx
xorl %r14d, %r14d
cmpq $0x3, %rcx
jb 0x32ebd2
testw %bp, %bp
js 0x32ebb8
movswq %bp, %r13
cmpq $0x2, %r12
ja 0x32eb29
decq %r13
jmp 0x32eb52
movq %r12, %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 %r12, %rcx
movq %rcx, %r13
addq $-0x2, %rbx
movl $0x0, %r14d
cmpq %rbx, %r13
ja 0x32ebd2
callq 0x17110
movq (%rax), %r14
addq $0x3, %r13
leaq 0x4(%rsp), %r12
movsbq -0x3(%r15,%r13), %rax
movb (%r14,%rax,4), %al
movb %al, 0x4(%rsp)
movsbq -0x2(%r15,%r13), %rax
movb (%r14,%rax,4), %al
movb %al, 0x5(%rsp)
movsbq -0x1(%r15,%r13), %rax
movb (%r14,%rax,4), %al
movb %al, 0x6(%rsp)
movq %r12, %rdi
callq 0x32e9d4
cmpq %rbx, %r13
ja 0x32ebb2
addq $0x3, %r13
testw %ax, %ax
je 0x32eb72
movzwl %ax, %r14d
jmp 0x32ebd2
movq %r15, %rdi
movq 0x8(%rsp), %rsi
movq %r13, %rdx
callq 0x2160d0
movl $0xffffffff, %r14d      # imm = 0xFFFFFFFF
testl %eax, %eax
je 0x32ebee
movq 0x10(%rsp), %rdi
callq 0x11bdbf
movl %r14d, %eax
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
negl %ebp
notq %rbx
movq 0x8(%rsp), %rax
addq %rax, %rbx
subq %r12, %rax
movq %rbx, %r12
movq %rax, %rbx
jmp 0x32eb1a
callq 0x95e74