// File: /workspace/github_c_makefile_star2_O0/genometools[P]genometools/src/extended/gff3_parser.c
// Function: parse_gff3_feature_line
static int parse_gff3_feature_line(GtGFF3Parser *parser,
                                   GtQueue *genome_nodes,
                                   GtCstrTable *used_types, char *line,
                                   size_t line_length, GtStr *filenamestr,
                                   unsigned int line_number, GtError *err)
{
  GtGenomeNode *gn = NULL, *feature_node = NULL;
  GtSplitter *splitter;
  GtStr *seqid_str = NULL;
  GtStrand gt_strand_value;
  float score_value;
  GtPhase phase_value;
  GtRange range;
  char *seqid = NULL, *source = NULL, *type = NULL, *start = NULL,
       *end = NULL, *score = NULL, *strand = NULL, *phase = NULL,
       *attributes = NULL, **tokens;
  const char *filename;
  bool score_is_defined, is_child = false;
  int had_err = 0;

  gt_error_check(err);

  filename = gt_str_get(filenamestr);

  /* create splitter */
  splitter = gt_splitter_new();

  /* parse */
  gt_splitter_split(splitter, line, line_length, '\t');
  if (gt_splitter_size(splitter) != 9) {
    if (parser->tidy && gt_splitter_size(splitter) == 10) {
      gt_warning("line %u in file \"%s\" does not contain 9 tab (\\t) "
                 "separated fields, dropping 10th field",
                 line_number, filename);
    }
    else {
      gt_error_set(err, "line %u in file \"%s\" does not contain 9 tab (\\t) "
                        "separated fields", line_number, filename);
      had_err = -1;
    }
  }
  if (!had_err) {
    tokens = gt_splitter_get_tokens(splitter);
    seqid      = tokens[0];
    source     = tokens[1];
    type       = tokens[2];
    start      = tokens[3];
    end        = tokens[4];
    score      = tokens[5];
    strand     = tokens[6];
    phase      = tokens[7];
    attributes = tokens[8];
  }

  if (!had_err && parser->tidy && (start[0] == '.' || end[0] == '.')) {
    gt_warning("feature \"%s\" on line %u in file \"%s\" has undefined "
               "range, discarding feature", type, line_number, filename);
    gt_splitter_delete(splitter);
    return 0;
  }

  /* parse the feature type */
  if (!had_err) {
    if (parser->type_checker &&
        !gt_type_checker_is_valid(parser->type_checker, type)) {
      gt_error_set(err, "type \"%s\" on line %u in file \"%s\" is not a valid "
                   "one", type, line_number, filename);
      had_err = -1;
    }
    else if (!gt_cstr_table_get(used_types, type))
      gt_cstr_table_add(used_types, type);
  }

  /* parse the range */
  if (!had_err) {
    if (parser->strict)
      had_err = gt_parse_range(&range, start, end, line_number, filename, err);
    else if (parser->tidy) {
      had_err = gt_parse_range_tidy(&range, start, end, line_number, filename,
                                    err);
    }
    else {
      had_err = gt_parse_range_correct_neg(&range, start, end, line_number,
                                           filename, err);
    }
  }
  if (!had_err && range.start == 0) {
      gt_error_set(err, "illegal feature start 0 on line %u in file \"%s\" "
                   "(GFF3 files are 1-based)", line_number, filename);
      had_err = -1;
  }
  if (!had_err) {
    had_err = add_offset_if_necessary(&range, parser, seqid, filename,
                                      line_number, err);
  }

  /* parse the score */
  if (!had_err) {
    had_err = gt_parse_score(&score_is_defined, &score_value, score,
                             line_number, filename, err);
  }

  /* parse the strand */
  if (!had_err) {
    had_err = gt_parse_strand(&gt_strand_value, strand, line_number, filename,
                              err);
  }

  /* parse the phase */
  if (!had_err)
    had_err = gt_parse_phase(&phase_value, phase, line_number, filename, err);

  if (!had_err)
    chomp_seqid(seqid, filename, line_number);

  /* get seqid */
  if (!had_err) {
    had_err = get_seqid_str(&seqid_str, seqid, range, parser, filename,
                            line_number, err);
  }
  /* verify seqid */
  if (!had_err)
    had_err = verify_seqid(seqid_str, filename, line_number, err);

  /* create the feature */
  if (!had_err) {
    feature_node = gt_feature_node_new(seqid_str, type, range.start, range.end,
                                       gt_strand_value);
    gt_genome_node_set_origin(feature_node, filenamestr, line_number);
  }

  /* set source */
  if (!had_err) {
    set_source((GtFeatureNode*) feature_node, source,
               parser->source_to_str_mapping);
  }

  /* parse the attributes */
  if (!had_err) {
    had_err = parse_attributes(attributes, feature_node, &is_child, parser,
                               seqid, genome_nodes, filename, line_number, err);
  }

  if (!had_err && score_is_defined)
    gt_feature_node_set_score((GtFeatureNode*) feature_node, score_value);
  if (!had_err && phase_value != GT_PHASE_UNDEFINED)
    gt_feature_node_set_phase((GtFeatureNode*) feature_node, phase_value);

  if (!had_err)
    gn = is_child ? NULL : feature_node;
  else if (!is_child)
    gt_genome_node_delete(feature_node);

  if (!had_err && gn)
    gt_queue_add(genome_nodes, gn);

  /* free */
  gt_str_delete(seqid_str);
  gt_splitter_delete(splitter);

  return had_err;
}

// Assembly:
subq $0xf8, %rsp
movq 0x108(%rsp), %rax
movl 0x100(%rsp), %eax
movq %rdi, 0xe8(%rsp)
movq %rsi, 0xe0(%rsp)
movq %rdx, 0xd8(%rsp)
movq %rcx, 0xd0(%rsp)
movq %r8, 0xc8(%rsp)
movq %r9, 0xc0(%rsp)
movq $0x0, 0xb8(%rsp)
movq $0x0, 0xb0(%rsp)
movq $0x0, 0xa0(%rsp)
movq $0x0, 0x78(%rsp)
movq $0x0, 0x70(%rsp)
movq $0x0, 0x68(%rsp)
movq $0x0, 0x60(%rsp)
movq $0x0, 0x58(%rsp)
movq $0x0, 0x50(%rsp)
movq $0x0, 0x48(%rsp)
movq $0x0, 0x40(%rsp)
movq $0x0, 0x38(%rsp)
movb $0x0, 0x26(%rsp)
movl $0x0, 0x20(%rsp)
cmpq $0x0, 0x108(%rsp)
je 0x2af9e
movq 0x108(%rsp), %rdi
callq 0xc270
testb $0x1, %al
jne 0x2af66
jmp 0x2af9e
movq 0x18906b(%rip), %rax    # 0x1b3fd8
movq (%rax), %rdi
leaq 0x1330ef(%rip), %rsi    # 0x15e066
leaq 0x1336ca(%rip), %rdx    # 0x15e648
leaq 0x1393ce(%rip), %rcx    # 0x164353
leaq 0x13861f(%rip), %r8     # 0x1635ab
movl $0x5fd, %r9d            # imm = 0x5FD
movb $0x0, %al
callq 0xb890
callq 0xb2e0
jmp 0x2afa0
movq 0xc0(%rsp), %rdi
callq 0x19940
movq %rax, 0x28(%rsp)
callq 0x16a10
movq %rax, 0xa8(%rsp)
movq 0xa8(%rsp), %rdi
movq 0xd0(%rsp), %rsi
movq 0xc8(%rsp), %rdx
movl $0x9, %ecx
callq 0x16a30
movq 0xa8(%rsp), %rdi
callq 0x17010
cmpq $0x9, %rax
je 0x2b05d
movq 0xe8(%rsp), %rax
testb $0x1, 0x1c(%rax)
je 0x2b031
movq 0xa8(%rsp), %rdi
callq 0x17010
cmpq $0xa, %rax
jne 0x2b031
movl 0x100(%rsp), %esi
movq 0x28(%rsp), %rdx
leaq 0x139343(%rip), %rdi    # 0x16436b
movb $0x0, %al
callq 0x1c550
jmp 0x2b05b
movq 0x108(%rsp), %rdi
movl 0x100(%rsp), %edx
movq 0x28(%rsp), %rcx
leaq 0x139376(%rip), %rsi    # 0x1643c2
movb $0x0, %al
callq 0xc0d0
movl $0xffffffff, 0x20(%rsp) # imm = 0xFFFFFFFF
jmp 0x2b05d
cmpl $0x0, 0x20(%rsp)
jne 0x2b0f7
movq 0xa8(%rsp), %rdi
callq 0x16ed0
movq %rax, 0x30(%rsp)
movq 0x30(%rsp), %rax
movq (%rax), %rax
movq %rax, 0x78(%rsp)
movq 0x30(%rsp), %rax
movq 0x8(%rax), %rax
movq %rax, 0x70(%rsp)
movq 0x30(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, 0x68(%rsp)
movq 0x30(%rsp), %rax
movq 0x18(%rax), %rax
movq %rax, 0x60(%rsp)
movq 0x30(%rsp), %rax
movq 0x20(%rax), %rax
movq %rax, 0x58(%rsp)
movq 0x30(%rsp), %rax
movq 0x28(%rax), %rax
movq %rax, 0x50(%rsp)
movq 0x30(%rsp), %rax
movq 0x30(%rax), %rax
movq %rax, 0x48(%rsp)
movq 0x30(%rsp), %rax
movq 0x38(%rax), %rax
movq %rax, 0x40(%rsp)
movq 0x30(%rsp), %rax
movq 0x40(%rax), %rax
movq %rax, 0x38(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b162
movq 0xe8(%rsp), %rax
testb $0x1, 0x1c(%rax)
je 0x2b162
movq 0x60(%rsp), %rax
movsbl (%rax), %eax
cmpl $0x2e, %eax
je 0x2b126
movq 0x58(%rsp), %rax
movsbl (%rax), %eax
cmpl $0x2e, %eax
jne 0x2b162
movq 0x68(%rsp), %rsi
movl 0x100(%rsp), %edx
movq 0x28(%rsp), %rcx
leaq 0x1392c6(%rip), %rdi    # 0x164404
movb $0x0, %al
callq 0x1c550
movq 0xa8(%rsp), %rdi
callq 0x17060
movl $0x0, 0xf4(%rsp)
jmp 0x2b60f
cmpl $0x0, 0x20(%rsp)
jne 0x2b1f5
movq 0xe8(%rsp), %rax
cmpq $0x0, 0x40(%rax)
je 0x2b1c7
movq 0xe8(%rsp), %rax
movq 0x40(%rax), %rdi
movq 0x68(%rsp), %rsi
callq 0x393f0
testb $0x1, %al
jne 0x2b1c7
movq 0x108(%rsp), %rdi
movq 0x68(%rsp), %rdx
movl 0x100(%rsp), %ecx
movq 0x28(%rsp), %r8
leaq 0x13929b(%rip), %rsi    # 0x164451
movb $0x0, %al
callq 0xc0d0
movl $0xffffffff, 0x20(%rsp) # imm = 0xFFFFFFFF
jmp 0x2b1f3
movq 0xd8(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0x7d1d0
cmpq $0x0, %rax
jne 0x2b1f1
movq 0xd8(%rsp), %rdi
movq 0x68(%rsp), %rsi
callq 0x7d0b0
jmp 0x2b1f3
jmp 0x2b1f5
cmpl $0x0, 0x20(%rsp)
jne 0x2b2b1
movq 0xe8(%rsp), %rax
testb $0x1, 0x1b(%rax)
je 0x2b23f
movq 0x60(%rsp), %rsi
movq 0x58(%rsp), %rdx
movl 0x100(%rsp), %ecx
movq 0x28(%rsp), %r8
movq 0x108(%rsp), %r9
leaq 0x80(%rsp), %rdi
callq 0x15770
movl %eax, 0x20(%rsp)
jmp 0x2b2af
movq 0xe8(%rsp), %rax
testb $0x1, 0x1c(%rax)
je 0x2b27e
movq 0x60(%rsp), %rsi
movq 0x58(%rsp), %rdx
movl 0x100(%rsp), %ecx
movq 0x28(%rsp), %r8
movq 0x108(%rsp), %r9
leaq 0x80(%rsp), %rdi
callq 0x15c90
movl %eax, 0x20(%rsp)
jmp 0x2b2ad
movq 0x60(%rsp), %rsi
movq 0x58(%rsp), %rdx
movl 0x100(%rsp), %ecx
movq 0x28(%rsp), %r8
movq 0x108(%rsp), %r9
leaq 0x80(%rsp), %rdi
callq 0x15cf0
movl %eax, 0x20(%rsp)
jmp 0x2b2af
jmp 0x2b2b1
cmpl $0x0, 0x20(%rsp)
jne 0x2b2ed
cmpq $0x0, 0x80(%rsp)
jne 0x2b2ed
movq 0x108(%rsp), %rdi
movl 0x100(%rsp), %edx
movq 0x28(%rsp), %rcx
leaq 0x1391a8(%rip), %rsi    # 0x164486
movb $0x0, %al
callq 0xc0d0
movl $0xffffffff, 0x20(%rsp) # imm = 0xFFFFFFFF
cmpl $0x0, 0x20(%rsp)
jne 0x2b329
movq 0xe8(%rsp), %rsi
movq 0x78(%rsp), %rdx
movq 0x28(%rsp), %rcx
movl 0x100(%rsp), %eax
movl %eax, %r8d
movq 0x108(%rsp), %r9
leaq 0x80(%rsp), %rdi
callq 0x2c1e0
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b35f
movq 0x50(%rsp), %rdx
movl 0x100(%rsp), %ecx
movq 0x28(%rsp), %r8
movq 0x108(%rsp), %r9
leaq 0x27(%rsp), %rdi
leaq 0x98(%rsp), %rsi
callq 0x15d50
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b390
movq 0x48(%rsp), %rsi
movl 0x100(%rsp), %edx
movq 0x28(%rsp), %rcx
movq 0x108(%rsp), %r8
leaq 0x9c(%rsp), %rdi
callq 0x15ea0
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b3c1
movq 0x40(%rsp), %rsi
movl 0x100(%rsp), %edx
movq 0x28(%rsp), %rcx
movq 0x108(%rsp), %r8
leaq 0x94(%rsp), %rdi
callq 0x16020
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b3de
movq 0x78(%rsp), %rdi
movq 0x28(%rsp), %rsi
movl 0x100(%rsp), %edx
callq 0x296c0
cmpl $0x0, 0x20(%rsp)
jne 0x2b431
movq 0x78(%rsp), %rsi
movq 0xe8(%rsp), %r8
movq 0x28(%rsp), %r9
movl 0x100(%rsp), %r10d
movq 0x108(%rsp), %rax
movq 0x80(%rsp), %rdx
movq 0x88(%rsp), %rcx
leaq 0xa0(%rsp), %rdi
movl %r10d, (%rsp)
movq %rax, 0x8(%rsp)
callq 0x2cab0
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b45d
movq 0xa0(%rsp), %rdi
movq 0x28(%rsp), %rsi
movl 0x100(%rsp), %edx
movq 0x108(%rsp), %rcx
callq 0x2bfe0
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b4b2
movq 0xa0(%rsp), %rdi
movq 0x68(%rsp), %rsi
movq 0x80(%rsp), %rdx
movq 0x88(%rsp), %rcx
movl 0x9c(%rsp), %r8d
callq 0x20580
movq %rax, 0xb0(%rsp)
movq 0xb0(%rsp), %rdi
movq 0xc0(%rsp), %rsi
movl 0x100(%rsp), %edx
callq 0x25610
cmpl $0x0, 0x20(%rsp)
jne 0x2b4d7
movq 0xb0(%rsp), %rdi
movq 0x70(%rsp), %rsi
movq 0xe8(%rsp), %rax
movq 0x10(%rax), %rdx
callq 0x2cc90
cmpl $0x0, 0x20(%rsp)
jne 0x2b531
movq 0x38(%rsp), %rdi
movq 0xb0(%rsp), %rsi
movq 0xe8(%rsp), %rcx
movq 0x78(%rsp), %r8
movq 0xe0(%rsp), %r9
movq 0x28(%rsp), %r11
movl 0x100(%rsp), %r10d
movq 0x108(%rsp), %rax
leaq 0x26(%rsp), %rdx
movq %r11, (%rsp)
movl %r10d, 0x8(%rsp)
movq %rax, 0x10(%rsp)
callq 0x2cda0
movl %eax, 0x20(%rsp)
cmpl $0x0, 0x20(%rsp)
jne 0x2b555
testb $0x1, 0x27(%rsp)
je 0x2b555
movq 0xb0(%rsp), %rdi
movss 0x98(%rsp), %xmm0
callq 0x21330
cmpl $0x0, 0x20(%rsp)
jne 0x2b57a
cmpl $0x3, 0x94(%rsp)
je 0x2b57a
movq 0xb0(%rsp), %rdi
movl 0x94(%rsp), %esi
callq 0x1fff0
cmpl $0x0, 0x20(%rsp)
jne 0x2b5ad
testb $0x1, 0x26(%rsp)
je 0x2b591
xorl %eax, %eax
movq %rax, 0x18(%rsp)
jmp 0x2b59e
movq 0xb0(%rsp), %rax
movq %rax, 0x18(%rsp)
movq 0x18(%rsp), %rax
movq %rax, 0xb8(%rsp)
jmp 0x2b5c3
testb $0x1, 0x26(%rsp)
jne 0x2b5c1
movq 0xb0(%rsp), %rdi
callq 0x26eb0
jmp 0x2b5c3
cmpl $0x0, 0x20(%rsp)
jne 0x2b5ea
cmpq $0x0, 0xb8(%rsp)
je 0x2b5ea
movq 0xe0(%rsp), %rdi
movq 0xb8(%rsp), %rsi
callq 0x909d0
movq 0xa0(%rsp), %rdi
callq 0x1afc0
movq 0xa8(%rsp), %rdi
callq 0x17060
movl 0x20(%rsp), %eax
movl %eax, 0xf4(%rsp)
movl 0xf4(%rsp), %eax
addq $0xf8, %rsp
retq
nop