summaryrefslogtreecommitdiff
path: root/language/arabic/dad/make-dad-font.pl
diff options
context:
space:
mode:
Diffstat (limited to 'language/arabic/dad/make-dad-font.pl')
-rw-r--r--language/arabic/dad/make-dad-font.pl1171
1 files changed, 1171 insertions, 0 deletions
diff --git a/language/arabic/dad/make-dad-font.pl b/language/arabic/dad/make-dad-font.pl
new file mode 100644
index 0000000000..82fb82a37c
--- /dev/null
+++ b/language/arabic/dad/make-dad-font.pl
@@ -0,0 +1,1171 @@
+# %%% ====================================================================
+# %%% @Perl-file{
+# %%% filename = "make-dad-font.pl",
+# %%% version = "1.1",
+# %%% date = "2014/10/11",
+# %%% author = "Yannis Haralambous",
+# %%% copyright = "This file is part of the dad package, released
+# %%% under the LPPL."
+# %%% keywords = "TeX, file header,
+# %%% supported = "yes",
+# %%% abstract = "This is the Perl script that creates
+# %%% the dad fonts out of their AFM and ADJUST files.",
+# %%% }
+# %%% ====================================================================
+$MAXHEIGHT=560;
+$MAXDEPTH=-360;
+if ($ARGV[0] ne "") { $STYLE_="-".$ARGV[0]; $STYLE=$ARGV[0]; } else { $STYLE=""; }
+
+@LETTERS=("alif","ba","tamarbuta","ta","tha","dzim","he","khe","dal","dhal","ra","za",
+"sin","shin","sad","dad","tta","zza","ayn","ghayn","fa","qaf","kaf","lam","meem","nun",
+"ha","waw","ya","alifmaqsura","alifwasla","pe","tche","zhe","va","gaf",
+"hahamza","alifuphamza","alifmadda","aliflohamza","wawhamza","yahamza","banodots","nunnodots","fanodots","qafnodots","keshideh");
+@LETTERS_NO_LAMS=("alif","ba","tamarbuta","ta","tha","dzim","he","khe","dal","dhal","ra","za","sin","shin","sad","dad","tta","zza","ayn","ghayn","fa","qaf","kaf","meem","nun",
+"ha","waw","ya","alifmaqsura","alifwasla","alifmadda","pe","tche","zhe","va","gaf",
+"hahamza","alifuphamza","aliflohamza","wawhamza","yahamza","banodots","nunnodots","fanodots","qafnodots","keshideh");
+@LETTERS_NO_ALIFS=("ba","tamarbuta","ta","tha","dzim","he","khe","dal","dhal","ra","za",
+"sin","shin","sad","dad","tta","zza","ayn","ghayn","fa","qaf","kaf","lam","meem","nun",
+"ha","waw","ya","alifmaqsura","pe","tche","zhe","va","gaf",
+"hahamza","wawhamza","yahamza","banodots","nunnodots","fanodots","qafnodots","keshideh");
+@LETTERS_NO_LAMS_NO_ALIFS=("ba","tamarbuta","ta","tha","dzim","he","khe","dal","dhal","ra","za","sin","shin","sad","dad","tta","zza","ayn","ghayn","fa","qaf","kaf","meem","nun",
+"ha","waw","ya","alifmaqsura","pe","tche","zhe","va","gaf",
+"hahamza","wawhamza","yahamza","banodots","nunnodots","fanodots","qafnodots","keshideh");
+@LAMS=("lam");
+@ALIFS=("alif","alifuphamza","aliflohamza","alifwasla","alifmadda");
+@DIACS=("shadda","sukun","madda","vfatha");
+@vDIACS=("fatha","kasra","damma");
+$FORM{"apos"}=4;
+$FORM{"alif"}=2;
+$FORM{"ba"}=4;
+$FORM{"banodots"}=4;
+$FORM{"tamarbuta"}=4;
+$FORM{"ta"}=4;
+$FORM{"tha"}=4;
+$FORM{"dzim"}=4;
+$FORM{"he"}=4;
+$FORM{"khe"}=4;
+$FORM{"dal"}=2;
+$FORM{"dhal"}=2;
+$FORM{"ra"}=2;
+$FORM{"za"}=2;
+$FORM{"sin"}=4;
+$FORM{"shin"}=4;
+$FORM{"sad"}=4;
+$FORM{"dad"}=4;
+$FORM{"tta"}=4;
+$FORM{"zza"}=4;
+$FORM{"ayn"}=4;
+$FORM{"ghayn"}=4;
+$FORM{"fa"}=4;
+$FORM{"fanodots"}=4;
+$FORM{"qaf"}=4;
+$FORM{"qafnodots"}=4;
+$FORM{"kaf"}=4;
+$FORM{"lam"}=4;
+$FORM{"meem"}=4;
+$FORM{"nun"}=4;
+$FORM{"nunnodots"}=4;
+$FORM{"ha"}=4;
+$FORM{"waw"}=2;
+$FORM{"ya"}=4;
+$FORM{"alifmaqsura"}=2;
+$FORM{"alifwasla"}=2;
+$FORM{"pe"}=4;
+$FORM{"tche"}=4;
+$FORM{"zhe"}=2;
+$FORM{"va"}=4;
+$FORM{"gaf"}=4;
+$FORM{"hahamza"}=2;
+$FORM{"alifuphamza"}=2;
+$FORM{"aliflohamza"}=2;
+$FORM{"wawhamza"}=2;
+$FORM{"yahamza"}=4;
+$FORM{"hamza"}=1;
+$FORM{"keshideh"}=4;
+$FORM{"zwj"}=4;
+$POS{"alif0"}="41";
+$POS{"alif3"}="00";
+$POS{"alif4"}="8F";
+$POS{"alif5"}="E6";
+$POS{"ba0"}="62";
+$POS{"ba1"}="1A";
+$POS{"ba2"}="1B";
+$POS{"ba3"}="1C";
+$POS{"banodots0"}="88";
+$POS{"banodots1"}="DE";
+$POS{"banodots2"}="DF";
+$POS{"banodots3"}="E1";
+$POS{"tamarbuta0"}="84";
+$POS{"tamarbuta1"}="F4";
+$POS{"tamarbuta2"}="F5";
+$POS{"tamarbuta3"}="D2";
+$POS{"ta0"}="74";
+$POS{"ta1"}="C1";
+$POS{"ta2"}="EB";
+$POS{"ta3"}="C3";
+$POS{"tha0"}="63";
+$POS{"tha1"}="D3";
+$POS{"tha2"}="D4";
+$POS{"tha3"}="D5";
+$POS{"dzim0"}="6A";
+$POS{"dzim1"}="A8";
+$POS{"dzim2"}="A9";
+$POS{"dzim3"}="AA";
+$POS{"he0"}="48";
+$POS{"he1"}="07";
+$POS{"he2"}="08";
+$POS{"he3"}="09";
+$POS{"khe0"}="78";
+$POS{"khe1"}="C7";
+$POS{"khe2"}="C8";
+$POS{"khe3"}="C9";
+$POS{"dal0"}="64";
+$POS{"dal3"}="1D";
+$POS{"dhal0"}="85";
+$POS{"dhal3"}="86";
+$POS{"ra0"}="72";
+$POS{"ra3"}="BD";
+$POS{"za0"}="7A";
+$POS{"za3"}="CB";
+$POS{"sin0"}="73";
+$POS{"sin1"}="BE";
+$POS{"sin2"}="BF";
+$POS{"sin3"}="C0";
+$POS{"shin0"}="89";
+$POS{"shin1"}="DA";
+$POS{"shin2"}="DB";
+$POS{"shin3"}="DC";
+$POS{"sad0"}="53";
+$POS{"sad1"}="0D";
+$POS{"sad2"}="0E";
+$POS{"sad3"}="0F";
+$POS{"dad0"}="44";
+$POS{"dad1"}="04";
+$POS{"dad2"}="05";
+$POS{"dad3"}="06";
+$POS{"tta0"}="54";
+$POS{"tta1"}="10";
+$POS{"tta2"}="11";
+$POS{"tta3"}="12";
+$POS{"zza0"}="5A";
+$POS{"zza1"}="14";
+$POS{"zza2"}="15";
+$POS{"zza3"}="16";
+$POS{"ayn0"}="60";
+$POS{"ayn1"}="17";
+$POS{"ayn2"}="18";
+$POS{"ayn3"}="19";
+$POS{"ghayn0"}="52";
+$POS{"ghayn1"}="D6";
+$POS{"ghayn2"}="D7";
+$POS{"ghayn3"}="D8";
+$POS{"fa0"}="66";
+$POS{"fa1"}="1F";
+$POS{"fa2"}="A0";
+$POS{"fa3"}="A1";
+$POS{"fanodots0"}="8C";
+$POS{"fanodots1"}="E2";
+$POS{"fanodots2"}="E3";
+$POS{"fanodots3"}="F3";
+$POS{"qaf0"}="71";
+$POS{"qaf1"}="BA";
+$POS{"qaf2"}="BB";
+$POS{"qaf3"}="BC";
+$POS{"qafnodots0"}="8D";
+$POS{"qafnodots1"}="EE";
+$POS{"qafnodots2"}="F6";
+$POS{"qafnodots3"}="E5";
+$POS{"kaf0"}="6B";
+$POS{"kaf1"}="AB";
+$POS{"kaf2"}="AC";
+$POS{"kaf3"}="AD";
+$POS{"lam0"}="6C";
+$POS{"lam1"}="AE";
+$POS{"lam2"}="AF";
+$POS{"lam3"}="B0";
+$POS{"lam4"}="46"; #lam1-alif3
+$POS{"lam5"}="47"; #lam2-alif3
+$POS{"lam6"}="4C"; #lam1-(lam2)-ha3
+$POS{"lam7"}="4D"; #lam2-(lam2)-ha3
+$POS{"lam8"}="94"; #(lam1)-lam2-ha3
+$POS{"ll0"}="F7";
+$POS{"ll1"}="F8";
+$POS{"ll5"}="F9";
+$POS{"LLh0"}="FA";
+$POS{"meem0"}="6D";
+$POS{"meem1"}="B1";
+$POS{"meem2"}="B2";
+$POS{"meem3"}="B3";
+$POS{"nun0"}="6E";
+$POS{"nun1"}="B4";
+$POS{"nun2"}="B5";
+$POS{"nun3"}="B6";
+$POS{"nunnodots0"}="8B";
+$POS{"nunnodots1"}="EC";
+$POS{"nunnodots2"}="ED";
+$POS{"nunnodots3"}="E0";
+$POS{"ha0"}="68";
+$POS{"ha1"}="A5";
+$POS{"ha2"}="A6";
+$POS{"ha3"}="A7";
+$POS{"ha4"}="93"; #(lam1-lam2)-ha3
+$POS{"waw0"}="55";
+$POS{"waw3"}="13";
+$POS{"ya0"}="59";
+$POS{"ya1"}="0A";
+$POS{"ya2"}="0B";
+$POS{"ya3"}="CA";
+$POS{"alifmaqsura0"}="49";
+$POS{"alifmaqsura3"}="0C";
+$POS{"pe0"}="70";
+$POS{"pe1"}="B7";
+$POS{"pe2"}="B8";
+$POS{"pe3"}="B9";
+$POS{"tche0"}="43";
+$POS{"tche1"}="01";
+$POS{"tche2"}="02";
+$POS{"tche3"}="03";
+$POS{"zhe0"}="4A";
+$POS{"zhe3"}="D9";
+$POS{"va0"}="76";
+$POS{"va1"}="C4";
+$POS{"va2"}="C5";
+$POS{"va3"}="C6";
+$POS{"gaf0"}="67";
+$POS{"gaf1"}="A2";
+$POS{"gaf2"}="A3";
+$POS{"gaf3"}="A4";
+$POS{"hahamza0"}="65";
+$POS{"hahamza3"}="1E";
+$POS{"alifuphamza0"}="E4";
+$POS{"alifuphamza3"}="CC";
+$POS{"alifuphamza4"}="90";
+$POS{"alifuphamza5"}="E7";
+$POS{"aliflohamza0"}="EF";
+$POS{"aliflohamza3"}="CD";
+$POS{"aliflohamza4"}="91";
+$POS{"aliflohamza5"}="E8";
+$POS{"alifmadda0"}="C2";
+$POS{"alifmadda3"}="DD";
+$POS{"alifmadda4"}="92";
+$POS{"alifmadda5"}="E9";
+$POS{"alifwasla0"}="83";
+$POS{"alifwasla3"}="F0";
+$POS{"alifwasla4"}="F1";
+$POS{"alifwasla5"}="F2";
+$POS{"wawhamza0"}="FC";
+$POS{"wawhamza3"}="CE";
+$POS{"yahamza0"}="FF";
+$POS{"yahamza1"}="CF";
+$POS{"yahamza2"}="D0";
+$POS{"yahamza3"}="D1";
+$POS{"hamza0"}="7C";
+$POS{"keshideh0"}="4B";
+$POS{"keshideh1"}="4F";
+$POS{"keshideh2"}="50";
+$POS{"keshideh3"}="51";
+$POS{"zwj0"}="2D";
+$POS{"zwj1"}="2D";
+$POS{"zwj2"}="2D";
+$POS{"zwj3"}="26";
+$POS{"fatha"}="61";
+$POS{"vfatha"}="8E";
+$POS{"kasra"}="69";
+$POS{"damma"}="75";
+$POS{"sukun"}="6F";
+$POS{"madda"}="9F";
+$POS{"fathatan"}="99";
+$POS{"kasratan"}="9A";
+$POS{"dammatan"}="9B";
+$POS{"shadda"}="2B";
+$POS{"shaddafatha"}="96";
+$POS{"shaddavfatha"}="EA";
+$POS{"shaddakasra"}="97";
+$POS{"shaddadamma"}="98";
+$POS{"shaddamadda"}="8A";
+$POS{"shaddafathatan"}="9C";
+$POS{"shaddakasratan"}="9D";
+$POS{"shaddadammatan"}="9E";
+$POS{"BC"}="7C";
+$POS{"plus"}="2B";
+$POS{"apos0"}="27";
+$POS{"apos1"}="56";
+$POS{"apos2"}="57";
+$POS{"apos3"}="58";
+$POS{"apos4"}="5E";
+$POS{"apos5"}="5F";
+$POS{"aster"}="2A";
+$POS{"N"}="4E";
+$POS{"zero"}="30";
+$POS{"un"}="31";
+$POS{"deux"}="32";
+$POS{"trois"}="33";
+$POS{"quatre"}="34";
+$POS{"cinq"}="35";
+$POS{"six"}="36";
+$POS{"sept"}="37";
+$POS{"huit"}="38";
+$POS{"neuf"}="39";
+$POS{"question"}="3F";
+$POS{"comma"}="2C";
+$POS{"semicolon"}="EB";
+$DECALAGE{"fatha"}=1;
+$DECALAGE{"kasra"}=2;
+$DECALAGE{"damma"}=3;
+$DECALAGE{"fathatan"}=4;
+$DECALAGE{"kasratan"}=5;
+$DECALAGE{"dammatan"}=7;
+$DECALAGE{"shadda"}=8;
+$DECALAGE{"shaddafatha"}=9;
+$DECALAGE{"shaddakasra"}=10;
+$DECALAGE{"shaddadamma"}=11;
+$DECALAGE{"shaddafathatan"}=12;
+$DECALAGE{"shaddakasratan"}=13;
+$DECALAGE{"shaddadammatan"}=14;
+$DECALAGE{"sukun"}=15;
+$DECALAGE{"madda"}=16;
+$DECALAGE{"vfatha"}=17;
+$DECALAGE{"shaddavfatha"}=18;
+$DECALAGE{"shaddamadda"}=19;
+
+$UTFPOS{"alif0"}="0627";
+$UTFPOS{"ba0"}="0628";
+$UTFPOS{"banodots0"}="066E";
+$UTFPOS{"tamarbuta0"}="0629";
+$UTFPOS{"ta0"}="062A";
+$UTFPOS{"tha0"}="062B";
+$UTFPOS{"dzim0"}="062C";
+$UTFPOS{"he0"}="062D";
+$UTFPOS{"khe0"}="062E";
+$UTFPOS{"dal0"}="062F";
+$UTFPOS{"dhal0"}="0630";
+$UTFPOS{"ra0"}="0631";
+$UTFPOS{"za0"}="0632";
+$UTFPOS{"sin0"}="0633";
+$UTFPOS{"shin0"}="0634";
+$UTFPOS{"sad0"}="0635";
+$UTFPOS{"dad0"}="0636";
+$UTFPOS{"tta0"}="0637";
+$UTFPOS{"zza0"}="0638";
+$UTFPOS{"ayn0"}="0639";
+$UTFPOS{"ghayn0"}="063A";
+$UTFPOS{"fa0"}="0641";
+$UTFPOS{"fanodots0"}="06A1";
+$UTFPOS{"qaf0"}="0642";
+$UTFPOS{"qafnodots0"}="066F";
+$UTFPOS{"kaf0"}="0643";
+$UTFPOS{"lam0"}="0644";
+$UTFPOS{"meem0"}="0645";
+$UTFPOS{"nun0"}="0646";
+$UTFPOS{"nunnodots0"}="06BA";
+$UTFPOS{"ha0"}="0647";
+$UTFPOS{"waw0"}="0648";
+$UTFPOS{"ya0"}="064A";
+$UTFPOS{"alifmaqsura0"}="0649";
+$UTFPOS{"pe0"}="067E";
+$UTFPOS{"tche0"}="0686";
+$UTFPOS{"zhe0"}="0698";
+$UTFPOS{"va0"}="06A4";
+$UTFPOS{"gaf0"}="06AF";
+$UTFPOS{"hahamza0"}="06C2";
+$UTFPOS{"alifuphamza0"}="0623";
+$UTFPOS{"aliflohamza0"}="0625";
+$UTFPOS{"alifmadda0"}="0622";
+$UTFPOS{"alifwasla0"}="0671";
+$UTFPOS{"wawhamza0"}="0624";
+$UTFPOS{"yahamza0"}="0626";
+$UTFPOS{"hamza0"}="0621";
+$UTFPOS{"keshideh0"}="0640";
+$UTFPOS{"zwj0"}="200D";
+$UTFPOS{"fatha"}="064E";
+$UTFPOS{"vfatha"}="0670";
+$UTFPOS{"kasra"}="0650";
+$UTFPOS{"damma"}="064F";
+$UTFPOS{"shadda"}="0651";
+$UTFPOS{"sukun"}="0652";
+$UTFPOS{"madda"}="0653";
+$UTFPOS{"fathatan"}="064B";
+$UTFPOS{"kasratan"}="064D";
+$UTFPOS{"dammatan"}="064C";
+$UTFPOS{"zero"}="0660";
+$UTFPOS{"un"}="0661";
+$UTFPOS{"deux"}="0662";
+$UTFPOS{"trois"}="0663";
+$UTFPOS{"quatre"}="0664";
+$UTFPOS{"cinq"}="0665";
+$UTFPOS{"six"}="0666";
+$UTFPOS{"sept"}="0667";
+$UTFPOS{"huit"}="0668";
+$UTFPOS{"neuf"}="0669";
+$UTFPOS{"question"}="061F";
+$UTFPOS{"comma"}="060C";
+$UTFPOS{"semicolon"}="061B";
+foreach $utf (%UTFPOS) {
+if ($POS{$utf} ne "") {
+$UTF_GOTO{$POS{$utf}}=$UTFPOS{$utf};
+}}
+
+###read AFM file
+open IN, "Dad$STYLE_.afm";
+while (<IN>) {
+if (m/^C ([0-9]+) ; WX ([0-9]+) ; N [^;]+ ; B ([0-9-]+) ([0-9-]+) ([0-9-]+) ([0-9-]+) ;/) {
+$w=$2;
+$h=$6;
+$d=$4;
+$HEX=sprintf("%X",$1 + 0);
+$HEX=~s/^([0-9A-F])$/0\1/;
+$WIDTH{$HEX}=$w/1000;
+$HEIGHT{$HEX}=($h>$MAXHEIGHT?$MAXHEIGHT/1000:$h/1000);
+if ($d != 0) { $DEPTH{$HEX}=-($d<$MAXDEPTH?$MAXDEPTH/1000:$d/1000); } else { $DEPTH{$HEX}="0.0"; }
+}
+}
+close IN;
+
+if ($STYLE eq "bold") { $thickness="0.111"; }
+elsif ($STYLE eq "mono") { $thickness="0.113"; }
+else { $thickness="0.072"; }
+
+$PRELUDE="(OFMLEVEL D 0)
+(FONTDIR TL)
+(FAMILY YARABIC)
+(FACE F MRR)
+(CODINGSCHEME FONTSPECIFIC)
+(DESIGNSIZE R 10.0)
+(CHECKSUM H 9DCC4880)
+(FONTDIMEN
+ (SLANT R 0.000000)
+ (SPACE R 0.333334)
+ (STRETCH R 0.166667)
+ (SHRINK R 0.111112)
+ (XHEIGHT R 0.430555)
+ (QUAD R 1.000003)
+ (EXTRASPACE R 0.111112)
+ (DEFAULTRULETHICKNESS R $thickness)
+ )
+(MAPFONT D 0
+ (FONTNAME dadreal$STYLE)
+ (FONTAT R 1.0)
+ (FONTDSIZE R 10.0)
+ )
+(LIGTABLE
+";
+$PL_PRELUDE="(FAMILY DADREAL)
+(CODINGSCHEME FONTSPECIFIC)
+(DESIGNSIZE R 10.0)
+(FONTDIMEN
+ (SPACE R 0.333334)
+ (STRETCH R 0.166667)
+ (SHRINK R 0.111112)
+ (XHEIGHT R 0.430555)
+ (QUAD R 1.000003)
+ (EXTRASPACE R 0.111112)
+ )
+(LIGTABLE
+";
+
+###write real PL file
+open OUT, ">dadreal$STYLE.pl";
+print OUT $PL_PRELUDE;
+print OUT " )\n";
+foreach $i (0 .. 255) {
+$i_hex=sprintf("%X",$i);
+$i_hex=~s/^([0-9A-F])$/0\1/;
+print OUT "(CHARACTER H $i_hex (COMMENT char$i_hex)
+ (CHARWD R ".$WIDTH{$i_hex}.")
+ (CHARHT R ".$HEIGHT{$i_hex}.")
+ (CHARDP R ".$DEPTH{$i_hex}.")
+ )
+";
+}
+close OUT;
+system("pltotf dadreal$STYLE.pl");
+
+sub alter_LIGS {
+my $label=shift;
+my $LIG=shift;
+my $right=shift;
+my $result=shift;
+if ($label ne "" and $LIG ne "" and $right ne "" and $result ne "") {
+if ($LIGS{$label} =~ m|[/]?LIG[/>]*:$right:([0-9A-F]+)|) {
+$LIGS{$label} =~ s|[/]?LIG[/>]*:$right:([0-9A-F]+)|$LIG:$right:$result|;
+} else {
+if ($LIGS{$label} ne "") {
+$LIGS{$label} .= "#";
+}
+$LIGS{$label} .= "$LIG:$right:$result";
+}
+}
+}
+
+sub addoperation {
+my $tmp=shift;
+my $label=$POS{$tmp};
+my $LIG=shift;
+my $tmp=shift;
+my $right=$POS{$tmp};
+my $tmp=shift;
+my $result=$POS{$tmp};
+&alter_LIGS($label,$LIG,$right,$result);
+}
+
+sub addplusutfvowoperation {
+my $tmp=shift;
+my $label=$POS{$tmp};
+my $LIG=shift;
+my $tmp=shift;
+my $right=$UTFPOS{$tmp};
+my $tmp=shift;
+my $result=$POS{$tmp};
+&alter_LIGS($label,$LIG,$right,$result);
+}
+
+sub addutfoperation {
+my $tmp=shift;
+if ($tmp =~ m/^(.+?)([0-9])$/) { $labelc=$1; $labelp=$2; }
+my $label=$POS{$tmp};
+my $LIG=shift;
+my $tmp=shift;
+if ($tmp =~ m/^(.+?)([0-9])$/) { $rightc=$1; $rightp=$2; }
+my $right=$POS{$tmp};
+my $tmp=shift;
+if ($tmp =~ m/^(.+?)([0-9])$/) { $resultc=$1; $resultp=$2; }
+my $result=$POS{$tmp};
+
+if ($labelp==0 and $UTFPOS{$labelc.$labelp} ne "") { $label=$UTF_GOTO{$label}; }
+if ($rightp==0 and $UTFPOS{$rightc.$rightp} ne "") { $right=$UTF_GOTO{$right}; }
+if ($resultp==0 and $UTFPOS{$resultc.$resultp} ne "") { $result=$UTF_GOTO{$result}; }
+
+&alter_LIGS($label,$LIG,$right,$result);
+}
+
+sub addutfvowoperation {
+my $tmp=shift;
+my $label=$UTFPOS{$tmp};
+my $labellow=$POS{$tmp};
+my $tmp=shift;
+my $vowelname=$tmp;
+my $vow=$UTFPOS{$tmp};
+my $vowlow=$POS{$tmp};
+
+&alter_LIGS($label,"LIG",$vow,sprintf("%X",$DECALAGE{$vowelname}).$labellow);
+}
+
+# sub addutfccoperation {
+# my $tmp=shift;
+# my $label=$UTFPOS{$tmp};
+# my $labellow=$POS{$tmp};
+# my $tmp=shift;
+# my $vowelname=$tmp;
+# my $vow=$UTFPOS{$tmp};
+# my $vowlow=$POS{$tmp};
+# my $tmp=shift;
+# my $labelb=$UTFPOS{$tmp};
+# my $labelblow=$POS{$tmp};•••
+#
+# &alter_LIGS(sprintf("%X",$DECALAGE{$vowelname}).$labellow,"/LIG",$labelb,$labelblow);
+# }
+
+##k0 + l0 - /LIG/ -> k0 - l0
+##k0 + - LIG/ -> k1 -
+##- + l0 LIG -> l3
+# foreach $lettera (@LETTERS) {
+# if ($FORM{$lettera}==4) {
+# foreach $letterb (@LETTERS) {
+# &addoperation($lettera."0","/LIG/",$letterb."0","zwj0");
+# }
+# &addoperation($lettera."0","LIG/","zwj0",$lettera."1");
+# }
+# if ($FORM{$lettera}==4 or $FORM{$lettera}==2) {
+# &addoperation("zwj0","LIG",$lettera."0",$lettera."3");
+# }
+# }
+foreach $lettera (@LETTERS) {
+&addoperation("zwj0","LIG",$lettera."0",$lettera."3");
+&addutfoperation("zwj0","LIG",$lettera."0",$lettera."3");
+}
+&addoperation("zwj0","LIG","apos0","apos3");
+
+foreach $lettera (@LETTERS) {
+if ($FORM{$lettera}==4) {
+&addoperation($lettera."0","LIG/","zwj0",$lettera."1");
+&addoperation($lettera."3","LIG/","zwj0",$lettera."2");
+&addutfoperation($lettera."0","LIG/","zwj0",$lettera."1");
+&addutfoperation($lettera."3","LIG/","zwj0",$lettera."2");
+&addoperation($lettera."0","LIG/","apos0",$lettera."1");
+&addoperation($lettera."3","LIG/","apos0",$lettera."2");
+&addoperation($lettera."0","LIG/","lam6",$lettera."1");
+&addoperation($lettera."3","LIG/","lam6",$lettera."2");
+&addoperation($lettera."2","/LIG","lam6","lam7");
+&addoperation($lettera."1","/LIG","lam6","lam7");
+&addutfoperation($lettera."0","LIG/","lam6",$lettera."1");
+&addutfoperation($lettera."3","LIG/","lam6",$lettera."2");
+&addutfoperation($lettera."2","/LIG","lam6","lam7");
+&addutfoperation($lettera."1","/LIG","lam6","lam7");
+}
+elsif ($FORM{$lettera}==2) {
+&addoperation($lettera."0","/LIG","zwj0","zwj3");
+&addoperation($lettera."3","/LIG","zwj0","zwj3");
+}
+}
+foreach $lettera (@LETTERS_NO_LAMS) {
+if ($FORM{$lettera}==4) {
+&addoperation($lettera."1","/LIG","apos0","apos3");
+&addoperation($lettera."2","/LIG","apos0","apos3");
+}
+}
+foreach $lettera (@LAMS) {
+if ($FORM{$lettera}==4) {
+&addoperation($lettera."1","/LIG","apos0","apos3");
+&addoperation($lettera."2","/LIG","apos0","apos3");
+&addoperation($lettera."0","LIG/","apos0",$lettera."4");
+&addoperation($lettera."3","LIG/","apos0",$lettera."5");
+&addoperation($lettera."4","/LIG>","apos0","apos4");
+&addoperation($lettera."5","/LIG>","apos0","apos5");
+}
+}
+
+foreach $lettera (@LETTERS_NO_LAMS) {
+if ($FORM{$lettera}==4) {
+foreach $letterb (@LETTERS_NO_ALIFS) {
+if ($FORM{$letterb}==4 or $FORM{$letterb}==2) {
+&addoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addutfoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addutfoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+}
+}
+}
+}
+foreach $lettera (@LAMS) {
+if ($FORM{$lettera}==4) {
+foreach $letterb (@LETTERS_NO_ALIFS) {
+if ($FORM{$letterb}==4 or $FORM{$letterb}==2) {
+&addoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addutfoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addutfoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+}
+}
+}
+}
+foreach $lettera (@LETTERS_NO_LAMS) {
+if ($FORM{$lettera}==4) {
+foreach $letterb (@ALIFS) {
+if ($FORM{$letterb}==4 or $FORM{$letterb}==2) {
+&addoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."0","LIG/",$letterb."0",$lettera."1");
+&addutfoperation($lettera."3","LIG/",$letterb."0",$lettera."2");
+&addutfoperation($lettera."1","/LIG",$letterb."0",$letterb."3");
+&addutfoperation($lettera."2","/LIG",$letterb."0",$letterb."3");
+}
+}
+}
+}
+foreach $lettera (@LAMS) {
+foreach $letterb (@ALIFS) {
+&addoperation($lettera."0","LIG/",$letterb."0",$lettera."4");
+&addoperation($lettera."3","LIG/",$letterb."0",$lettera."5");
+&addoperation($lettera."4","/LIG>",$letterb."0",$letterb."4");
+&addoperation($lettera."5","/LIG>",$letterb."0",$letterb."5");
+&addutfoperation($lettera."0","LIG/",$letterb."0",$lettera."4");
+&addutfoperation($lettera."3","LIG/",$letterb."0",$lettera."5");
+&addutfoperation($lettera."4","/LIG>",$letterb."0",$letterb."4");
+&addutfoperation($lettera."5","/LIG>",$letterb."0",$letterb."5");
+}
+}
+
+foreach $letter (@LETTERS) {
+foreach $vowel ("fatha","kasra","damma","sukun","shadda","madda","vfatha") {
+&addutfvowoperation($letter."0",$vowel);
+# foreach $letterb (@LETTERS) {
+# if ($FORM{$letter}==4 and $FORM{$letterb}==4) {•••
+# &addutfccoperation($letter."0",$vowel,"LIG/",$letterb."0",$letter."1");
+# &addutfccoperation($letter."1",$vowel,"/LIG",$letterb."0",$letterb."3");
+# }
+# }
+}
+}
+
+##encoding operations
+# &operation("'","LIG","a","alifuphamza0"); ä
+# &operation("'","LIG","i","aliflohamza0"); ï
+# &operation("'","LIG","u","wawhamza0"); ü
+# &operation("'","LIG","I","yahamza0"); ÿ
+# &operation("'","LIG","A","alifmadda0"); Â
+&addoperation("lam6","/LIG","lam6","lam8");
+&addoperation("lam7","/LIG","lam6","lam8");
+&addoperation("lam8","/LIG","ha0","ha4");
+&addoperation("apos0","LIG","ba0","banodots0");
+&addoperation("apos3","LIG","ba0","banodots3");
+&addoperation("apos0","LIG","nun0","nunnodots0");
+&addoperation("apos3","LIG","nun0","nunnodots3");
+&addoperation("apos0","LIG","fa0","fanodots0");
+&addoperation("apos3","LIG","fa0","fanodots3");
+&addoperation("apos0","LIG","qaf0","qafnodots0");
+&addoperation("apos3","LIG","qaf0","qafnodots3");
+&addoperation("apos0","LIG","fatha","alifuphamza0");
+&addoperation("apos3","LIG","fatha","alifuphamza3");
+&addoperation("apos4","LIG","fatha","alifuphamza4");
+&addoperation("apos5","LIG","fatha","alifuphamza5");
+&addoperation("apos0","LIG","kasra","aliflohamza0");
+&addoperation("apos3","LIG","kasra","aliflohamza3");
+&addoperation("apos4","LIG","kasra","aliflohamza4");
+&addoperation("apos5","LIG","kasra","aliflohamza5");
+&addoperation("apos0","LIG","alif0","alifmadda0");
+&addoperation("apos3","LIG","alif0","alifmadda3");
+&addoperation("apos4","LIG","alif0","alifmadda4");
+&addoperation("apos5","LIG","alif0","alifmadda5");
+&addoperation("apos0","LIG","damma","wawhamza0");
+&addoperation("apos3","LIG","damma","wawhamza3");
+&addoperation("apos0","LIG","alifmaqsura0","yahamza0");
+&addoperation("apos3","LIG","alifmaqsura0","yahamza3");
+&addoperation("alif0","LIG","aster","alifwasla0");
+&addoperation("alif3","LIG","aster","alifwasla3");
+&addoperation("ta0","LIG","aster","tamarbuta0");
+&addoperation("ta1","LIG","aster","tamarbuta1");
+&addoperation("ta2","LIG","aster","tamarbuta2");
+&addoperation("ta3","LIG","aster","tamarbuta3");
+&addoperation("ta0","LIG","ha0","tha0");
+&addoperation("ta1","LIG","ha0","tha1");
+&addoperation("ta2","LIG","ha0","tha2");
+&addoperation("ta3","LIG","ha0","tha3");
+&addoperation("dal0","LIG","ha0","dhal0");
+&addoperation("dal3","LIG","ha0","dhal3");
+# &addoperation("za0","LIG","ha0","zhe0");
+# &addoperation("za3","LIG","ha0","zhe3");
+# &addoperation("kaf0","LIG","ha0","khe0");
+# &addoperation("kaf1","LIG","ha0","khe1");
+# &addoperation("kaf2","LIG","ha0","khe2");
+# &addoperation("kaf3","LIG","ha0","khe3");
+&addoperation("lam0","LIG","quatre","lam4");
+&addoperation("lam3","LIG","cinq","lam5");
+&addoperation("lam1","LIG","quatre","lam4");
+&addoperation("lam2","LIG","cinq","lam5");
+&addoperation("alif3","LIG","quatre","alif4");
+&addoperation("alif3","LIG","cinq","alif5");
+&addoperation("alifuphamza3","LIG","quatre","alifuphamza4");
+&addoperation("alifuphamza3","LIG","cinq","alifuphamza5");
+&addoperation("aliflohamza3","LIG","quatre","aliflohamza4");
+&addoperation("aliflohamza3","LIG","cinq","aliflohamza5");
+&addoperation("alifmadda3","LIG","quatre","alifmadda4");
+&addoperation("alifmadda3","LIG","cinq","alifmadda5");
+&addoperation("alifwasla3","LIG","quatre","alifwasla4");
+&addoperation("alifwasla3","LIG","cinq","alifwasla5");
+&addoperation("sin0","LIG","ha0","shin0");
+&addoperation("sin1","LIG","ha0","shin1");
+&addoperation("sin2","LIG","ha0","shin2");
+&addoperation("sin3","LIG","ha0","shin3");
+# &addoperation("gaf0","LIG","ha0","ghayn0");
+# &addoperation("gaf1","LIG","ha0","ghayn1");
+# &addoperation("gaf2","LIG","ha0","ghayn2");
+# &addoperation("gaf3","LIG","ha0","ghayn3");
+&addoperation("plus","LIG","fatha","shaddafatha");
+&addoperation("plus","LIG","kasra","shaddakasra");
+&addoperation("plus","LIG","damma","shaddadamma");
+&addoperation("fatha","LIG","N","fathatan");
+&addoperation("kasra","LIG","N","kasratan");
+&addoperation("damma","LIG","N","dammatan");
+&addoperation("fatha","LIG","aster","vfatha");
+&addoperation("vfatha","LIG","aster","madda");
+&addoperation("shaddafatha","LIG","aster","shaddavfatha");
+&addoperation("shaddavfatha","LIG","aster","shaddamadda");
+&addoperation("shaddafatha","LIG","N","shaddafathatan");
+&addoperation("shaddakasra","LIG","N","shaddakasratan");
+&addoperation("shaddadamma","LIG","N","shaddadammatan");
+&addoperation("zwj0","LIG","zwj0","keshideh0");
+&addoperation("zwj3","LIG","zwj0","keshideh3");
+&addoperation("keshideh0","/LIG>","zwj0","keshideh0");
+&addoperation("keshideh3","/LIG>","zwj0","keshideh3");
+
+if (-e "dad$STYLE.adjust") {
+open ADJ, "dad$STYLE.adjust";
+while (<ADJ>) {
+if (m/^KRN ([^ ]+) ([^ ]+) ([0-9.-]+)/) {
+$l=$1;
+$r=$2;
+$k=$3;
+if ($POS{$l} ne "" and $POS{$r} ne "") {
+if ($LIGS{$POS{$l}} eq "") {
+$LIGS{$POS{$l}} = "KRN:".$POS{$r}.":".$k;
+} else {
+$LIGS{$POS{$l}} .= "#KRN:".$POS{$r}.":".$k;
+}
+}
+}
+elsif (m/^ADJ ([^ ]+) ([^ ]+) ([0-9.-]+) ([0-9.-]+)/) {
+$l=$1;
+$r=$2;
+$h=$3;
+$v=$4;
+if ($POS{$l} ne "" and ($POS{$r} ne "" or $r eq "#UVOWEL#" or $r eq "#LVOWEL#")) {
+$HADJUST{"$l:$r"}=$h;
+$VADJUST{"$l:$r"}=$v;
+}
+}
+}
+close ADJ;
+}
+
+%ALREADY_OUTPUT=();
+
+sub clone_LIGS {
+my $orig=shift;
+my $diac=shift;
+my $decalage=shift;
+
+my $new=$orig."+".$diac;
+
+foreach $i ("0","1","2","3","4","5","6","7","8") {
+if ($POS{$orig.$i} ne "") {
+
+
+###############
+$POS{$new.$i}=sprintf("%X",hex($POS{$orig.$i})+$decalage*256);
+
+my @lesLIGS=split(/#/,$LIGS{$POS{$orig.$i}});
+my @tmp=();
+foreach $laLIG (@lesLIGS) {
+($a,$b,$c)=split(/:/,$laLIG);
+
+if ($a eq "LIG/" and hex($b)<256) { $c=sprintf("%X",hex($c)+$decalage*256); }
+push @tmp, "$a:$b:$c";
+#if ($b eq "69" and $c eq "A6C") { print STDERR "zut"; }
+if ($UTF_GOTO{$b} ne "") {
+if ($decalage==8 and ($diac eq "fatha" or $diac eq "kasra" or $diac eq "damma" or $diac eq "fathatan" or $diac eq "kasratan" or $diac eq "dammatan" or $diac eq "vfatha" or $diac eq "damma")) {}
+else { push @tmp, "$a:".$UTF_GOTO{$b}.":$c"; }
+#if ($UTF_GOTO{$b} eq "0650" and $c eq "26C") { print STDERR "$b $c yes"; }
+}
+}
+
+###############
+if ($diac eq "fathatan" or $diac eq "kasratan" or $diac eq "dammatan") {
+$new_without_tan=$new;
+$new_without_tan=~s/tan$//;
+&addoperation($new_without_tan.$i,"LIG","N",$new.$i);
+}
+elsif ($diac eq "shaddafathatan" or $diac eq "shaddakasratan" or $diac eq "shaddadammatan") {
+$new_without_tan=$new;
+$new_without_tan=~s/tan$//;
+&addoperation($new_without_tan.$i,"LIG","N",$new.$i);
+$diac_without_shadda=$diac;
+$diac_without_shadda=~s/^shadda//;
+&addplusutfvowoperation($orig."+"."shadda".$i,"LIG",$diac_without_shadda,$new.$i);
+}
+elsif ($diac eq "shaddafatha" or $diac eq "shaddakasra" or $diac eq "shaddadamma") {
+$diac_without_shadda=$diac;
+$diac_without_shadda=~s/^shadda//;
+&addoperation($orig."+"."shadda".$i,"LIG",$diac_without_shadda,$new.$i);
+&addplusutfvowoperation($orig."+"."shadda".$i,"LIG",$diac_without_shadda,$new.$i);
+}
+elsif ($diac eq "shaddavfatha") {
+&addoperation($orig."+"."shaddafatha".$i,"LIG","aster",$orig."+"."shaddavfatha".$i);
+&addplusutfvowoperation($orig."+"."shadda".$i,"LIG","vfatha",$new.$i);
+}
+elsif ($diac eq "vfatha") {
+&addoperation($orig."+"."fatha".$i,"LIG","aster",$orig."+"."vfatha".$i);
+}
+elsif ($diac eq "madda") {
+&addoperation($orig."+"."vfatha".$i,"LIG","aster",$orig."+"."madda".$i);
+}
+elsif ($diac eq "shaddamadda") {
+&addoperation($orig."+"."shaddavfatha".$i,"LIG","aster",$orig."+"."shaddamadda".$i);
+&addplusutfvowoperation($orig."+"."shadda".$i,"LIG","madda",$new.$i);
+}
+###############
+
+$LIGS{$POS{$new.$i}}=join("#",@tmp);
+###############
+
+
+}
+}
+}
+
+
+$UVOWEL{"fatha"}=1;
+$UVOWEL{"damma"}=1;
+$LVOWEL{"kasra"}=1;
+$UVOWEL{"fathatan"}=1;
+$UVOWEL{"dammatan"}=1;
+$LVOWEL{"kasratan"}=1;
+$UVOWEL{"shaddafatha"}=1;
+$UVOWEL{"shaddadamma"}=1;
+$UVOWEL{"shaddakasra"}=1;
+$UVOWEL{"shaddafathatan"}=1;
+$UVOWEL{"shaddadammatan"}=1;
+$UVOWEL{"shaddakasratan"}=1;
+$UVOWEL{"sukun"}=1;
+$UVOWEL{"shadda"}=1;
+$UVOWEL{"madda"}=1;
+$UVOWEL{"vfatha"}=1;
+$UVOWEL{"shaddavfatha"}=1;
+$UVOWEL{"shaddamadda"}=1;
+
+sub buildchar_one {
+my $base=shift;
+my $form=shift;
+my $diac=shift;
+my $decalage=shift;
+my $position=sprintf("%X",hex($POS{$base.$form})+$decalage*256);
+my $res="";
+
+if ($POS{"$base$form"} ne "") {
+$POS{"$base+$diac$form"}=$position;
+&addoperation("$base$form","LIG",$diac,"$base+$diac$form");
+&addplusutfvowoperation("$base$form","LIG",$diac,"$base+$diac$form");
+$res="(CHARACTER H $position (COMMENT $base+$diac$form)
+ (CHARWD R ".$WIDTH{$POS{$base.$form}}.")
+ (CHARHT R ".$HEIGHT{$POS{$base.$form}}.")
+ (CHARDP R ".$DEPTH{$POS{$base.$form}}.")
+ (MAP
+ (SELECTFONT D 0)
+";
+
+if ($UVOWEL{$diac}==1 and ($HADJUST{"$base$form:#UVOWEL#"} ne "" or $VADJUST{"$base$form:#UVOWEL#"} ne "")) {
+$HADJUST{"$base$form:$diac"}=$HADJUST{"$base$form:#UVOWEL#"};
+$VADJUST{"$base$form:$diac"}=$VADJUST{"$base$form:#UVOWEL#"};
+}
+if ($LVOWEL{$diac}==1 and ($HADJUST{"$base$form:#LVOWEL#"} ne "" or $VADJUST{"$base$form:#LVOWEL#"} ne "")) {
+$HADJUST{"$base$form:$diac"}=$HADJUST{"$base$form:#LVOWEL#"};
+$VADJUST{"$base$form:$diac"}=$VADJUST{"$base$form:#LVOWEL#"};
+}
+
+$res.=
+" (PUSH)
+ (SETCHAR H ".$POS{$base.$form}.")
+ (POP)
+";
+if ($HADJUST{"$base$form:$diac"} ne "" or $VADJUST{"$base$form:$diac"} ne "")
+{
+$res.=
+" (PUSH)
+ (MOVERIGHT R ".($HADJUST{"$base$form:$diac"}/1000).")
+ (MOVEUP R ".($VADJUST{"$base$form:$diac"}/1000).")
+ (SETCHAR H ".$POS{$diac}.")
+ (POP)
+"; } else {
+$res.=" (SETCHAR H ".$POS{$diac}.")
+"; }
+$res.=" )
+ )
+";
+}
+}
+
+foreach $utf (sort keys %UTFPOS) {
+if ($WIDTH{$POS{$utf}} ne "") {
+$BUILD .= "(CHARACTER H ".$UTFPOS{$utf}." (COMMENT char".$UTFPOS{$utf}.")
+ (CHARWD R ".$WIDTH{$POS{$utf}}.")
+ (CHARHT R ".$HEIGHT{$POS{$utf}}.")
+ (CHARDP R ".$DEPTH{$POS{$utf}}.")
+ (MAP
+ (SELECTFONT D 0)
+ (SETCHAR H ".$POS{$utf}.")
+ )
+ )
+";
+}
+}
+
+foreach $vowel ("fatha","kasra","damma","fathatan","kasratan","dammatan","sukun","shadda","shaddafatha","shaddakasra","shaddadamma","shaddafathatan","shaddakasratan","shaddadammatan",
+"vfatha","shaddavfatha","madda","shaddamadda") #,"shadda","sukun","madda","shaddafatha","shaddakasra","shaddadamma","shaddafathatan","shaddakasratan","shaddadammatan")
+{
+foreach $letter (@LETTERS_NO_LAMS_NO_ALIFS) {
+if ($FORM{$letter}==4) {
+$BUILD .= &buildchar_one($letter,"0",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"1",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"2",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"3",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"4",$vowel,$DECALAGE{$vowel});
+} elsif ($FORM{$letter}==2) {
+$BUILD .= &buildchar_one($letter,"0",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"3",$vowel,$DECALAGE{$vowel});
+} elsif ($FORM{$letter}==1) {
+$BUILD .= &buildchar_one($letter,"0",$vowel,$DECALAGE{$vowel});
+}
+&clone_LIGS($letter,$vowel,$DECALAGE{$vowel});
+}
+foreach $letter (@LAMS) {
+$BUILD .= &buildchar_one($letter,"0",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"1",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"2",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"3",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"4",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"5",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"6",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"7",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"8",$vowel,$DECALAGE{$vowel});
+&clone_LIGS($letter,$vowel,$DECALAGE{$vowel});
+}
+foreach $letter (@ALIFS) {
+$BUILD .= &buildchar_one($letter,"0",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"3",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"4",$vowel,$DECALAGE{$vowel});
+$BUILD .= &buildchar_one($letter,"5",$vowel,$DECALAGE{$vowel});
+&clone_LIGS($letter,$vowel,$DECALAGE{$vowel});
+}
+$BUILD .= &buildchar_one("hamza","0",$vowel,$DECALAGE{$vowel});
+&clone_LIGS("hamza",$vowel,$DECALAGE{$vowel});
+}
+
+# sub printLIGS {
+# my $res="";
+# my $letter=shift;
+# if ($ALREADY_OUTPUT{$POS{$letter}} ne "") { return ""; }
+# else { $ALREADY_OUTPUT{$POS{$letter}}=1;
+# if ($LIGS{$POS{$letter}} ne "") {
+# @lesLIGS=split(/#/,$LIGS{$POS{$letter}});
+# $res .= " (LABEL H ".$POS{$letter}.")\n";
+# foreach $uneLIG (@lesLIGS) {
+# ($LIG,$right,$result)=split(/:/,$uneLIG);
+# $res .= " ($LIG H $right H $result)\n";
+# }
+# $res .= " (STOP)\n";
+# }
+# return $res;
+# }
+# }
+
+%BIG=();
+foreach $key (sort keys %LIGS) {
+$BIG{$key."|".$LIGS{$key}}=1;
+}
+%LIGS=();
+foreach $entry (sort keys %BIG) {
+($left,$right)=split(/\|/,$entry);
+$LIGS{$left}=$right;
+}
+
+sub erase_ligature {
+my $left=shift;
+my $right=shift;
+$LIS{$left} =~ /#$right:[^:]+:[^#:]+/g;
+$LIS{$left} =~ /^$right:[^:]+:[^#:]+/;
+}
+
+&erase_ligature("0644","0644");
+&alter_LIGS("0644","LIG","0644","F7");
+
+foreach $letterb (@ALIFS) {
+&addutfoperation("ll0","LIG/",$letterb."0","ll5");
+&addutfoperation("ll5","/LIG>",$letterb."0",$letterb."5");
+}
+
+foreach $letterb (@LETTERS_NO_ALIFS) {
+if ($letterb ne "ha") {
+if ($FORM{$letterb}==4 or $FORM{$letterb}==2) {
+&addutfoperation("ll0","LIG/",$letterb."0","ll1");
+&addutfoperation("ll1","/LIG",$letterb."0",$letterb."3");
+}
+}
+}
+&addutfoperation("ll0","LIG","ha0","LLh0");
+
+###write dad.ovp
+open OUT, ">dad$STYLE.ovp";
+print OUT $PRELUDE;
+foreach $key (sort keys %LIGS) {
+if ($key ne "" and $LIGS{$key} ne "") {
+@lesLIGS=split(/#/,$LIGS{$key});
+$res .= " (LABEL H $key)\n";
+foreach $uneLIG (@lesLIGS) {
+($LIG,$right,$result)=split(/:/,$uneLIG);
+if ($LIG eq "KRN") {
+$result /= 1000;
+$res .= " ($LIG H $right R $result)\n";
+} else {
+$res .= " ($LIG H $right H $result)\n";
+}
+}
+$res .= " (STOP)\n";
+}
+}
+print OUT $res;
+
+# print OUT &printLIGS("zwj0");
+# foreach $letter (@LETTERS_NO_LAMS_NO_ALIFS) {
+# if ($FORM{$letter}==4) {
+# print OUT &printLIGS($letter."0");
+# print OUT &printLIGS($letter."1");
+# print OUT &printLIGS($letter."2");
+# print OUT &printLIGS($letter."3");
+# } elsif ($FORM{$letter}==2) {
+# print OUT &printLIGS($letter."0");
+# print OUT &printLIGS($letter."3");
+# } elsif ($FORM{$letter}==1) {
+# print OUT &printLIGS($letter."0");
+# }
+# }
+# foreach $letter (@LAMS) {
+# print OUT &printLIGS($letter."0");
+# print OUT &printLIGS($letter."1");
+# print OUT &printLIGS($letter."2");
+# print OUT &printLIGS($letter."3");
+# print OUT &printLIGS($letter."4");
+# print OUT &printLIGS($letter."5");
+# }
+# foreach $letter (@ALIFS) {
+# print OUT &printLIGS($letter."0");
+# print OUT &printLIGS($letter."3");
+# print OUT &printLIGS($letter."4");
+# print OUT &printLIGS($letter."5");
+# }
+# foreach $diac (@DIACS) {
+# print OUT &printLIGS($diac);
+# }
+# foreach $diac (@vDIACS) {
+# print OUT &printLIGS($diac."tan");
+# print OUT &printLIGS("shadda".$diac);
+# print OUT &printLIGS("shadda".$diac."tan");
+# }
+
+
+print OUT " )\n"; ###END OF LIGTABLE
+
+foreach $i (0 .. 255) {
+$i_hex=sprintf("%X",$i);
+$i_hex=~s/^([0-9A-F])$/0\1/;
+print OUT "(CHARACTER H $i_hex (COMMENT char$i_hex)
+ (CHARWD R ".$WIDTH{$i_hex}.")
+ (CHARHT R ".$HEIGHT{$i_hex}.")
+ (CHARDP R ".$DEPTH{$i_hex}.")
+ (MAP
+ (SELECTFONT D 0)
+ (SETCHAR H $i_hex)
+ )
+ )
+";
+}
+
+
+print OUT $BUILD;
+
+
+
+
+close OUT;
+system("cp Dad$STYLE_.pfa /hom/yannis/texmf-static/fonts/pfb/");
+system("wovp2ovf dad$STYLE.ovp");
+
+open IN, "dad$STYLE.ovp";
+while (<IN>) {
+if (m/LIG[^T]/) { $countLIG++; }
+if (m|/LIG/|) { $countSMA++; }
+elsif (m|/LIG|) { $countSMA++; }
+elsif (m|LIG/|) { $countSMA++; }
+if (m/KRN/) { $countKRN++; }
+if (m/CHARACTER/) { $countCHA++; }
+}
+print "$countLIG ligatures ($countSMA smart), $countKRN kerns, $countCHA characters\n";
+close IN;