#!/usr/bin/ruby def max x, y (x >= y) ? x : y end class String def tablen (length + 8) / 8 end def tabfill tabs self + "\t" * (tabs - (length / 8)) end def ** other star = nil star = length - 1 if self[length - 1] == '*' star = other.length - 1 if other[other.length - 1] == '*' if star then if self[0...star] == other[0...star] then return 1 if star == length - 1 return -1 end end return self <=> other end end header = [] supported = [] maxtabs = [0,0] maxlen = [0,0] File.open("supported.conf"){|f| f.each_line{|l| l.chomp! l.gsub! %r, '/' split = (l.match %r<^([^[:blank:]/]*)[[:blank:]]+(?:([^[:blank:]/]+)[[:blank:]]+)?(?:([^[:blank:]/]+)[[:blank:]]+)?([^[:blank:]]+/[^[:blank:]]+)(?:[[:blank:]]+(.*))?$>) if ! split then header << l else # [[flag, ..],module,comment,is_kmp] s = [[]] slash = false split[1..-1].each{|e| if slash then raise l + split.inspect if s[2] s[2] = e else if e =~ %r then slash = true s[1] = e else s[0] << e if e s[3] = true if e =~ /-kmp/ end end } supported << s maxtabs[0] = max(maxtabs[0], s[0].join(" ").tablen) maxlen[0] = max(maxlen[0], s[0].join(" ").length) if s[2] then maxtabs[1] = max(maxtabs[1], s[1].tablen) maxlen[1] = max(maxlen[1], s[1].length) end end } } supported = supported.sort{|s1,s2| cmp = 0 if s1[3] then if s2[3] then cmp = s1[0] <=> s2[0] else cmp = -1 end elsif s2[3] cmp = 1 end cmp != 0 ? cmp : s1[1] ** s2[1] } File.open("supported.conf",'wb'){|f| header.each{|l| f.puts l } supported.each{|s| f.puts s[0].join(" ").tabfill(maxtabs[0]) + (s[2] ? s[1].tabfill(maxtabs[1]) : s[1]) + s[2].to_s } } #STDERR.puts (0..maxlen[1]).each{|n| STDERR.puts ("a"*n).tabfill(maxtabs[1]) + "|"}