local unicode_printability_boundaries = require "luacheck.unicode_printability_boundaries"
|
|
local unicode = {}
|
|
-- unicode_printability_boundaries is an array of first codepoints of
|
-- each continuous block of codepoints that are all printable or all not printable.
|
|
function unicode.is_printable(codepoint)
|
-- Binary search for index of the first boundary less than or equal to given codepoint.
|
local floor_boundary_index
|
|
-- Target index is always in [begin_index..end_index).
|
local begin_index = 1
|
local end_index = #unicode_printability_boundaries + 1
|
|
while end_index - begin_index > 1 do
|
local mid_index = math.floor((begin_index + end_index) / 2)
|
local mid_codepoint = unicode_printability_boundaries[mid_index]
|
|
if codepoint < mid_codepoint then
|
end_index = mid_index
|
elseif codepoint > mid_codepoint then
|
begin_index = mid_index
|
else
|
floor_boundary_index = mid_index
|
break
|
end
|
end
|
|
floor_boundary_index = floor_boundary_index or begin_index
|
-- floor_boundary_index is the number of the block containing codepoint.
|
-- Printable and not printable blocks alternate and the first one is not printable (zero is not printable).
|
return floor_boundary_index % 2 == 0
|
end
|
|
return unicode
|