Blob Blame History Raw
#!/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]) + "|"}