def goahead(_end)
rawdata = @rawdata
i = 0
n = rawdata.length
while i < n
if @nomoretags
i = handle_data_range(rawdata, i, n)
break
end
j = rawdata.index(Interesting, i)
j = n unless j
i = handle_data_range(rawdata, i, j)
break if (i == n)
if rawdata[i] == ?<
if rawdata.index(Starttagopen, i) == i
if @literal
i = handle_data_range(rawdata, i, i+1)
next
end
k = parse_starttag(i)
break unless k
i = k
next
end
if rawdata.index(Endtagopen, i) == i
k = parse_endtag(i)
break unless k
i = k
@literal = false
next
end
if rawdata.index(Commentopen, i) == i
if @literal
i = handle_data_range(rawdata, i, i+1)
next
end
k = parse_comment(i)
break unless k
i += k
next
end
if rawdata.index(Special, i) == i
if @literal
i = handle_data_range(rawdata, i, i+1)
next
end
k = parse_special(i)
break unless k
i += k
next
end
elsif rawdata[i] == ?&
if rawdata.index(Charref, i) == i
end_index = i + $&.length
end_index -= 1 unless rawdata[end_index-1] == ?;
set_range(i, end_index)
handle_charref($1)
i = end_index
next
end
if rawdata.index(Entityref, i) == i
end_index = i + $&.length
end_index -= 1 unless rawdata[end_index-1] == ?;
set_range(i, end_index)
handle_entityref($1)
i = end_index
next
end
else
raise RuntimeError, 'neither < nor & ??'
end
match = rawdata.index(Incomplete, i)
unless match == i
i = handle_data_range(rawdata, i, i+1)
next
end
j = match + $&.length
break if j == n
i = handle_data_range(rawdata, i, j)
end
if _end and i < n
i = handle_data_range(rawdata, i, n)
end
@rawdata = rawdata[i..-1]
@offset += i
end