#!/usr/bin/perl

if ($ARGV[0] eq "-n") {$nowe = 1; shift;}

open UNIDATA, shift;
while (<UNIDATA>)
{
	@F = split /;/, $_;
	$unidata{$F[0]}{DATA} = [@F];
}
close UNIDATA;

sub rozklady ($)
{
	my ($znak) = @_;
	my $reszta = "";
	my @znaki = ();
	while (1)
	{
		push @znaki, "U+$znak$reszta";
		$znak =~ /^(.*?)((?:\+.*)?)$/;
		$reszta = $2 . $reszta;
		$znak = $unidata{$1}{DATA}[5];
		last unless $znak =~ /^[0-9A-F]([0-9A-F ]*[0-9A-F])?$/;
		$znak =~ s/ /+/g;
	}
	return @znaki;
}

foreach (sort keys %unidata)
{
	my $dane =
		"Name: $unidata{$_}{DATA}[1]\n" .
		"Category: $unidata{$_}{DATA}[2]\n" .
		(
			$unidata{$_}{DATA}[3] ?
				"Combining-Class: $unidata{$_}{DATA}[3]\n"
			:
				""
		) .
		(
			$unidata{$_}{DATA}[5] ne "" ?
				"Decomposition: $unidata{$_}{DATA}[5]\n"
			:
				""
		);
	my %znaki = ();
	foreach (rozklady $_)
	{
		$dane{$_} .= $dane;
		foreach ($aliasy{$_} ? @{$aliasy{$_}} : ($_))
		{
			$znaki{$_} = 1;
		}
	}
	my @znaki = sort {length $a <=> length $b || $a cmp $b} keys %znaki;
	$aliasy{$znaki[0]} = [@znaki];
	foreach (@znaki[1 .. $#znaki])
	{
		$aliasy{$_} = $aliasy{$znaki[0]};
	}
}

$_ = <>; s/\s+$//;
while (1)
{
	if (/^\[(.*)\]$/)
	{
		unless ($juzbyl = $juzbyl{$1})
		{
			if ($aliasy{$1})
			{
				@znaki1 = ();
				foreach (@{$aliasy{$1}})
				{
					push @znaki, "[$_]\n$dane{$_}";
					push @znaki1, \$znaki[-1];
					$juzbyl{$_} = 1;
				}
				$pomijamystare = 1;
			}
			else
			{
				push @znaki, "[$1]\n";
				@znaki1 = (\$znaki[-1]);
				$juzbyl{$1} = 1;
				$pomijamystare = 0;
			}
		}
	}
	elsif (/^$/)
	{
		if (@znaki || $juzbyl)
		{
			if (@znaki)
			{
				push @font,
				{
					ZNAKI => [@znaki],
					ZNAK => $znak,
				};
				@znaki = ();
			}
			$znak = "";
			$juzbyl = 0;
		}
	}
	else
	{
		if (@znaki || $juzbyl)
		{
			if (/^[.0]+$/)
			{
				$znak .= "$_\n";
			}
			else
			{
				unless
				(
					$juzbyl ||
					$pomijamystare &&
					(
						/^Name:/ ||
						/^Category:/ ||
						/^Combining-Class:/ ||
						/^Decomposition:/
					)
				)
				{
					foreach $z (@znaki1)
					{
						${$z} .= "$_\n";
					}
				}
			}
		}
		else
		{
			$font .= "$_\n";
		}
	}
	last unless defined;
	$_ = <>; s/\s+$//;
}

if ($nowe)
{
	foreach (map {"U+$_"} sort keys %unidata)
	{
		unless ($juzbyl{$_})
		{
			push @font,
			{
				ZNAKI => 
				[
					map
					{
						$juzbyl{$_} = 1;
						"[$_]\n$dane{$_}";
					}
						@{$aliasy{$_}}
				],
			};
		}
	}
}

print "$font\n";

foreach (@font)
{
	print @{${$_}{ZNAKI}}, "${$_}{ZNAK}\n";
}
