// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/extended/gff3_parser.c
// Function: check_multi_feature_constrains
static int check_multi_feature_constrains(GtGenomeNode *new_gf,
                                          GtGenomeNode *old_gf, const char *id,
                                          GtGFF3Parser *parser,
                                          const char *filename,
                                          unsigned int line_number,
                                          GtError *err)
{
  int had_err = 0;
  gt_error_check(err);
  gt_assert(new_gf && old_gf);
  gt_assert(!gt_feature_node_is_pseudo((GtFeatureNode*) new_gf));
  gt_assert(!gt_feature_node_is_pseudo((GtFeatureNode*) old_gf));
  /* the seqids have been compared already */
  gt_assert(!gt_str_cmp(gt_genome_node_get_seqid(new_gf),
                        gt_genome_node_get_seqid(old_gf)));
  /* check source */
  if (!had_err &&
      strcmp(gt_feature_node_get_source((GtFeatureNode*) new_gf),
             gt_feature_node_get_source((GtFeatureNode*) old_gf))) {
    gt_error_set(err, "the multi-feature with %s \"%s\" on line %u in file "
                 "\"%s\" has a different source than its counterpart on line "
                 "%u", GT_GFF_ID, id, line_number, filename,
                 gt_genome_node_get_line_number(old_gf));
    had_err = -1;
  }
  /* check type */
  if (!had_err && gt_feature_node_get_type((GtFeatureNode*) new_gf) !=
                  gt_feature_node_get_type((GtFeatureNode*) old_gf)) {
    gt_error_set(err, "the multi-feature with %s \"%s\" on line %u in file "
                 "\"%s\" has a different type than its counterpart on line %u",
                 GT_GFF_ID, id, line_number, filename,
                 gt_genome_node_get_line_number(old_gf));
    had_err = -1;
  }
  /* check strand */
  if (!had_err && gt_feature_node_get_strand((GtFeatureNode*) new_gf) !=
                  gt_feature_node_get_strand((GtFeatureNode*) old_gf)) {
    /* we just issue a warning here, because this is possible in rare cases, see
       https://github.com/genometools/genometools/issues/225 */
    gt_warning("the multi-feature with %s \"%s\" on line %u in file \"%s\" has "
               "a different strand than its counterpart on line %u (possible "
               "in rare cases)", GT_GFF_ID, id, line_number, filename,
               gt_genome_node_get_line_number(old_gf));
  }
  /* check attributes (for target attribute only the name) */
  if (!had_err) {
    GtStrArray *new_attributes, *old_attributes;
    new_attributes =
      gt_feature_node_get_attribute_list((GtFeatureNode*) new_gf);
    old_attributes =
      gt_feature_node_get_attribute_list((GtFeatureNode*) old_gf);
    had_err = check_missing_attributes(new_gf, new_attributes,
                                       (GtFeatureNode*) old_gf, id, filename,
                                       err);
    if (!had_err) {
      had_err = check_missing_attributes(old_gf, old_attributes,
                                         (GtFeatureNode*) new_gf, id, filename,
                                         err);
    }
    if (!had_err) {
      GtUword i;
      for (i = 0; !had_err && i < gt_str_array_size(new_attributes); i++) {
        const char *attr_name = gt_str_array_get(new_attributes, i);
        if (!strcmp(attr_name, GT_GFF_TARGET)) {
          had_err = compare_target_attribute((GtFeatureNode*) new_gf,
                                             (GtFeatureNode*) old_gf, id, err);
        }
        else if (!strcmp(attr_name, GT_GFF_PARENT) ||
                 !strcmp(attr_name, GT_GFF_NAME)) {
          /* we relaxed the check and now only require the 'Parent' and the
             'Name' attribute to match*/
          had_err = compare_other_attribute(attr_name, (GtFeatureNode*) new_gf,
                                            (GtFeatureNode*) old_gf, id, parser,
                                            err);
        }
      }
    }
    gt_str_array_delete(new_attributes);
    gt_str_array_delete(old_attributes);
  }
  return had_err;
}

// Assembly:
subq $0xe8, %rsp
movq 0xf0(%rsp), %rax
movq %rdi, 0xe0(%rsp)
movq %rsi, 0xd8(%rsp)
movq %rdx, 0xd0(%rsp)
movq %rcx, 0xc8(%rsp)
movq %r8, 0xc0(%rsp)
movl %r9d, 0xbc(%rsp)
movl $0x0, 0xb8(%rsp)
cmpq $0x0, 0xf0(%rsp)
je 0x2e7e0
movq 0xf0(%rsp), %rdi
callq 0xc270
testb $0x1, %al
jne 0x2e7a8
jmp 0x2e7e0
movq 0x185829(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x12f8ad(%rip), %rsi    # 0x15e066
leaq 0x12fe88(%rip), %rdx    # 0x15e648
leaq 0x136589(%rip), %rcx    # 0x164d50
leaq 0x134ddd(%rip), %r8     # 0x1635ab
movl $0x431, %r9d            # imm = 0x431
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2e7e2
jmp 0x2e7e4
cmpq $0x0, 0xe0(%rsp)
je 0x2e7fa
cmpq $0x0, 0xd8(%rsp)
jne 0x2e832
movq 0x1857d7(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x12f85b(%rip), %rsi    # 0x15e066
leaq 0x13655d(%rip), %rdx    # 0x164d6f
leaq 0x136537(%rip), %rcx    # 0x164d50
leaq 0x134d8b(%rip), %r8     # 0x1635ab
movl $0x432, %r9d            # imm = 0x432
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2e834
jmp 0x2e836
movq 0xe0(%rsp), %rdi
callq 0x21880
testb $0x1, %al
jne 0x2e849
jmp 0x2e881
movq 0x185788(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x12f80c(%rip), %rsi    # 0x15e066
leaq 0x13651f(%rip), %rdx    # 0x164d80
leaq 0x1364e8(%rip), %rcx    # 0x164d50
leaq 0x134d3c(%rip), %r8     # 0x1635ab
movl $0x433, %r9d            # imm = 0x433
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2e883
jmp 0x2e885
movq 0xd8(%rsp), %rdi
callq 0x21880
testb $0x1, %al
jne 0x2e898
jmp 0x2e8d0
movq 0x185739(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x12f7bd(%rip), %rsi    # 0x15e066
leaq 0x136504(%rip), %rdx    # 0x164db4
leaq 0x136499(%rip), %rcx    # 0x164d50
leaq 0x134ced(%rip), %r8     # 0x1635ab
movl $0x434, %r9d            # imm = 0x434
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2e8d2
jmp 0x2e8d4
movq 0xe0(%rsp), %rdi
callq 0x258a0
movq %rax, 0x90(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x258a0
movq 0x90(%rsp), %rdi
movq %rax, %rsi
callq 0x19bd0
cmpl $0x0, %eax
je 0x2e943
movq 0x1856c6(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x12f74a(%rip), %rsi    # 0x15e066
leaq 0x1364c5(%rip), %rdx    # 0x164de8
leaq 0x136426(%rip), %rcx    # 0x164d50
leaq 0x134c7a(%rip), %r8     # 0x1635ab
movl $0x437, %r9d            # imm = 0x437
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2e945
cmpl $0x0, 0xb8(%rsp)
jne 0x2ea06
movq 0xe0(%rsp), %rdi
callq 0x215a0
movq %rax, 0x88(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x215a0
movq 0x88(%rsp), %rdi
movq %rax, %rsi
callq 0xb850
cmpl $0x0, %eax
je 0x2ea06
movq 0xf0(%rsp), %rax
movq %rax, 0x68(%rsp)
movq 0xd0(%rsp), %rax
movq %rax, 0x70(%rsp)
movl 0xbc(%rsp), %eax
movl %eax, 0x7c(%rsp)
movq 0xc0(%rsp), %rax
movq %rax, 0x80(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x25850
movq 0x68(%rsp), %rdi
movq 0x70(%rsp), %rcx
movl 0x7c(%rsp), %r8d
movq 0x80(%rsp), %r9
leaq 0x13644e(%rip), %rsi    # 0x164e38
leaq 0x135e4f(%rip), %rdx    # 0x164840
movl %eax, (%rsp)
movb $0x0, %al
callq 0xc0d0
movl $0xffffffff, 0xb8(%rsp) # imm = 0xFFFFFFFF
cmpl $0x0, 0xb8(%rsp)
jne 0x2eab6
movq 0xe0(%rsp), %rdi
callq 0x211d0
movq %rax, 0x60(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x211d0
movq %rax, %rcx
movq 0x60(%rsp), %rax
cmpq %rcx, %rax
je 0x2eab6
movq 0xf0(%rsp), %rax
movq %rax, 0x40(%rsp)
movq 0xd0(%rsp), %rax
movq %rax, 0x48(%rsp)
movl 0xbc(%rsp), %eax
movl %eax, 0x54(%rsp)
movq 0xc0(%rsp), %rax
movq %rax, 0x58(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x25850
movq 0x40(%rsp), %rdi
movq 0x48(%rsp), %rcx
movl 0x54(%rsp), %r8d
movq 0x58(%rsp), %r9
leaq 0x13640c(%rip), %rsi    # 0x164ea6
leaq 0x135d9f(%rip), %rdx    # 0x164840
movl %eax, (%rsp)
movb $0x0, %al
callq 0xc0d0
movl $0xffffffff, 0xb8(%rsp) # imm = 0xFFFFFFFF
cmpl $0x0, 0xb8(%rsp)
jne 0x2eb44
movq 0xe0(%rsp), %rdi
callq 0x20a10
movl %eax, 0x3c(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x20a10
movl %eax, %ecx
movl 0x3c(%rsp), %eax
cmpl %ecx, %eax
je 0x2eb44
movq 0xd0(%rsp), %rax
movq %rax, 0x20(%rsp)
movl 0xbc(%rsp), %eax
movl %eax, 0x2c(%rsp)
movq 0xc0(%rsp), %rax
movq %rax, 0x30(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x25850
movq 0x20(%rsp), %rdx
movl 0x2c(%rsp), %ecx
movq 0x30(%rsp), %r8
movl %eax, %r9d
leaq 0x1363dc(%rip), %rdi    # 0x164f12
leaq 0x135d03(%rip), %rsi    # 0x164840
movb $0x0, %al
callq 0x1c550
cmpl $0x0, 0xb8(%rsp)
jne 0x2ed6c
movq 0xe0(%rsp), %rdi
callq 0x1fe30
movq %rax, 0xb0(%rsp)
movq 0xd8(%rsp), %rdi
callq 0x1fe30
movq %rax, 0xa8(%rsp)
movq 0xe0(%rsp), %rdi
movq 0xb0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0xd0(%rsp), %rcx
movq 0xc0(%rsp), %r8
movq 0xf0(%rsp), %r9
callq 0x2f620
movl %eax, 0xb8(%rsp)
cmpl $0x0, 0xb8(%rsp)
jne 0x2ebfe
movq 0xd8(%rsp), %rdi
movq 0xa8(%rsp), %rsi
movq 0xe0(%rsp), %rdx
movq 0xd0(%rsp), %rcx
movq 0xc0(%rsp), %r8
movq 0xf0(%rsp), %r9
callq 0x2f620
movl %eax, 0xb8(%rsp)
cmpl $0x0, 0xb8(%rsp)
jne 0x2ed52
movq $0x0, 0xa0(%rsp)
xorl %eax, %eax
cmpl $0x0, 0xb8(%rsp)
movb %al, 0x1f(%rsp)
jne 0x2ec54
movq 0xa0(%rsp), %rax
movq %rax, 0x10(%rsp)
movq 0xb0(%rsp), %rdi
callq 0x1b720
movq %rax, %rcx
movq 0x10(%rsp), %rax
cmpq %rcx, %rax
setb %al
movb %al, 0x1f(%rsp)
movb 0x1f(%rsp), %al
testb $0x1, %al
jne 0x2ec61
jmp 0x2ed50
movq 0xb0(%rsp), %rdi
movq 0xa0(%rsp), %rsi
callq 0x1b320
movq %rax, 0x98(%rsp)
movq 0x98(%rsp), %rdi
leaq 0x135c24(%rip), %rsi    # 0x1648b1
callq 0xb850
cmpl $0x0, %eax
jne 0x2ecc5
movq 0xe0(%rsp), %rdi
movq 0xd8(%rsp), %rsi
movq 0xd0(%rsp), %rdx
movq 0xf0(%rsp), %rcx
callq 0x2f860
movl %eax, 0xb8(%rsp)
jmp 0x2ed35
movq 0x98(%rsp), %rdi
leaq 0x135b6f(%rip), %rsi    # 0x164843
callq 0xb850
cmpl $0x0, %eax
je 0x2ecf7
movq 0x98(%rsp), %rdi
leaq 0x135c6e(%rip), %rsi    # 0x16495b
callq 0xb850
cmpl $0x0, %eax
jne 0x2ed33
movq 0x98(%rsp), %rdi
movq 0xe0(%rsp), %rsi
movq 0xd8(%rsp), %rdx
movq 0xd0(%rsp), %rcx
movq 0xc8(%rsp), %r8
movq 0xf0(%rsp), %r9
callq 0x2fb10
movl %eax, 0xb8(%rsp)
jmp 0x2ed35
jmp 0x2ed37
movq 0xa0(%rsp), %rax
addq $0x1, %rax
movq %rax, 0xa0(%rsp)
jmp 0x2ec18
jmp 0x2ed52
movq 0xb0(%rsp), %rdi
callq 0x1b780
movq 0xa8(%rsp), %rdi
callq 0x1b780
movl 0xb8(%rsp), %eax
addq $0xe8, %rsp
retq
nopl (%rax,%rax)