# extract_missing.rb
#
# extract72.txt に実際に存在しない sequence を調べ、
# missing_sequence.txt に出力する。
#
# sequence は各行の51～54文字目（Rubyでは line[50,4]）。
#
# 0000 と 0080 は先頭部分の手動補完対象なので、
# 自動欠落検索から除外する。
#
# FFD9 は判定基準として使用しない。

input_file  = "extract72.txt"
output_file = "missing_sequence.txt"

# 期待されるsequenceを作成
expected = []

value = 0x0000
while value <= 0x1F80
  expected << "%04X" % value
  value += 0x80
end

# extract72.txt に実際に存在するsequenceを記録
found = {}

File.foreach(input_file) do |line|
  sequence = line[50, 4]

  if sequence && sequence.length == 4
    found[sequence] = true
  end
end

# 0000 と 0080 は手動補完対象
manual = ["0000", "0080"]

# 自動検索対象
search_target = expected - manual

# 欠落sequence
missing = []

search_target.each do |sequence|
  missing << sequence unless found[sequence]
end

# ファイルへ保存
File.open(output_file, "w") do |f|
  f.puts "extract72.txt sequence 欠落一覧"
  f.puts
  f.puts "期待sequence数: #{expected.length}"
  f.puts "手動補完対象: #{manual.length} (#{manual.join(",")})"
  f.puts "自動検索対象: #{search_target.length}"
  f.puts
  f.puts "欠落sequence:"
  
  missing.each do |sequence|
    f.puts sequence
  end

  f.puts
  f.puts "欠落数: #{missing.length}"
end

# 画面表示
puts
puts "========================================"
puts "extract_missing.rb 検索結果"
puts "========================================"
puts "期待sequence数 : #{expected.length}"
puts "手動補完対象   : #{manual.length} (#{manual.join(",")})"
puts "自動検索対象   : #{search_target.length}"
puts "欠落sequence数 : #{missing.length}"
puts

if missing.length > 0
  puts "欠落sequence:"
  missing.each do |sequence|
    puts "  #{sequence}"
  end
else
  puts "欠落sequenceはありません。"
end

puts
puts "結果ファイル: #{output_file}"
puts "========================================"
