// File: /workspace/github_c_makefile_star2_O0/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:
subq $0x78, %rsp
movw %cx, %ax
movq %rdi, 0x70(%rsp)
movq %rsi, 0x68(%rsp)
movq %rdx, 0x60(%rsp)
movw %ax, 0x5e(%rsp)
movq %r8, 0x50(%rsp)
movl $0x0, 0x4c(%rsp)
movq $0x0, 0x40(%rsp)
movq $0x0, 0x38(%rsp)
movq $0x0, 0x30(%rsp)
movw $0x0, 0x26(%rsp)
movw $0x0, 0x24(%rsp)
movq $0x0, 0x10(%rsp)
leaq 0xc(%rsp), %rdi
xorl %esi, %esi
movl $0x4, %edx
callq 0x19360
cmpq $0x0, 0x50(%rsp)
je 0x4ed9ab
movq 0x50(%rsp), %rdi
callq 0xd8a60
testb $0x1, %al
jne 0x4ed973
jmp 0x4ed9ab
movq 0x14e626(%rip), %rax    # 0x63bfa0
movq (%rax), %rdi
leaq 0x2868f(%rip), %rsi     # 0x516013
leaq 0x28834(%rip), %rdx     # 0x5161bf
leaq 0xce573(%rip), %rcx     # 0x5bbf05
leaq 0xce521(%rip), %r8      # 0x5bbeba
movl $0x357, %r9d            # imm = 0x357
movb $0x0, %al
callq 0x199f0
callq 0x19370
jmp 0x4ed9ad
movq 0x68(%rsp), %rax
movq %rax, 0x40(%rsp)
movq 0x60(%rsp), %rax
movq %rax, 0x38(%rsp)
movq 0x70(%rsp), %rax
movq 0x120(%rax), %rdi
callq 0x11dfa0
movq %rax, 0x30(%rsp)
movq 0x70(%rsp), %rax
movq 0x120(%rax), %rdi
callq 0x11dee0
movq %rax, %rdi
callq 0x11d510
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rdi
callq 0x11dee0
movq %rax, 0x10(%rsp)
movswq 0x5e(%rsp), %rdi
callq 0x4eb870
movw %ax, 0x26(%rsp)
movq 0x40(%rsp), %rax
subq 0x38(%rsp), %rax
movq %rax, 0x28(%rsp)
cmpq $0x0, 0x28(%rsp)
jge 0x4eda36
imulq $-0x1, 0x28(%rsp), %rax
movq %rax, 0x28(%rsp)
cmpq $0x3, 0x28(%rsp)
jl 0x4edb92
movswl 0x26(%rsp), %eax
cmpl $0x0, %eax
jge 0x4eda93
movswl 0x26(%rsp), %eax
imull $-0x1, %eax, %eax
movw %ax, 0x26(%rsp)
movq 0x10(%rsp), %rdi
movq 0x30(%rsp), %rsi
movq 0x50(%rsp), %rdx
callq 0x31ac60
movl %eax, 0x4c(%rsp)
movq 0x30(%rsp), %rax
subq $0x1, %rax
subq 0x60(%rsp), %rax
movq %rax, 0x40(%rsp)
movq 0x30(%rsp), %rax
subq 0x68(%rsp), %rax
movq %rax, 0x38(%rsp)
cmpl $0x0, 0x4c(%rsp)
jne 0x4edb89
cmpq $0x3, 0x40(%rsp)
jae 0x4edab7
movswl 0x26(%rsp), %eax
subl $0x1, %eax
cltq
movq %rax, 0x40(%rsp)
jmp 0x4edaea
movq 0x40(%rsp), %rax
movswq 0x26(%rsp), %rcx
subq %rcx, %rax
movl $0x3, %ecx
xorl %edx, %edx
divq %rcx
movq 0x40(%rsp), %rax
subq %rdx, %rax
movq %rax, 0x40(%rsp)
movq 0x40(%rsp), %rax
subq $0x1, %rax
movq %rax, 0x40(%rsp)
jmp 0x4edaec
movq 0x40(%rsp), %rcx
movq 0x38(%rsp), %rdx
subq $0x2, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, 0xb(%rsp)
ja 0x4edb14
cmpw $0x0, 0x24(%rsp)
setne %al
xorb $-0x1, %al
movb %al, 0xb(%rsp)
movb 0xb(%rsp), %al
testb $0x1, %al
jne 0x4edb1e
jmp 0x4edb87
movq 0x10(%rsp), %rax
movq 0x40(%rsp), %rcx
movsbl (%rax,%rcx), %edi
callq 0x19a20
movb %al, 0xc(%rsp)
movq 0x10(%rsp), %rax
movq 0x40(%rsp), %rcx
movsbl 0x1(%rax,%rcx), %edi
callq 0x19a20
movb %al, 0xd(%rsp)
movq 0x10(%rsp), %rax
movq 0x40(%rsp), %rcx
movsbl 0x2(%rax,%rcx), %edi
callq 0x19a20
movb %al, 0xe(%rsp)
leaq 0xc(%rsp), %rdi
callq 0x4ed810
movw %ax, 0x24(%rsp)
movq 0x40(%rsp), %rax
addq $0x3, %rax
movq %rax, 0x40(%rsp)
jmp 0x4edaec
jmp 0x4edb90
movw $0xffff, 0x24(%rsp)     # imm = 0xFFFF
jmp 0x4edb92
movq 0x18(%rsp), %rdi
callq 0x11f560
movswl 0x24(%rsp), %eax
addq $0x78, %rsp
retq
nopw %cs:(%rax,%rax)