set FONT ""
set LETTERS [list]
set BOUNDINGBOX [list]

proc remove_empty { l } \
{
	set out [list]

	foreach e $l {
		if { [string length $e] > 0 } {
			lappend out $e
		}
	}

	return $out
}

proc show_bits { bits } {
	
	set length [ string length $bits ]
	set output ""

	for { set i 0 } { $i < $length } { incr i } \
	{
		set c [ string index $bits $i ]
		switch [string toupper $c] \
		{
			0 { set output [format "%s%s" $output "...."] }
			1 { set output [format "%s%s" $output "...X"] }
			2 { set output [format "%s%s" $output "..X."] }
			3 { set output [format "%s%s" $output "..XX"] }
			4 { set output [format "%s%s" $output ".X.."] }
			5 { set output [format "%s%s" $output ".X.X"] }
			6 { set output [format "%s%s" $output ".XX."] }
			7 { set output [format "%s%s" $output ".XXX"] }
			8 { set output [format "%s%s" $output "X..."] }
			9 { set output [format "%s%s" $output "X..X"] }
			A { set output [format "%s%s" $output "X.X."] }
			B { set output [format "%s%s" $output "X.XX"] }
			C { set output [format "%s%s" $output "XX.."] }
			D { set output [format "%s%s" $output "XX.X"] }
			E { set output [format "%s%s" $output "XXX."] }
			F { set output [format "%s%s" $output "XXXX"] }
		}
		
	}

	return $output
}

proc letter_compare { l1 l2 } \
{
	set c1 [lindex $l1 1]
	set c2 [lindex $l2 1]

	if { $c1 > $c2 } {
		return 1
	}

	if { $c1 < $c2 } {
		return -1
	} 

	return 0
}

proc proc_char { f name } \
{
	global LETTERS
	set index 0
	set size_x 0
	set size_y 0
	set start_x 0
	set start_y 0
	set dwidth 0
	set bitmap [list]

	set line [ gets $f ]
	set tokens [split $line " \t" ]

	while { 1 } \
	{
		if { [lindex $tokens 0] == "ENCODING" } \
		{
			set index [lindex $tokens 1]
			if { -1 == $index } { return }
		}
		
		if { [lindex $tokens 0] == "DWIDTH" } \
		{
			set dwidth   [lindex $tokens 1]
		}

		if { [lindex $tokens 0] == "BBX" } \
		{
			set size_x   [lindex $tokens 1]
			set size_y   [lindex $tokens 2]
			set start_x  [lindex $tokens 3]
			set start_y  [lindex $tokens 4]
		}
	
		if { [lindex $tokens 0] == "BITMAP" } \
		{
			for { set i 0 } { $i < $size_y } { incr i } \
			{
				set line [ gets $f ]
				set tokens [split $line " \t" ]
				foreach token $tokens \
				{
					lappend bitmap $token
				}
			}
		}

		if { [lindex $tokens 0] == "ENDCHAR" } \
		{
			lappend LETTERS [list \
				$name \
				$index \
				$dwidth \
				$size_x \
				$size_y \
				$start_x \
				$start_y \
				[list $bitmap]]
			return
		}

		set line [ gets $f ]
		set tokens [split $line " \t" ]
	}

}


set f [open [lindex $argv 0] "r"]
set line [ gets $f ]

set font_name [lindex [split [lindex $argv 0] .] 0]

while { ! [ eof $f ] } \
{

	set tokens [split $line " \t" ]

	if { [lindex $tokens 0] == "FONT" } { set FONT [lindex $tokens 1] }
	if { [lindex $tokens 0] == "STARTCHAR" } { proc_char $f [lindex $tokens 1] }
	if { [lindex $tokens 0] == "FONTBOUNDINGBOX" } { set BOUNDINGBOX [lrange $tokens 1 end]}

	set line [ gets $f ]
}

set LETTERS [lsort -command letter_compare $LETTERS]

puts [format "#include \"adi_graph_font.h\""]
puts [format ""]

foreach l $LETTERS \
{
	puts [format "const char ADI_font_%s_%d\[\] =" $font_name [lindex $l 1] ]
	puts [format "{"]
	puts [format "\t/*%s*/"                      [lindex $l 0]]
	puts [format "\t/*dwidth*/\t\'\\x%x\',"      [expr 0xff&[lindex $l 2]]]
	puts [format "\t/*bbx_size_x*/\t\'\\x%x\',"  [expr 0xff&[lindex $l 3]]]
	puts [format "\t/*bbx_size_y*/\t\'\\x%x\',"  [expr 0xff&[lindex $l 4]]]
	puts [format "\t/*bbx_start_x*/\t\'\\x%x\'," [expr 0xff&[lindex $l 5]]]
	puts [format "\t/*bbx_start_y*/\t\'\\x%x\'," [expr 0xff&[lindex $l 6]]]
	puts [format "\t/*bitmap*/"]

	set bitlist [remove_empty [split [lindex $l 7] " \t{}"]]
	set index 0
	set length [llength $bitlist]

	foreach c $bitlist \
	{
		incr index
		if { [string length $c] == 2 } \
		{
			puts [format "\t\t\'\\x%s\'%c\t/*%s*/" \
				$c \
				[expr ($length==$index) ? 32 : 44] \
				[show_bits $c] ]
		} elseif { [string length $c] == 4 } \
		{
			puts [format "\t\t\'\\x%s\', \'\\x%s\'%c\t/*%s*/" \
				[string range $c 0 1] \
				[string range $c 2 3] \
				[expr ($length==$index) ? 32 : 44] \
				[show_bits $c] ]
		} elseif { [string length $c] == 6 } \
		{
			puts [format "\t\t\'\\x%s\', \'\\x%s\', \'\\x%s\'%c\t/*%s*/" \
				[string range $c 0 1] \
				[string range $c 2 3] \
				[string range $c 4 5] \
				[expr ($length==$index) ? 32 : 44] \
				[show_bits $c] ]
		} elseif { [string length $c] == 8 } \
		{
			puts [format "\t\t\'\\x%s\', \'\\x%s\', \'\\x%s\', \'\\x%s\'%c\t/*%s*/" \
				[string range $c 0 1] \
				[string range $c 2 3] \
				[string range $c 4 5] \
				[string range $c 6 7] \
				[expr ($length==$index) ? 32 : 44] \
				[show_bits $c] ]
		} else \
		{
			puts [format "\t\t\'\\x%s\', \'\\x%s\', \'\\x%s\, \'\\x%s\', \'\\x%s\''%c\t/*%s*/" \
				[string range $c 0 1] \
				[string range $c 2 3] \
				[string range $c 4 5] \
				[string range $c 6 7] \
				[string range $c 8 9] \
				[expr ($length==$index) ? 32 : 44] \
				[show_bits $c] ]
		}
	}

	puts [format "};"]
	puts [format ""]
}

puts [format "const ADI_sFont ADI_font_%s =" $font_name]
puts [format "{"]
puts [format "\t/*name*/ \"%s\"," $FONT]
puts [format "\t/*font_bb_x*/\t\'\\x%x\'," [lindex $BOUNDINGBOX 0]]
puts [format "\t/*font_bb_y*/\t\'\\x%x\'," [lindex $BOUNDINGBOX 1]]
puts [format "\t/*font_bb_gutter_x*/\t\'\\x%x\'," [expr 0xff&[lindex $BOUNDINGBOX 2]]]
puts [format "\t/*font_bb_gutter_y*/\t\'\\x%x\'," [expr 0xff&[lindex $BOUNDINGBOX 3]]]
puts [format "\t/*letter*/ {"]

set index 0
set last_index [lindex [lindex $LETTERS end] 1]

foreach l $LETTERS \
{
	while { [lindex $l 1] > $index } \
	{
		puts -nonewline [format "\t\t/*\[%d\]*/\t0" $index] 
		if { $index != $last_index } { puts "," } else { puts "" }
		incr index
	}

	puts -nonewline [format "\t\t/*\[%d\]*/\tADI_font_%s_%d" $index $font_name $index]
	if { $index != $last_index } { puts "," } else { puts "" }
	incr index
}

puts [format "\t}"]
puts [format "};"]
