summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/fonts/malayalam
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-11 23:49:08 +0000
committerKarl Berry <karl@freefriends.org>2006-01-11 23:49:08 +0000
commit10e86525da5f0224078b5bb299e21166a36631fc (patch)
tree4ef035be3ffb624eac1de0eea79c4550a84d2d6c /Master/texmf-dist/source/fonts/malayalam
parent7f97ebfa628c4d00c1d298daf8b8b5da3781fdb5 (diff)
trunk/Master/texmf-dist/source/fonts
git-svn-id: svn://tug.org/texlive/trunk@111 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/fonts/malayalam')
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dn2dng.pat58
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dng.pat632
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dng.tex63
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dngmacs.tex132
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.dng80
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.tex79
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/dntrmacs.tex33
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/dng/misspaal.dng177
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/ack2mm.pat93
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/avltree.c699
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/avltree.h44
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/makefile18
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/ml.bat4
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/ml.g4
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mlr.bat4
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mlr.g4
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mltr.g6
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mltrth.g14
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.c819
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.exebin0 -> 54527 bytes
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.h110
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.pat387
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.prj13
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.scr410
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.trs159
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm.ttpbin0 -> 18816 bytes
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mm2ack.pat85
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mmr.scr261
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mmr.trs159
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/mmrfull.trs160
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.g3
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.pat133
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.c474
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.exebin0 -> 22874 bytes
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.prj7
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.ttpbin0 -> 10680 bytes
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.txt97
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.c223
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.h13
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/pstree.c225
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/pstree.h19
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/readfile.c281
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/readfile.h21
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/scr.c185
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/scr.h39
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/trs.c148
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/trs.h18
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/preproc/unicode/UNICODE.TXT161
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/adami.pat86
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tamil.pat496
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tamil.tex44
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/test.tam42
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/test.tex39
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/test.tml39
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tmlmacs.tex365
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tex52
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tml52
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.txt55
-rw-r--r--Master/texmf-dist/source/fonts/malayalam/tamil/wntml.pat69
59 files changed, 8093 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dn2dng.pat b/Master/texmf-dist/source/fonts/malayalam/dng/dn2dng.pat
new file mode 100644
index 00000000000..a27b6e90574
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dn2dng.pat
@@ -0,0 +1,58 @@
+@patterns 0 Frans Velthuis' transcription -> my transcription
+"{\\dn" e "I can't match braces; I can only work with dollarmode"
+"$" 1 "$"
+
+@patterns 1
+"$" 0 "$"
+
+"A" p "aa"
+"I" p "ii"
+"U" p "uu"
+".R" p ".r.r"
+".L" p ".l.l"
+"E" p "ai"
+"O" p "au"
+
+% take care of ambiguities
+
+"aI" p "a<ii"
+"aU" p "a<uu"
+
+% consonants
+
+"K" p "kh"
+"G" p "gh"
+".kh" p "Kh"
+".K" p "Kh"
+".g" p "G"
+"\"n" p "n\""
+
+"C" p "ch"
+"J" p "jh"
+"~n" p "n~"
+
+".t" p "T"
+".T" p "Th"
+".d" p "D"
+".D" p "Dh"
+".n" p "N"
+
+"P" p "ph"
+"B" p "bh"
+
+"\"s" p "sh"
+".s" p "S"
+
+"/" p "~"
+".m" p "M"
+".h" p "H"
+
+".o" p "OM"
+
+"~a" p "a\""
+"~o" p "o\""
+"~r" p "r\""
+"&" p "+"
+".." p "."
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dng.pat b/Master/texmf-dist/source/fonts/malayalam/dng/dng.pat
new file mode 100644
index 00000000000..a2edf81380d
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dng.pat
@@ -0,0 +1,632 @@
+% Conversion my transkriptie -> transcription for devnag
+%
+% alphabet:
+% OM a/* aa i ii u uu .r .r.r .l .l.l e ai o au .a a" o"
+%
+% a~ aM aH
+%
+% ka kha ga gha n" qa Kha Ga
+% ca cha ja jha n~ za
+% Ta Tha Da Dha Na Ra Rha
+% ta tha da dha na
+% pa pha ba bha ma fa
+% ya ra la va r"
+% sha Sa sa ha La
+%
+% 0 1 2 3 4 5 6 7 8 9
+%
+% ` `` '' ' ! ? . , : ; | ( ) /
+%
+% + @ # ^ ^^ >
+%
+% author:
+% Jeroen Hellingman <jhelling@cs.ruu.nl>
+% 't Zand 2, 4133 TB Vianen, The Netherlands
+
+@patterns 0 patterns for normal ASCII
+"$" 1 "{\\dn " begin devanagari
+"<hindi>" 1 "{\\dn "
+"<marathi>" 1 "{\\dn "
+"<nepali>" 1 "{\\dn "
+"<sanskrit>" 1 "{\\dn "
+"$$" 2 "{\\dntr " begin devanagari in transcription
+"<hindi.transcription>" 1 "{\\dn "
+"<marathi.transcription>" 1 "{\\dn "
+"<nepali.transcription>" 1 "{\\dn "
+"<sanskrit.transcription>" 1 "{\\dn "
+"%" c skip comments
+"\\" t skip TeX-command.
+"\t" p " " tab -> space (for devnag)
+
+@rpatterns 1 patterns my transcription -> devnag transcription
+
+"$" 0 "}"
+"</hindi>" 0 "}"
+"</marathi>" 0 "}"
+"</nepali>" 0 "}"
+"</sanskrit>" 0 "}"
+"$$" e "$$ while in $-mode"
+"%" c
+"\\" t
+
+"a" p "a"
+"*" p "a" silent a ($kar*naa$ = to work)
+"aa" p "A"
+"i" p "i"
+"ii" p "I"
+"u" p "u"
+"uu" p "U"
+".r" p ".r"
+".rr" e "old transcription .rr -> .r.r"
+".r.r" p ".R"
+".l" p ".l"
+".ll" e "old transcription .ll -> .l.l"
+".l.l" p ".L"
+"e" p "e"
+"ai" p "E"
+"o" p "o"
+"au" p "O"
+
+
+"k" p "k"
+"kh" p "K"
+"g" p "g"
+"gh" p "G"
+"n\"" p "\"n"
+"q" p "q"
+".kh" e "old transcription .kh -> Kh"
+"Kh" p ".K"
+".g" e "old transcription .g -> G"
+"G" p ".g"
+"c" p "c"
+"ch" p "C"
+"j" p "j"
+"jh" p "J"
+"n~" p "~n"
+"z" p "z"
+".t" e "old transcription .t -> T"
+"T" p ".t"
+".th" e "old transcription .th -> Th"
+"Th" p ".T"
+".d" e "old transcription .d -> D"
+"D" p ".d"
+".dh" e "old transcription .dh -> Dh"
+"Dh" p ".D"
+".n" e "old transcription .n -> N"
+"N" p ".n"
+"R" p "R"
+"Rh" p "Rh"
+"t" p "t"
+"th" p "T"
+"d" p "d"
+"dh" p "D"
+"n" p "n"
+"p" p "p"
+"ph" p "P"
+"b" p "b"
+"bh" p "B"
+"m" p "m"
+"f" p "f"
+"y" p "y"
+"r" p "r"
+"l" p "l"
+"v" p "v"
+"w" e "old transcription w -> v"
+"sh" p "\"s"
+".s" e "old transcription .s -> S"
+"S" p ".s"
+"s" p "s"
+"h" p "h"
+"x" e "old transcription x -> kS"
+"L" p "L" Marathi l
+"r\"" p "~r" Marathi r
+".a" p ".a" ahagraha
+"OM" p ".o" O...M
+"a\"" p "~a" English a (Marathi)
+"o\"" p "~o" English o
+".m" e "old transcription .m -> M"
+"M" p "M" anusvara
+"~" p "/" candrabindu: gets a special treatment
+".h" e "old transcription .h -> H"
+"H" p ".h" visarga
+"|" p "|" dand
+"@" p "@" abbreviation circle
+"." p ".." period
+"#" p "#" centered period
+"+" p "&" viram
+"^" p "" ^ and ^^ dissappear in devanaagarii
+"<" p "" dissappears by definition
+">" p "" dissappears
+"{" p "{" TeX-braces
+"}" p "}"
+"\n" p "\n"
+"," p ","
+":" p ":"
+";" p ";"
+"-" p "-"
+"[" p "["
+"]" p "]"
+"(" p "("
+")" p ")"
+"?" p "?"
+"!" p "!"
+"`" p "`"
+"'" p "'"
+"/" p "{\\slash}"
+"0" p "0"
+"1" p "1"
+"2" p "2"
+"3" p "3"
+"4" p "4"
+"5" p "5"
+"6" p "6"
+"7" p "7"
+"8" p "8"
+"9" p "9"
+" " p " "
+"\t" p " " tab -> space
+
+% no candrabindu if matra above headline (does not function correctly with reph)
+
+"i~" p "iM"
+"ii~" p "IM"
+"e~" p "eM"
+"ai~" p "EM"
+"o~" p "oM"
+"au~" p "OM"
+" e~" p " e/" but remain candrabindu on front e
+"\ne~" p "\ne/" idem
+"\te~" p " e/" idem
+"-e~" p "-e/" idem
+"ae~" p "ae/"
+"aae~" p "Ae/"
+"ie~" p "ie/"
+"iie~" p "Ie/"
+"ue~" p "ue/"
+"uue~" p "Ue/"
+"aie~" p "Ee/"
+"oe~" p "oe/"
+"aue~" p "Oe/"
+
+@rpatterns 2 patterns my transcription -> transcription in TeX
+
+"$" e "$ while in $$-mode"
+"$$" 0 "}"
+"</hindi>" 0 "}"
+"</marathi>" 0 "}"
+"</nepali>" 0 "}"
+"</sanskrit>" 0 "}"
+"^^" 3 "" Go to capital-mode
+"%" c
+"\\" t
+"\t" p " " tab -> spacie
+"^" e "^ in front of non-letter"
+
+"a" p "a"
+"*" p "" silent a ($kar*naa$ = to work)
+"aa" p "\\=a"
+"i" p "i"
+"ii" p "{\\=\\i}"
+"u" p "u"
+"uu" p "\\=u"
+".r" p "\\d r"
+".rr" e "old transcription .rr -> .r.r"
+".r.r" p "{\\rii}" TeX macro \rii
+".l" p "\\d l"
+".ll" e "old transcription .ll -> .l.l"
+".l.l" p "{\\lii}" TeX macros \lii
+"e" p "e"
+"ai" p "ai"
+"o" p "o"
+"au" p "au"
+
+"k" p "k"
+"kh" p "kh"
+"g" p "g"
+"gh" p "gh"
+"n\"" p "\\.n"
+"q" p "q"
+".kh" e "old transcription .kh -> Kh"
+"Kh" p "{\\kh}" Tex macro \kh
+".g" e "old transcription .g -> G"
+"G" p "{\\g}" Tex macro \g
+"c" p "c"
+"ch" p "ch"
+"j" p "j"
+"jh" p "jh"
+"n~" p "\\~n"
+"z" p "z"
+".t" e "old transcription .t -> T"
+"T" p "\\d t"
+".th" e "old transcription .th -> Th"
+"Th" p "\\d th"
+".d" e "old transcription .d -> D"
+"D" p "\\d d"
+".dh" e "old transcription .dh -> Dh"
+"Dh" p "\\d dh"
+".n" e "old transcription .n -> N"
+"N" p "\\d n"
+"R" p "\\d r"
+"Rh" p "\\d rh"
+"t" p "t"
+"th" p "th"
+"d" p "d"
+"dh" p "dh"
+"n" p "n"
+"p" p "p"
+"ph" p "ph"
+"b" p "b"
+"bh" p "bh"
+"m" p "m"
+"f" p "f"
+"y" p "y"
+"r" p "r"
+"l" p "l"
+"v" p "v"
+"w" e "old transcription w -> v"
+"sh" p "\\'s"
+"\"s" e "old transcription \"s -> sh"
+".s" e "old transcription .s -> S"
+"S" p "\\d s"
+"s" p "s"
+"h" p "h"
+"x" e "old transcription x -> kS"
+"L" p "\\d l" Marathi l
+"r\"" p "r" Marathi eyelash r
+".a" p "a" ahagraha
+"OM" p "O\\dots M" O...M
+"a\"" p "\\^e" English a (Marathi)
+"o\"" p "\\^o" English o
+".m" e "old transcription .m -> M"
+"M" p "\\d m" anusvara: see below
+"~" p "\\.m" candrabindu: treated specially
+".h" e "old transcription .h -> H"
+"H" p "\\d h" visarga
+"|" p "." dand
+" |" p "." eat space before dand
+"||" p "." dubble dand
+"@" p "." abbreviation
+"." p "." period
+"###" p "{\\dots}"
+"#" p "." centered period
+"+" p "" viram
+"<" p "" stop ambiguity; dissappears by definition
+">" p " " becomes space
+"{" p "{" TeX-braces
+"}" p "}"
+"\n" p "\n"
+"," p ","
+":" p ":"
+";" p ";"
+"-" p "-"
+"[" p "["
+"]" p "]"
+"(" p "("
+")" p ")"
+"?" p "?"
+"!" p "!"
+"`" p "`"
+"'" p "'"
+"/" p "/"
+"0" p "0"
+"1" p "1"
+"2" p "2"
+"3" p "3"
+"4" p "4"
+"5" p "5"
+"6" p "6"
+"7" p "7"
+"8" p "8"
+"9" p "9"
+" " p " "
+
+% repeat partial table for correct transcription of anusvar
+
+"Mk" p "\\.nk"
+"Mkh" p "\\.nkh"
+"Mg" p "\\.ng"
+"Mgh" p "\\.ngh"
+"Mq" p "\\.nq"
+"MKh" p "\\.n{\\kh}"
+"MG" p "\\.n{\\g}"
+"Mh" p "\\.nh"
+
+"Mc" p "\\~nc"
+"Mch" p "\\~nch"
+"Mj" p "\\~nj"
+"Mjh" p "\\~njh"
+"Msh" p "\\~n\\'s"
+"My" p "\\~ny"
+
+"MT" p "\\d n\\d t"
+"MTh" p "\\d n\\d th"
+"MD" p "\\d n\\d d"
+"MDh" p "\\d n\\d dh"
+"MS" p "\\d n\\d s"
+"Mr" p "\\d nr"
+
+"Mt" p "nt"
+"Mth" p "nth"
+"Md" p "nd"
+"Mdh" p "ndh"
+"Ms" p "ns"
+"Ml" p "nl"
+
+"Mp" p "mp"
+"Mph" p "mph"
+"Mb" p "mb"
+"Mbh" p "mbh"
+"Mf" p "mf"
+
+% part for correct translation candrabindu
+
+"a~" p "\\~a"
+"aa~" p "\\ltwig{a}"
+"i~" p "{\\~\\i}"
+"ii~" p "\\ltwig{\\i}"
+"u~" p "\\~u"
+"uu~" p "\\ltwig{u}"
+"e~" p "\\~e"
+"ai~" p "a{\\~\\i}"
+"o~" p "\\~o"
+"au~" p "a\\~u"
+
+% part for capitals
+
+"^a" p "A"
+"^aa" p "\\=A"
+"^i" p "I"
+"^ii" p "\\=I"
+"^u" p "U"
+"^uu" p "\\=U"
+"^.r" p "\\d R"
+"^.r.r" p "{\\Rii}" TeX macro \Rii
+"^.l" p "\\d L"
+"^.l.l" p "{\\Lii}" TeX macro \Lii
+"^e" p "E"
+"^ai" p "Ai"
+"^o" p "O"
+"^au" p "Au"
+
+"^k" p "K"
+"^kh" p "Kh"
+"^g" p "G"
+"^gh" p "Gh"
+"^n\"" p "\\.N"
+"^q" p "Q"
+"^Kh" p "{\\Kh}" Tex macro \Kh
+"^G" p "{\\G}" Tex macro \G
+"^c" p "C"
+"^ch" p "Ch"
+"^j" p "J"
+"^jh" p "Jh"
+"^n~" p "\\~N"
+"^z" p "Z"
+"^T" p "\\d T"
+"^Th" p "\\d Th"
+"^D" p "\\d D"
+"^Dh" p "\\d Dh"
+"^N" p "\\d N"
+"^R" p "\\d R"
+"^Rh" p "\\d Rh"
+"^t" p "T"
+"^th" p "Th"
+"^d" p "D"
+"^dh" p "Dh"
+"^n" p "N"
+"^p" p "P"
+"^ph" p "Ph"
+"^b" p "B"
+"^bh" p "Bh"
+"^m" p "M"
+"^f" p "F"
+"^y" p "Y"
+"^r" p "R"
+"^l" p "L"
+"^v" p "V"
+"^sh" p "\\'S"
+"^S" p "\\d S"
+"^s" p "S"
+"^h" p "H"
+"^L" p "\\d L" Marathi l
+"^r\"" p "R" Marathi eyelash r
+"^.a" p "A" ahagraha
+"^a\"" p "\\^E" English a (Marathi)
+"^o\"" p "\\^O" English o
+
+% part for correct translation candrabindu
+
+"^a~" p "\\~A"
+"^aa~" p "\\ltwig{A}"
+"^i~" p "{\\~\\i}"
+"^ii~" p "\\ltwig{I}"
+"^u~" p "\\~U"
+"^uu~" p "\\ltwig{U}"
+"^e~" p "\\~E"
+"^ai~" p "A{\\~\\i}"
+"^o~" p "\\~O"
+"^au~" p "A\\~u"
+
+@rpatterns 3 patterns my transcription -> transcription in TeX (capitals)
+
+"$" e "$ while in $$-mode"
+"$$" 0 "}"
+"</hindi>" 0 "}"
+"</marathi>" 0 "}"
+"</nepali>" 0 "}"
+"</sanskrit>" 0 "}"
+"^^" 2 "" Go to small-letter-mode
+"%" c
+"\\" t
+"^" p "" forget this one now
+
+"a" p "A"
+"*" p "" silent a ($kar*naa$ = to work)
+"aa" p "\\=A"
+"i" p "I"
+"ii" p "\\=I"
+"u" p "U"
+"uu" p "\\=U"
+".r" p "\\d R"
+".rr" e "old transcription .rr -> .r.r"
+".r.r" p "{\\Rii}" TeX macro \Rii
+".l" p "\\d L"
+".ll" e "old transcription .ll -> .l.l"
+".l.l" p "{\\Lii}" TeX macro \Lii
+"e" p "E"
+"ai" p "AI"
+"o" p "O"
+"au" p "AU"
+
+"k" p "K"
+"kh" p "KH"
+"g" p "G"
+"gh" p "GH"
+"n\"" p "\\.N"
+"q" p "Q"
+".kh" e "old transcription .kh -> Kh"
+"Kh" p "{\\KH}" Tex macro \KH
+".g" e "old transcription .g -> G"
+"G" p "{\\G}" Tex macro \G
+"c" p "C"
+"ch" p "CH"
+"j" p "J"
+"jh" p "JH"
+"n~" p "\\~N"
+"z" p "Z"
+".t" e "old transcription .t -> T"
+"T" p "\\d T"
+".th" e "old transcription .th -> Th"
+"Th" p "\\d TH"
+".d" e "old transcription .d -> d"
+"D" p "\\d D"
+".dh" e "old transcription .dh -> Dh"
+"Dh" p "\\d DH"
+".n" e "old transcription .n -> N"
+"N" p "\\d N"
+"R" p "\\d R"
+"Rh" p "\\d RH"
+"t" p "T"
+"th" p "TH"
+"d" p "D"
+"dh" p "DH"
+"n" p "N"
+"p" p "P"
+"ph" p "PH"
+"b" p "B"
+"bh" p "BH"
+"m" p "M"
+"f" p "F"
+"y" p "Y"
+"r" p "R"
+"l" p "L"
+"v" p "V"
+"w" e "old transcription w -> v"
+"sh" p "\\'S"
+"\"s" e "old transcription \"s -> sh"
+".s" e "old transcription .s -> S"
+"S" p "\\d S"
+"s" p "S"
+"h" p "H"
+"x" e "old transcription x -> kS"
+"L" p "\\d L" Marathi l
+"r\"" p "R" Marathi eyelash r
+".a" p "A" ahagraha
+"OM" p "O\\dots M" O...M
+"a\"" p "\\^E" English a (Marathi)
+"o\"" p "\\^O" English o
+".m" e "old transcription .m -> M"
+"M" p "\\d M" anusvara: see below
+"~" p "\\.M" candrabindu: treated specially
+".h" e "old transcription .h -> H"
+"H" p "\\d H" visarga
+"|" p "." dand
+" |" p "." eat space in front of dand
+"||" p "." dubble dand
+"@" p "." abbreviation
+"." p "." period
+"###" p "{\\dots}"
+"#" p "." centered period
+"+" p "" viram
+"<" p "" remove ambiguity; dessapears by definition
+">" p " " becomes space
+"{" p "{" TeX-braces
+"}" p "}"
+"\n" p "\n"
+"," p ","
+":" p ":"
+";" p ";"
+"-" p "-"
+"[" p "["
+"]" p "]"
+"(" p "("
+")" p ")"
+"?" p "?"
+"!" p "!"
+"`" p "`"
+"'" p "'"
+"/" p "/"
+"0" p "0"
+"1" p "1"
+"2" p "2"
+"3" p "3"
+"4" p "4"
+"5" p "5"
+"6" p "6"
+"7" p "7"
+"8" p "8"
+"9" p "9"
+" " p " "
+
+% repeat part for correct transcription anusvara
+
+"Mk" p "\\.NK"
+"Mkh" p "\\.NKH"
+"Mg" p "\\.NG"
+"Mgh" p "\\.NGH"
+"Mq" p "\\.NQ"
+"MKh" p "\\.N{\\KH}"
+"MG" p "\\.N{\\G}"
+"Mh" p "\\.NH"
+
+"Mc" p "\\~NC"
+"Mch" p "\\~NCH"
+"Mj" p "\\~NJ"
+"Mjh" p "\\~NJH"
+"Msh" p "\\~N\\'S"
+"My" p "\\~NY"
+
+"MT" p "\\d N\\d T"
+"MTh" p "\\d N\\d TH"
+"MD" p "\\d N\\d D"
+"MDh" p "\\d N\\d DH"
+"MS" p "\\d N\\d S"
+"Mr" p "\\d NR"
+
+"Mt" p "NT"
+"Mth" p "NTH"
+"Md" p "ND"
+"Mdh" p "NDH"
+"Ms" p "NS"
+"Ml" p "NL"
+
+"Mp" p "MP"
+"Mph" p "MPH"
+"Mb" p "MB"
+"Mbh" p "MBH"
+"Mf" p "MF"
+
+% part for correct translation candrabindu
+
+"a~" p "\\~A"
+"aa~" p "\\ltwig{A}"
+"i~" p "\\~I"
+"ii~" p "\\ltwig{I}"
+"u~" p "\\~U"
+"uu~" p "\\ltwig{U}"
+"e~" p "\\~E"
+"ai~" p "A\\~I"
+"o~" p "\\~O"
+"au~" p "A\\~U"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dng.tex b/Master/texmf-dist/source/fonts/malayalam/dng/dng.tex
new file mode 100644
index 00000000000..ccfd931ab46
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dng.tex
@@ -0,0 +1,63 @@
+% dng.tex -- guide for using Devanagari with Malayalam-TeX
+% (c) Jeroen Hellingman 1993
+% Last edit: 07-JAN-1993
+
+\input dngmacs
+\input mmtrmacs
+\input dntrmacs
+
+\beginsection {\twelvebf How To Type Devanagari}
+
+Since a package for typesetting Devanagari,
+{\tt devnag}, designed by Frans Velthuis, was already available
+I~decided to adapt it to Malayalam-\TeX s input conventions.
+
+To start using Devanagari, all you have to do is say
+
+\medskip
+{\tt \bslash input dngmacs}
+
+{\tt \bslash input dntrmacs}
+\medskip
+
+Somewhere near the start of your document. Then you can switch to
+any of the principle languages that use Devanagari-script by saying
+{\tt<{}sanskrit>}, {\tt<{}hindi>}, {\tt<{}marathi>}, or {\tt<{}nepali>}.
+You will then enter the mode of the indicated language --~together
+called {\it Devanagari-mode}.
+You can switch back to normal mode by saying respectively
+{\tt<{}/sanskrit>}, {\tt<{}/hindi>}, {\tt<{}/marathi>}, or {\tt<{}/nepali>}.
+If you wish to use Roman transcription for any of those
+languages, you will have to append {\tt .transcription} to the language
+name in the start-tag; so Hindi in transcription can be started
+with {\tt<{}hindi.transcription>}. No modification of the end-tag is
+required (or even allowed).
+
+The following table shows the character(s) you have to type to produce
+a Devanagari character.
+
+\bigskip
+\input dngtrans
+\bigskip
+
+If you want to view or print your document after typing (a part of) it,
+you will have to do some extra pre-processing\footnote*{I admit, if you
+use several languages in one document, this can get pretty booring.}.
+Saying
+
+\medskip
+{\tt patc -p dng.pat {\it input-file}.dng {\it temporary-file}.dn }
+
+{\tt devnag {\it temporary-file}.dn {\it output-file}.tex}
+\medskip
+
+{\it after} pre-processing for Malayalam, if it is used,
+will do all the neccessary pre-processing for Devanagari. As you
+can see, you will still have to use Frans Velthuis'
+pre-processor\footnote{**}{As a matter of fact, I have only changed
+the transcription --~all functionality of {\tt devnag}, including
+{\tt@}-directives to it is still there.}.
+To find out how it should be used exactly, read the manual that
+comes with {\tt devnag}.
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dngmacs.tex b/Master/texmf-dist/source/fonts/malayalam/dng/dngmacs.tex
new file mode 100644
index 00000000000..3b1a027852a
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dngmacs.tex
@@ -0,0 +1,132 @@
+% DNMACS.TEX
+% TeX macros for the use of Devanagari fonts
+%
+% Copyright (C) 1991 University of Groningen, The Netherlands
+%
+% Author: Frans J. Velthuis
+% Internet: velthuis@rc.rug.nl
+% Bitnet: velthuis@hgrrug5
+%
+% This program is free software; you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation; either version 1, or (at your option)
+% any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program; if not, write to the Free Software
+% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+%
+%
+% modified by Jeroen Hellingman
+%
+% font-loading
+%
+\font\smalldn=dvng8%
+\font\ninedn=dvng9%
+\font\dvng=dvng10%
+\font\halfdn=dvng10 scaled\magstephalf
+\font\bigdn=dvng10 scaled\magstep1
+\font\largedn=dvng10 scaled\magstep2
+\font\hugedn=dvng10 scaled\magstep3
+\hyphenchar\smalldn=-1%
+\hyphenchar\ninedn=-1%
+\hyphenchar\dvng=-1%
+\hyphenchar\halfdn=-1%
+\hyphenchar\bigdn=-1%
+\hyphenchar\largedn=-1%
+\hyphenchar\hugedn=-1%
+\font\smallcr=cmr8%
+\font\ninecr=cmr9%
+\font\halfcr=cmr10 scaled\magstephalf
+\font\bigcr=cmr10 scaled\magstep1
+\font\largecr=cmr10 scaled\magstep2
+\font\hugecr=cmr10 scaled\magstep3
+%
+%
+%
+\let\rsize=\rm
+\newcount\chnum
+\newdimen\itdim
+\newdimen\dnblskip
+\newif\ifdnmode
+%
+% change some catcodes
+%
+\chnum=0%
+\loop\catcode\chnum=11%
+\ifnum\chnum<12\advance\chnum by1%
+\repeat%
+\chnum=14%
+\loop\catcode\chnum=11%
+\ifnum\chnum<31\advance\chnum by1%
+\repeat%
+\catcode127=11%}%
+%
+\def\subscr#1{\/\itdim=\lastkern
+\unkern\kern-\itdim \lower\dp0 \hbox to\itdim{#1\hfil}}
+%
+% font selecting
+%
+\def\dnsmall{\let\pdn=\smalldn\let\rsize=\smallcr%
+\dnblskip=12pt\ifdnmode\dn\fi}
+\def\dnnine{\let\pdn=\ninedn\let\rsize=\ninecr%
+\dnblskip=13pt\ifdnmode\dn\fi}
+\def\dnnormal{\let\pdn=\dvng\let\rsize=\rm%
+\dnblskip=15pt\ifdnmode\dn\fi}
+\def\dnhalf{\let\pdn=\halfdn\let\rsize=\halfcr%
+\dnblskip=16pt\ifdnmode\dn\fi}
+\def\dnbig{\let\pdn=\bigdn\let\rsize=\bigcr%
+\dnblskip=18pt\ifdnmode\dn\fi}
+\def\dnlarge{\let\pdn=\largedn\let\rsize=\largecr%
+\dnblskip=22pt\ifdnmode\dn\fi}
+\def\dnhuge{\let\pdn=\hugedn\let\rsize=\hugecr%
+\dnblskip=26pt\ifdnmode\dn\fi}
+%
+\def\dn{\dnmodetrue\pdn\baselineskip=\dnblskip%
+\def\<{\llap{\char4}}% locally redefine one macro that conflicts
+\tolerance=10000\pretolerance=10000}
+%
+% composing macro's
+%
+\def\0{\llap{\char13}}%
+\def\1{\llap{\char32}}%
+\def\2{\llap{\char92}}%
+\def\3#1w{{\char"#1}}%
+\def\4{\llap{\char123}}%
+\def\5{\llap{\char125}}%
+\def\6#1{\setbox0=\hbox{#1}#1\subscr{\char126}}%
+\def\7#1{\setbox0=\hbox{#1}#1\subscr{\char0}}%
+\def\8#1{\setbox0=\hbox{#1}#1\subscr{\char1}}%
+\def\9#1{\setbox0=\hbox{#1}#1\subscr{\char2}}%
+\def\qa#1#2{\setbox0=\hbox{#1}#1\subscr{\char253\kern1.5ex\lower1.25ex%
+\hbox{\char#2}\kern-1.5ex}}%
+\def\qb#1{\setbox0=\hbox{#1}#1\subscr{\char253}}%
+\def\qq#1{\setbox0=\hbox{#1}#1\subscr{\char94}}%
+\def\qx#1{\setbox0=\hbox{#1}#1\subscr{\char14}}%
+\def\qy#1{\setbox0=\hbox{#1}#1\subscr{\char31}}%
+\def\qz#1{\setbox0=\hbox{#1}#1\subscr{\char124}}%
+\def\qva{\kern0.5ex\2\kern-0.5ex}%
+\def\qvb{\kern1ex\0\kern-1ex}%
+\def\qvc{\kern1ex\rdt\kern-1ex}%
+\def\?{\llap{\char3}}%
+% \def\<{\llap{\char4}}% % CONFLICT !!!
+\def\rs{\rsize\thinspace}%
+\let\re=\thinspace%
+\def\rdt{\llap{\char19}}%
+%
+\def\dnnum{\let\nstyle=d}%
+\def\cmnum{\let\nstyle=r}%
+%
+% some parameters
+%
+\cmnum%
+\def\rn#1{\if\nstyle r{\rsize #1}\else#1\fi}%
+\let\pdn=\dvng%
+\dnblskip=15pt%
+%
+% end of dngmacs.tex
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.dng b/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.dng
new file mode 100644
index 00000000000..07740782e89
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.dng
@@ -0,0 +1,80 @@
+@hindi
+% dngtrans.txt -- Devanagari transcription table
+% (c) Jeroen Hellingman 1993
+% Last edit: 07-JAN-1993
+
+\bgroup
+\def\dngstrut{\vtop to4pt{}\vbox to10pt{}}
+\def\q{\quad\hfill}
+\def\x{\vrule\ }
+\def\xx{\vrule width.8pt}
+\offinterlineskip
+\halign{\dngstrut\xx\ \tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\cr
+\noalign{\hrule height.8pt}
+OM & $OM$ & $$OM$$ &
+ka, qa & $ka, qa$ & $$ka, qa$$ &
+pa & $pa$ & $$pa$$ \cr
+a & $a$ & $$a$$ &
+kha, Kha& $kha, Kha$& $$kha, Kha$$ &
+pha, fa & $pha, fa$ & $$pha, fa$$ \cr
+* & $*$ & $$*$$ &
+ga, Ga & $ga, Ga$ & $$ga, Ga$$ &
+ba & $ba$ & $$ba$$ \cr
+aa & $aa$ & $$aa$$ &
+gha & $gha$ & $$gha$$ &
+bha & $bha$ & $$bha$$ \cr
+i & $i$ & $$i$$ &
+n"a & $n"a$ & $$n"a$$ &
+ma & $ma$ & $$ma$$ \cr
+ii & $ii$ & $$ii$$ &
+ca & $ca$ & $$ca$$ &
+ya & $ya$ & $$ya$$ \cr
+u & $u$ & $$uu$$ &
+cha & $cha$ & $$cha$$ &
+ra & $ra$ & $$ra$$ \cr
+uu & $uu$ & $$uu$$ &
+ja, za & $ja, za$ & $$ja, za$$ &
+la & $la$ & $$la$$ \cr
+.r & $.r$ & $$.r$$ &
+jha & $jha$ & $$jha$$ &
+va & $va$ & $$va$$ \cr
+.r.r & $.r.r$ & $$.r.r$$ &
+n\~{}a & $n~a$ & $$n~a$$ &
+sha & $sha$ & $$sha$$ \cr
+.l & $.l$ & $$.l$$ &
+Ta & $Ta$ & $$Ta$$ &
+Sa & $Sa$ & $$Sa$$ \cr
+.l.l & $.l.l$ & $$.l.l$$ &
+Tha & $Tha$ & $$Tha$$ &
+sa & $sa$ & $$sa$$ \cr
+e & $e$ & $$e$$ &
+Da, Ra & $Da, Ra$ & $$Da, Ra$$ &
+ha & $ha$ & $$ha$$ \cr
+ai & $ai$ & $$ai$$ &
+Dha, Rha& $Dha, Rha$& $$Dha, Rha$$ &
+La & $La$ & $$La$$ \cr
+o & $o$ & $$o$$ &
+Na & $Na$ & $$Na$$ &
+r" & $r"$ & $$r"$$ \cr
+au & $au$ & $$au$$ &
+ta & $ta$ & $$ta$$ &
+k+ & $k+$ & $$k+$$ \cr
+aM & $aM$ & $$aM$$ &
+tha & $tha$ & $$tha$$ &
+| & $|$ & $$|$$ \cr
+a\~ & $a~$ & $$a~$$ &
+da & $da$ & $$da$$ &
+\# & $#$ & $$#$$ \cr
+aH & $aH$ & $$aH$$ &
+dha & $dha$ & $$dha$$ &
+\#\#\# & $###$ & $$###$$ \cr
+a" & $a"$ & $$a"$$ &
+na & $na$ & $$na$$ &
+@ & $@$ & $$@$$ \cr
+o" & $o"$ & $$o"$$ &
+ & & &
+ & & \cr
+\noalign{\hrule height.8pt}
+}\egroup
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.tex b/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.tex
new file mode 100644
index 00000000000..a1848cb59a0
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dngtrans.tex
@@ -0,0 +1,79 @@
+% dngtrans.txt -- Devanagari transcription table
+% (c) Jeroen Hellingman 1993
+% Last edit: 07-JAN-1993
+
+\bgroup
+\def\dngstrut{\vtop to4pt{}\vbox to10pt{}}
+\def\q{\quad\hfill}
+\def\x{\vrule\ }
+\def\xx{\vrule width.8pt}
+\offinterlineskip
+\halign{\dngstrut\xx\ \tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\cr
+\noalign{\hrule height.8pt}
+OM & {\dn :} & {\dntr O\dots M} &
+ka, qa & {\dn k{\rs ,\re} *} & {\dntr ka, qa} &
+pa & {\dn p} & {\dntr pa} \cr
+a & {\dn a} & {\dntr a} &
+kha, Kha& {\dn K{\rs ,\re} ^^L}& {\dntr kha, {\kh}a} &
+pha, fa & {\dn P{\rs ,\re} '} & {\dntr pha, fa} \cr
+* & {\dn a} & {\dntr } &
+ga, Ga & {\dn g{\rs ,\re} ^^K} & {\dntr ga, {\g}a} &
+ba & {\dn b} & {\dntr ba} \cr
+aa & {\dn aA} & {\dntr \=a} &
+gha & {\dn G} & {\dntr gha} &
+bha & {\dn B} & {\dntr bha} \cr
+i & {\dn i} & {\dntr i} &
+n"a & {\dn R} & {\dntr \.na} &
+ma & {\dn m} & {\dntr ma} \cr
+ii & {\dn I} & {\dntr {\=\i}} &
+ca & {\dn c} & {\dntr ca} &
+ya & {\dn y} & {\dntr ya} \cr
+u & {\dn u} & {\dntr \=u} &
+cha & {\dn C} & {\dntr cha} &
+ra & {\dn r} & {\dntr ra} \cr
+uu & {\dn U} & {\dntr \=u} &
+ja, za & {\dn j{\rs ,\re} )} & {\dntr ja, za} &
+la & {\dn l} & {\dntr la} \cr
+.r & {\dn ^^[} & {\dntr \d r} &
+jha & {\dn J} & {\dntr jha} &
+va & {\dn v} & {\dntr va} \cr
+.r.r & {\dn ^^Q} & {\dntr {\rii}} &
+n\~{}a & {\dn ^^Z} & {\dntr \~na} &
+sha & {\dn f} & {\dntr \'sa} \cr
+.l & {\dn ^^X} & {\dntr \d l} &
+Ta & {\dn V} & {\dntr \d ta} &
+Sa & {\dn q} & {\dntr \d sa} \cr
+.l.l & {\dn ^^Y} & {\dntr {\lii}} &
+Tha & {\dn W} & {\dntr \d tha} &
+sa & {\dn s} & {\dntr sa} \cr
+e & {\dn e} & {\dntr e} &
+Da, Ra & {\dn X{\rs ,\re} w} & {\dntr \d da, \d ra} &
+ha & {\dn h} & {\dntr ha} \cr
+ai & {\dn e\?} & {\dntr ai} &
+Dha, Rha& {\dn Y{\rs ,\re} x}& {\dntr \d dha, \d rha} &
+La & {\dn ^^O} & {\dntr \d la} \cr
+o & {\dn ao} & {\dntr o} &
+Na & {\dn Z} & {\dntr \d na} &
+r" & {\dn ^^]} & {\dntr r} \cr
+au & {\dn aO} & {\dntr au} &
+ta & {\dn t} & {\dntr ta} &
+k+ & {\dn \qq{k}} & {\dntr k} \cr
+aM & {\dn a\2} & {\dntr a\d m} &
+tha & {\dn T} & {\dntr tha} &
+| & {\dn .} & {\dntr .} \cr
+a\~ & {\dn a\1} & {\dntr \~a} &
+da & {\dn d} & {\dntr da} &
+\# & {\dn ^^U} & {\dntr .} \cr
+aH & {\dn a,} & {\dntr a\d h} &
+dha & {\dn D} & {\dntr dha} &
+\#\#\# & {\dn ^^U^^U^^U} & {\dntr {\dots}} \cr
+a" & {\dn e\<} & {\dntr \^e} &
+na & {\dn n} & {\dntr na} &
+@ & {\dn ^^?} & {\dntr .} \cr
+o" & {\dn aA\<} & {\dntr \^o} &
+ & & &
+ & & \cr
+\noalign{\hrule height.8pt}
+}\egroup
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/dntrmacs.tex b/Master/texmf-dist/source/fonts/malayalam/dng/dntrmacs.tex
new file mode 100644
index 00000000000..ea205491e15
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/dntrmacs.tex
@@ -0,0 +1,33 @@
+% dntrmacs.tex -- macro's for transcription of devanaagarii.
+% Jeroen Hellingman
+% last edit: 07-JAN-1993
+%
+% macro for two accents on one letter
+%
+% put accent #1 centered on top of #2
+\def\putaccentontop#1#2{\hskip0pt{\setbox0=\hbox{#2}\setbox1=\hbox{#1}%
+ \dimen0=.5\wd0\advance\dimen0by.5\wd1%
+ \dimen1=\ht0\advance\dimen1by-1ex% was: .45em%
+ \dimen3=.5\wd0\advance\dimen3by-.5\wd1%
+ \box0\kern-\dimen0\raise\dimen1\box1\kern\dimen3}}
+%
+% macros for special letters
+%
+\def\dntr{\hyphenpenalty=10000%
+ \def\ltwig##1{\putaccentontop{\char"7E}{\hbox{\=##1}}}%
+ \def\rii{\putaccentontop{\char"16}{\hbox{\d r}}}%
+ \def\RII{\putaccentontop{\char"16}{\hbox{\d R}}}%
+ \def\lii{\putaccentontop{\char"16}{\hbox{\d l}}}%
+ \def\LII{\putaccentontop{\char"16}{\hbox{\d L}}}%
+ \def\kh{{$\underline{\hbox{kh}}$}}%
+ \def\Kh{{$\underline{\hbox{Kh}}$}}%
+ \def\KH{{$\underline{\hbox{KH}}$}}%
+ \def\G{\b G}\def\g{\b g}}
+%
+% make math-modes and dollar-sign available again
+%
+\def\math{$}
+\def\Math{$$}
+\def\dollar{{\$}}
+%
+% end of dntrmacs.tex
diff --git a/Master/texmf-dist/source/fonts/malayalam/dng/misspaal.dng b/Master/texmf-dist/source/fonts/malayalam/dng/misspaal.dng
new file mode 100644
index 00000000000..99140af9adc
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/dng/misspaal.dng
@@ -0,0 +1,177 @@
+@hindi
+@nolig 5
+
+\input dnmacs
+\input dntrmacs
+
+\emergencystretch=20pt
+
+$
+\centerline{\dnbig ^mohan ^raakesh: ^mis ^paal}
+
+\medskip
+
+^vah duur se dikhaayii detii aak.rti mis ^paal hii ho sak*tii thii|
+^phir bhii vishvaas kar*ne ke lie mai~ne ap*naa cashma Thiik kiyaa|
+^niHsaMdeh, vah mis ^paal hii thii|
+^yah to khair mujhe pati thaa ki vah un dine~ kulluu me~ hii kahii~
+hai, par is tarah acaanak us*se bheMT ho jaayegi, yah nahii~ socaa thaa|
+^aur use saam*ne dekh*kar bhii muujhe vishvaas nahii~ huaa ki vah sthaayii
+ruup se kulluu ke biic us choTe-se gaa~v me~ rahtii hogii|
+^jeb vah dillii se naukarii choR*kar aayii thii, to logo~ ne us*ke bare
+me~ kya-kya nahii~ socaa tha!
+
+^bas raayasan ke Daakakhaane ke paas pahu~c*kar ruk gajii|
+^mis ^paal Daakakhaane ke baahar khaRii posT*maasTar se kuch baat kar rahii
+thii|
+^haath me~ vah ek thailaa liye thii|
+^bas ke ruk*ne par na jaane kis baat ke lie posT*maasTer ko danyavaad
+detii huii vah kii taraf muRii|
+^tabhii mai~ atar*kar us*ko saam*ne pahu~c gayaa|
+^ek aad*mii ke acaanak saam*ne aa jaane se mis ^paal thoRaa acakacaa gayii,
+magar mujhe pahacaan*te hii uskaa ceharaa Khushii aur utsaah se khil
+gayaa|
+
+``^raNajiit tum?'' us*ne kahaa, ``^tum yahaa~ se Tapak paRe?''
+
+``^mai~ is bas se manaalii se aa rahaa huu~|'' mai~ne kahaa|
+
+``^acchaa! ^manaalii tum kab se aaye hue the?''
+
+``^aaT-das din hue, aaya tha| ^aaj vaapas jaa rahaa huu~|''
+
+``^aaj hii jaa rahe ho?'' mis ^paal ke cehare se aadhaa utsaah gaayab
+ho gayaa, ``dekho, kit*nii burii baat hai ki aaT-das din se tum aur
+mujh*se mil*ne kii tum*ne koshish bhii nahii~ kii|
+^tumhe~ yah to pataa hii thaa ki mai~ aaj*kal kulluu me~ huu~
+
+^haa~, yah to pataa thaa, par yah nahii~ pataa thaa ki kulluu ke kis
+hisse me~ ho|
+^ab bhii tum acaanak hii dikhaayii de gayii~, nahii~ mujhe kahaa~ se
+pataa cal*taa ki tum is jaMgal ko aabaad kar rahii ho?''
+
+``^sac*muc bahut barii baat hai,'' mis ^paal almaah*ne ke svar
+me~ bolii, ``tum it*ne dino~ se yahaa~ ho aur mujh*se tumhaarii
+bhaMT huii aaj jaane ke vaqt###|''
+
+^Draaivar zor-zor se ho"rn bajaane lagaa|
+^mis ^paal ne kuch ciRh*kar Draaivar kii taraf dekhaa aur ek*saath
+jhiRak*ne kSama ma~g*ne ke svar me~ kahaa, ``bas jii ek
+minaT| mai~ bhii isii bas se kullu cal rahii huu~|
+^mujhe kullu ki ek siiT de diijie|
+^thaiMk yuu verii mac!'' aur phir merii taraf muR*kar bolii,
+``tum is bas se kahaa~ tak jaa rahee ho?''
+
+``^aaj to is bas se jogindar*nagar jaauu~gaa|
+^vahaa~ ek din rah*kar kal subah aage kii bas pakaRuu~gaa|''
+
+^Draaivar ab aur zor se ho"rn bajaane lagaa|
+^mis ^paal ne ek baar krodh aur bab*sii ke saath us*kii
+taraf dekhaa aur bas ke dar*vaaze kii taraf baRh*tii huii,
+``acchaa, kulluu tak to ham logo~ kaa saath hai hii, aur baat
+kulluu pahu~c*kar kare~ge|
+^mai~ to kah*tii huu~ ki tum do-caar din yahii~ ruko, phir cale
+jaanaa|''
+
+^bas me~ pahale hii bahut bhiiR thii|
+^do-tiin aad*mii vahaa~ se aur caRh gaye the, jis*se andar
+khaRe hone ki jagah bhii nahii~ rahii thii|
+^mis ^paal dar*vaaze se andar jaane to kaNDakTar ne haath
+baRhaakar use rok diyaa|
+^mai~ne kaNDakTar se bahuteraa kahaa ki andar mere vaalii jagah
+khaali hai, mis saahab vahaa~ baiTh jaae~gii aur mai~ bhiR me~
+kisii tarah khaRaa calaa jaauu~gaa kaNDakTar ek baar jid par aRaa
+to aRaa hii rahaa ki aur savaarii vah nahii~ le sak*taa|
+^mai~ abhii us*se baat kar hii rahaa thaa ki Draaivar ne bas sTarT
+kar dii|
+^meraa saamaan bas me~ thaa, is*lie mai~ dauR*kar cal*tii bas me~
+savaar ho gayaa|
+
+$
+
+\bigskip %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+$$
+\centerline{\bf ^mohan ^raakesh: ^mis ^paal}
+
+\medskip
+
+^vah duur se dikhaayii detii aak.rti mis ^paal hii ho sak*tii thii|
+^phir bhii vishvaas kar*ne ke lie mai~ne ap*naa cashma Thiik kiyaa|
+^niHsaMdeh, vah mis ^paal hii thii|
+^yah to khair mujhe pati thaa ki vah un dine~ kulluu me~ hii kahii~
+hai, par is tarah acaanak us*se bheMT ho jaayegi, yah nahii~ socaa thaa|
+^aur use saam*ne dekh*kar bhii muujhe vishvaas nahii~ huaa ki vah sthaayii
+ruup se kulluu ke biic us choTe-se gaa~v me~ rahtii hogii|
+^jeb vah dillii se naukarii choR*kar aayii thii, to logo~ ne us*ke bare
+me~ kya-kya nahii~ socaa tha!
+
+^bas raayasan ke Daakakhaane ke paas pahu~c*kar ruk gajii|
+^mis ^paal Daakakhaane ke baahar khaRii posT*maasTar se kuch baat kar rahii
+thii|
+^haath me~ vah ek thailaa liye thii|
+^bas ke ruk*ne par na jaane kis baat ke lie posT*maasTer ko danyavaad
+detii huii vah kii taraf muRii|
+^tabhii mai~ atar*kar us*ko saam*ne pahu~c gayaa|
+^ek aad*mii ke acaanak saam*ne aa jaane se mis ^paal thoRaa acakacaa gayii,
+magar mujhe pahacaan*te hii uskaa ceharaa Khushii aur utsaah se khil
+gayaa|
+
+``^raNajiit tum?'' us*ne kahaa, ``^tum yahaa~ se Tapak paRe?''
+
+``^mai~ is bas se manaalii se aa rahaa huu~|'' mai~ne kahaa|
+
+``^acchaa! ^manaalii tum kab se aaye hue the?''
+
+``^aaT-das din hue, aaya tha| ^aaj vaapas jaa rahaa huu~|''
+
+``^aaj hii jaa rahe ho?'' mis ^paal ke cehare se aadhaa utsaah gaayab
+ho gayaa, ``dekho, kit*nii burii baat hai ki aaT-das din se tum aur
+mujh*se mil*ne kii tum*ne koshish bhii nahii~ kii|
+^tumhe~ yah to pataa hii thaa ki mai~ aaj*kal kulluu me~ huu~
+
+^haa~, yah to pataa thaa, par yah nahii~ pataa thaa ki kulluu ke kis
+hisse me~ ho|
+^ab bhii tum acaanak hii dikhaayii de gayii~, nahii~ mujhe kahaa~ se
+pataa cal*taa ki tum is jaMgal ko aabaad kar rahii ho?''
+
+``^sac*muc bahut barii baat hai,'' mis ^paal almaah*ne ke svar
+me~ bolii, ``tum it*ne dino~ se yahaa~ ho aur mujh*se tumhaarii
+bhaMT huii aaj jaane ke vaqt###|''
+
+^Draaivar zor-zor se ho"rn bajaane lagaa|
+^mis ^paal ne kuch ciRh*kar Draaivar kii taraf dekhaa aur ek*saath
+jhiRak*ne kSama ma~g*ne ke svar me~ kahaa, ``bas jii ek
+minaT| mai~ bhii isii bas se kullu cal rahii huu~|
+^mujhe kullu ki ek siiT de diijie|
+^thaiMk yuu verii mac!'' aur phir merii taraf muR*kar bolii,
+``tum is bas se kahaa~ tak jaa rahee ho?''
+
+``^aaj to is bas se jogindar*nagar jaauu~gaa|
+^vahaa~ ek din rah*kar kal subah aage kii bas pakaRuu~gaa|''
+
+^Draaivar ab aur zor se ho"rn bajaane lagaa|
+^mis ^paal ne ek baar krodh aur bab*sii ke saath us*kii
+taraf dekhaa aur bas ke dar*vaaze kii taraf baRh*tii huii,
+``acchaa, kulluu tak to ham logo~ kaa saath hai hii, aur baat
+kulluu pahu~c*kar kare~ge|
+^mai~ to kah*tii huu~ ki tum do-caar din yahii~ ruko, phir cale
+jaanaa|''
+
+^bas me~ pahale hii bahut bhiiR thii|
+^do-tiin aad*mii vahaa~ se aur caRh gaye the, jis*se andar
+khaRe hone ki jagah bhii nahii~ rahii thii|
+^mis ^paal dar*vaaze se andar jaane to kaNDakTar ne haath
+baRhaakar use rok diyaa|
+^mai~ne kaNDakTar se bahuteraa kahaa ki andar mere vaalii jagah
+khaali hai, mis saahab vahaa~ baiTh jaae~gii aur mai~ bhiR me~
+kisii tarah khaRaa calaa jaauu~gaa kaNDakTar ek baar jid par aRaa
+to aRaa hii rahaa ki aur savaarii vah nahii~ le sak*taa|
+^mai~ abhii us*se baat kar hii rahaa thaa ki Draaivar ne bas sTarT
+kar dii|
+^meraa saamaan bas me~ thaa, is*lie mai~ dauR*kar cal*tii bas me~
+savaar ho gayaa|
+
+$$
+
+\bye
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/ack2mm.pat b/Master/texmf-dist/source/fonts/malayalam/preproc/ack2mm.pat
new file mode 100644
index 00000000000..e170b646389
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/ack2mm.pat
@@ -0,0 +1,93 @@
+% ack2mm.pat --- patterns to convert transcription used in A.C.K
+% (designed by Mathai Chundat) to my transcription
+% (c) 1993 Jeroen Hellingman
+% last edit: 22-JAN-1993
+
+% I use a different transcription, that is more regular than the
+% A.C.K. one, and in line with the transcriptions I use for other
+% Indian languages. The things I prefer in MC's transscription
+% is the use of nG, nnG, nJ, and nnJ. but I didn't use G, since I
+% use it in transcription of Hindi for something else. I may change
+% my transcription to accept both in Malayalam -- there are some
+% differences anyway, for example, in Hindi I use e for ee.
+%
+% KNOWN PROBLEMS:
+% colon may stand for itself or for visargam; this file assumes the visargam.
+
+
+@patterns 0
+"<malayalam>" 1 "$"
+"$" 1 "$"
+
+@patterns 1
+"</malayalam>" 0 "$"
+"$" 0 "$"
+% vowels
+"a" p "a"
+"aa" p "aa"
+"A" p "aa"
+"i" p "i"
+"ee" p "ii"
+"u" p "u"
+"oo" p "uu"
+"R~" p ".r"
+"e" p "e"
+"E" p "ee"
+"o" p "o"
+"O" p "oo"
+"ai" p "ai"
+"ou" p "au"
+"am" p "am"
+":" p "H"
+"wa" p "ua" % u + a = wa (?)
+% ka
+"k" p "k"
+"kh" p "kh"
+"g" p "g"
+"gh" p "gh"
+"nG" p "n\""
+"nnG" p "n\"n\""
+% ca
+"ch" p "c"
+"Ch" p "ch"
+"j" p "j"
+"jh" p "jh"
+"nJ" p "n~"
+"cch" p "cc"
+"nnJ" p "n~n~"
+% Ta
+"t" p "T"
+"T" p "Th"
+"D" p "D"
+"Dh" p "Dh"
+"N" p "N"
+% ta
+"th" p "t"
+"Th" p "th"
+"d" p "d"
+"dh" p "dh"
+"n" p "n"
+"tth" p "tt"
+"tTh" p "tth"
+"tdh" p "tdh"
+"tbh" p "tbh"
+% pa
+"p" p "p"
+"ph" p "ph"
+"b" p "b"
+"bh" p "bh"
+"m" p "m"
+% yaraladikaaL
+"y" p "y"
+"r" p "r"
+"l" p "l"
+"v" p "v"
+"S" p "sh"
+"sh" p "S"
+"s" p "s"
+"h" p "h"
+"R" p "R"
+"zh" p "zh"
+"L" p "L"
+"TT" p "RR"
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.c b/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.c
new file mode 100644
index 00000000000..909898a01ab
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.c
@@ -0,0 +1,699 @@
+/*+
+
+TITLE: AVLtree.c general purpose balanced trees.
+
+DESCRIPTION:
+ General purpose binairy-tree functions. This package uses AVL-trees
+ to ensure proper balancing. (The heigth of the tree will never exceed
+ ceil(1.44 * lg(n)), where lg is the logarithm base 2 and n the number
+ of elements.) This package can be used to store any kind of data in a
+ binairy tree. The only thing you have to do is to include AVLtree.h,
+ link AVLtree.lib and call the appropriate functions. You should also
+ provide a function to compare elements, and to free the memory used
+ by elements.
+
+USAGE:
+ To use the AVLtree package, include the file AVLtree.h in your
+ program. A root of a binairy tree can then be declared as follows:
+
+ AVLtree *a_binairy_tree;
+
+ The following operations are defined for Binairy trees:
+
+ -- Insert an element in the tree
+ -- Delete an element in the tree
+ -- Find an element in the tree
+ -- Traverse the tree
+
+ These operations are described below. You should always change the
+ AVLtree structure by these functions. Don't go jamming in its
+ structure yourself: it's delicate.
+
+FUNCTIONS:
+ Inserting an element:
+ Use the function AVLinsert() to insert an element. Its
+ prototype is:
+
+ int AVLinsert(const void *element,
+ AVLtree **root,
+ int (*cmp)(void*, void*));
+
+ element is a pointer to the element you want to insert in the
+ tree. Since it is this pointer that is actually stored in the
+ AVL-tree, you should not touch the space it is pointing at
+ after its insertion in the tree.
+ root is a pointer to a pointer to the root node of the tree.
+ A double reference is needed, since the root can change.
+ cmp() is a user defined function. It should compare two
+ elements and return 0 if the elements are equal, 1 if the first
+ element is 'bigger' than the second, and -1 if the first
+ element is 'smaller' than the second.
+
+ The function will return one of the following codes:
+
+ -- AVL_OK everything is alright.
+ -- AVL_DUP attempt to insert element already present.
+ -- AVL_NO_MEM no memory could be allocated.
+ -- AVL_ERROR called with incorrect parameters.
+
+ Deleting an element:
+ Use the function AVLdelete() to delete an element from the
+ tree. Its prototype is:
+
+ int AVLdelete(const void *element,
+ AVLtree **root,
+ int (*cmp)(void*, void*),
+ void (*del)(void*));
+
+ element is the element to be deleted from the tree.
+ root and cmp() are the same as in AVLinsert(). del() is a user
+ defined function that should free the memory occupied by the
+ element in the tree. It is passed a pointer to the element to
+ be deleted.
+
+ The function will return one of the following codes:
+
+ -- AVL_OK everything is alright.
+ -- AVL_NO_DEL attemp to delete non-existant element.
+ -- AVL_ERROR called with incorrect parameters.
+
+ Finding an element:
+ To find an element, the function AVLfind() should be used. Its
+ prototype is:
+
+ void *AVLfind(const void *element,
+ AVLtree *root,
+ int (*cmp)(void*, void*));
+
+ element is the element to be found, root is a pointer the the
+ root node of the tree. cmp() is the same as in AVLinsert().
+
+ The function will return a pointer to the found element, or
+ NULL if the element could not be found.
+
+ Traversing the tree:
+ The tree can be traversed in three ways:
+
+ -- preorder AVLpreorder()
+ -- inorder AVLinorder()
+ -- postorder AVLpostorder()
+
+ Inorder traversal will yield all elements in their correct
+ order.
+
+ The prototypes are:
+
+ void AVLpreorder(AVLtree *root, void (*func)(void*));
+ void AVLinorder(AVLtree *root,void (*func)(void*));
+ void AVLpostorder(AVLtree *root,void (*func)(void*));
+
+ root is a pointer to the tree to be traversed, and
+ func() is a user defined function that will be called at
+ every node. This could do something with that element, like
+ printing it.
+
+ These functions return nothing.
+
+DOCUMENTATION:
+ Robert L. Kruse, "Data Structures and Program Design" (2nd Ed.)
+ pp. 344-356.
+
+AUTHOR:
+ Jeroen Hellingman, 't Zand 2, 4133TB Vianen, the Netherlands.
+
+COPYRIGHT:
+ Copyright (c) Jeroen Hellingman 1990.
+ License is granted for any non-commercially and non-millitary use
+ of this package, provided that this notice is kept intact. Use of
+ this software in any product that is sold for profit or usage by
+ (semi-)militairy organisations is forbidden. (contact me for
+ commercial usage) Donations are always appreciated (postbank
+ giro 5025409).
+
+CAVEAT:
+ I can take no responseability whatsoever if this software
+ is malfunctioning. If you find any bug in it, please fix it and
+ notice me. If you can't fix it, you can also notice me, I might
+ try to fix it.
+
+HISTORY
+ 18-DEC-1992 last edit
+ 04-NOV-1992 declared static functions static in prototype too.
+ gcc seems to complain about this (JH)
+ 01-DEC-1989 creation (Jeroen Hellingman)
+
+-*/
+
+/* #define TEST */
+
+#include "avltree.h"
+#include <stdlib.h>
+#include <stddef.h>
+#include <stdio.h>
+
+#define TRUE 1
+#define FALSE 0
+
+#define EQUAL 0
+#define LEFT 1
+#define RIGHT 2
+
+/* ANSI C prototypes */
+
+static int insert(const void *element, AVLtree **root,
+ int (*cmp)(void*, void*), int *taller);
+static int delete(const void *element, AVLtree **root,
+ int (*cmp)(void*, void*), void (*del)(void*), int *shorter);
+static void left_balance(AVLtree **root);
+static void right_balance(AVLtree **root);
+static void left_rebalance(AVLtree **root, int *shorter);
+static void right_rebalance(AVLtree **root, int *shorter);
+static void left_rotate(AVLtree **root);
+static void right_rotate(AVLtree **root);
+static void error(int errno);
+
+/* add element to AVL-tree */
+
+int AVLinsert(const void *element,AVLtree **root,int (*cmp)(void*, void*))
+{ int taller = FALSE;
+
+ if(element == NULL) return AVL_ERROR;
+ return insert(element, root, cmp, &taller);
+}
+
+int AVLdelete(const void *element,AVLtree **root,int (*cmp)(void*, void*),
+ void (*del)(void *))
+{ int shorter = FALSE;
+
+ if(element == NULL) return AVL_ERROR;
+ return delete(element, root, cmp, del, &shorter);
+}
+
+static int insert(const void *element, AVLtree **root,
+ int (*cmp)(void*, void*), int *taller)
+{ int result;
+ int tallersubtree = FALSE;
+ AVLtree *subtree; /* needed since you can't do & on a struct member */
+
+ if(*root == NULL) /* then adding is really easy */
+ { *root = (AVLtree *) malloc(sizeof(AVLtree));
+ if(*root == NULL) return AVL_NO_MEM;
+ (*root)->element = element;
+ (*root)->balance = EQUAL;
+ (*root)->left = NULL;
+ (*root)->right = NULL;
+ *taller = TRUE;
+ result = AVL_OK;
+ }
+ else /* recursively insert in appropriate subtree */
+ { int compare = (*cmp)(element,(*root)->element);
+
+ if(compare == 0) return AVL_DUP;
+ else if(compare < 0)
+ { subtree = (*root)->left;
+ result = insert(element,&subtree,cmp,&tallersubtree);
+ (*root)->left = subtree;
+ if(tallersubtree)
+ switch((*root)->balance)
+ { case LEFT: left_balance(root);
+ *taller = FALSE;
+ break;
+ case EQUAL: (*root)->balance = LEFT;
+ *taller = TRUE;
+ break;
+ case RIGHT: (*root)->balance = EQUAL;
+ *taller = FALSE;
+ }
+ else *taller = FALSE;
+ }
+ else
+ { subtree = (*root)->right;
+ result = insert(element,&subtree,cmp,&tallersubtree);
+ (*root)->right = subtree;
+ if(tallersubtree)
+ switch((*root)->balance)
+ { case RIGHT: right_balance(root);
+ *taller = FALSE;
+ break;
+ case EQUAL: (*root)->balance = RIGHT;
+ *taller = TRUE;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ *taller = FALSE;
+ }
+ else *taller = FALSE;
+ }
+ }
+ return result;
+} /* end of insert() */
+
+static int delete(const void *element, AVLtree **root,
+ int (*cmp)(void*, void*), void (*del)(void*), int *shorter)
+{ int result;
+ int compare;
+ int shortersubtree = FALSE;
+ AVLtree *subtree;
+
+ if(root == NULL) return AVL_ERROR;
+ if((*root) == NULL) return AVL_NO_DEL;
+ if((*root)->element == NULL) error(6); /* DEBUG */
+ compare = (*cmp)(element,(*root)->element);
+
+ if(compare == 0)
+ {
+ /* check: two children? */
+ if((*root)->left != NULL && (*root)->right != NULL)
+ { AVLtree *pred;
+ void *tmp;
+
+ /* find immediate predecessor */
+ pred = (*root)->left;
+ while(pred->right != NULL) pred = pred->right;
+
+ /* swap element to be deleted with its immediate predecessor */
+ tmp = (*root)->element;
+ (*root)->element = pred->element;
+ pred->element = tmp;
+
+ /* delete predecessor from left subtree */
+ subtree = (*root)->left;
+ result = delete(element,&subtree,cmp,del,&shortersubtree);
+ (*root)->left = subtree;
+
+ /* rebalance tree */
+ if(shortersubtree)
+ switch((*root)->balance)
+ { case RIGHT: right_rebalance(root,shorter);
+ break;
+ case EQUAL: (*root)->balance = RIGHT;
+ *shorter = FALSE;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ *shorter = TRUE;
+ }
+
+ }
+ else
+ { /* user must delete his element */
+
+ (*del)((*root)->element);
+ /* delete node */
+ subtree = ((*root)->left == NULL) ? (*root)->right : (*root)->left;
+ free(*root);
+ *root = subtree;
+ *shorter = TRUE;
+ result = AVL_OK;
+ }
+ }
+ else if(compare < 0) /* delete from left subtree */
+ { subtree = (*root)->left;
+ result = delete(element, &subtree, cmp, del, &shortersubtree);
+ (*root)->left = subtree;
+
+ /* rebalance tree */
+ if(shortersubtree)
+ switch((*root)->balance)
+ { case RIGHT: right_rebalance(root,shorter);
+ break;
+ case EQUAL: (*root)->balance = RIGHT;
+ *shorter = FALSE;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ *shorter = TRUE;
+ }
+ }
+ else /* delete from right subtree */
+ { subtree = (*root)->right;
+ result = delete(element, &subtree, cmp, del, &shortersubtree);
+ (*root)->right = subtree;
+
+ /* rebalance tree */
+ if(shortersubtree)
+ switch((*root)->balance)
+ { case LEFT: left_rebalance(root,shorter);
+ break;
+ case EQUAL: (*root)->balance = LEFT;
+ *shorter = FALSE;
+ break;
+ case RIGHT: (*root)->balance = EQUAL;
+ *shorter = TRUE;
+ }
+ }
+ return result;
+} /* end of delete() */
+
+static void right_rebalance(AVLtree **root, int *shorter)
+{ AVLtree *rightsub, *leftsubsub;
+
+ if(root == NULL) error(7);
+ if(*root == NULL) error(8);
+ if((*root)->right == NULL) error(9); /* DEBUG */
+
+ rightsub = (*root)->right;
+ switch(rightsub->balance)
+ { case EQUAL: (*root)->balance = RIGHT;
+ rightsub->balance = LEFT;
+ left_rotate(root);
+ *shorter = FALSE;
+ break;
+ case RIGHT: (*root)->balance = EQUAL;
+ rightsub->balance = EQUAL;
+ left_rotate(root);
+ *shorter = TRUE;
+ break;
+ case LEFT: leftsubsub = rightsub->left;
+ switch(leftsubsub->balance)
+ { case EQUAL: (*root)->balance = EQUAL;
+ rightsub->balance = EQUAL;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ rightsub->balance = RIGHT;
+ break;
+ case RIGHT: (*root)->balance = LEFT;
+ rightsub->balance = EQUAL;
+ }
+ leftsubsub->balance = EQUAL;
+ right_rotate(&rightsub);
+ (*root)->right = rightsub;
+ left_rotate(root);
+ *shorter = TRUE;
+ }
+} /* end of right_rebalance() */
+
+static void left_rebalance(AVLtree **root, int *shorter)
+{ AVLtree *leftsub, *rightsubsub;
+
+ if(root == NULL) error(10);
+ if(*root == NULL) error(11);
+ if((*root)->left == NULL) error(12); /* DEBUG */
+
+ leftsub = (*root)->left;
+ switch(leftsub->balance)
+ { case EQUAL: (*root)->balance = LEFT;
+ leftsub->balance = RIGHT;
+ right_rotate(root);
+ *shorter = FALSE;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ leftsub->balance = EQUAL;
+ right_rotate(root);
+ *shorter = TRUE;
+ break;
+ case RIGHT: rightsubsub = leftsub->right;
+ switch(rightsubsub->balance)
+ { case EQUAL: (*root)->balance = EQUAL;
+ leftsub->balance = EQUAL;
+ break;
+ case RIGHT: (*root)->balance = EQUAL;
+ leftsub->balance = LEFT;
+ break;
+ case LEFT: (*root)->balance = RIGHT;
+ leftsub->balance = EQUAL;
+ }
+ rightsubsub->balance = EQUAL;
+ left_rotate(&leftsub);
+ (*root)->left = leftsub;
+ right_rotate(root);
+ *shorter = TRUE;
+ }
+} /* end of left_rebalance() */
+
+void *AVLfind(const void *element,AVLtree *root,int (*cmp)(void*, void*))
+{ int compare;
+
+ if(root == NULL) return NULL;
+ compare = (*cmp)(element,root->element);
+ if(compare == 0) return root->element;
+ else if(compare < 0)
+ return AVLfind(element,root->left,cmp);
+ else
+ return AVLfind(element,root->right,cmp);
+}
+
+static void left_balance(AVLtree **root)
+{ AVLtree *leftsub, *rightsubsub;
+
+ leftsub = (*root)->left;
+ switch(leftsub->balance)
+ { case LEFT: (*root)->balance = EQUAL;
+ leftsub->balance = EQUAL;
+ right_rotate(root);
+ break;
+ case RIGHT: rightsubsub = leftsub->right;
+ switch(rightsubsub->balance)
+ { case EQUAL: (*root)->balance = EQUAL;
+ leftsub->balance = EQUAL;
+ break;
+ case RIGHT: (*root)->balance = EQUAL;
+ leftsub->balance = LEFT;
+ break;
+ case LEFT: (*root)->balance = RIGHT;
+ leftsub->balance = EQUAL;
+ }
+ rightsubsub->balance = EQUAL;
+ left_rotate(&leftsub);
+ (*root)->left = leftsub;
+ right_rotate(root);
+ }
+} /* end of left_balance() */
+
+static void right_balance(AVLtree **root)
+{ AVLtree *rightsub, *leftsubsub;
+
+ rightsub = (*root)->right;
+ switch(rightsub->balance)
+ { case RIGHT: (*root)->balance = EQUAL;
+ rightsub->balance = EQUAL;
+ left_rotate(root);
+ break;
+ case LEFT: leftsubsub = rightsub->left;
+ switch(leftsubsub->balance)
+ { case EQUAL: (*root)->balance = EQUAL;
+ rightsub->balance = EQUAL;
+ break;
+ case LEFT: (*root)->balance = EQUAL;
+ rightsub->balance = RIGHT;
+ break;
+ case RIGHT: (*root)->balance = LEFT;
+ rightsub->balance = EQUAL;
+ }
+ leftsubsub->balance = EQUAL;
+ right_rotate(&rightsub);
+ (*root)->right = rightsub;
+ left_rotate(root);
+ }
+} /* end of right_balance() */
+
+static void left_rotate(AVLtree **root)
+{
+ if(*root == NULL) error(1);
+ else if((*root)->right == NULL) error(2);
+ else
+ { AVLtree *temp;
+
+ temp = (*root)->right;
+ (*root)->right = temp->left;
+ temp->left = *root;
+ *root = temp;
+ }
+}
+
+static void right_rotate(AVLtree **root)
+{
+ if(*root == NULL) error(3);
+ else if((*root)->left == NULL) error(5);
+ else
+ { AVLtree *temp;
+
+ temp = (*root)->left;
+ (*root)->left = temp->right;
+ temp->right = *root;
+ *root = temp;
+ }
+}
+
+void AVLinorder(AVLtree *root, void (*func)(void*))
+{
+ if(root == NULL) return;
+
+ AVLinorder(root->left, func);
+ (*func)(root->element);
+ AVLinorder(root->right, func);
+}
+
+void AVLpreorder(AVLtree *root, void (*func)(void*))
+{
+ if(root == NULL) return;
+
+ AVLpreorder(root->left, func);
+ AVLpreorder(root->right, func);
+ (*func)(root->element);
+}
+
+void AVLpostorder(AVLtree *root, void (*func)(void*))
+{
+ if(root == NULL) return;
+
+ (*func)(root->element);
+ AVLpostorder(root->left, func);
+ AVLpostorder(root->right, func);
+}
+
+
+static void error(int errno)
+{ fprintf(stderr,"AVLtree package error # %d\n",errno);
+ exit(1);
+}
+
+
+#ifdef TEST
+
+#include <string.h>
+
+#define MAXN 1000
+#define BUFSIZE 512
+
+int fgetline(char *buf, FILE *input);
+int cmp(void*, void*);
+void del(void *p1);
+void show_element(void *element);
+int AVLcheck(AVLtree *root);
+void AVLshowtree(AVLtree *root, void (*func)(void*), int depth);
+
+void AVLshowtree(AVLtree *root, void (*func)(void*), int depth)
+{
+ if(root == NULL) return;
+
+ printf(" [%d](%d) ",root->balance, depth);
+ (*func)(root->element);
+ AVLshowtree(root->left, func, depth+1);
+ AVLshowtree(root->right, func, depth+1);
+}
+
+/* naive compare using strcmp() (ASCII order) */
+
+int cmp(void *p1, void *p2)
+{ return strcmp(p1, p2);
+}
+
+/* routine to delete an element */
+
+void del(void *p1)
+{ free(p1);
+}
+
+/* simple routine to show a node */
+
+void show_element(void *element)
+{ printf("%s\n",element);
+}
+
+void main()
+{ AVLtree *root = NULL;
+ char buf[BUFSIZE];
+ int n = 0, length;
+ char *p;
+
+
+ fprintf(stdout,"testing routine for B-tree package\n");
+ fprintf(stdout,"just read lines from input, put them in the\n");
+ fprintf(stdout,"tree, then traverse the tree in order to\n");
+ fprintf(stdout,"show the lines sorted (stop with '-') \n");
+
+ while(TRUE)
+ { length = fgetline(buf, stdin);
+ if(buf[0] == '-') break;
+ if(length != 0)
+ { if(n == MAXN)
+ { fprintf(stderr, "Too many strings\n");
+ exit(1);
+ }
+ p = malloc(length+1);
+ if(p == NULL)
+ { fprintf(stderr, "Out of memory\n");
+ exit(2);
+ }
+ strcpy(p, buf);
+ if(AVLinsert(p,&root,cmp) != AVL_OK)
+ { fprintf(stderr, "Insertion error\n");
+ }
+ AVLcheck(root);
+ ++n;
+ }
+ if(feof(stdin)) break;
+ }
+
+ /* check tree */
+ AVLcheck(root);
+ /* now try to delete some elements */
+
+ while(TRUE)
+ { length = fgetline(buf, stdin);
+ if(length != 0)
+ { if(n == MAXN)
+ { fprintf(stderr, "Too many strings\n");
+ exit(1);
+ }
+ p = malloc(length+1);
+ if(p == NULL)
+ { fprintf(stderr, "Out of memory\n");
+ exit(2);
+ }
+ strcpy(p, buf);
+ if(AVLdelete(p,&root,cmp,del) != AVL_OK)
+ { fprintf(stderr, "Deletion error\n");
+ }
+ AVLcheck(root);
+ ++n;
+ }
+ if(feof(stdin)) break;
+ }
+
+ AVLshowtree(root,show_element, 1);
+
+ exit(0);
+}
+
+int fgetline(char *buf, FILE *input)
+{ int i = 0, tmp;
+
+ while((tmp = getc(input)) != EOF)
+ { buf[i] = (char)tmp;
+ if(buf[i] == '\n')
+ { buf[i] = '\0';
+ return i;
+ }
+ else
+ { i++;
+ if(i >= BUFSIZE)
+ { fprintf(stderr, "line too long\n");
+ exit(4);
+ }
+ }
+ }
+ buf[i] = '\0';
+ return i;
+}
+
+int AVLcheck(AVLtree *root)
+{ int lh, rh;
+
+ if(root == NULL) return 0;
+
+ lh = AVLcheck(root->left);
+ rh = AVLcheck(root->right);
+
+ if(lh == rh && root->balance != EQUAL)
+ printf("improper balance EQUAL\n");
+ if(lh - rh == 1 && root->balance != LEFT)
+ printf("improper balance LEFT\n");
+ if(lh - rh == -1 && root->balance != RIGHT)
+ printf("improper balance RIGHT\n");
+ if(lh - rh > 1 || lh - rh < -1) printf("Not an AVL-tree\n");
+
+ return (lh < rh ? rh : lh) + 1;
+}
+
+#endif /* TESTing part */
+
+/* end of AVLtree.c */ \ No newline at end of file
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.h b/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.h
new file mode 100644
index 00000000000..fc4cee88bc9
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/avltree.h
@@ -0,0 +1,44 @@
+/*+
+ AVLtree.h header file for generic binairy-tree package
+
+ (c) Jeroen Hellingman, 1 dec 1989.
+
+-*/
+
+#ifndef AVLTREE_HEADER_READ
+#define AVLTREE_HEADER_READ
+
+/* return values */
+
+#define AVL_OK 0
+#define AVL_ERROR 1
+#define AVL_NO_MEM 2
+#define AVL_DUP 3
+#define AVL_NO_DEL 4
+
+/* AVLtree structure */
+
+typedef struct AVLtree AVLtree;
+
+struct AVLtree
+{ void *element;
+ char balance;
+ AVLtree *left;
+ AVLtree *right;
+};
+
+/* ANSI C prototypes */
+
+int AVLinsert(const void *element,AVLtree **root,int (*cmp)(void*, void*));
+int AVLdelete(const void *element,AVLtree **root,int (*cmp)(void*, void*),void (*del)(void*));
+
+void *AVLfind(const void *element,AVLtree *root,int (*cmp)(void*, void*));
+
+/* traversal routines */
+
+void AVLpreorder(AVLtree *root, void (*func)(void*));
+void AVLinorder(AVLtree *root,void (*func)(void*));
+void AVLpostorder(AVLtree *root,void (*func)(void*));
+
+#endif
+/* end of AVLtree.h */
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/makefile b/Master/texmf-dist/source/fonts/malayalam/preproc/makefile
new file mode 100644
index 00000000000..762f65196f7
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/makefile
@@ -0,0 +1,18 @@
+# compiler
+CC = c:/emx/bin/gcc
+# include directory
+INCLUDE =-Ic:/emx/include
+
+objects = mm.o readfile.o trs.o scr.o pstree.o avltree.o
+
+mm.exe: $(objects)
+ $(CC) -o mm.exe $(objects)
+
+# file dependencies:
+mm.o : mm.h trs.h scr.h readfile.h
+readfile.o : readfile.h
+trs.o : trs.h readfile.h mm.h
+scr.o : scr.h readfile.h mm.h
+pstree.o : pstree.h
+avltree.o : avltree.h
+# end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/ml.bat b/Master/texmf-dist/source/fonts/malayalam/preproc/ml.bat
new file mode 100644
index 00000000000..03e0537efc4
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/ml.bat
@@ -0,0 +1,4 @@
+echo process TeX file for Malayalam traditional script
+patc -v -p c:\malyalam\mmfont\preproc\mm.pat $1 mm.tmp
+mm -v -t c:\malyalam\mmfont\preproc\mm.trs -s c:\malyalam\mmfont\preproc\mm.scr mm.tmp $2
+del mm.tmp
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/ml.g b/Master/texmf-dist/source/fonts/malayalam/preproc/ml.g
new file mode 100644
index 00000000000..7e60fbea579
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/ml.g
@@ -0,0 +1,4 @@
+echo process TeX file for Malayalam traditional script
+patc -v -p d:\doc\malyalam\mmfont\preproc\mm.pat $1 mm.tmp
+mm -v -t mm -s mm mm.tmp $2
+rm mm.tmp
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.bat b/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.bat
new file mode 100644
index 00000000000..19618c01188
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.bat
@@ -0,0 +1,4 @@
+echo process TeX file for Malayalam reformed script
+patc -v -p c:\malyalam\mmfont\preproc\mm.pat $1 mm.tmp
+mm -v -t c:\malyalam\mmfont\preproc\mmr.trs -s c:\malyalam\mmfont\preproc\mmr.scr mm.tmp $2
+del mm.tmp
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.g b/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.g
new file mode 100644
index 00000000000..65ca4b51902
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mlr.g
@@ -0,0 +1,4 @@
+echo process TeX file for Malayalam reformed script
+patc -v -p d:\doc\malyalam\mmfont\preproc\mm.pat $1 mm.tmp
+mm -v -t mmr.trs -s mmr.scr mm.tmp $2
+rm mm.tmp
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mltr.g b/Master/texmf-dist/source/fonts/malayalam/preproc/mltr.g
new file mode 100644
index 00000000000..84605cfea44
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mltr.g
@@ -0,0 +1,6 @@
+echo process TeX file for Malayalam reformed and traditional script
+patc -v -p d:\doc\malyalam\mmfont\preproc\mm.pat $1 mm.tmp
+mm -v -t mmr.trs -s mmr.scr mm.tmp mm2.tmp
+rm mm.tmp
+mm -v -t mm -s mm mm2.tmp $2
+rm mm2.tmp
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mltrth.g b/Master/texmf-dist/source/fonts/malayalam/preproc/mltrth.g
new file mode 100644
index 00000000000..e8eee14080a
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mltrth.g
@@ -0,0 +1,14 @@
+echo process TeX file for Malayalam/Tamil/Devanagari
+patc -v -p d:\doc\malyalam\mmfont\preproc\mm.pat $1 mm1.tmp
+mm -v -t mm -s mm mm1.tmp mm2.tmp
+rm mm1.tmp
+mm -v -t mmr.trs -s mmr.scr mm2.tmp mm3.tmp
+rm mm2.tmp
+patc -v -p d:\doc\malyalam\mmfont\tamil\tamil.pat mm3.tmp mm4.tmp
+rm mm3.tmp
+patc -v -p d:\doc\malyalam\mmfont\dng\dng.pat mm4.tmp mm5.tmp
+rm mm4.tmp
+echo devnag mm5.tmp $2
+devnag mm5.tmp $2
+rm mm5.tmp
+echo well, that's done...
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.c b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.c
new file mode 100644
index 00000000000..5e8fb4a06cf
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.c
@@ -0,0 +1,819 @@
+#define VERSION "mm v1.0 (c) Jeroen Hellingman 26-APR-1993\n"
+
+/*
+ mm -- convert malayalam text in transcription into input for TeX
+
+USAGE:
+ mm {-q|-v|-V|-h} [-t transfile][-s scriptfile] infile [outfile]
+ -q quiet mode (default)
+ -v verbose mode
+ -V very verbose mode
+ -h print help
+ -t read transcription from transfile (default mm.trs)
+ -s read script information from scriptfile (default mm.scr)
+
+HISTORY:
+ 26-APR-1993 changed directory structure of source files (JH)
+ 25-DEC-1992 Move to version 1.0
+ removed coded that placed reepham when Ra occurs
+ initially (JH).
+ 24-DEC-1992 added support for environment variable. (JH)
+ added -h option to print help. (JH)
+ program will now add default file-suffixes if not given
+ on command line. (JH)
+ program will only `pun out' if very verbose option is given. (JH)
+ 08-OCT-1992 added support for at{end|begin}syllabe (JH)
+ 22-JUL-1992 removed bug causing endless loop outputting virama (JH)
+ 21-JUL-1992 added support for reepham (JH)
+ 28-JUN-1992 Genesis (Jeroen Hellingman)
+
+*/
+
+/*
+
+ functional organisation
+
+ main:
+ command line arguments
+ read tables
+
+ start in normal mode
+ switch mode when begin malayalam text is encountered
+
+ convert mode:
+ read letters from file
+ build syllabes
+ convert syllabes
+ output result
+
+*/
+
+/***********************************************************************/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <assert.h>
+
+#include "mm.h"
+#include "trs.h"
+#include "scr.h"
+#include "readfile.h"
+
+#define ATARI_ST /* machine type, can be ATARI_ST, MS_DOS, UNIX */
+
+#define TRUE (1==1)
+#define FALSE (1==0)
+
+#if defined(ATARI_ST) || defined(MS_DOS)
+#define DIRSEPARATOR_CHAR '\\'
+#define DIRSEPARATOR_STRING "\\"
+#define MMDIR "D:\\doc\\malyalam\\mmfont\\preproc\\" /* place where .trs and .scr are (overruled by env. var. MMDIR) */
+#else /* UNIX */
+#define DIRSEPARATOR_CHAR '/'
+#define DIRSEPARATOR_STRING "/"
+#define MMDIR "/bin" /* place where .trs and .scr are (overruled by env. var. MMDIR) */
+#endif
+
+#define NUMPATS 10 /* number of pattern trees */
+#define PATLEN 50 /* maximum length of pattern */
+/* #define BUFSIZE 512 pushback buffer size (BUFSIZE >= PATLEN) */
+#define SYLLABESIZE 20 /* maximum size of syllabe */
+
+/* data types */
+
+/***********************************************************************/
+
+/* prototypes */
+
+void defaultloop(void);
+void malayalamloop(void);
+
+void put_malayalam_letter(char);
+void put_malayalam_syllabe(void);
+void put_syllabe(char *s);
+prebuild_char *find_cluster(char *s);
+glyph_pair *find_ra(char **t);
+glyph_pair *find_sec_cons(char *s, int r);
+glyph_pair *find_vowel(char *s);
+void use_virama(char *s, glyph_pair **primary_ra);
+
+void processflags(int argc, char** argv);
+static char *name_suffix(char* name, char *suffix);
+static char *force_suffix(char* name, char *suffix);
+void usage(void);
+void help(void);
+void copytexcommand(void);
+void skiptexcommand(void);
+void copycomment(void);
+void skipcomment(void);
+int readchar(void);
+void unreadchar(int);
+int what_escape(const char *s, char *result);
+void inittables(void);
+
+/***********************************************************************/
+
+/* globals */
+
+FILE *infile;
+FILE *outfile;
+char *progname = "mm";
+char *insuffix = "mm";
+char *outsuffix = "tex";
+char *trssuffix = "trs";
+char *scrsuffix = "scr";
+char *trsfilename = "mmr.trs"; /* file containing transcription information */
+char *scrfilename = "mmr.scr"; /* file containing script information */
+char *infilename = NULL;
+char *outfilename = NULL;
+char *home = MMDIR; /* home directory (defined above) */
+char *mmdir = "MMDIR"; /* name of env. var. for home directory */
+int quiet = FALSE; /* don't be quiet */
+int very_verbose = FALSE;
+int verbose = FALSE; /* don't be verbose */
+static int debug = FALSE; /* don't debug */
+static int linenumber = 1; /* current line in infile */
+
+PSTree *normal=NULL; /* default patterns */
+trs_table *trs=NULL; /* patterns for transcription */
+scr_table *scr = NULL; /* script definition */
+
+/* some extra globals */
+
+typedef enum { ACCEPT, FLUSH } state;
+
+char syllabe[SYLLABESIZE];
+int syl_len = 0;
+state syllabe_state = ACCEPT;
+
+typedef enum
+{ UNDEF, VOWEL, CONS, VSIGN, DIGIT, OTHER, VIRAM,
+ BLANK, JOIN, NJOIN
+} char_type_enum;
+
+char_type_enum char_type[128] =
+{ UNDEF, UNDEF, OTHER, OTHER, UNDEF, VOWEL, VOWEL, VOWEL,
+ VOWEL, VOWEL, VOWEL, VOWEL, VOWEL, UNDEF, VOWEL, VOWEL,
+ VOWEL, UNDEF, VOWEL, VOWEL, VOWEL, CONS, CONS, CONS,
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,
+ CONS, UNDEF, CONS, CONS, CONS, CONS, CONS, CONS,
+ CONS, CONS, CONS, CONS, CONS, CONS, CONS, CONS,
+ CONS, CONS, UNDEF, UNDEF, UNDEF, UNDEF, VSIGN, VSIGN,
+ VSIGN, VSIGN, VSIGN, VSIGN, VSIGN, UNDEF, VSIGN, VSIGN,
+ VSIGN, UNDEF, VSIGN, VSIGN, VSIGN, VIRAM, UNDEF, UNDEF,
+ UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, OTHER,
+ UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF,
+ VOWEL, VOWEL, UNDEF, UNDEF, UNDEF, UNDEF, DIGIT, DIGIT,
+ DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT, DIGIT,
+ UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF, UNDEF,
+ UNDEF, UNDEF, UNDEF, UNDEF, BLANK, OTHER, NJOIN, JOIN,
+};
+
+/***********************************************************************/
+
+void PUSHBACK(char *c)
+/* push the characters in string c back into the inputstream, works
+ * with the pair of functions readchar() and unreadchar()
+ */
+{ int i = (int)strlen(c)-1;
+ for( ;i >= 0; i--) unreadchar((int)c[i]);
+}
+
+/***********************************************************************/
+
+void main(int argc, char** argv)
+/* check arguments, intialize tables, open files
+ */
+{ char *tmp;
+ tmp = getenv(mmdir);
+ if(tmp != NULL) home = tmp;
+
+ processflags(argc, argv);
+ if(verbose) fputs(VERSION, stderr);
+
+ inittables();
+
+ if(verbose) printf("reading from %s\n", infilename);
+ infile = fopen(infilename, "r");
+ if(infile==NULL)
+ { fprintf(stderr, "%s: can't open %s\n", progname, infilename);
+ exit(2);
+ }
+ if(verbose) printf("writing to %s\n", outfilename);
+ outfile = fopen(outfilename, "w");
+ if(outfile==NULL)
+ { fprintf(stderr, "%s: can't create %s\n", progname, outfilename);
+ exit(2);
+ }
+
+ defaultloop();
+ fclose(infile);
+ fclose(outfile);
+ if(verbose) printf("done\n");
+ exit(0);
+}
+
+void processflags(int argc, char** argv)
+{ int nextoption = FALSE;
+ int i = 1;
+
+ if(argc < i+1) usage();
+ if(argv[i][0] == '-') nextoption = TRUE;
+
+ while(nextoption)
+ { switch(argv[i][1])
+ { case 'V': very_verbose = TRUE;
+ case 'v': verbose = TRUE; break;
+ case 'q': quiet = TRUE; break;
+ case 'h': help();
+ case 'D': debug = TRUE; break;
+ case 't': trsfilename = name_suffix(argv[i+1], trssuffix); i++; break;
+ case 's': scrfilename = name_suffix(argv[i+1], scrsuffix); i++; break;
+ default: usage();
+ }
+ i++;
+ if(argc < i+1) usage();
+ if(argv[i][0] != '-') nextoption = FALSE;
+ }
+ infilename = name_suffix(argv[i], insuffix);
+ if(argc < i+2)
+ { outfilename = force_suffix(argv[i], outsuffix);
+ }
+ else
+ outfilename = name_suffix(argv[i+1], outsuffix);
+}
+
+/* add suffix to name if none given */
+
+static char *name_suffix(char* name, char *suffix)
+{ long i, len = strlen(name);
+ char *result;
+
+ /* seek for dot, if found return name */
+ for(i=0; i<len; i++) if(name[i] == '.') return name;
+ /* otherwise add suffix */
+
+ result = malloc(len+5);
+ assert(result != NULL);
+ strcpy(result, name);
+ result[len] = '.';
+ result[++len] = suffix[0];
+ result[++len] = suffix[1];
+ result[++len] = suffix[2];
+ result[++len] = '\0';
+ return result;
+}
+
+/* add suffix, remove orginal suffix if given */
+
+static char *force_suffix(char* name, char *suffix)
+{ long i, len = strlen(name);
+ char *result;
+
+ /* seek for dot, if found break */
+ for(i=0; i<len; i++) if(name[i] == '.') break;
+
+ result = malloc(len+5);
+ assert(result != NULL);
+ strcpy(result, name);
+ result[i] = '.';
+ result[++i] = suffix[0];
+ result[++i] = suffix[1];
+ result[++i] = suffix[2];
+ result[++i] = '\0';
+ return result;
+}
+
+/* place the home directory name in front of the file name */
+
+char *prepend_home(char *filename)
+{ long len1, len2;
+ char *result;
+ if(home == NULL) return filename;
+ len1 = strlen(home);
+ len2 = strlen(filename);
+ result = malloc(len1+len2+2);
+ assert(result != NULL);
+ strcpy(result, home);
+ if(home[len1-1] != DIRSEPARATOR_CHAR) /* add backslash if not already there */
+ strcat(result, DIRSEPARATOR_STRING);
+ strcat(result, filename);
+ return result;
+}
+
+void usage()
+{ fprintf(stderr, "usage: %s {-q|-v|-V|-h} [-t transfile][-s scriptfile] infile [outfile]\n", progname);
+ fprintf(stderr, "(%s -h will print a help message)\n", progname);
+ exit(1);
+}
+
+void help()
+{ char *s;
+ puts(VERSION);
+ printf("usage: %s {-q|-v|-V|-h} [-t transfile][-s scriptfile] infile [outfile]\n", progname);
+ printf("\noptions:\n");
+ printf(" -q quiet mode (default)\n");
+ printf(" -v verbose mode\n");
+ printf(" -V very verbose mode\n");
+ printf(" -h print help\n");
+ printf(" -t read transcription from transfile (default mmr.trs)\n");
+ printf(" -s read script information from scriptfile (default mmr.scr)\n");
+ printf("\ndefault file extensions:\n");
+ printf(" transfile: .trs\n");
+ printf(" scriptfile: .scr\n");
+ printf(" infile: .mm\n");
+ printf(" outfile: .tex\n");
+ printf("\nthe environment variable %s tells %s where to look for transfile\nand scriptfile.\n", mmdir, progname);
+ printf(" %s is currently ", mmdir);
+ if((s=getenv(mmdir)) == NULL)
+ printf("not set\n\n");
+ else
+ printf("set to %s\n\n", s);
+ exit(0);
+}
+
+/***********************************************************************/
+
+void inittables()
+{ long len;
+ char *act;
+ string_list *next;
+
+ trs = read_trs(trsfilename);
+ scr = read_scr(scrfilename);
+
+ /* insert trs->atend with action scr->atend in trs->p patterntree */
+ len = strlen(scr->atend) + 1; act = malloc(len);
+ if(act==NULL){fprintf(stderr, "can't allocate\n");exit(0);}
+ act[0] = 'M'; /* action: switch to Malayalam script */
+ act[1] = '\0';
+ act = strcat(act, scr->atend);
+
+ next = trs->atend;
+ while(next != NULL && (next->s)!=NULL && next->s[0] != '\0')
+ { PSTinsert(&(trs->p), next->s, act);
+ next = next->n;
+ }
+
+ /* insert trs->atbegin in default patterntree */
+ len = strlen(scr->atbegin) + 1; act = malloc(len);
+ if(act==NULL){fprintf(stderr, "can't allocate\n");exit(0);}
+ act[0] = 'M'; /* action: switch to default script */
+ act[1] = '\0';
+ act = strcat(act, scr->atbegin);
+
+ next = trs->atbegin;
+ while(next != NULL && (next->s)!=NULL && next->s[0] != '\0')
+ { PSTinsert(&normal, next->s, act);
+ next = next->n;
+ }
+ /* also skip comment in default mode (HACK) */
+ PSTinsert(&normal, "%", "s");
+ PSTinsert(&normal, "\\%", "\\%");
+ PSTinsert(&normal, "$$", "p$$");
+ /* code will change to add normal patterns from scr file */
+}
+
+/***********************************************************************/
+
+void defaultloop() /* almost same as normal patc */
+{ char ps[PATLEN+1]; /* pattern to be search for */
+ char *action; /* action with pattern */
+ int len = PATLEN; /* length of found pattern; part of ps to be read */
+ int i, j; /* counters */
+
+ while(TRUE)
+ {
+ /* fill pattern */
+ for(i = 0, j = len; j < PATLEN; i++, j++) ps[i] = ps[j];
+ for(i = PATLEN - len; i < PATLEN; i++)
+ { int c = readchar();
+ ps[i] = (c == EOF) ? '\0' : (char)c;
+ }
+ ps[PATLEN] = '\0'; /* NULL-terminate */
+ if(ps[0] == '\0') break;
+
+ /* find action */
+
+ action = PSTmatch(normal, ps, &len);
+
+ if(len == 0) /* no match, copy first letter silently */
+ { fputc(ps[0], outfile);
+ len = 1;
+ }
+ else /* do action */
+ { switch(action[0])
+ { case 'p': fputs(&action[1], outfile); break;
+ case 'c': PUSHBACK(ps); len = PATLEN; copycomment(); break;
+ case 't': PUSHBACK(ps); len = PATLEN; copytexcommand(); break;
+ case 'T': PUSHBACK(ps); len = PATLEN; skiptexcommand(); break;
+ case 's': PUSHBACK(ps); len = PATLEN; skipcomment(); break;
+ case 'f': /* forget */ break;
+ case 'e': fprintf(stderr, "Error: %s near line %d\n", &action[1], linenumber);
+ break;
+ case 'M': fputs(&action[1], outfile); /* output @atbegin text */
+ PUSHBACK(&ps[len]); len = PATLEN; /* pushback rest */
+ malayalamloop();
+ break;
+ default: fprintf(stderr, "Internal error: unknown action\n");
+ exit(10);
+ } /* switch */
+ } /* else */
+ } /* while */
+} /* defaultloop() */
+
+/***********************************************************************/
+
+void malayalamloop() /* build syllabes loop */
+{ char ps[PATLEN+1]; /* pattern to be search for */
+ char *action; /* action with pattern */
+ int len = PATLEN; /* length of found pattern; part of ps to be read */
+ int i, j; /* counters */
+
+ while(TRUE)
+ {
+ /* fill pattern */
+ for(i = 0, j = len; j < PATLEN; i++, j++) ps[i] = ps[j];
+ for(i = PATLEN - len; i < PATLEN; i++)
+ { int c = readchar();
+ ps[i] = (c == EOF) ? '\0' : (char)c;
+ }
+ ps[PATLEN] = '\0'; /* NULL-terminate */
+ if(ps[0] == '\0') break;
+
+ /* find action */
+
+ action = PSTmatch(trs->p, ps, &len);
+
+ if(len == 0) /* no match, complain */
+ { fprintf(stderr, "Error: illegal character '%c' near line %d\n", ps[0], linenumber);
+ len = 1;
+ }
+ else /* do action */
+ { switch(action[0])
+ { case 'p': put_malayalam_syllabe();
+ fputs(&action[1], outfile); break;
+ case 'c': put_malayalam_syllabe();
+ PUSHBACK(ps); len = PATLEN; copycomment(); break;
+ case 't': put_malayalam_syllabe();
+ PUSHBACK(ps); len = PATLEN; copytexcommand(); break;
+ case 'T': put_malayalam_syllabe();
+ PUSHBACK(ps); len = PATLEN; skiptexcommand(); break;
+ case 's': put_malayalam_syllabe();
+ PUSHBACK(ps); len = PATLEN; skipcomment(); break;
+ case 'f': /* forget */ break;
+ case 'e': put_malayalam_syllabe();
+ fprintf(stderr, "Error: %s near line %d\n", &action[1], linenumber);
+ break;
+ case 'M': put_malayalam_syllabe(); /* output last syllabe */
+ fputs(&action[1], outfile); /* output @atend text */
+ PUSHBACK(&ps[len]); len = PATLEN; /* pushback rest */
+ return; /* go back to main loop */
+ case '=': /* we have a letter, now we have to decide what to do with it
+ we have reached the end of a syllabe or not */
+ put_malayalam_letter(action[1]); /* add letter to current syllabe */
+ break;
+ default: fprintf(stderr, "Internal error: unknown action\n");
+ exit(10);
+ } /* switch */
+ } /* else */
+ } /* while */
+}
+
+/***********************************************************************/
+
+void put_malayalam_letter(char c) /* accept a letter, and output a syllabe if neccessary */
+{
+ if(debug)fprintf(stdout, "put malayalam letter %X\n", (int)c);
+
+ if(char_type[c] == UNDEF)
+ { fprintf(stderr, "%s: undefined Malayalam char %X near line %i\n", progname, (int)c, linenumber);
+ return;
+ }
+
+ switch(syllabe_state)
+ { case ACCEPT:
+ switch(char_type[c])
+ { case CONS:
+ case JOIN:
+ syllabe[syl_len++] = c;
+ break;
+ case BLANK:
+ put_malayalam_syllabe();
+ /* fall through */
+ default:
+ syllabe[syl_len++] = c;
+ syllabe_state = FLUSH;
+ }
+ break;
+ case FLUSH:
+ switch(char_type[c])
+ { case JOIN:
+ syllabe[syl_len++] = c;
+ syllabe_state = ACCEPT;
+ break;
+ case CONS:
+ put_malayalam_syllabe();
+ syllabe[syl_len++] = c;
+ syllabe_state = ACCEPT;
+ break;
+ default:
+ put_malayalam_syllabe();
+ syllabe[syl_len++] = c;
+ break;
+ }
+ }
+ syllabe[syl_len] = '\0';
+ if(syl_len >= SYLLABESIZE-2)
+ put_malayalam_syllabe();
+}
+
+static int cmp_glyph_pair(void *a, void *b)
+{ return strcmp(((glyph_pair*)a)->c, ((glyph_pair*)b)->c);
+}
+
+static int cmp_prebuild_char(void *a, void *b)
+{ return strcmp(((prebuild_char*)a)->c, ((prebuild_char*)b)->c);
+}
+
+void put_malayalam_syllabe() /* output a syllabe */
+{ int is_syllabe = FALSE;
+
+ if(debug)fprintf(stdout, "syllabe\n");
+ if(syl_len == 0) return;
+
+ /* add VIRAMA if last sign is consonant */
+ if(char_type[syllabe[syl_len-1]] == CONS)
+ { syllabe[syl_len++] = VIRAMA;
+ syllabe[syl_len] = '\0';
+ }
+
+ if(char_type[syllabe[0]] == CONS ||
+ char_type[syllabe[0]] == VOWEL) is_syllabe = TRUE;
+
+ if(is_syllabe) fputs(scr->atbeginsyllabe, outfile);
+
+ put_syllabe(syllabe);
+
+ if(is_syllabe) fputs(scr->atendsyllabe, outfile);
+
+ syllabe[0]='\0'; syl_len=0;
+ return;
+}
+
+prebuild_char *is_prebuild(char *s)
+{ prebuild_char tmp; tmp.c = s;
+ return AVLfind(&tmp, scr->prebuild, cmp_prebuild_char);
+}
+
+glyph_pair *is_primary(char *s)
+{ glyph_pair tmp; tmp.c = s;
+ return AVLfind(&tmp, scr->primary, cmp_glyph_pair);
+}
+
+glyph_pair *is_secondary(char *s)
+{ glyph_pair tmp; tmp.c = s;
+ return AVLfind(&tmp, scr->secondary, cmp_glyph_pair);
+}
+
+void pun_out(char c)
+{ static column = 0;
+ column++;
+ if(column == 78) { putchar('\n'); column = 1; }
+ putchar(c);
+}
+
+void put_syllabe(char *s)
+{
+ glyph_pair *primary_ra = NULL;
+ glyph_pair *vowel = NULL; /* also used for virama */
+ glyph_pair *sec_cons = NULL;
+ prebuild_char *cluster = NULL;
+
+ if(very_verbose) pun_out('.'); /* signal it */
+
+ if((cluster = is_prebuild(s)) == NULL)
+ { primary_ra = find_ra(&s);
+ if((cluster = is_prebuild(s)) == NULL)
+ { if((sec_cons = find_sec_cons(s, 1)) == NULL)
+ { vowel = find_vowel(s);
+ if((cluster = is_prebuild(s)) != NULL)
+ s[0] = '\0';
+ else
+ sec_cons = find_sec_cons(s, 0);
+ }
+ if(cluster == NULL)
+ cluster = find_cluster(s);
+ if(strlen(s) > 0) use_virama(s, &primary_ra);
+ }
+ }
+ /* output the syllabe */
+
+ if(!scr->reepham && primary_ra != NULL) fputs(primary_ra->b, outfile);
+ if(vowel != NULL) fputs(vowel->b, outfile);
+ if(sec_cons != NULL) fputs(sec_cons->b, outfile);
+ if(scr->reepham && primary_ra != NULL) fputs(primary_ra->b, outfile);
+ if(cluster != NULL) fputs(cluster->g, outfile);
+ if(scr->reepham && primary_ra != NULL) fputs(primary_ra->a, outfile);
+ if(sec_cons != NULL) fputs(sec_cons->a, outfile);
+ if(vowel != NULL) fputs(vowel->a, outfile);
+ if(!scr->reepham && primary_ra != NULL) fputs(primary_ra->a, outfile);
+}
+
+
+glyph_pair *find_ra(char **t)
+{ char *s = *t;
+ char ra_string[] = { LETTER_RA, '\0' };
+ glyph_pair *result = NULL;
+
+ /* do we have primary ra? */
+ if(s[0] == LETTER_RA && char_type[s[1]] == CONS)
+ { if((result = is_primary(ra_string)) == NULL)
+ fprintf(stderr, "need glyph(s) for primary ra\n");
+ s = &s[1];
+ }
+ *t = s;
+ return result;
+}
+
+glyph_pair *find_sec_cons(char *s, int r)
+{ glyph_pair *result = NULL;
+ long i;
+ long len=strlen(s)-r;
+
+ for(i=1;i<len;i++)
+ { if((result = is_secondary(&s[i])) != NULL)
+ { s[i] = '\0';
+ break;
+ }
+ }
+ return result;
+}
+
+glyph_pair *find_vowel(char *s)
+{ long i = strlen(s)-1;
+ glyph_pair *result;
+
+ if((result = is_secondary(&s[i])) == NULL)
+ fprintf(stderr, "need glyph(s) for secondary vowel/virama %X\n",(int)s[i]);
+ s[i] = '\0';
+ return result;
+}
+
+prebuild_char *find_cluster(char *s)
+{ long i, len = strlen(s);
+ prebuild_char *result;
+ for(i = 0;i<len;i++)
+ { if((result = is_prebuild(&s[i])) != NULL)
+ { s[i] = '\0'; /* that is done now */
+ break;
+ }
+ }
+ if(result == NULL)
+ { fprintf(stderr, "need glyph(s) for single character %X\n",(int)s[len-1]);
+ s[len-1] = '\0';
+ }
+ return result;
+}
+
+void use_virama(char *s, glyph_pair **primary_ra)
+{
+ long i;
+ long len = strlen(s);
+ prebuild_char *cluster = NULL;
+ glyph_pair *virama = NULL;
+ char virama_string[] = { VIRAMA, '\0' };
+
+ if(very_verbose) pun_out('+');
+
+ for(i=0;i<len;i++)
+ { s[len] = VIRAMA; s[len+1] = '\0';
+ if((cluster = is_prebuild(&s[i])) != NULL)
+ { s[i] = '\0';
+ break;
+ }
+ else
+ { s[len] = '\0';
+ if((cluster = is_prebuild(&s[i])) != NULL)
+ { s[i] = '\0';
+ if((virama = is_secondary(virama_string)) == NULL)
+ fprintf(stderr, "need glyph(s) for secondary virama\n");
+ break;
+ }
+ }
+ }
+ if(strlen(s) > 0) use_virama(s, primary_ra);
+
+ /* output what we have now */
+ if(*primary_ra != NULL) fputs((*primary_ra)->b, outfile);
+ if(virama != NULL) fputs(virama->b, outfile);
+ if(cluster != NULL) fputs(cluster->g, outfile);
+ if(virama != NULL) fputs(virama->a, outfile);
+ if(*primary_ra != NULL)
+ { fputs((*primary_ra)->a, outfile);
+ *primary_ra = NULL;
+ }
+}
+
+/***********************************************************************/
+
+void copytexcommand()
+/* copy TeX commmand, including preceding \
+ * this will work in plain TeX and LaTeX
+ */
+{ int c = readchar();
+ if(c=='\\')
+ { fputc(c, outfile);
+ c = readchar();
+ if(isalpha(c))
+ { while(isalpha(c))
+ { fputc(c, outfile);
+ c = readchar();
+ }
+ unreadchar(c);
+ }
+ else
+ fputc(c, outfile);
+ }
+ else
+ unreadchar(c);
+}
+
+void skiptexcommand()
+/* skip TeX commmand, including preceding \
+ * this will work in plain TeX and LaTeX
+ */
+{ int c = readchar();
+ if(c=='\\')
+ { c = readchar();
+ if(isalpha(c))
+ { while(isalpha(c))
+ { c = readchar();
+ }
+ unreadchar(c);
+ }
+ }
+ else
+ unreadchar(c);
+}
+
+
+void copycomment()
+{ int c = readchar();
+ if(c=='%')
+ { while(c != '\n' && c != EOF)
+ { fputc(c, outfile);
+ c = readchar();
+ }
+ fputc('\n', outfile);
+ }
+ else
+ unreadchar(c);
+}
+
+void skipcomment()
+{ int c = readchar();
+ if(c=='%')
+ { while(c != '\n' && c != EOF)
+ c = readchar();
+ }
+ else
+ unreadchar(c);
+}
+
+/***********************************************************************/
+/* file access with buffer */
+
+static int fbuffer[BUFSIZE]; /* buffer for file operations */
+static int last = 0; /* last + 1 used in fbuffer */
+
+int readchar()
+{ int result;
+
+ if(last==0) /* nothing in buffer */
+ result = fgetc(infile);
+ else /* get first from buffer */
+ { last--;
+ result = fbuffer[last];
+ }
+ if(result == '\n') linenumber++;
+ return result;
+}
+
+void unreadchar(int c)
+{
+ if(last == BUFSIZE)
+ { fprintf(stderr, "%s: push-back file buffer full\n", progname);
+ exit(1);
+ }
+ else /* voeg na last in buffer */
+ { fbuffer[last] = c;
+ last++;
+ if(c == '\n') linenumber--;
+ }
+}
+
+/***********************************************************************/
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.exe b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.exe
new file mode 100644
index 00000000000..9077c13826b
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.exe
Binary files differ
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.h b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.h
new file mode 100644
index 00000000000..3db74a846a0
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.h
@@ -0,0 +1,110 @@
+
+#define TRUE (1==1)
+#define FALSE (1==0)
+
+char *prepend_home(char *filename);
+
+/* table of malayalam letters */
+
+#define SIGN_ANUSVARA 2
+#define SIGN_VISARGA 3
+
+#define LETTER_A 5
+#define LETTER_AA 6
+#define LETTER_I 7
+#define LETTER_II 8
+#define LETTER_U 9
+#define LETTER_UU 10
+#define LETTER_VOCALIC_R 11
+#define LETTER_VOCALIC_L 12
+
+#define LETTER_E 14
+#define LETTER_EE 15
+#define LETTER_AI 16
+
+#define LETTER_O 18
+#define LETTER_OO 19
+#define LETTER_AU 20
+
+#define LETTER_KA 21
+#define LETTER_KHA 22
+#define LETTER_GA 23
+#define LETTER_GHA 24
+#define LETTER_NGA 25
+#define LETTER_CA 26
+#define LETTER_CHA 27
+#define LETTER_JA 28
+#define LETTER_JHA 29
+#define LETTER_NYA 30
+#define LETTER_TTA 31
+#define LETTER_TTHA 32
+#define LETTER_DDA 33
+#define LETTER_DDHA 34
+#define LETTER_NNA 35
+#define LETTER_TA 36
+#define LETTER_THA 37
+#define LETTER_DA 38
+#define LETTER_DHA 39
+#define LETTER_NA 40
+
+#define LETTER_PA 42
+#define LETTER_PHA 43
+#define LETTER_BA 44
+#define LETTER_BHA 45
+#define LETTER_MA 46
+#define LETTER_YA 47
+#define LETTER_RA 48
+#define LETTER_RRA 49
+#define LETTER_LA 50
+#define LETTER_LLA 51
+#define LETTER_LLLA 52
+#define LETTER_VA 53
+#define LETTER_SHA 54
+#define LETTER_SSA 55
+#define LETTER_SA 56
+#define LETTER_HA 57
+
+#define VOWEL_SIGN_AA 62
+#define VOWEL_SIGN_I 63
+#define VOWEL_SIGN_II 64
+#define VOWEL_SIGN_U 65
+#define VOWEL_SIGN_UU 66
+#define VOWEL_SIGN_VOCALIC_R 67
+#define VOWEL_SIGN_VOCALIC_RR 68
+
+#define VOWEL_SIGN_E 70
+#define VOWEL_SIGN_EE 71
+#define VOWEL_SIGN_AI 72
+
+#define VOWEL_SIGN_O 74
+#define VOWEL_SIGN_OO 75
+#define VOWEL_SIGN_AU 76
+
+#define VIRAMA 77
+
+#define AU_LENGTH_MARK 87
+
+#define LETTER_VOCALIC_RR 96
+#define LETTER_VOCALIC_LL 97
+
+#define DIGIT_ZERO 102
+#define DIGIT_ONE 103
+#define DIGIT_TWO 104
+#define DIGIT_THREE 105
+#define DIGIT_FOUR 106
+#define DIGIT_FIVE 107
+#define DIGIT_SIX 108
+#define DIGIT_SEVEN 109
+#define DIGIT_EIGHT 110
+#define DIGIT_NINE 111
+
+/* extra's not on this place in unicode */
+
+#define JOINER 127
+#define NON_JOIN 126
+#define DOTTED_CIRCLE 125
+#define SPACE 124
+
+/* eof */
+
+
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.pat b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.pat
new file mode 100644
index 00000000000..4d36412e553
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.pat
@@ -0,0 +1,387 @@
+% mm.pat --- Malayalam transcription definition for TeX pre-processor
+% (c) 1993 Jeroen Hellingman
+% last edit: 14-JAN-1993
+
+@patterns 0 % default patterns
+"$$" 1 "{\\mmtr " % begin Malayalam in transcription
+"%" c % skip comments
+"\\" t % copy TeX-commands
+"\t" p " " % tab -> space
+
+@rpatterns 1 patterns ASCII transcription -> scientific transcription in TeX.
+
+"$$" 0 "}" % switch back to default mode
+"$" e "$ in $$-mode"
+">" f % eliminate ambiguities
+"\\" t % copy TeX command
+"%" s % skip comment
+"^" e "^ in front of non letter"
+"^^" 2 "" % switch to capital mode
+
+"{" p "{"
+"}" p "}"
+"\n" p "\n"
+" " p " "
+"\t" p " "
+
+"a" p "a" % a
+"aa" p "\\=a" % aa
+"A" p "\\=a"
+"i" p "i" % i
+"ii" p "{\\=\\i}" % ii
+"I" p "{\\=\\i}"
+"u" p "u" % u
+"uu" p "\\=u" % uu
+"U" p "\\=u"
+".r" p "\\d r" % vocalic r
+".r.r" p "{\\rii}" % vocalic rr
+".R" p "{\\rii}"
+".l" p "\\d l" % vocalic l
+".l.l" p "{\\lii}" % vocalic ll
+".L" p "{\\lii}"
+"e" p "e"
+"ee" p "\\=e"
+"E" p "\\=e"
+"ai" p "ai"
+"o" p "o"
+"oo" p "\\=o"
+"O" p "\\=o"
+"au" p "au"
+"au\"" p "au" % au length mark
+
+% modifiers
+
+"M" p "\\d m" % anusvara
+"H" p "\\d h" % visarga
+
+% consonants
+
+"k" p "k"
+"kh" p "kh"
+"g" p "g"
+"gh" p "gh"
+"n\"" p "\\.n" % nga
+
+"c" p "c"
+"ch" p "ch"
+"j" p "j"
+"jh" p "jh"
+"n~" p "\\~n" % nya
+
+"T" p "\\d t"
+"Th" p "\\d th"
+"D" p "\\d d"
+"Dh" p "\\d dh"
+"N" p "\\d n"
+
+"t" p "t"
+"t_" p "\\b t" % dental ta
+"th" p "th"
+"d" p "d"
+"dh" p "dh"
+"n" p "n"
+"n_" p "\\b n" % dental na
+
+"p" p "p"
+"ph" p "ph"
+"f" p "f"
+"b" p "b"
+"bh" p "bh"
+"m" p "m"
+
+"y" p "y"
+"r" p "r"
+"R" p "\\b r"
+"RR" p "\\b t" % double Ra is dental t
+"t_t_" p "\\b t" % double Ra is dental t
+"l" p "l"
+"L" p "\\d l"
+"zh" p "\\b z"
+"v" p "v"
+"sh" p "\\'s"
+"S" p "\\d s"
+"s" p "s"
+"h" p "h"
+
+"+" f % virama
+"u+" p "\\u u" % half u
+
+% digits
+
+% special
+
+"<>" f % join
+"@" f % non join
+"[]" p "\\dotcircle" % dotted circle
+
+% interpunction
+
+"." p "."
+"`" p "`"
+"'" p "'"
+"," p ","
+":" p ":"
+";" p ";"
+"-" p "-"
+"--" p "--"
+"---" p "---"
+"(" p "("
+")" p ")"
+"?" p "?"
+"!" p "!"
+"\\%" p "\\%"
+
+% repeat partial table for correct transcription of anusvar
+
+"Mk" p "\\.nk"
+"Mkh" p "\\.nkh"
+"Mg" p "\\.ng"
+"Mgh" p "\\.ngh"
+
+"Mc" p "\\~nc"
+"Mch" p "\\~nch"
+"Mj" p "\\~nj"
+"Mjh" p "\\~njh"
+
+"MT" p "\\d n\\d t"
+"MTh" p "\\d n\\d th"
+"MD" p "\\d n\\d d"
+"MDh" p "\\d n\\d dh"
+
+"Mt" p "nt"
+"Mth" p "nth"
+"Md" p "nd"
+"Mdh" p "ndh"
+
+"Mp" p "mp"
+"Mph" p "mph"
+"Mb" p "mb"
+"Mbh" p "mbh"
+"Mf" p "mf"
+
+% repeat table for capital letters
+
+"^a" p "A" % a
+"^aa" p "\\=A" % aa
+"^A" p "\\=A"
+"^i" p "I" % i
+"^ii" p "\\=I" % ii
+"^I" p "\\=I"
+"^u" p "U"
+"^uu" p "\\=U"
+"^U" p "\\=U"
+"^.r" p "\\d R" % vocalic r
+"^.r.r" p "{\\Rii}" % vocalic rr
+"^.R" p "{\\Rii}"
+"^.l" p "\\d L" % vocalic l
+"^.l.l" p "{\\Lii}" % vocalic ll
+"^.L" p "{\\Lii}"
+"^e" p "E"
+"^ee" p "\\=E"
+"^E" p "\\=E"
+"^ai" p "Ai"
+"^o" p "O"
+"^oo" p "\\=O"
+"^O" p "\\=O"
+"^au" p "Au"
+"^au\"" p "Au" % au length mark
+
+% consonants
+
+"^k" p "K"
+"^kh" p "Kh"
+"^g" p "G"
+"^gh" p "Gh"
+"^n\"" p "\\.N" % nga
+
+"^c" p "C"
+"^ch" p "Ch"
+"^j" p "J"
+"^jh" p "Jh"
+"^n~" p "\\~N" % nya
+
+"^T" p "\\d T"
+"^Th" p "\\d Th"
+"^D" p "\\d D"
+"^Dh" p "\\d Dh"
+"^N" p "\\d N"
+
+"^t" p "T"
+"^t_" p "\\b T" % dental ta
+"^th" p "Th"
+"^d" p "D"
+"^dh" p "Dh"
+"^n" p "N"
+"^n_" p "\\b N"
+
+"^p" p "P"
+"^ph" p "Ph"
+"^f" p "F"
+"^b" p "B"
+"^bh" p "Bh"
+"^m" p "M"
+
+"^y" p "Y"
+"^r" p "R"
+"^R" p "\\b R"
+"^RR" p "\\b T" % double Ra is dental t
+"^t_t_" p "\\b T" % double Ra is dental t
+"^l" p "L"
+"^L" p "\\d L"
+"^zh" p "\\b Z"
+"^v" p "V"
+"^sh" p "\\'S"
+"^S" p "\\d S"
+"^s" p "S"
+"^h" p "H"
+
+@rpatterns 2 patterns ASCII transcription -> scientific transcription in TeX in Caps.
+
+"$$" 0 "}" % switch back to default mode
+"$" e "$ in $$-mode"
+">" f % eliminate ambiguities
+"\\" t % copy TeX command
+"%" s % skip comment
+"^" s % no capitals in caps-mode
+"^^" 1 "" % switch to normal mode
+
+"{" p "{"
+"}" p "}"
+"\n" p "\n"
+" " p " "
+"\t" p " "
+
+"a" p "A" % a
+"aa" p "\\=A" % aa
+"A" p "\\=A"
+"i" p "I" % i
+"ii" p "\\=I" % ii
+"I" p "\\=I"
+"u" p "U"
+"uu" p "\\=U"
+"U" p "\\=U"
+".r" p "\\d R" % vocalic r
+".r.r" p "{\\RII}" % vocalic rr
+".R" p "{\\RII}"
+".l" p "\\d L" % vocalic l
+".l.l" p "{\\LII}" % vocalic ll
+".L" p "{\\LII}"
+"e" p "E"
+"ee" p "\\=E"
+"E" p "\\=E"
+"ai" p "AI"
+"o" p "O"
+"oo" p "\\=O"
+"O" p "\\=O"
+"au" p "AU"
+"au\"" p "AU" % au length mark
+
+% modifiers
+
+"M" p "\\d M" % anusvara
+"H" p "\\d H" % visarga
+
+% consonants
+
+"k" p "K"
+"kh" p "KH"
+"g" p "G"
+"gh" p "GH"
+"n\"" p "\\.N" % nga
+
+"c" p "C"
+"ch" p "CH"
+"j" p "J"
+"jh" p "JH"
+"n~" p "\\~N" % nya
+
+"T" p "\\d T"
+"Th" p "\\d TH"
+"D" p "\\d D"
+"Dh" p "\\d DH"
+"N" p "\\d N"
+
+"t" p "T"
+"t_" p "\\b T" % dental ta
+"th" p "TH"
+"d" p "D"
+"dh" p "DH"
+"n" p "N"
+"n_" p "\\b N"
+
+"p" p "P"
+"ph" p "PH"
+"f" p "F"
+"b" p "B"
+"bh" p "BH"
+"m" p "M"
+
+"y" p "Y"
+"r" p "R"
+"R" p "\\b R"
+"RR" p "\\b T" % double Ra is dental t
+"t_t_" p "\\b T" % double Ra is dental t
+"l" p "L"
+"L" p "\\d L"
+"zh" p "\\b Z"
+"v" p "V"
+"sh" p "\\'S"
+"S" p "\\d S"
+"s" p "S"
+"h" p "H"
+
+"+" f % virama
+"u+" p "\\u U" % half u
+
+% digits
+
+% special
+
+"<>" f % join
+"@" f % non join
+"[]" p "\\dotcircle" % dotted circle
+
+% interpunction
+
+"." p "."
+"`" p "`"
+"'" p "'"
+"," p ","
+":" p ":"
+";" p ";"
+"-" p "-"
+"--" p "--"
+"---" p "---"
+"(" p "("
+")" p ")"
+"\\%" p "\\%"
+
+% repeat partial table for correct transcription of anusvar
+
+"Mk" p "\\.NK"
+"Mkh" p "\\.NKH"
+"Mg" p "\\.NG"
+"Mgh" p "\\.NGH"
+
+"Mc" p "\\~NC"
+"Mch" p "\\~NCH"
+"Mj" p "\\~NJ"
+"Mjh" p "\\~NJH"
+
+"MT" p "\\d N\\d T"
+"MTh" p "\\d N\\d TH"
+"MD" p "\\d N\\d D"
+"MDh" p "\\d N\\d DH"
+
+"Mt" p "NT"
+"Mth" p "NTH"
+"Md" p "ND"
+"Mdh" p "NDH"
+
+"Mp" p "MP"
+"Mph" p "MPH"
+"Mb" p "MB"
+"Mbh" p "MBH"
+"Mf" p "MF"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.prj b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.prj
new file mode 100644
index 00000000000..bd2035baa90
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.prj
@@ -0,0 +1,13 @@
+mm.ttp
+.C [-A -K -G] ; [ -Y -A -K -G -T ]
+.L [-S=32000] ; [ -Y -L -G -S=32000 ]
+=
+PCSTART.O
+mm.c (mm.h, trs.h, scr.h, readfile.h)
+readfile.c (readfile.h)
+trs.c (trs.h, readfile.h, mm.h)
+scr.c (scr.h, readfile.h, mm.h)
+pstree.c (pstree.h)
+avltree.c (avltree.h)
+
+PCSTDLIB.LIB
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.scr b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.scr
new file mode 100644
index 00000000000..b9112aedebf
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.scr
@@ -0,0 +1,410 @@
+% mm.scr --- Malayalam script file for TeX pre-processor
+% (c) 1993 Jeroen Hellingman
+%
+% History:
+% 22-JAN-1994 changes in macro for virama (JH)
+% 02-APR-1993 changed macro for virama (JH)
+% 28-JAN-1993 version 1.0 (Jeroen Hellingman)
+%
+% summary of used TeX commands
+% \<#1> typeset glyph #1
+% \B#1#2 put #2 centered below #1
+% \M#1#2 put #2 right below of #1
+% \T#1#2 put #1 centered on top of #2
+% \Z switch to sub-font
+% \K#1 kern in #1 em's ( \def\K#1{\kern#1em} )
+% \X \def\X{\hbox}
+% \mmV#1 place virama over #1
+
+@malayalam
+% script type
+
+@atbegin "{\\mm "
+@atend "}"
+% to be placed at the begin respectively end of malayalam text
+
+@atbeginsyllabe "\\X{"
+@atendsyllabe "}"
+% to be placed at the begin repectively end of every syllabe
+
+@prebuild
+% prebuild characters: <codes, glyphs>.
+% We start with a list mapping all single characters to glyphs (i.e. TeX
+% codes to typeset them), they need to be here!
+
+"\d02" "\\<2>" % anusvara
+"\d03" "\\<3>" % visarga
+
+% vowels
+
+"\d05" "\\<5>" % a
+"\d06" "\\<6>" % aa
+"\d07" "\\<7>" % i
+"\d08" "\\<7>\\<87>" % ii
+"\d09" "\\<9>" % u
+"\d10" "\\<9>\\<87>" % uu
+"\d11" "\\<11>" % vocalic r
+"\d96" "\\<96>" % vocalic rr
+"\d12" "\\<12>" % vocalic l
+"\d97" "\\<97>" % vocalic ll
+"\d14" "\\<14>" % e
+"\d15" "\\<15>" % ee
+"\d16" "\\<70>\\<14>" % ai
+"\d18" "\\<18>" % o
+"\d19" "\\<18>\\<62>" % oo
+"\d20" "\\<18>\\<87>" % au
+"\d87" "\\<87>" % au length mark
+
+% consonants
+
+"\d21" "\\<21>" % ka
+"\d22" "\\<22>" % kha
+"\d23" "\\<23>" % ga
+"\d24" "\\<24>" % gha
+"\d25" "\\<25>" % nga
+
+"\d26" "\\<26>" % ca
+"\d27" "\\<27>" % cha
+"\d28" "\\<28>" % ja
+"\d29" "\\<29>" % jha
+"\d30" "\\<30>" % nya
+
+"\d31" "\\<31>" % Ta
+"\d32" "\\<32>" % Tha
+"\d33" "\\<33>" % Da
+"\d34" "\\<34>" % Dha
+"\d35" "\\<35>" % Na
+
+"\d36" "\\<36>" % ta
+"\d37" "\\<37>" % tha
+"\d38" "\\<38>" % da
+"\d39" "\\<39>" % dha
+"\d40" "\\<40>" % na
+
+"\d42" "\\<42>" % pa
+"\d43" "\\<43>" % pha, fa
+"\d44" "\\<44>" % ba
+"\d45" "\\<45>" % bha
+"\d46" "\\<46>" % ma
+
+"\d47" "\\<47>" % ya
+"\d48" "\\<48>" % ra
+"\d49" "\\<49>" % Ra
+"\d50" "\\<50>" % la
+"\d51" "\\<51>" % La
+"\d52" "\\<52>" % zha
+"\d53" "\\<53>" % va
+"\d54" "\\<54>" % sha
+"\d55" "\\<55>" % Sa
+"\d56" "\\<56>" % sa
+"\d57" "\\<57>" % ha
+
+% digits
+
+"\d102" "{\\mmzero}" % 0
+"\d103" "{\\mmone}" % 1
+"\d104" "{\\mmtwo}" % 2
+"\d105" "{\\mmthree}" % 3
+"\d106" "{\\mmfour}" % 4
+"\d107" "{\\mmfive}" % 5
+"\d108" "{\\mmsix}" % 6
+"\d109" "{\\mmseven}" % 7
+"\d110" "{\\mmeight}" % 8
+"\d111" "{\\mmnine}" % 9
+
+% specials
+
+"\d77" "\\<77>" % virama
+
+"\d127" "\\hbox{}" % join (dissapears)
+"\d126" "\\hbox{}" % non-join (dissapears)
+"\d125" "\\<00>" % dotted circle
+"\d125\d127" "\\<00>" % dotted circle + join
+"\d124" " " % space
+"\d124\d127" "\\hbox{}" % space + join (dissapears)
+
+"\d48\d127\d125" "\\T{\\<76>}{\\R{3.5ex}{\\<00>}}" % reepham on dotted circle
+
+% then we have a list of all conjuncts and consonant vowel combinations
+% that cannot be build by the standard algorithm, i.e. we need a ligature.
+
+"\d21\d09" "\\<128>" % ku
+"\d21\d10" "\\<139>" % kuu
+"\d21\d11" "\\<150>" % kr
+"\d21\d21" "\\<160>" % k+ka
+"\d21\d21\d09" "\\<168>" % k+ku
+"\d21\d21\d10" "\\<169>" % k+kuu
+"\d21\d21\d48" "\\<213>" % k+k+ra
+"\d21\d21\d49" "\\<213>" % k+k+Ra
+"\d21\d22" "\\M{\\<21>}{\\Z\\<22>}" % k+kha
+"\d21\d26" "\\M{\\<21>}{\\Z\\<26>}" % k+ca
+"\d21\d36" "\\<176>" % k+ta
+"\d21\d48" "\\<200>" % k+ra
+"\d21\d55" "\\<251>" % k+Sa
+"\d21\d55\d46" "\\M{\\<251>}{\\Z\\<46>}" % k+S+ma
+"\d21\d55\d35" "\\M{\\<251>}{\\Z\\<35>}" % k+S+Na
+
+"\d23\d09" "\\<129>" % gu
+"\d23\d10" "\\<140>" % guu
+"\d23\d11" "\\<151>" % gr
+"\d23\d23" "\\<240>" % g+ga
+% "\d23\d23\d47" "\\<240>\\<122>" % g+g+ya
+"\d23\d24" "\\<218>" % g+gha
+"\d23\d28" "\\M{\\<23>}{\\Z\\<28>}" % g+ja
+"\d23\d38" "\\<177>" % g+da
+"\d23\d38\d39" "\\<178>" % g+d+dha
+"\d23\d40" "\\<179>" % g+na
+"\d23\d46" "\\<180>" % g+ma
+"\d23\d48" "\\<201>" % g+ra
+
+"\d24\d48" "\\M{\\<24>}{\\<127>}" % gh+ra
+
+"\d25\d25" "\\<161>" % ng+nga
+"\d25\d21" "\\<181>" % ng+ka
+"\d25\d21\d09" "\\<182>" % ng+ku
+"\d25\d21\d10" "\\<183>" % ng+kuu
+
+"\d26\d26" "\\<247>" % c+ca
+% "\d26\d26\d47" "\\<247>\\<121>" % c+c+ya
+"\d26\d27" "\\M{\\<26>}{\\Z\\<27>}" % c+cha
+"\d26\d54" "\\M{\\<26>}{\\Z\\<54>}" % c+sha
+"\d26\d48" "\\M{\\<26>}{\\<124>}" % c+ra
+
+"\d27\d09" "\\<130>" % chu
+"\d27\d10" "\\<141>" % chuu
+"\d27\d48" "\\<202>" % ch+ra
+
+"\d28\d09" "\\<131>" % ju
+"\d28\d10" "\\<142>" % juu
+"\d28\d28" "\\<162>" % j+ja
+"\d28\d28\d09" "\\<170>" % j+ju
+"\d28\d28\d10" "\\<171>" % j+juu
+"\d28\d30" "\\<184>" % j+nya
+% "\d28\d47" "\\<28>\\<120>" % j+ya
+"\d28\d48" "\\<203>" % j+ra
+
+"\d30\d26" "\\<185>" % ny+ca
+"\d30\d28" "\\<186>" % ny+ja
+"\d30\d30" "\\<163>" % ny+nya
+"\d30\d48" "\\M{\\<30>}{\\<126>}" % ny+ra
+
+% "\d31\d09" "\\B{\\<31>}{\\<65>}" % Tu
+% "\d31\d10" "\\B{\\<31>}{\\<66>}" % Tuu
+"\d31\d31" "\\<164>" % T+Ta
+% "\d31\d31\d09" "\\B{\\<164>}{\\<65>}" % T+Tu
+% "\d31\d31\d10" "\\B{\\<164>}{\\<66>}" % T+Tuu
+"\d31\d32" "\\B{\\<31>}{\\Z\\<32>}" % T+Tha
+"\d31\d48" "\\<204>" % T+ra
+
+"\d32\d48" "\\M{\\<32>}{\\<123>}" % Th+ra
+
+"\d33\d33" "\\M{\\<33>}{\\<89>}" % D+Da
+"\d33\d23" "\\M{\\<33>}{\\Z\\<23>}" % D+ga
+"\d33\d48" "\\M{\\<33>}{\\<126>}" % D+ra
+
+"\d34\d34" "\\M{\\<34>}{\\<89>}" % Dh+Dha
+"\d34\d48" "\\M{\\<34>}{\\<126>}" % Dh+ra
+
+"\d35\d09" "\\<132>" % Nu
+"\d35\d10" "\\<143>" % Nuu
+"\d35\d31" "\\<187>" % N+Ta
+"\d35\d32" "\\M{\\<35>}{\\Z\\<32>}" % N+Tha
+"\d35\d33" "\\<188>" % N+Da
+"\d35\d35" "\\<241>" % N+Na
+"\d35\d48" "\\M{\\<35>}{\\<127>}" % N+ra
+"\d35\d77" "\\<78>" % N+virama
+
+"\d36\d09" "\\<133>" % tu
+"\d36\d10" "\\<144>" % tuu
+"\d36\d11" "\\<152>" % tr
+"\d36\d36" "\\<165>" % t+ta
+"\d36\d36\d09" "\\<172>" % t+tu
+"\d36\d36\d10" "\\<173>" % t+tuu
+"\d36\d37" "\\<36>\\K{-.5}\\<88>" % t+tha
+"\d36\d40" "\\<191>" % t+na
+"\d36\d42" "\\M{\\<36>}{\\Z\\<42>}" % t+pa
+"\d36\d46" "\\<190>" % t+ma
+"\d36\d48" "\\<205>" % t+ra
+"\d36\d56" "\\<221>" % t+sa
+"\d36\d77" "\\<81>" % t+virama
+
+"\d37\d48" "\\M{\\<37>}{\\<84>}" % th+ra
+
+"\d38\d11" "\\<153>" % dr
+"\d38\d38" "\\<166>" % d+da
+"\d38\d39" "\\<192>" % d+dha
+"\d38\d48" "\\<206>" % d+ra
+
+"\d39\d48" "\\<207>" % dh+ra
+
+"\d40\d09" "\\<134>" % nu
+"\d40\d10" "\\<145>" % nuu
+"\d40\d11" "\\<155>" % nr
+"\d40\d36" "\\<194>" % n+ta
+"\d40\d36\d09" "\\<222>" % n+tu
+"\d40\d36\d10" "\\<223>" % n+tuu
+"\d40\d36\d48" "\\<215>" % n+t+ra
+"\d40\d36\d49" "\\<215>" % n+t+Ra
+"\d40\d38" "\\<195>" % n+da
+"\d40\d38\d48" "\\<216>" % n+d+ra
+"\d40\d39" "\\<219>" % n+dha
+"\d40\d40" "\\<167>" % n+na
+"\d40\d40\d09" "\\<174>" % n+nu
+"\d40\d40\d10" "\\<175>" % n+nuu
+"\d40\d42" "\\<220>" % n+pa
+"\d40\d46" "\\<193>" % n+ma
+"\d40\d48" "\\<208>" % n+ra
+"\d40\d49" "\\<79>\\<49>" % n+Ra
+"\d40\d53" "\\<40>\\K{-1.5}\\<93>" % n+va
+"\d40\d77" "\\<79>" % n+virama
+
+"\d42\d36" "\\M{\\<42>}{\\Z\\<36>}" % p+ta
+"\d42\d40" "\\M{\\<42>}{\\Z\\<40>}" % p+na
+"\d42\d42" "\\<242>" % p+pa
+% "\d42\d42\d47" "\\<242>\\<122>" % p+p+ya
+"\d42\d48" "\\M{\\<42>}{\\<124>}" % p+ra
+
+"\d43\d48" "\\M{\\<43>}{\\<125>}" % ph+ra
+
+"\d44\d38" "\\M{\\<44>}{\\Z\\<38>}" % b+da
+"\d44\d39" "\\M{\\<44>}{\\Z\\<39>}" % b+dha
+"\d44\d44" "\\<248>" % b+ba
+"\d44\d48" "\\M{\\<44>}{\\<126>}" % b+ra
+
+"\d45\d09" "\\<135>" % bhu
+"\d45\d10" "\\<146>" % bhuu
+"\d45\d11" "\\<156>" % bhr
+"\d45\d33" "\\<196>" % bh+Da
+"\d45\d48" "\\<209>" % bh+ra
+
+"\d46\d40" "\\M{\\<46>}{\\Z\\<40>}" % m+na
+"\d46\d42" "\\<220>" % m+pa
+"\d46\d46" "\\<46>\\K{-.27}\\<46>" % m+ma
+"\d46\d48" "\\M{\\<46>}{\\<123>}" % m+ra
+"\d46\d77" "\\<2>" % m+virama (=anusvara)
+
+"\d47\d36" "\\M{\\<47>}{\\Z\\<36>}" % y+ta
+"\d47\d36\d09" "\\M{\\<47>}{\\Z\\<133>}" % y+tu
+"\d47\d47" "\\<249>" % y+ya
+"\d47\d48" "\\M{\\<47>}{\\<84>}" % y+ra
+
+"\d48\d09" "\\<136>" % ru
+"\d48\d10" "\\<147>" % ruu
+"\d48\d77" "\\<80>" % r+virama
+
+"\d49\d49" "\\<243>" % R+Ra
+"\d49\d77" "\\<80>" % R+virama
+
+"\d50\d77" "\\<81>" % l+virama
+"\d50\d36\d36" "\\B{\\<50>}{\\Z\\<165>}" % l+t+ta
+"\d50\d48" "\\M{\\<50>}{\\<84>}" % l+ra
+
+"\d51\d51" "\\<51>\\K{-.2}\\<51>" % L+La
+"\d51\d21\d21" "\\<82>\\<160>" % L+k+ka
+"\d51\d21\d21\d09" "\\<82>\\<168>" % L+k+ku
+"\d51\d77" "\\<82>" % L+virama
+
+"\d52\d09" "\\B{\\<52>}{\\<65>}" % zhu
+"\d52\d10" "\\B{\\<52>}{\\<66>}" % zhuu
+"\d52\d21\d21" "\\B{\\<52>}{\\<115>}" % zh+k+ka
+
+"\d53\d53" "\\<250>" % v+va
+
+"\d54\d09" "\\<137>" % shu
+"\d54\d10" "\\<148>" % shuu
+"\d54\d11" "\\<157>" % shr
+"\d54\d26" "\\<197>" % sh+ca
+"\d54\d48" "\\<210>" % sh+ra
+"\d54\d54" "\\<244>" % sh+sha
+
+"\d55\d31" "\\M{\\<55>}{\\Z\\<31>}" % S+Ta
+"\d55\d31\d48" "\\M{\\<55>}{\\Z\\<204>}" % S+T+ra
+"\d55\d35" "\\M{\\<55>}{\\Z\\<35>}" % S+Na
+"\d55\d46" "\\M{\\<55>}{\\Z\\<46>}" % S+Ma
+"\d55\d48" "\\M{\\<55>}{\\<125>}" % S+ra
+
+"\d56\d21" "\\M{\\<56>}{\\<112>}" % s+ka
+"\d56\d36" "\\M{\\<56>}{\\Z\\<36>}" % s+ta
+"\d56\d36\d09" "\\M{\\<56>}{\\Z\\<133>}" % s+tu
+"\d56\d36\d48" "\\M{\\<56>}{\\Z\\<205>}" % s+t+ra
+"\d56\d46" "\\M{\\<56>}{\\Z\\<46>}" % s+ma
+"\d56\d48" "\\<211>" % s+ra
+"\d56\d56" "\\<245>" % s+sa
+
+"\d57\d09" "\\<138>" % hu
+"\d57\d10" "\\<149>" % huu
+"\d57\d11" "\\<159>" % hr
+"\d57\d40" "\\<199>" % h+na
+"\d57\d46" "\\<198>" % h+ma
+"\d57\d48" "\\<212>" % h+ra
+"\d57\d53" "\\<57>\\K{-1.5}\\<93>" % h+va
+
+% cillu/non-cillu variants of $k$ $y$ $n$, $N$, $m$, $t$ $l$ $L$
+
+"\d21\d127\d77" "\\<94>" % $k<<+$ cillu-form of ka
+"\d47\d127\d77" "\\<95>" % $k<<+$ cillu-form of ya
+
+"\d35\d127\d77" "\\mmV{\\<35>}" % $N<<+$ Na with viraama
+"\d36\d127\d77" "\\mmV{\\<36>}" % $t<<+$ ta
+"\d40\d127\d77" "\\mmV{\\<40>}" % na
+"\d46\d127\d77" "\\mmV{\\<46>}" % ma
+"\d48\d127\d77" "\\mmV{\\<48>}" % ra
+"\d49\d127\d77" "\\mmV{\\<49>}" % Ra
+"\d50\d127\d77" "\\mmV{\\<50>}" % la
+"\d51\d127\d77" "\\mmV{\\<51>}" % La
+
+@secondary
+% secondary shapes of characters: <codes, glyphs, glyphs> the first set of
+% glyphs (TeX commands) comes in front of the cluster that is being build,
+% the second set comes after it.
+
+% vowels
+
+"\d05" "" "" % a
+"\d06" "" "\\<62>" % aa
+"\d07" "" "\\<63>" % i
+"\d08" "" "\\<64>" % ii
+"\d09" "\\M{" "}{\\<65>}" % u
+"\d10" "\\M{" "}{\\<66>}" % uu
+"\d11" "\\M{" "}{\\<67>}" % vocalic r
+"\d96" "\\M{" "}{\\<68>}" % vocalic rr
+"\d12" "" "\\<12>" % vocalic l
+"\d97" "" "\\<97>" % vocalic ll
+"\d14" "\\<70>" "" % e
+"\d15" "\\<71>" "" % ee
+"\d16" "\\<70>\\<70>" "" % ai
+"\d18" "\\<70>" "\\<62>" % o
+"\d19" "\\<71>" "\\<62>" % oo
+"\d20" "\\<70>" "\\<87>" % au
+"\d87" "" "\\<87>" % au length mark
+"\d77" "\\mmV{" "}" % virama
+
+% secondary shapes of the consonants
+
+"\d47" "" "\\<83>" % secondary ya
+% "\d47" "" "\\<92>" % secondary ya
+"\d48" "\\M{" "}{\\<84>}" % secondary ra
+"\d50" "\\M{" "}{\\<85>}" % secondary la
+"\d53" "" "\\K{-.5}\\<86>" % secondary va
+
+"\d21" "\\M{" "}{\\<112>}" % secondary ka
+"\d37" "" "\\K{-.5}\\<88>" % secondary tha
+"\d38" "\\M{" "}{\\Z\\<38>}" % secondary da
+
+"\d21\d09" "\\M{" "}{\\<113>}" % secondary ku
+"\d21\d10" "\\M{" "}{\\<114>}" % secondary kuu
+"\d21\d21" "\\M{" "}{\\<115>}" % secondary k+ka
+"\d21\d21\d09" "\\M{" "}{\\<116>}" % secondary k+ku
+"\d21\d21\d10" "\\M{" "}{\\<117>}" % secondary k+kuu
+
+@reepham % we use reepham
+
+@primary
+% primary shapes of characters, occurs only with "ra" (reepham)
+
+"\d48" "\\T{\\<76>}{\\R{.8ex}{" "}}" % ra
+
+% "\d48" "\\<80>" "" % ra
+
+@end
+% end of file
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.trs b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.trs
new file mode 100644
index 00000000000..e5a43efe0b5
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.trs
@@ -0,0 +1,159 @@
+% mm.trs --- Malayalam transcription definition for TeX pre-processor
+% copyright 1992 Jeroen Hellingman
+% last edit: 19-DEC-1992
+
+% This .TRS file defines the transcription used in the input text.
+% It translates (sequences of) ASCII-characters (patterns)
+% into the internal codes of the pre-processor.
+% You should never change the (UNICODE based) codes of the letters,
+% but you can redefine the transcription if you take care that the
+% table does not define a pattern twice, or that it is ambigious
+% otherwise.
+
+@atbegin "<malayalam>" "<ml>" "$" % this starts Malayalam text in ASCII
+@atend "</malayalam>" "</ml>" "$" % this ends Malayalam text in ASCII
+
+% @table format:
+% <pattern> <space> <command> <space> [ <parameter> ][ <comment> ]
+
+@table
+
+% vowels
+
+"a" = "\d05" % a
+"aa" = "\d06" % aa
+"A" = "\d06"
+"i" = "\d07" % i
+"ii" = "\d08" % ii
+"I" = "\d08"
+"u" = "\d09"
+"uu" = "\d10"
+"U" = "\d10"
+".r" = "\d11" % vocalic r
+".r.r" = "\d96" % vocalic rr
+".R" = "\d96"
+".l" = "\d12" % vocalic l
+".l.l" = "\d97" % vocalic ll
+".L" = "\d97"
+"e" = "\d14"
+"ee" = "\d15"
+"E" = "\d15"
+"ai" = "\d16"
+"o" = "\d18"
+"oo" = "\d19"
+"O" = "\d19"
+"au" = "\d20"
+"au\"" = "\d87" % au length mark
+
+% modifiers
+
+"M" = "\d02" % anusvara
+"H" = "\d03" % visarga
+
+% consonants will be print in cillu form if no vowel follows
+
+"k" = "\d21"
+"kh" = "\d22"
+"g" = "\d23"
+"gh" = "\d24"
+"n\"" = "\d25" % nga
+
+"c" = "\d26"
+"ch" = "\d27"
+"j" = "\d28"
+"jh" = "\d29"
+"n~" = "\d30" % nya
+
+"T" = "\d31"
+"Th" = "\d32"
+"D" = "\d33"
+"Dh" = "\d34"
+"N" = "\d35"
+
+"t" = "\d36"
+"th" = "\d37"
+"d" = "\d38"
+"dh" = "\d39"
+"n" = "\d40"
+"n_" = "\d40"
+
+"p" = "\d42"
+"ph" = "\d43"
+"f" = "\d43"
+"b" = "\d44"
+"bh" = "\d45"
+"m" = "\d46"
+
+"y" = "\d47"
+"r" = "\d48"
+"R" = "\d49"
+"t_" = "\d49"
+"l" = "\d50"
+"L" = "\d51"
+"zh" = "\d52"
+"v" = "\d53"
+"sh" = "\d54"
+"S" = "\d55"
+"s" = "\d56"
+"h" = "\d57"
+
+"+" = "\d77" % virama
+%"u+" = "\d77" % half u
+
+% digits
+
+"0" = "\d102"
+"1" = "\d103"
+"2" = "\d104"
+"3" = "\d105"
+"4" = "\d106"
+"5" = "\d107"
+"6" = "\d108"
+"7" = "\d109"
+"8" = "\d110"
+"9" = "\d111"
+
+% special (arbitrary code positions)
+
+"<<" = "\d127" % join
+">>" = "\d126" % non join
+"[]" = "\d125" % dotted circle
+" " = "\d124" % space
+"\t" = "\d124" % tab = space
+
+% interpunction
+
+% non malayalam things
+
+">" f % eliminate ambiguities
+"\\" t % copy TeX command
+"^" f % forget about capital letters
+"\\$" p "\\$"
+"%" s % skip comment
+"{" p "{"
+"}" p "}"
+"\n" p "\n" % newline
+
+% things borrowed from roman
+
+"." p "{\\RMF.}"
+"," p "{\\RMF,}"
+":" p "{\\RMF:}"
+";" p "{\\RMF;}"
+"`" p "{\\RMF`}"
+"``" p "{\\RMF``}"
+"'" p "{\\RMF'}"
+"''" p "{\\RMF''}"
+"-" p "{\\RMF-}"
+"--" p "{\\RMF--}"
+"---" p "{\\RMF---}"
+"?" p "{\\RMF?}"
+"!" p "{\\RMF!}"
+"(" p "{\\RMF(}"
+")" p "{\\RMF)}"
+"[" p "{\\RMF[}"
+"]" p "{\\RMF]}"
+"/" p "{\\RMF/}"
+"\\%" p "{\\RMF\\%}"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm.ttp b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.ttp
new file mode 100644
index 00000000000..f81f8b26a6e
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm.ttp
Binary files differ
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mm2ack.pat b/Master/texmf-dist/source/fonts/malayalam/preproc/mm2ack.pat
new file mode 100644
index 00000000000..a6b8d3922ce
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mm2ack.pat
@@ -0,0 +1,85 @@
+% mm2ack.pat --- patterns to convert my transcription to
+% transcription used in A.C.K (designed by Mathai Chundat)
+% (c) 1993 Jeroen Hellingman
+% last edit: 22-JAN-1993
+
+@patterns 0
+"<malayalam>" 1 "<malayalam>"
+"$" 1 "<malayalam>"
+
+@patterns 1
+"</malayalam>" 0 "</malayalam>"
+"$" 0 "</malayalam>"
+% vowels
+"a" p "a"
+"aa" p "aa"
+"A" p "aa"
+"i" p "i"
+"ii" p "ee"
+"I" p "ee"
+"u" p "u"
+"uu" p "oo"
+"U" p "oo"
+".r" p "R~"
+"e" p "e"
+"ee" p "E"
+"E" p "E"
+"o" p "o"
+"oo" p "O"
+"O" p "O"
+"ai" p "ai"
+"au" p "ou"
+"am" p "am"
+"H" p ":"
+"ua" p "wa" % u + a = wa (?)
+% ka
+"k" p "k"
+"kh" p "kh"
+"g" p "g"
+"gh" p "gh"
+"n\"" p "nG"
+"n\"n\"" p "nnG"
+% ca
+"c" p "ch"
+"ch" p "Ch"
+"j" p "j"
+"jh" p "jh"
+"n~" p "nJ"
+"cc" p "cch"
+"n~n~" p "nnJ"
+% Ta
+"T" p "t"
+"Th" p "T"
+"D" p "D"
+"Dh" p "Dh"
+"N" p "N"
+% ta
+"t" p "th"
+"th" p "Th"
+"d" p "d"
+"dh" p "dh"
+"n" p "n"
+"tt" p "tth"
+"tth" p "tTh"
+"tdh" p "tdh"
+"tbh" p "tbh"
+% pa
+"p" p "p"
+"ph" p "ph"
+"b" p "b"
+"bh" p "bh"
+"m" p "m"
+% yaraladikaaL
+"y" p "y"
+"r" p "r"
+"l" p "l"
+"v" p "v"
+"sh" p "S"
+"S" p "sh"
+"s" p "s"
+"h" p "h"
+"R" p "R"
+"zh" p "zh"
+"L" p "L"
+"RR" p "TT"
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.scr b/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.scr
new file mode 100644
index 00000000000..b9a8a223619
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.scr
@@ -0,0 +1,261 @@
+% mmr.scr --- Malayalam reformed script file for TeX pre-processor
+% (c) 1993 Jeroen Hellingman
+%
+% History:
+% 22-JAN-1994 changes for virama (JH)
+% 02-APR-1993 changed macro for virama (JH)
+% 28-JAN-1993 version 1.0 (Jeroen Hellingman)
+%
+% summary of used TeX commands
+% \<#1> typeset glyph #1
+% \B#1#2 put #2 centered below #1
+% \M#1#2 put #2 right below of #1
+% \T#1#2 put #1 centered on top of #2
+% \Z switch to sub-font (not used for reformed script)
+% \K kern in em's ( \def\K#1{\kern#1em} )
+% \X \def\X{\hbox}
+
+@malayalam
+% script type
+
+@atbegin "{\\mm "
+@atend "}"
+% to be placed at the begin respectively end of malayalam text
+
+@atbeginsyllabe "\\X{"
+@atendsyllabe "}"
+% to be placed at the begin repectively end of every syllabe
+
+@prebuild
+% prebuild characters: <codes, glyphs>.
+% We start with a list mapping all single characters to glyphs (i.e. TeX
+% codes to typeset them), they need to be here!
+
+"\d02" "\\<2>" % anusvara
+"\d03" "\\<3>" % visarga
+
+% vowels
+
+"\d05" "\\<5>" % a
+"\d06" "\\<6>" % aa
+"\d07" "\\<7>" % i
+"\d08" "\\<7>\\<87>" % ii
+"\d09" "\\<9>" % u
+"\d10" "\\<9>\\<87>" % uu
+"\d11" "\\<11>" % vocalic r
+"\d96" "\\<96>" % vocalic rr
+"\d12" "\\<12>" % vocalic l
+"\d97" "\\<97>" % vocalic ll
+"\d14" "\\<14>" % e
+"\d15" "\\<15>" % ee
+"\d16" "\\<70>\\<14>" % ai
+"\d18" "\\<18>" % o
+"\d19" "\\<18>\\<62>" % oo
+"\d20" "\\<18>\\<87>" % au
+"\d87" "\\<87>" % au length mark
+
+% consonants
+
+"\d21" "\\<21>" % ka
+"\d22" "\\<22>" % kha
+"\d23" "\\<23>" % ga
+"\d24" "\\<24>" % gha
+"\d25" "\\<25>" % nga
+
+"\d26" "\\<26>" % ca
+"\d27" "\\<27>" % cha
+"\d28" "\\<28>" % ja
+"\d29" "\\<29>" % jha
+"\d30" "\\<30>" % nya
+
+"\d31" "\\<31>" % Ta
+"\d32" "\\<32>" % Tha
+"\d33" "\\<33>" % Da
+"\d34" "\\<34>" % Dha
+"\d35" "\\<35>" % Na
+
+"\d36" "\\<36>" % ta
+"\d37" "\\<37>" % tha
+"\d38" "\\<38>" % da
+"\d39" "\\<39>" % dha
+"\d40" "\\<40>" % na
+
+"\d42" "\\<42>" % pa
+"\d43" "\\<43>" % pha, fa
+"\d44" "\\<44>" % ba
+"\d45" "\\<45>" % bha
+"\d46" "\\<46>" % ma
+
+"\d47" "\\<47>" % ya
+"\d48" "\\<48>" % ra
+"\d49" "\\<49>" % Ra
+"\d50" "\\<50>" % la
+"\d51" "\\<51>" % La
+"\d52" "\\<52>" % zha
+"\d53" "\\<53>" % va
+"\d54" "\\<54>" % sha
+"\d55" "\\<55>" % Sa
+"\d56" "\\<56>" % sa
+"\d57" "\\<57>" % ha
+
+% digits
+
+"\d102" "{\\mmzero}" % 0
+"\d103" "{\\mmone}" % 1
+"\d104" "{\\mmtwo}" % 2
+"\d105" "{\\mmthree}" % 3
+"\d106" "{\\mmfour}" % 4
+"\d107" "{\\mmfive}" % 5
+"\d108" "{\\mmsix}" % 6
+"\d109" "{\\mmseven}" % 7
+"\d110" "{\\mmeight}" % 8
+"\d111" "{\\mmnine}" % 9
+
+% specials
+
+"\d77" "\\<77>" % virama
+
+"\d127" "\\hbox{}" % join (dissapears)
+"\d126" "\\hbox{}" % non-join (dissapears)
+"\d125" "\\<00>" % dotted circle
+"\d125\d127" "\\<00>" % dotted circle + join
+"\d124" " " % space
+"\d124\d127" "\\hbox{}" % space + join (dissapears)
+
+% then we have a list of all conjuncts and consonant vowel combinations
+% that cannot be build by the standard algorithm, i.e. we need a ligature.
+
+"\d21\d21" "\\<160>" % k+ka
+"\d21\d55" "\\<251>" % k+Sa
+"\d21\d77" "\\<94>" % k+virama
+
+"\d23\d23" "\\<240>" % g+ga
+"\d23\d24" "\\<218>" % g+gha
+"\d23\d38" "\\<177>" % g+da
+"\d23\d38\d39" "\\<178>" % g+d+dha
+"\d23\d40" "\\<179>" % g+na
+"\d23\d46" "\\<180>" % g+ma
+
+"\d25\d25" "\\<161>" % ng+nga
+"\d25\d21" "\\<181>" % ng+ka
+
+"\d26\d26" "\\<247>" % c+ca
+
+"\d28\d28" "\\<162>" % j+ja
+"\d28\d30" "\\<184>" % j+nya
+
+"\d30\d26" "\\<185>" % ny+ca
+"\d30\d28" "\\<186>" % ny+ja
+"\d30\d30" "\\<163>" % ny+nya
+
+"\d31\d31" "\\<164>" % T+Ta
+
+"\d33\d33" "\\M{\\<33>}{\\<89>}" % D+Da
+
+"\d34\d34" "\\M{\\<34>}{\\<89>}" % Dh+Dha
+
+"\d35\d31" "\\<187>" % N+Ta
+"\d35\d33" "\\<188>" % N+Da
+"\d35\d35" "\\<241>" % N+Na
+"\d35\d77" "\\<78>" % N+virama
+
+"\d36\d36" "\\<165>" % t+ta
+"\d36\d37" "\\<36>\\K{-.5}\\<88>" % t+tha
+"\d36\d40" "\\<191>" % t+na
+"\d36\d46" "\\<190>" % t+ma
+"\d36\d56" "\\<221>" % t+sa
+"\d36\d77" "\\<81>" % t+virama
+
+"\d38\d38" "\\<166>" % d+da
+"\d38\d39" "\\<192>" % d+dha
+
+"\d40\d36" "\\<194>" % n+ta
+"\d40\d38" "\\<195>" % n+da
+"\d40\d40" "\\<167>" % n+na
+"\d40\d46" "\\<193>" % n+ma
+"\d40\d77" "\\<79>" % n+virama
+
+"\d42\d42" "\\<242>" % p+pa
+
+"\d44\d44" "\\<248>" % b+ba
+
+"\d46\d46" "\\<46>\\K{-.27}\\<46>" % m+ma
+"\d46\d77" "\\<2>" % m+virama (=anusvara)
+
+"\d47\d47" "\\<249>" % y+ya
+
+"\d48\d77" "\\<80>" % r+virama
+
+"\d49\d49" "\\<243>" % R+Ra
+"\d49\d77" "\\<80>" % R+virama
+
+"\d50\d77" "\\<81>" % l+virama
+
+"\d51\d51" "\\<51>\\K{-.2}\\<51>" % L+La
+"\d51\d77" "\\<82>" % L+virama
+
+"\d53\d53" "\\<250>" % v+va
+
+"\d54\d54" "\\<244>" % sh+sha
+
+"\d56\d56" "\\<245>" % s+sa
+
+% cillu/non-cillu variants of $k$ $y$ $n$, $N$, $m$, $t$ $l$ $L$
+
+"\d21\d127\d77" "\\mmV{\\<21>}" % $k<<+$ cillu-form of ka
+"\d47\d127\d77" "\\<95>" % $k<<+$ cillu-form of ya
+
+"\d35\d127\d77" "\\mmV{\\<35>}" % Na
+"\d36\d127\d77" "\\mmV{\\<36>}" % ta
+"\d40\d127\d77" "\\mmV{\\<40>}" % na
+"\d46\d127\d77" "\\mmV{\\<46>}" % ma
+"\d48\d127\d77" "\\mmV{\\<48>}" % ra
+"\d49\d127\d77" "\\mmV{\\<49>}" % Ra
+"\d50\d127\d77" "\\mmV{\\<50>}" % la
+"\d51\d127\d77" "\\mmV{\\<51>}" % La
+
+@secondary
+% secondary shapes of characters: <codes, glyphs, glyphs> the first set of
+% glyphs (TeX commands) comes in front of the cluster that is being build,
+% the second set comes after it.
+
+% vowels
+
+"\d05" "" "" % a
+"\d06" "" "\\<62>" % aa
+"\d07" "" "\\<63>" % i
+"\d08" "" "\\<64>" % ii
+"\d09" "" "\\<72>" % u
+"\d10" "" "\\<73>" % uu
+"\d11" "" "\\<75>" % vocalic r
+"\d96" "\\M{" "}{\\<68>}" % vocalic rr
+"\d12" "" "\\<12>" % vocalic l
+"\d97" "" "\\<97>" % vocalic ll
+"\d14" "\\<70>" "" % e
+"\d15" "\\<71>" "" % ee
+"\d16" "\\<70>\\<70>" "" % ai
+"\d18" "\\<70>" "\\<62>" % o
+"\d19" "\\<71>" "\\<62>" % oo
+"\d20" "" "\\<87>" % au
+"\d87" "\\<70>" "\\<87>" % au length mark
+"\d77" "\\mmV{" "}" % virama
+
+
+% secondary shapes of the consonants
+
+"\d47" "" "\\<83>" % secondary ya
+"\d48" "\\<74>" "" % secondary ra
+"\d50" "\\M{" "}{\\<85>}" % secondary la
+"\d53" "" "\\K{-.5}\\<86>" % secondary va
+
+@primary
+% primary shapes of characters, occurs only with "ra"
+%
+% @reepham "\\T{\\<76>}{" "}"
+%
+% "\d48" "\\T{\\<76>}{" "}" % ra
+
+"\d48" "\\<80>" "" % ra
+
+@end
+% end of file
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.trs b/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.trs
new file mode 100644
index 00000000000..047fb206921
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mmr.trs
@@ -0,0 +1,159 @@
+% mmr.trs --- Malayalam transcription definition for TeX pre-processor
+% copyright 1992 Jeroen Hellingman
+% last edit: 20-DEC-1992
+
+% This .TRS file defines the transcription used in the input text.
+% It translates (sequences of) ASCII-characters (patterns)
+% into the internal codes of the pre-processor.
+% You should never change the (UNICODE based) codes of the letters,
+% but you can redefine the transcription if you take care that the
+% table does not define a pattern twice, or that it is ambigious
+% otherwise.
+
+@atbegin "<malayalam>" "<mlr>" "$" % this starts Malayalam text in ASCII
+@atend "</malayalam>" "</mlr>" "$" % this ends Malayalam text in ASCII
+
+% @table format:
+% <pattern> <space> <command> <space> [ <parameter> ][ <comment> ]
+
+@table
+
+% vowels
+
+"a" = "\d05" % a
+"aa" = "\d06" % aa
+"A" = "\d06"
+"i" = "\d07" % i
+"ii" = "\d08" % ii
+"I" = "\d08"
+"u" = "\d09"
+"uu" = "\d10"
+"U" = "\d10"
+".r" = "\d11" % vocalic r
+".r.r" = "\d96" % vocalic rr
+".R" = "\d96"
+".l" = "\d12" % vocalic l
+".l.l" = "\d97" % vocalic ll
+".L" = "\d97"
+"e" = "\d14"
+"ee" = "\d15"
+"E" = "\d15"
+"ai" = "\d16"
+"o" = "\d18"
+"oo" = "\d19"
+"O" = "\d19"
+"au" = "\d20"
+"au\"" = "\d87" % au length mark
+
+% modifiers
+
+"M" = "\d02" % anusvara
+"H" = "\d03" % visarga
+
+% consonants will be print in cillu form if no vowel follows
+
+"k" = "\d21"
+"kh" = "\d22"
+"g" = "\d23"
+"gh" = "\d24"
+"n\"" = "\d25" % nga
+
+"c" = "\d26"
+"ch" = "\d27"
+"j" = "\d28"
+"jh" = "\d29"
+"n~" = "\d30" % nya
+
+"T" = "\d31"
+"Th" = "\d32"
+"D" = "\d33"
+"Dh" = "\d34"
+"N" = "\d35"
+
+"t" = "\d36"
+"th" = "\d37"
+"d" = "\d38"
+"dh" = "\d39"
+"n" = "\d40"
+"n_" = "\d40"
+
+"p" = "\d42"
+"ph" = "\d43"
+"f" = "\d43"
+"b" = "\d44"
+"bh" = "\d45"
+"m" = "\d46"
+
+"y" = "\d47"
+"r" = "\d48"
+"R" = "\d49"
+"t_" = "\d49"
+"l" = "\d50"
+"L" = "\d51"
+"zh" = "\d52"
+"v" = "\d53"
+"sh" = "\d54"
+"S" = "\d55"
+"s" = "\d56"
+"h" = "\d57"
+
+"+" = "\d77" % virama
+"u+" = "\d77" % half u
+
+% digits
+
+"0" = "\d102"
+"1" = "\d103"
+"2" = "\d104"
+"3" = "\d105"
+"4" = "\d106"
+"5" = "\d107"
+"6" = "\d108"
+"7" = "\d109"
+"8" = "\d110"
+"9" = "\d111"
+
+% special (arbitrary code positions)
+
+"<<" = "\d127" % join
+">>" = "\d126" % non join
+"[]" = "\d125" % dotted circle
+" " = "\d124" % space
+"\t" = "\d124" % tab = space
+
+% interpunction
+
+% non malayalam things
+
+">" f % eliminate ambiguities
+"\\" t % copy TeX command
+"^" f % forget about capital letters
+"\\$" p "\\$"
+"%" s % skip comment
+"{" p "{"
+"}" p "}"
+"\n" p "\n" % newline
+
+% things borrowed from roman
+
+"." p "{\\RMF.}"
+"," p "{\\RMF,}"
+":" p "{\\RMF:}"
+";" p "{\\RMF;}"
+"`" p "{\\RMF`}"
+"``" p "{\\RMF``}"
+"'" p "{\\RMF'}"
+"''" p "{\\RMF''}"
+"-" p "{\\RMF-}"
+"--" p "{\\RMF--}"
+"---" p "{\\RMF---}"
+"?" p "{\\RMF?}"
+"!" p "{\\RMF!}"
+"(" p "{\\RMF(}"
+")" p "{\\RMF)}"
+"[" p "{\\RMF[}"
+"]" p "{\\RMF]}"
+"/" p "{\\RMF/}"
+"\\%" p "{\\RMF\\%}"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/mmrfull.trs b/Master/texmf-dist/source/fonts/malayalam/preproc/mmrfull.trs
new file mode 100644
index 00000000000..4893aa56704
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/mmrfull.trs
@@ -0,0 +1,160 @@
+% mmrfull.trs --- Malayalam transcription definition for
+% TeX pre-processor using Malayalam font punctuation
+% copyright 1992 Jeroen Hellingman
+% last edit: 31-DEC-1992
+
+% This .TRS file defines the transcription used in the input text.
+% It translates (sequences of) ASCII-characters (patterns)
+% into the internal codes of the pre-processor.
+% You should never change the (UNICODE based) codes of the letters,
+% but you can redefine the transcription if you take care that the
+% table does not define a pattern twice, or that it is ambigious
+% otherwise.
+
+@atbegin "<malayalam>" "<mlr>" "$" % this starts Malayalam text in ASCII
+@atend "</malayalam>" "</mlr>" "$" % this ends Malayalam text in ASCII
+
+% @table format:
+% <pattern> <space> <command> <space> [ <parameter> ][ <comment> ]
+
+@table
+
+% vowels
+
+"a" = "\d05" % a
+"aa" = "\d06" % aa
+"A" = "\d06"
+"i" = "\d07" % i
+"ii" = "\d08" % ii
+"I" = "\d08"
+"u" = "\d09"
+"uu" = "\d10"
+"U" = "\d10"
+".r" = "\d11" % vocalic r
+".r.r" = "\d96" % vocalic rr
+".R" = "\d96"
+".l" = "\d12" % vocalic l
+".l.l" = "\d97" % vocalic ll
+".L" = "\d97"
+"e" = "\d14"
+"ee" = "\d15"
+"E" = "\d15"
+"ai" = "\d16"
+"o" = "\d18"
+"oo" = "\d19"
+"O" = "\d19"
+"au" = "\d20"
+"au\"" = "\d87" % au length mark
+
+% modifiers
+
+"M" = "\d02" % anusvara
+"H" = "\d03" % visarga
+
+% consonants will be print in cillu form if no vowel follows
+
+"k" = "\d21"
+"kh" = "\d22"
+"g" = "\d23"
+"gh" = "\d24"
+"n\"" = "\d25" % nga
+
+"c" = "\d26"
+"ch" = "\d27"
+"j" = "\d28"
+"jh" = "\d29"
+"n~" = "\d30" % nya
+
+"T" = "\d31"
+"Th" = "\d32"
+"D" = "\d33"
+"Dh" = "\d34"
+"N" = "\d35"
+
+"t" = "\d36"
+"th" = "\d37"
+"d" = "\d38"
+"dh" = "\d39"
+"n" = "\d40"
+"n_" = "\d40"
+
+"p" = "\d42"
+"ph" = "\d43"
+"f" = "\d43"
+"b" = "\d44"
+"bh" = "\d45"
+"m" = "\d46"
+
+"y" = "\d47"
+"r" = "\d48"
+"R" = "\d49"
+"t_" = "\d49"
+"l" = "\d50"
+"L" = "\d51"
+"zh" = "\d52"
+"v" = "\d53"
+"sh" = "\d54"
+"S" = "\d55"
+"s" = "\d56"
+"h" = "\d57"
+
+"+" = "\d77" % virama
+"u+" = "\d77" % half u
+
+% digits
+
+"0" = "\d102"
+"1" = "\d103"
+"2" = "\d104"
+"3" = "\d105"
+"4" = "\d106"
+"5" = "\d107"
+"6" = "\d108"
+"7" = "\d109"
+"8" = "\d110"
+"9" = "\d111"
+
+% special (arbitrary code positions)
+
+"<<" = "\d127" % join
+">>" = "\d126" % non join
+"[]" = "\d125" % dotted circle
+" " = "\d124" % space
+"\t" = "\d124" % tab = space
+
+% interpunction
+
+% non malayalam things
+
+">" f % eliminate ambiguities
+"\\" t % copy TeX command
+"^" f % forget about capital letters
+"\\$" p "\\$"
+"%" s % skip comment
+"{" p "{"
+"}" p "}"
+"\n" p "\n" % newline
+
+% things borrowed from roman
+
+"." p "\\<59>"
+"," p "\\<58>"
+":" p "\\<61>"
+";" p "\\<60>"
+"`" p "\\<19>"
+"``" p "\\<19>\\<19>"
+"'" p "\\<20>"
+"''" p "\\<20>\\<20>"
+"-" p "\\<69>"
+"--" p "\\<98>"
+"---" p "\\<99>"
+"?" p "\\<41>"
+"!" p "\\<13>"
+"(" p "\\<16>"
+")" p "\\<17>"
+"[" p "\\<8>"
+"]" p "\\<10>"
+"/" p "\\<4>"
+"\\%" p "{\\RMF\\%}"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.g b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.g
new file mode 100644
index 00000000000..c4936a04d5d
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.g
@@ -0,0 +1,3 @@
+echo verwijder TeX opdrachten uit een bestand:
+echo patc '-v -p d:\src\patc\detex.pat' $1 $2
+patc '-v -p d:\src\patc\detex.pat' $1 $2
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.pat b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.pat
new file mode 100644
index 00000000000..e5a02f9091e
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/detex.pat
@@ -0,0 +1,133 @@
+% detex.patc -- maak van een TeX-bestand (bijna) kale PC/ST-ASCII
+% (c) Jeroen Hellingman 1993
+% laatste wijziging: 01-MAY-1993
+
+@patterns 0
+
+"%" s skip commentaar
+"\\" T verwijder TeX commando's
+"{" f
+"}" f
+"#" f
+"&" f
+
+% math-mode proberen we niet eens (skippen)
+
+"$" 1 "$"
+"$$" 1 "$$"
+
+% index commando's \`a la The TeXbook slopen we er ook uit
+
+"^{" f
+"^^{" B skip till closing brace
+
+"<" S ">" skip till closing bracket
+
+% wat speciale dingen
+
+"\\footnote" e "\\footnote in text"
+"\\halign" e "\\halign in text"
+"\\item" e "\\item in text"
+
+"\\dots" p "..."
+"\\ " p " "
+"\\par" p "\n\n"
+"\\paragraaf" f
+"\\paragraph" f
+"\\i " p "i"
+"{\\i}" p "i"
+"\\i}" p "i"
+
+"\\#" p "#"
+"\\$" p "$"
+"\\&" p "&"
+"\\%" p "%"
+"~" p " " non-breaking space
+
+% letters met accenten, voorzover aanwezig in de Atari-ST character set.
+
+"\\c C" p "€"
+"\\c{C}" p "€"
+"\\\"u" p ""
+"\\'e" p "‚"
+"\\^a" p "ƒ"
+"\\\"a" p "„"
+"\\`a" p "…"
+"\\aa " p "†"
+"{\\aa}" p "†"
+"\\c c" p "‡"
+"\\c{c}" p "‡"
+"\\^e" p "ˆ"
+"\\\"e" p "‰"
+"\\`e" p "Š"
+"\\\"\\i " p "‹"
+"{\\\"\\i}" p "‹"
+"\\\"{\\i}" p "‹"
+"\\^\\i " p "Œ"
+"{\\^\\i}" p "Œ"
+"\\^{\\i}" p "Œ"
+"\\^\\i\\ " p "Œ "
+"\\`\\i " p ""
+"{\\`\\i}" p ""
+"\\`{\\i}" p ""
+"\\`\\i\\ " p " "
+"\\\"A" p "Ž"
+"\\AA " p ""
+"{\\AA}" p ""
+"\\'E" p ""
+"\\ae " p "‘"
+"{\\ae}" p "‘"
+"\\AE " p "’"
+"{\\AE}" p "’"
+"\\^o" p "“"
+"\\\"o" p "”"
+"\\`o" p "•"
+"\\^u" p "–"
+"\\`u" p "—"
+"\\\"O" p "™"
+"\\\"U" p "š"
+"\\ss " p "ž"
+"\\ss\\ " p "ž "
+"{\\ss}" p "ž"
+"\\'a" p " "
+"\\'\\i " p "¡"
+"{\\'\\i}" p "¡"
+"\\'{\\i}" p "¡"
+"\\'\\i\\ " p "¡ "
+"\\'o" p "¢"
+"\\'u" p "£"
+"\\~n" p "¤"
+"\\~N" p "¥"
+"`?" p "¨"
+"`!" p "­"
+"\\~a" p "°"
+"\\~o" p "±"
+"\\O " p "²"
+"{\\O}" p "²"
+"\\O\\ " p "² "
+"\\o " p "³"
+"{\\o}" p "³"
+"\\o\\ " p "³ "
+"\\oe " p "´"
+"{\\oe}" p "´"
+"\\OE " p "µ"
+"{\\OE}" p "µ"
+"\\`A" p "¶"
+"\\~A" p "·"
+"\\~O" p "¸"
+
+% letters met accenten, niet aanwezig in ST character-set
+
+"\\l " p "l" Poolse l-streep
+"{\\l}" p "l"
+"\\L " p "L" Poolse L-streep
+"{\\L}" p "L"
+
+"\\d " f dot under
+"{\\d}" f dot under
+
+@patterns 1 (voor math-mode)
+"$" 0 "$"
+"$$" 0 "$$"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.c b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.c
new file mode 100644
index 00000000000..c3c641851b1
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.c
@@ -0,0 +1,474 @@
+#define version "patc v1.1c (c) Jeroen Hellingman 01-MAY-1993\n"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include "PSTree.h"
+
+#define TRUE (1==1)
+#define FALSE (1==0)
+
+#define NUMPATS 10 /* number of pattern trees */
+#define PATLEN 50 /* maximum length of pattern */
+#define BUFSIZE 512 /* pushback buffer size (BUFSIZE >= PATLEN) */
+
+/* datatypen */
+
+typedef struct patterntree
+{ PSTree *t; /* pattern tree for this node */
+ int r; /* restrictive or not? */
+} patterntree;
+
+/* globals */
+
+FILE *infile;
+FILE *outfile;
+patterntree pat[NUMPATS];
+char *progname = "patc";
+char *patfilename = "patc.pat";
+char *infilename;
+char *outfilename;
+static int quiet = TRUE; /* be quiet */
+static int linenumber = 1; /* current line in infile */
+
+/* prototypes */
+
+void parsetables(FILE *patfile);
+void patc(void);
+void processflags(int argc, char** argv);
+void usage(void);
+void copytexcommand(void);
+void skiptexcommand(void);
+void skiptillmatchingbrace(void);
+void skiptillchar(char c1);
+void copycomment(void);
+void skipcomment(void);
+int readchar(void);
+void unreadchar(int);
+int what_escape(const char *s, char *result);
+
+/***********************************************************************/
+
+void PUSHBACK(char *c)
+/* push the characters in string c back into the inputstream, works
+ * with the pair of functions readchar() and unreadchar()
+ */
+{ int i = (int)strlen(c)-1;
+ for( ;i >= 0; i--) unreadchar((int)c[i]);
+}
+
+void main(int argc, char** argv)
+/* check arguments, intialize tables, open files
+ */
+{ FILE *patfile;
+
+ processflags(argc, argv);
+ if(!quiet) fputs(version, stderr);
+
+ patfile = fopen(patfilename, "r");
+ if(patfile==NULL)
+ { fprintf(stderr, "%s: can't open %s\n", progname, patfilename);
+ exit(2);
+ }
+ parsetables(patfile);
+ fclose(patfile);
+
+ infile = fopen(infilename, "r");
+ if(infile==NULL)
+ { fprintf(stderr, "%s: can't open %s\n", progname, infilename);
+ exit(2);
+ }
+ outfile = fopen(outfilename, "w");
+ if(outfile==NULL)
+ { fprintf(stderr, "%s: can't create %s\n", progname, outfilename);
+ exit(2);
+ }
+ patc();
+ fclose(infile);
+ fclose(outfile);
+ exit(0);
+}
+
+void processflags(int argc, char** argv)
+{ int nextoption = FALSE;
+ int i = 1;
+
+ if(argc < i+2) usage();
+ if(argv[i][0] == '-') nextoption = TRUE;
+
+ while(nextoption)
+ { switch(argv[i][1])
+ { case 'v': quiet = FALSE; break;
+ case 'p': patfilename = argv[i+1]; i++; break;
+ default: usage();
+ }
+ i++;
+ if(argc < i+2) usage();
+ if(argv[i][0] != '-') nextoption = FALSE;
+ }
+
+ infilename = argv[i];
+ outfilename = argv[i+1];
+}
+
+void usage()
+{ fprintf(stderr, "usage: %s [-v] [-p patfile] infile outfile\n", progname);
+ exit(1);
+}
+
+/***********************************************************************/
+
+int readline(char *l, FILE* infile)
+{ int i = 0;
+ int c = fgetc(infile);
+ while(isspace(c) && c != '\n' && c != EOF) c = fgetc(infile); /* skip whitespace */
+ if(c == '%') while(c != '\n' && c != EOF) c = fgetc(infile); /* skip comments */
+ while(c != '\n' && c != EOF && i < BUFSIZE)
+ { l[i] = (c == EOF) ? '\0' : (int) c;
+ i++;
+ c = getc(infile);
+ }
+ l[i] = '\0'; /* NULL-terminate */
+ return (c!=EOF);
+}
+
+int getword(char *s, char *d)
+{ int i = 0, j = 0;
+ while(isspace(s[i]) && s[i] != '\0') i++;
+ while(isalnum(s[i])) { d[j] = s[i]; j++; i++; }
+ d[j] = '\0';
+ return i;
+}
+
+int getquotedstring(const char *s, char *d)
+{ int i = 0; /* no of chars read in source */
+ int j = 0; /* no of chars inserted in destination */
+ while(isspace(s[i]) && s[i] != '\0') i++;
+
+ if(s[i] == '"')
+ { i++;
+ while(s[i] != '"')
+ { if(s[i] == '\\') /* escape char */
+ i += what_escape(&s[i], &d[j]);
+ else
+ { d[j] = s[i];
+ }
+ j++; i++;
+ }
+ }
+ d[j] = '\0'; /* NULL-terminate */
+ i++; /* skip final " */
+ return i;
+}
+
+/* Find out what escape sequence is used. If non can be found, we just
+ forget about the backslash. Interprete numbers up to 255/177/FF
+*/
+
+#define UNSIGNED(t) (char)(((t) < 0) ? (t) + 256 : (t))
+
+int what_escape(const char *s, char *result)
+{ int i = 1; /* length of escape sequence read */
+ int ok = TRUE;
+ int t = 0; /* temporary result */
+
+ switch(s[1])
+ { case '"': *result = '"'; break;
+ case '\\': *result = '\\'; break;
+ case 't': *result = '\t'; break;
+ case 'n': *result = '\n'; break;
+ case 'b': *result = '\b'; break;
+ case 'h': /* hexadecimal */
+ while(i < 3 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='9') t = t * 16 + (s[i] - '0');
+ else if(s[i]>='A' && s[i]<='F') t = t * 16 + (s[i] - 'A') + 10;
+ else if(s[i]>='a' && s[i]<='f') t = t * 16 + (s[i] - 'a') + 10;
+ else
+ { if(i==2) /* no number after \h */
+ *result = 'h';
+ else /* short number after \h */
+ *result = UNSIGNED(t);
+ i--;
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ break;
+ case 'd': /* decimal */
+ while(i < 4 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='9') t = t * 10 + (s[i] - '0');
+ else
+ { if(i==2) /* no number after \d */
+ *result = 'd';
+ else /* short number after \d */
+ *result = UNSIGNED(t);
+ i--;
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ break;
+ default: /* try octal interpretation */
+ i--;
+ while(i < 3 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='7') t = t * 8 + (s[i] - '0');
+ else
+ { if(i==1) /* no number after \ */
+ *result = s[i];
+ else /* short number after \ */
+ { *result = UNSIGNED(t);
+ i--;
+ }
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ }
+ return i;
+}
+
+void parsetables(FILE *patfile)
+{ char line[BUFSIZE];
+ char command[BUFSIZE];
+ char pattern[BUFSIZE];
+ char action[BUFSIZE];
+ char *tmp;
+ int pos = 1;
+ char notEOF = TRUE;
+ int currentpat = 0; /* current patterntree under construction */
+
+ while(notEOF)
+ { notEOF = readline(line, patfile);
+ pos = 0;
+ switch(line[0])
+ { case '\0': /* empty line */ break;
+ case '@': /* command */
+ pos++;
+ pos += tolower(getword(&line[1], command));
+ if(strcmp(command, "patterns") == 0)
+ { pos += getword(&line[pos], command);
+ currentpat = atoi(command);
+ pat[currentpat].r = FALSE;
+ }
+ else if(strcmp(command, "rpatterns") == 0)
+ { pos += getword(&line[pos], command);
+ currentpat = atoi(command);
+ pat[currentpat].r = TRUE;
+ }
+ else if(strcmp(command, "end") == 0) return;
+ else
+ { fprintf(stderr, "Error: unknown command %s\n", command);
+ exit(1);
+ }
+ break;
+ case '"': /* action */
+ pos += getquotedstring(line, pattern);
+ pos += getword(&line[pos], command);
+ pos += getquotedstring(&line[pos], &action[1]);
+ action[0] = command[0];
+ tmp = malloc(strlen(action) + 1);
+ if(tmp == NULL)
+ { fprintf(stderr, "Error: cannot allocate\n");
+ exit(3);
+ }
+ strcpy(tmp, action);
+ PSTinsert(&pat[currentpat].t, pattern, tmp);
+ break;
+ default: fprintf(stderr, "Error: illegal line '%s' in %s\n",
+ line, patfilename);
+ fprintf(stderr, "I will forget it\n");
+ }
+ }
+}
+
+/***********************************************************************/
+
+void patc()
+{ char ps[PATLEN+1]; /* pattern to be search for */
+ char *action; /* action with pattern */
+ int len = PATLEN; /* length of found pattern; part of ps to be read */
+ int current = 0; /* current active patterntree */
+ int i, j; /* counters */
+
+ while(TRUE)
+ {
+ /* fill pattern */
+ for(i = 0, j = len; j < PATLEN; i++, j++) ps[i] = ps[j];
+ for(i = PATLEN - len; i < PATLEN; i++)
+ { int c = readchar();
+ ps[i] = (c == EOF) ? '\0' : c;
+ }
+ ps[PATLEN] = '\0'; /* NULL-terminate */
+ if(ps[0] == '\0') break;
+
+ /* find action */
+
+ action = PSTmatch(pat[current].t, ps, &len);
+
+ if(len == 0)
+ { if(pat[current].r) /* complain */
+ fprintf(stderr, "Error: illegal character '%c' near line %d\n", ps[0], linenumber);
+ else /* copy silently */
+ fputc(ps[0], outfile);
+ len = 1;
+ }
+ else /* do action */
+ { switch(action[0])
+ { case 'p': fputs(&action[1], outfile); break;
+ case 'c': PUSHBACK(ps); len = PATLEN; copycomment(); break;
+ case 't': PUSHBACK(ps); len = PATLEN; copytexcommand(); break;
+ case 'T': PUSHBACK(ps); len = PATLEN; skiptexcommand(); break;
+ case 's': PUSHBACK(ps); len = PATLEN; skipcomment(); break;
+ case 'f': /* forget */ break;
+ case 'e': fprintf(stderr, "Error: %s near line %d\n", &action[1], linenumber);
+ break;
+ case 'S': PUSHBACK(ps); len = PATLEN; skiptillchar(action[1]); break;
+ case 'B': PUSHBACK(ps); len = PATLEN; skiptillmatchingbrace(); break;
+ case '0': current = 0; fputs(&action[1], outfile); break;
+ case '1': current = 1; fputs(&action[1], outfile); break;
+ case '2': current = 2; fputs(&action[1], outfile); break;
+ case '3': current = 3; fputs(&action[1], outfile); break;
+ case '4': current = 4; fputs(&action[1], outfile); break;
+ case '5': current = 5; fputs(&action[1], outfile); break;
+ case '6': current = 6; fputs(&action[1], outfile); break;
+ case '7': current = 7; fputs(&action[1], outfile); break;
+ case '8': current = 8; fputs(&action[1], outfile); break;
+ case '9': current = 9; fputs(&action[1], outfile); break;
+ default: fprintf(stderr, "Internal error: unknown action\n");
+ exit(10);
+ } /* switch */
+ } /* else */
+ } /* while */
+ if(current != 0)
+ fprintf(stderr, "Warning: mode = %d at end of file\n", current);
+} /* patc() */
+
+/***********************************************************************/
+
+void skiptillchar(char c1)
+{ char c2;
+ do
+ { c2 = readchar();
+ if(c2 == EOF) return;
+ } while(c2 != c1);
+}
+
+void skiptillmatchingbrace()
+/* skip a TeX group enclosed in braces.
+ * next brace on input opens the group to skip
+ */
+{ int i = 1;
+ int c;
+ do
+ { c = readchar();
+ if(c == EOF) return;
+ } while(c != '{');
+ while(i>0)
+ { c = readchar();
+ if(c == '{') i++;
+ if(c == '}') i--;
+ if(c == EOF) return;
+ }
+}
+
+void copytexcommand()
+/* copy TeX commmand, including preceding \
+ * this will work in plain TeX and LaTeX
+ */
+{ int c = readchar();
+ if(c=='\\')
+ { fputc(c, outfile);
+ c = readchar();
+ if(isalpha(c))
+ { while(isalpha(c))
+ { fputc(c, outfile);
+ c = readchar();
+ }
+ unreadchar(c);
+ }
+ else
+ fputc(c, outfile);
+ }
+ else
+ unreadchar(c);
+}
+
+void skiptexcommand()
+/* skip TeX commmand, including preceding \
+ * this will work in plain TeX and LaTeX
+ */
+{ int c = readchar();
+ if(c=='\\')
+ { c = readchar();
+ if(isalpha(c))
+ { while(isalpha(c))
+ { c = readchar();
+ }
+ unreadchar(c);
+ }
+ }
+ else
+ unreadchar(c);
+}
+
+
+void copycomment()
+{ int c = readchar();
+ if(c=='%')
+ { while(c != '\n' && c != EOF)
+ { fputc(c, outfile);
+ c = readchar();
+ }
+ fputc('\n', outfile);
+ }
+ else
+ unreadchar(c);
+}
+
+void skipcomment()
+{ int c = readchar();
+ if(c=='%')
+ { while(c != '\n' && c != EOF)
+ c = readchar();
+ }
+ else
+ unreadchar(c);
+}
+
+/***********************************************************************/
+/* file access with buffer */
+
+static int fbuffer[BUFSIZE]; /* buffer for file operations */
+static int last = 0; /* last + 1 used in fbuffer */
+
+int readchar()
+{ int result;
+
+ if(last==0) /* niets in buffer */
+ result = fgetc(infile);
+ else /* pak first uit buffer */
+ { last--;
+ result = fbuffer[last];
+ }
+ if(result == '\n') linenumber++;
+ return result;
+}
+
+void unreadchar(int c)
+{
+ if(last == BUFSIZE)
+ { fprintf(stderr, "%s: push-back file buffer full\n", progname);
+ exit(1);
+ }
+ else /* voeg na last in buffer */
+ { fbuffer[last] = c;
+ last++;
+ if(c == '\n') linenumber--;
+ }
+}
+
+/***********************************************************************/
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.exe b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.exe
new file mode 100644
index 00000000000..13d56541b6d
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.exe
Binary files differ
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.prj b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.prj
new file mode 100644
index 00000000000..330c52f4071
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.prj
@@ -0,0 +1,7 @@
+patc.ttp
+= ; list of modules follows...
+PCSTART.O ; startup code
+patc.c (pstree.h)
+pstree.c (pstree.h)
+PCSTDLIB.LIB ; standard library
+PCTOSLIB.LIB ; TOS library
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.ttp b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.ttp
new file mode 100644
index 00000000000..9f2834ac536
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.ttp
Binary files differ
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.txt b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.txt
new file mode 100644
index 00000000000..53e7dea25e8
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/patc.txt
@@ -0,0 +1,97 @@
+
+patc v1.1b -- a little tool to convert patterns
+
+Introduction
+------------
+patc uses a patfile, in which a set of patterns is specified,
+to chance patterns in the input to other patterns in the output, especially
+usefull if you want to chance from different transcriptions.
+
+Usage
+-----
+
+ patc [-v] [-p patfile] infile outfile
+ -v verbose mode
+
+ default patfile: "patc.pat"
+
+patc is a pattern conversion tool, that changes patterns in the input
+into other patterns in the output. It is specificly made for entering
+foreign scripts in transcriptions. patc can handle several sets of patterns
+in a file at the same time.
+
+patc scans the text from begin to end for patterns, starting with the first
+not yet used character. Whenever patc finds a pattern, it executes the
+corresponding action. This can be outputting a string, give an message,
+or switch to another set of patterns. When no pattern can be found,
+will output the first letter unchanged, and start searching again with the
+next letter, or if you want that, it will complain about it.
+
+The patterns patc can recognize are given in a patfile. A patfile consists
+of lines, that can be empty (white space or comment), contain a command, or
+a pattern with its corresponding action.
+
+Comment lines start with %, command lines with an @ and a pattern line
+with a ". Every line can end with comment.
+
+Commands:
+ @patterns # definition of patterns in set # follows
+ @rpatterns # definition of patterns in set # follows.
+ if a pattern cannot be found in the input, this
+ will generate an error message.
+ @end end of patfile
+
+A pattern line consists of the pattern inbetween double quotes, an
+action opcode, and optionally a string in between codes as an argument.
+
+Actions:
+ p string output string
+ # string output string, use pattern set # from now on.
+ e string give error message string, forget this pattern.
+ f forget this pattern (silently)
+ s skip until end of line (including this patten)
+ S string skip till first char of string
+ B skip till closing brace, matching braces)
+ c copy until end of line (including this patten)
+ t copy a TeX command
+ T skip a TeX command
+
+In strings and patterns the following escape codes can be used:
+
+ \t tab
+ \n newline
+ \" double quote
+ \\ backslash
+ \b backspace
+ \xxx character xxx octal
+ \dxxx character xxx decimal
+ \hxx character xx hexadecimal
+
+Do _not_ use character \000 !
+
+Warning
+-------
+Don't give patterns in alfabetic order. The algorithm used will show its
+worse case performance then.
+
+Wishes for future versions
+--------------------------
+* Include meta-characters, as to decrease the number of patterns.
+ Proposed syntax:
+ @META \C "b" "c" "d" "f" ... consonants
+ @META \V "a" "e" "i" "o" ... vowels
+ This is quite difficult, and requires a rethink of the underlying
+ data structures, so it will take some time. Any volunteer?
+* Make it count. (easy too)
+* More actions.
+
+Author
+------
+Jeroen Hellingman. <jhelling@cs.ruu.nl>
+'t Zand 2, 4133 TB Vianen, The Netherlands
+
+Copyright & disclaimer
+----------------------
+This program may be used, copied, and distributed by anyone who feels the
+need, but it is copyrighted by me. This is offered free as it is, I do not
+accept any responseability when it does not do what you want it to do.
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.c b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.c
new file mode 100644
index 00000000000..fa7cb8c21d0
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.c
@@ -0,0 +1,223 @@
+/*+
+
+NAME: PSTree.c --- Pattern Search Tree
+
+AUTHOR: Jeroen Hellingman
+
+ PSTree is een verzameling routines om snel patronen in een
+ multi-branch tree op te slaan en terug te vinden, zoals gebruikt
+ worden voor bijvoorbeeld spellingscheckers. Bij elk patroon
+ kunnen we een string opslaan.
+
+ De worden worden letter voor letter opgeslagen in de nodes
+ van de boom, waarbij de eerste node alle eerste letters,
+ bevat, en de tweede node voor elk van die letters, de tweede
+ letters van woorden die met die letter beginnen. Elke node
+ opzich is ook weer opgebouwd als een boom.
+
+ Per letter gebruikt deze structuur vier pointers en een
+ character geheugen ruimte (op een 68000 17 bytes), maar
+ als het woord 'automatisch' al is opgeslagen, hoeven we
+ maar een extra letter te bewaren om 'automatische' op te
+ slaan.
+
+ Op deze structuur hebben we de volgende operaties:
+
+ int PSTinsert(PSTree **tree, char *pattern, char *action);
+ voeg pattern met action toe aan tree, *tree kan NULL zijn,
+ en zal dan veranderen, resultaat: TRUE als succes, FALSE
+ anders
+
+ int PSTretract(PSTree **tree, char *pattern);
+ Nog niet geimplementeerd
+
+ char *PSTmatch(PSTree *tree, const char *pattern, int *length);
+ vind de langste match beginnend bij de pattern[0] van pattern
+ met een patroon in tree, resultaat: de actie bij dat patroon,
+ NULL als geen actie gevonden, length bevat na afloop de lengte
+ van het gematchte patroon, of 0 als geen patroon is gevonden.
+
+HISTORY:
+ 05-FEB-1992 Creation
+
+-*/
+
+#define TEST (0)
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "PSTree.h"
+
+#define TRUE (1)
+#define FALSE (0)
+
+/* private operations */
+
+PSTree *PSTfindelement(PSTree *t, char c);
+PSTree *PSTfindinsertelement(PSTree **t, char c);
+void PSTpmatch(PSTree *tree, const char *pattern, char **action, int *length, int depth);
+
+/* insert: insert p into the pattern tree:
+ TRUE: success
+ FALSE: failure (already available pattern, failure to allocate cell);
+*/
+
+int PSTinsert(PSTree **t, char *p, char *a)
+{ PSTree *first = NULL;
+
+ if(t == NULL || p == NULL || p[0] == '\0') /* sanity check */
+ return FALSE;
+
+ first = PSTfindinsertelement(t, p[0]);
+ if(first == NULL) /* element could not be added/inserted in PSTree? */
+ return FALSE;
+
+ if(p[1] == '\0') /* p[0] last element of pattern? */
+ { if(first->a == NULL) /* no action assigned yet */
+ { first->a = a;
+ return TRUE;
+ }
+ else /* i.e. pattern already in tree */
+ { return FALSE;
+ }
+ }
+ else /* not last element in pattern: insert rest of pattern */
+ return PSTinsert(&(first->n), &p[1], a);
+}
+
+
+/* PSTfindinsertelement: search for element c, return its node
+ if it can be found, create a new node with element c and all
+ pointers at NULL otherwise, and return it.
+ return NULL at failure.
+*/
+
+static PSTree *PSTfindinsertelement(PSTree **t, char c)
+{
+ if(t == NULL) /* sanity check */
+ return NULL;
+
+ if(*t == NULL) /* empty tree: create new node */
+ { *t = malloc(sizeof(PSTree));
+ if(*t == NULL) /* malloc failed */
+ return FALSE;
+ (*t)->e = c;
+ (*t)->l = NULL;
+ (*t)->r = NULL;
+ (*t)->n = NULL;
+ (*t)->a = NULL;
+ return *t;
+ }
+ else
+ { if((*t)->e == c) /* we found it */
+ return *t;
+ else if((*t)->e < c) /* then go left */
+ return PSTfindinsertelement(&((*t)->l), c);
+ else /* go right */
+ return PSTfindinsertelement(&((*t)->r), c);
+ }
+}
+
+/* PSTfindelement: search for element c, return its node
+ if it can be found return NULL at otherwise.
+*/
+
+static PSTree *PSTfindelement(PSTree *t, char c)
+{
+ if(t == NULL) /* empty tree */
+ return NULL;
+ else
+ { if(t->e == c) /* we found it */
+ return t;
+ else if(t->e < c) /* then go left */
+ return PSTfindelement(t->l, c);
+ else /* go right */
+ return PSTfindelement(t->r, c);
+ }
+}
+
+char *PSTmatch(PSTree *t, const char *p, int *length)
+{ char *action = NULL;
+ *length = 0;
+ PSTpmatch(t, p, &action, length, 1);
+ return action;
+}
+
+/* remember recursion depth to determine length of match */
+
+static void PSTpmatch(PSTree *t, const char *p, char **action, int *length, int depth)
+{ PSTree *first = NULL;
+
+ if(t == NULL || p == NULL || p[0] == '\0') /* sanity check */
+ return;
+
+ first = PSTfindelement(t, p[0]);
+ if(first == NULL) /* element not found in PSTree? */
+ return;
+
+ if(first->a != NULL) /* action for pattern so-far? */
+ { *length = depth;
+ *action = first->a;
+ }
+
+ PSTpmatch(first->n, &p[1], action, length, depth + 1);
+}
+
+
+#if TEST
+
+void PSTshow(PSTree *t)
+{
+ if(t == NULL)
+ printf("(null)\n");
+ else
+ { putchar(t->e);
+ if(t->a != NULL)
+ { putchar('[');
+ printf("%s", t->a);
+ putchar(']');
+ }
+ PSTshow(t->n);
+ putchar('L'); PSTshow(t->l);
+ putchar('R'); PSTshow(t->r);
+ }
+}
+
+
+void main()
+{
+
+ char *actie = NULL;
+ int len = 0;
+
+ PSTree *t = NULL;
+ PSTinsert(&t, "aap", "1");
+ PSTinsert(&t, "appel", "2");
+ PSTinsert(&t, "aapjes", "3");
+ PSTinsert(&t, "koe", "4");
+ PSTinsert(&t, "kokosnoot", "5");
+ PSTinsert(&t, "akker", "6");
+ PSTshow(t); puts("------------"); getchar();
+
+ actie = PSTmatch(t, "aapjesverhaal", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "aapjelief", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "appelboom", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "aster", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+ else { printf("actie: NULL lengte: %d\n", actie, len); }
+
+ exit(0);
+
+}
+
+#endif /* TEST */
+
+/* end of PSTree.c */
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.h b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.h
new file mode 100644
index 00000000000..f5c4fc4ec95
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/patc/pstree.h
@@ -0,0 +1,13 @@
+typedef struct PSTree
+{ char e; /* element in this node */
+ struct PSTree *l; /* left branch of PSTree */
+ struct PSTree *r; /* right branch of PSTree */
+ struct PSTree *n; /* PSTree for next element in pattern */
+ char *a; /* Action with pattern that ends here */
+} PSTree;
+
+/* public operations */
+
+int PSTinsert(PSTree **tree, char *pattern, char *action);
+int PSTretract(PSTree **tree, char *pattern);
+char *PSTmatch(PSTree *tree, const char *pattern, int *length);
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.c b/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.c
new file mode 100644
index 00000000000..31bc0690f3e
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.c
@@ -0,0 +1,225 @@
+/*+
+
+NAME: PSTree.c --- Pattern Search Tree
+
+AUTHOR: Jeroen Hellingman
+
+ PSTree is een verzameling routines om snel patronen in een
+ multi-branch tree op te slaan en terug te vinden, zoals gebruikt
+ worden voor bijvoorbeeld spellingscheckers. Bij elk patroon
+ kunnen we een string opslaan.
+
+ De worden worden letter voor letter opgeslagen in de nodes
+ van de boom, waarbij de eerste node alle eerste letters,
+ bevat, en de tweede node voor elk van die letters, de tweede
+ letters van woorden die met die letter beginnen. Elke node
+ opzich is ook weer opgebouwd als een boom.
+
+ Per letter gebruikt deze structuur vier pointers en een
+ character geheugen ruimte (op een 68000 17 bytes), maar
+ als het woord 'automatisch' al is opgeslagen, hoeven we
+ maar een extra letter te bewaren om 'automatische' op te
+ slaan.
+
+ Op deze structuur hebben we de volgende operaties:
+
+ int PSTinsert(PSTree **tree, char *pattern, char *action);
+ voeg pattern met action toe aan tree, *tree kan NULL zijn,
+ en zal dan veranderen, resultaat: TRUE als succes, FALSE
+ anders
+
+ int PSTretract(PSTree **tree, char *pattern);
+ Nog niet geimplementeerd
+
+ char *PSTmatch(PSTree *tree, const char *pattern, int *length);
+ vind de langste match beginnend bij de pattern[0] van pattern
+ met een patroon in tree, resultaat: de actie bij dat patroon,
+ NULL als geen actie gevonden, length bevat na afloop de lengte
+ van het gematchte patroon, of 0 als geen patroon is gevonden.
+
+HISTORY:
+ 18-DEC-1992 Last edit (JH)
+ 05-NOV-1992 declared static functions static in prototype (JH)
+ 05-FEB-1992 Creation (Jeroen Hellingman)
+
+-*/
+
+#define TEST (0)
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+#include "pstree.h"
+
+#define TRUE (1)
+#define FALSE (0)
+
+/* private operations */
+
+static PSTree *PSTfindelement(PSTree *t, char c);
+static PSTree *PSTfindinsertelement(PSTree **t, char c);
+static void PSTpmatch(PSTree *tree, const char *pattern, char **action, int *length, int depth);
+
+/* insert: insert p into the pattern tree:
+ TRUE: success
+ FALSE: failure (already available pattern, failure to allocate cell);
+*/
+
+int PSTinsert(PSTree **t, char *p, char *a)
+{ PSTree *first = NULL;
+
+ if(t == NULL || p == NULL || p[0] == '\0') /* sanity check */
+ return FALSE;
+
+ first = PSTfindinsertelement(t, p[0]);
+ if(first == NULL) /* element could not be added/inserted in PSTree? */
+ return FALSE;
+
+ if(p[1] == '\0') /* p[0] last element of pattern? */
+ { if(first->a == NULL) /* no action assigned yet */
+ { first->a = a;
+ return TRUE;
+ }
+ else /* i.e. pattern already in tree */
+ { return FALSE;
+ }
+ }
+ else /* not last element in pattern: insert rest of pattern */
+ return PSTinsert(&(first->n), &p[1], a);
+}
+
+
+/* PSTfindinsertelement: search for element c, return its node
+ if it can be found, create a new node with element c and all
+ pointers at NULL otherwise, and return it.
+ return NULL at failure.
+*/
+
+static PSTree *PSTfindinsertelement(PSTree **t, char c)
+{
+ if(t == NULL) /* sanity check */
+ return NULL;
+
+ if(*t == NULL) /* empty tree: create new node */
+ { *t = malloc(sizeof(PSTree));
+ if(*t == NULL) /* malloc failed */
+ return FALSE;
+ (*t)->e = c;
+ (*t)->l = NULL;
+ (*t)->r = NULL;
+ (*t)->n = NULL;
+ (*t)->a = NULL;
+ return *t;
+ }
+ else
+ { if((*t)->e == c) /* we found it */
+ return *t;
+ else if((*t)->e < c) /* then go left */
+ return PSTfindinsertelement(&((*t)->l), c);
+ else /* go right */
+ return PSTfindinsertelement(&((*t)->r), c);
+ }
+}
+
+/* PSTfindelement: search for element c, return its node
+ if it can be found return NULL at otherwise.
+*/
+
+static PSTree *PSTfindelement(PSTree *t, char c)
+{
+ if(t == NULL) /* empty tree */
+ return NULL;
+ else
+ { if(t->e == c) /* we found it */
+ return t;
+ else if(t->e < c) /* then go left */
+ return PSTfindelement(t->l, c);
+ else /* go right */
+ return PSTfindelement(t->r, c);
+ }
+}
+
+char *PSTmatch(PSTree *t, const char *p, int *length)
+{ char *action = NULL;
+ *length = 0;
+ PSTpmatch(t, p, &action, length, 1);
+ return action;
+}
+
+/* remember recursion depth to determine length of match */
+
+static void PSTpmatch(PSTree *t, const char *p, char **action, int *length, int depth)
+{ PSTree *first = NULL;
+
+ if(t == NULL || p == NULL || p[0] == '\0') /* sanity check */
+ return;
+
+ first = PSTfindelement(t, p[0]);
+ if(first == NULL) /* element not found in PSTree? */
+ return;
+
+ if(first->a != NULL) /* action for pattern so-far? */
+ { *length = depth;
+ *action = first->a;
+ }
+
+ PSTpmatch(first->n, &p[1], action, length, depth + 1);
+}
+
+
+#if TEST
+
+void PSTshow(PSTree *t)
+{
+ if(t == NULL)
+ printf("(null)\n");
+ else
+ { putchar(t->e);
+ if(t->a != NULL)
+ { putchar('[');
+ printf("%s", t->a);
+ putchar(']');
+ }
+ PSTshow(t->n);
+ putchar('L'); PSTshow(t->l);
+ putchar('R'); PSTshow(t->r);
+ }
+}
+
+
+void main()
+{
+
+ char *actie = NULL;
+ int len = 0;
+
+ PSTree *t = NULL;
+ PSTinsert(&t, "aap", "1");
+ PSTinsert(&t, "appel", "2");
+ PSTinsert(&t, "aapjes", "3");
+ PSTinsert(&t, "koe", "4");
+ PSTinsert(&t, "kokosnoot", "5");
+ PSTinsert(&t, "akker", "6");
+ PSTshow(t); puts("------------"); getchar();
+
+ actie = PSTmatch(t, "aapjesverhaal", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "aapjelief", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "appelboom", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+
+ actie = PSTmatch(t, "aster", &len);
+ if(actie != NULL) { printf("actie: (%s) lengte: %d\n", actie, len); }
+ else { printf("actie: NULL lengte: %d\n", actie, len); }
+
+ exit(0);
+
+}
+
+#endif /* TEST */
+
+/* end of PSTree.c */
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.h b/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.h
new file mode 100644
index 00000000000..8b2677c06b1
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/pstree.h
@@ -0,0 +1,19 @@
+#ifndef PSTREE_HEADER_READ
+#define PSTREE_HEADER_READ
+
+typedef struct PSTree
+{ char e; /* element in this node */
+ struct PSTree *l; /* left branch of PSTree */
+ struct PSTree *r; /* right branch of PSTree */
+ struct PSTree *n; /* PSTree for next element in pattern */
+ char *a; /* Action with pattern that ends here */
+} PSTree;
+
+/* public operations */
+
+int PSTinsert(PSTree **tree, char *pattern, char *action);
+int PSTretract(PSTree **tree, char *pattern);
+char *PSTmatch(PSTree *tree, const char *pattern, int *length);
+
+#endif
+/* eof */ \ No newline at end of file
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.c b/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.c
new file mode 100644
index 00000000000..5bcb01b32c5
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.c
@@ -0,0 +1,281 @@
+/*
+
+readfile.c -- read a command file
+
+get lines from a file, split up into "words", separated by spaces
+skip whitespace and comments, treats strings as a unit, interpretes
+C-like escape codes
+
+@ starts command
+% starts comment
+\ starts escape code
+" starts and ends string
+
+everything before the first command is considered comment,
+everything after @end also
+
+HISTORY:
+ 19-NOV-1992 restructuring of program (JH)
+ 22-JUL-1992 removed bug causing COMMENTCHAR in string to be interpreted (JH)
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#include "readfile.h"
+
+static char *read_line(FILE *f, char *s, int n);
+static char *read_cline(FILE *f, char *s, int n);
+static char *strlow(char *s);
+static string_list *make_string_list(char *s);
+static void skip_spaces(FILE *f);
+static void skip_line(FILE *f);
+static int getword(char *s, char *d);
+static int getquotedstring(const char *s, char *d);
+static int what_escape(const char *s, char *result);
+static string_list *get_cline(FILE *f);
+
+/********/
+
+char *get_command(FILE *f, char *command, string_list **rest)
+{
+ string_list *l;
+ /* get first line starting with "@" */
+ do
+ { l = get_cline(f);
+ if(l == NULL)
+ { return NULL;
+ }
+ }
+ while(l->s[0] != COMMANDCHAR);
+
+ strcpy(command, &(l->s)[1]);
+ strlow(command);
+ *rest = l->n;
+ free(l);
+ return command;
+}
+
+static char *strlow(char *s)
+{ char *t = s;
+ while(*t!='\0') { *t = tolower(*t); t++; }
+ return s;
+}
+
+static string_list *get_cline(FILE *f)
+{ char buffer[BUFSIZE], *s = buffer;
+ s = read_cline(f, s, BUFSIZE);
+ return make_string_list(s);
+}
+
+string_list *get_line(FILE *f)
+{ char buffer[BUFSIZE], *s = buffer;
+ s = read_line(f, s, BUFSIZE);
+ return make_string_list(s);
+}
+
+static string_list *make_string_list(char *s)
+{
+ char d[BUFSIZE];
+ int i = 0;
+ string_list *result = NULL;
+ string_list **previous = &result;
+ string_list *current = NULL;
+ int empty_quoted_string;
+
+ /* break line up into words */
+ do
+ { empty_quoted_string = FALSE;
+ while(isspace(s[i]) && s[i] != '\0' && s[i] != COMMENTCHAR) i++;
+ if(s[i] == COMMENTCHAR) break;
+ if(s[i] == '"')
+ { i += getquotedstring(&s[i], d);
+ if(d[0]=='\0') empty_quoted_string = TRUE;
+ }
+ else i += getword(&s[i], d);
+ if(d[0] != '\0' || empty_quoted_string)
+ { /* insert at end in string list */
+ long len;
+ *previous = current = (string_list*)malloc(sizeof(string_list));
+ if(current==NULL){fprintf(stderr,"can't allocate");exit(1);}
+ current->n = NULL;
+ len = strlen(d);
+ len = (len==0) ? 1 : len;
+ current->s = (char*)malloc(len);
+ if(current->s==NULL){fprintf(stderr,"can't allocate");exit(1);}
+ strcpy(current->s, d);
+ previous = &(current->n);
+ }
+ }
+ while(s[i] != '\0' && i < BUFSIZE);
+ return result;
+}
+
+
+static char *read_cline(FILE *f, char *s, int n)
+/* read until <EOF> or <NL> */
+{
+ int c;
+ int i = 0;
+
+ skip_spaces(f);
+ do
+ { c=getc(f);
+ s[i++] = (char)c;
+ if(i>=n)
+ { fprintf(stderr, "buffer full, skipping rest of line\n");
+ skip_line(f);
+ break;
+ }
+ }
+ while (c != EOF && c!= '\n');
+ s[--i]='\0';
+
+ return s;
+}
+
+static char *read_line(FILE *f, char *s, int n)
+/* read until <EOF>, COMMANDCHAR or <NL> */
+{
+ int c;
+ int i = 0;
+
+ skip_spaces(f);
+ do
+ { c=getc(f);
+ s[i++] = (char)c;
+ if(i>=n)
+ { fprintf(stderr, "buffer full, skipping rest of line\n");
+ skip_line(f);
+ break;
+ }
+ if(i == 1 && c==COMMANDCHAR)
+ { ungetc(c, f);
+ s[0] = '\0';
+ return s;
+ }
+ }
+ while (c != EOF && c!= '\n');
+ s[--i]='\0';
+
+ return s;
+}
+
+static void skip_spaces(FILE *f)
+/* skip white space and comment */
+{ int c;
+ do
+ { c=getc(f);
+ while(c==COMMENTCHAR) { skip_line(f); c = getc(f); }
+ }
+ while(isspace(c) || c == '\n');
+ ungetc(c, f);
+}
+
+static void skip_line(FILE *f)
+/* skip until <NL> */
+{ int c;
+ do { c=getc(f); } while(c != EOF && c != '\n');
+}
+
+static int getword(char *s, char *d)
+{ int i = 0, j = 0;
+ while(isspace(s[i]) && s[i] != '\0') i++;
+ while(!isspace(s[i]) && s[i] != '\0') { d[j] = s[i]; j++; i++; }
+ d[j] = '\0';
+ return i;
+}
+
+static int getquotedstring(const char *s, char *d)
+{ int i = 0; /* no of chars read in source */
+ int j = 0; /* no of chars inserted in destination */
+ while(isspace(s[i]) && s[i] != '\0') i++;
+
+ if(s[i] == '"')
+ { i++;
+ while(s[i] != '"')
+ { if(s[i] == '\\') /* escape char */
+ i += what_escape(&s[i], &d[j]);
+ else
+ { d[j] = s[i];
+ }
+ j++; i++;
+ }
+ }
+ d[j] = '\0'; /* NULL-terminate */
+ i++; /* skip final " */
+ return i;
+}
+
+/* Find out what escape sequence is used. If non can be found, we just
+ forget about the backslash. Interprete numbers up to 255/177/FF
+*/
+
+#define UNSIGNED(t) (char)(((t) < 0) ? (t) + 256 : (t))
+
+static int what_escape(const char *s, char *result)
+{ int i = 1; /* length of escape sequence read */
+ int ok = TRUE;
+ int t = 0; /* temporary result */
+
+ switch(s[1])
+ { case '"': *result = '"'; break;
+ case '\\': *result = '\\'; break;
+ case 't': *result = '\t'; break;
+ case 'n': *result = '\n'; break;
+ case 'b': *result = '\b'; break;
+ case 'h': /* hexadecimal */
+ while(i < 3 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='9') t = t * 16 + (s[i] - '0');
+ else if(s[i]>='A' && s[i]<='F') t = t * 16 + (s[i] - 'A') + 10;
+ else if(s[i]>='a' && s[i]<='f') t = t * 16 + (s[i] - 'a') + 10;
+ else
+ { if(i==2) /* no number after \h */
+ *result = 'h';
+ else /* short number after \h */
+ *result = UNSIGNED(t);
+ i--;
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ break;
+ case 'd': /* decimal */
+ while(i < 4 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='9') t = t * 10 + (s[i] - '0');
+ else
+ { if(i==2) /* no number after \d */
+ *result = 'd';
+ else /* short number after \d */
+ *result = UNSIGNED(t);
+ i--;
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ break;
+ default: /* try octal interpretation */
+ i--;
+ while(i < 3 && ok)
+ { i++;
+ if(s[i]>='0' && s[i]<='7') t = t * 8 + (s[i] - '0');
+ else
+ { if(i==1) /* no number after \ */
+ *result = s[i];
+ else /* short number after \ */
+ { *result = UNSIGNED(t);
+ i--;
+ }
+ ok = FALSE;
+ }
+ }
+ if(ok) *result = UNSIGNED(t);
+ }
+ return i;
+}
+
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.h b/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.h
new file mode 100644
index 00000000000..605d6fa3c9a
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/readfile.h
@@ -0,0 +1,21 @@
+#ifndef READFILE_HEADER_READ
+#define READFILE_HEADER_READ
+
+#define TRUE (1==1)
+#define FALSE (1==0)
+#define BUFSIZE 1024
+#define COMMANDCHAR '@'
+#define COMMENTCHAR '%'
+
+typedef struct string_list
+{ char *s;
+ struct string_list *n;
+} string_list;
+
+/* public operations */
+
+string_list *get_line(FILE *f);
+char *get_command(FILE *f, char *command, string_list **rest);
+
+#endif
+/* eof */
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c
new file mode 100644
index 00000000000..7a323e9e372
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.c
@@ -0,0 +1,185 @@
+/*
+
+scr.c -- read script table from file
+
+History:
+ 26-APR-1993 changed directory structure of source files (JH)
+ 24-DEC-1992 added ability to look in directory given by home
+ 08-OCT-1992 added support for at{end|begin}syllabe (JH)
+ 21-JUL-1992 added support for reepham (JH)
+ 06-JUL-1992 Genesis (Jeroen Hellingman)
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "scr.h"
+#include "mm.h"
+
+extern char *progname;
+extern int verbose;
+
+static AVLtree *read_prebuild(FILE *f);
+static AVLtree *read_table(FILE *f);
+
+
+scr_table *read_scr(char *filename)
+{ int stop = FALSE;
+ char b[BUFSIZE];
+ char *command=b;
+ string_list *rest=NULL;
+ scr_table *result = NULL;
+ FILE *f;
+
+ f = fopen(filename, "r");
+ if(f==NULL)
+ { filename = prepend_home(filename);
+ f = fopen(filename, "r");
+ if(f==NULL)
+ { fprintf(stderr, "%s: can't open %s\n", progname, filename);
+ exit(1);
+ }
+ }
+ if(verbose) printf("reading script definition from %s\n", filename);
+
+ result=malloc(sizeof(scr_table));
+ if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);}
+
+ result->prebuild = NULL;
+ result->primary = NULL;
+ result->secondary = NULL;
+ result->atbegin = NULL;
+ result->atend = NULL;
+ result->atbeginsyllabe = "";
+ result->atendsyllabe = "";
+ result->reepham = FALSE;
+
+ get_command(f, command, &rest);
+ if(strcmp(command, "malayalam")!=0)
+ { fprintf(stderr, "%s: script type is not malayalam\n", progname);
+ exit(0);
+ }
+ result->script_type = MALAYALAM_SCRIPT;
+
+ while(!stop)
+ { get_command(f, command, &rest);
+ if(command == NULL || strcmp(command, "end")==0)
+ { if(result->prebuild == NULL ||
+ result->atbegin == NULL ||
+ result->atend == NULL)
+ { fprintf(stderr, "%s: invalid script file &s:\n", progname, filename);
+ if(result->prebuild == NULL)
+ fprintf(stderr, "no @prebuild given\n");
+ if(result->atbegin == NULL)
+ fprintf(stderr, "no @atbegin given\n");
+ if(result->atend == NULL)
+ fprintf(stderr, "no @atend given\n");
+ exit(1);
+ }
+ stop = TRUE;
+ }
+ else /* handle commmands */
+ { if(strcmp(command, "atbegin")==0)
+ result->atbegin = rest->s;
+ else
+ { if(strcmp(command, "atend")==0)
+ result->atend = rest->s;
+ else
+ { if(strcmp(command, "prebuild")==0)
+ result->prebuild = read_prebuild(f);
+ else
+ { if(strcmp(command, "primary")==0)
+ result->primary = read_table(f);
+ else
+ { if(strcmp(command, "secondary")==0)
+ result->secondary = read_table(f);
+ else
+ { if(strcmp(command, "reepham")==0)
+ result->reepham = TRUE;
+ else
+ { if(strcmp(command, "atbeginsyllabe")==0)
+ result->atbeginsyllabe = rest->s;
+ else
+ { if(strcmp(command, "atendsyllabe")==0)
+ result->atendsyllabe = rest->s;
+ else
+ { fprintf(stderr, "unknown command @%s ignored\n", command);
+ }
+ }}}}}}}}
+ }
+ return result;
+}
+
+prebuild_char *new_prebuild_char(char *c, char *g)
+{ prebuild_char *result = NULL;
+
+ result = malloc(sizeof(prebuild_char));
+ if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);}
+
+ result->c = c;
+ result->g = g;
+
+ return result;
+}
+
+int cmp_prebuild_char(void *a, void *b)
+{ return strcmp(((prebuild_char*)a)->c, ((prebuild_char*)b)->c);
+}
+
+static AVLtree *read_prebuild(FILE *f)
+{ AVLtree *result = NULL;
+ string_list *l;
+
+ while((l = get_line(f)) != NULL)
+ {
+ if(l->n==NULL)
+ { fprintf(stderr, "incomplete line\n");
+ }
+ else
+ { prebuild_char *p = new_prebuild_char(l->s, l->n->s);
+ AVLinsert(p, &result, cmp_prebuild_char);
+ }
+ }
+ return result;
+}
+
+glyph_pair *new_glyph_pair(char *c, char *b, char *a)
+{ glyph_pair *result = NULL;
+
+ result = malloc(sizeof(glyph_pair));
+ if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);}
+
+ result->c = c;
+ result->b = b;
+ result->a = a;
+
+ return result;
+}
+
+int cmp_glyph_pair(void *a, void *b)
+{ return strcmp(((glyph_pair*)a)->c, ((glyph_pair*)b)->c);
+}
+
+static AVLtree *read_table(FILE *f)
+{ AVLtree *result = NULL;
+ string_list *l;
+
+ while((l = get_line(f)) != NULL)
+ {
+ if(l->n==NULL || l->n->n == NULL)
+ { fprintf(stderr, "incomplete line\n");
+ }
+ else
+ { glyph_pair *p = new_glyph_pair(l->s, l->n->s, l->n->n->s);
+ AVLinsert(p, &result, cmp_glyph_pair);
+ }
+ }
+ return result;
+}
+
+
+
+
+
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/scr.h b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.h
new file mode 100644
index 00000000000..416240d3067
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/scr.h
@@ -0,0 +1,39 @@
+
+#ifndef SCR_HEADER_READ
+#define SCR_HEADER_READ
+
+#include "avltree.h"
+#include "readfile.h"
+
+#define MALAYALAM_SCRIPT 13
+
+typedef struct
+{ int script_type;
+ AVLtree *prebuild; /* AVLtree of prebuild_chars, defining pre-build syllabes */
+ AVLtree *primary; /* AVLtree of glyph_pairs, defining front and final part of primary variants */
+ AVLtree *secondary; /* AVLtree of glyph_pairs, defining front and final part of secondary variants */
+ char *atbegin;
+ char *atend;
+ char *atbeginsyllabe;
+ char *atendsyllabe;
+ int reepham; /* boolean: do we use the reepham? */
+} scr_table;
+
+typedef struct
+{ char *c; /* char codes */
+ char *g; /* glyphs */
+} prebuild_char;
+
+typedef struct
+{ char *c; /* char codes */
+ char *b; /* glyphs to place before syllabe in construction */
+ char *a; /* glyphs to place after syllabe in construction */
+} glyph_pair;
+
+/* public functions */
+
+scr_table *read_scr(char *filename);
+
+#endif
+
+/* eof */
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/trs.c b/Master/texmf-dist/source/fonts/malayalam/preproc/trs.c
new file mode 100644
index 00000000000..4805c35079a
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/trs.c
@@ -0,0 +1,148 @@
+/*
+
+trs.c -- read transcription table from file
+
+History:
+ 24-DEC-1992 added ability to look in directory given by home
+ 06-JUL-1992 Genesis (Jeroen Hellingman)
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "readfile.h"
+#include "trs.h"
+#include "mm.h"
+
+extern char *progname;
+extern int verbose;
+
+static PSTree *read_table(FILE *f);
+
+trs_table *read_trs(char *filename)
+{ int stop = FALSE;
+ char b[BUFSIZE];
+ char *command=b;
+ string_list *rest=NULL;
+ trs_table *result = NULL;
+ FILE *f;
+
+ f = fopen(filename, "r");
+ if(f==NULL)
+ { filename = prepend_home(filename);
+ f = fopen(filename, "r");
+ if(f==NULL)
+ { fprintf(stderr, "%s: can't open %s\n", progname, filename);
+ exit(1);
+ }
+ }
+ if(verbose) printf("reading transcription from %s\n", filename);
+
+ result=malloc(sizeof(trs_table));
+ if(result==NULL){fprintf(stderr,"can't allocate\n");exit(0);}
+
+ while(!stop)
+ { get_command(f, command, &rest);
+ if(command == NULL || strcmp(command, "end")==0)
+ { if(result->p == NULL ||
+ result->atbegin == NULL ||
+ result->atend == NULL)
+ { fprintf(stderr, "%s: invalid transcription file &s:\n", progname, filename);
+ if(result->p == NULL)
+ fprintf(stderr, "no @table given\n");
+ if(result->atbegin == NULL)
+ fprintf(stderr, "no @atbegin given\n");
+ if(result->atend == NULL)
+ fprintf(stderr, "no @atend given\n");
+ exit(1);
+ }
+ stop = TRUE;
+ }
+ else
+ { if(strcmp(command, "atbegin")==0)
+ result->atbegin = rest;
+ else
+ { if(strcmp(command, "atend")==0)
+ result->atend = rest;
+ else
+ { if(strcmp(command, "table")==0)
+ result->p = read_table(f);
+ }
+ }
+ }
+ }
+ return result;
+}
+
+static PSTree *read_table(FILE *f)
+{ PSTree *result = NULL;
+ string_list *l, *n;
+ char *pattern;
+ char b[BUFSIZE];
+ char *action = b;
+ char *tmp = NULL;
+ int i = 1; /* length of action string */
+ int no_parameters;
+
+ while(TRUE)
+ { int ignore = FALSE;
+ l = get_line(f);
+ if(l==NULL)
+ return result;
+ else
+ {
+ /* pattern at position 1 */
+ pattern = l->s;
+ n = l->n;
+ free(l);
+ if(n==NULL)
+ { fprintf(stderr, "incomplete line\n");
+ ignore = TRUE;
+ }
+ else
+ { /* command pattern at position 2 */
+ action[0] = (n->s)[0]; /* single letter commands */
+ action[1] = '\0'; /* NULL terminate */
+ switch(action[0])
+ { case 'f':
+ case 't':
+ case 's': no_parameters = 0; break;
+ default : no_parameters = 1;
+ }
+ /* parameters pattern at position 3 */
+ while(no_parameters > 0)
+ { no_parameters--;
+ l = n->n;
+ free(n);
+ n = l;
+ if(l==NULL)
+ { fprintf(stderr, "incomplete line\n");
+ ignore = TRUE;
+ break;
+ }
+ else
+ { if (++i >= BUFSIZE)
+ { fprintf(stderr, "line too long\n");
+ ignore = TRUE;
+ break;
+ }
+ if ((i+=(int)strlen(l->s)) >= BUFSIZE)
+ { fprintf(stderr, "line too long\n");
+ ignore = TRUE;
+ break;
+ }
+ action = strcat(action, l->s);
+ }
+ }
+ }
+ }
+ if(!ignore)
+ { tmp = malloc(strlen(action));
+ if(tmp==NULL){fprintf(stderr,"can't allocate\n");exit(1);}
+ strcpy(tmp, action);
+ PSTinsert(&result, pattern, tmp);
+ }
+ }
+}
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/trs.h b/Master/texmf-dist/source/fonts/malayalam/preproc/trs.h
new file mode 100644
index 00000000000..ce5b29932f9
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/trs.h
@@ -0,0 +1,18 @@
+
+#ifndef TRS_HEADER_READ
+#define TRS_HEADER_READ
+
+#include "pstree.h"
+#include "readfile.h"
+
+typedef struct
+{ PSTree *p;
+ string_list *atbegin;
+ string_list *atend;
+} trs_table;
+
+/* public operations */
+
+trs_table *read_trs(char *filename);
+
+#endif
diff --git a/Master/texmf-dist/source/fonts/malayalam/preproc/unicode/UNICODE.TXT b/Master/texmf-dist/source/fonts/malayalam/preproc/unicode/UNICODE.TXT
new file mode 100644
index 00000000000..a86da65dd77
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/preproc/unicode/UNICODE.TXT
@@ -0,0 +1,161 @@
+
+Subject: UNICODE-tools/SGML for language tagging in UNICODE
+
+
+Since I am trying to process several languages in TeX at the same
+time, and getting a bit fed up of several preprocessors, etc.
+I want to make one universal, table driven pre-processor in awaitance of
+a TeX that really handles things correctly. I also want to have
+it produce Unicode files so that I have a good standard for storage, file
+exchange, editing, and so on.
+
+I think (dream?) of some tools to help me in this work.
+
+transcribe
+ translate to/from transcription in ASCII to Unicode
+ given some transcription tables for the languages/scripts
+ used in the document. It should do much more than placing 00 in front
+ of every byte, also in English. It should replace quotes, dashes
+ etc for the correct signs, interprete TeX commands for accented
+ letters, and so on.
+pretex
+ pre-process a unicode file for TeX, given some script tables
+ that describe the scripts used as it is encoded in a TeX-font
+sorttext
+ sort a unicode file according to the rules of a given language,
+ on a line by line or paragraph by paragraph base.
+atou
+ create `unicode' files by placing 00 in front of every byte.
+utoa
+ create `ascii' files by stripping MS-byte.
+
+
+In the original files I create (in ASCII), I want to tag the text with
+SGML-style tags indicating the languages used. Transcribe reads
+this and translates my transcription to appropriate Unicode characters.
+(Including replacing TeX commands for accented letters for appropriate
+accents/accented characters in Unicode.) Given a transcript file for
+that language.
+A transcript file includes a list of letters and their UNICODE-values
+It knows how to handle the syllabic nature of the script, although it is
+transcribed in an alphabetic script.
+The default language is english (but not english.american).
+
+Need to decide on file formats and contents of transcript files
+
+I can sort the resulting files with sorttext, given a sort-key for a
+certain language.
+
+Need to decide on file formats and contents of sort-key files
+
+I can pre-process the files for TeX with pretex, which will turn the files
+into ASCII again, but places codes for glyphs and font changes as
+neccessary for non-latin scripts, as indicated in the script file.
+For latin languages it could take care of all kinds of conventions, like the
+use of ligatures, hypenation, spacing after sentencesm etc. The tags could be
+used by spell checkers.
+
+Need to decide on file formats and contents of script files (defining
+context dependent behaviour of characters, locations of glyphs in fonts,
+etc.)
+
+----
+
+SGML-style Language tags in UNICODE
+
+how to? (are the indicators floating marks or block formers?)
+
+<malayalam>Malayalam text</malayalam>
+<block language=malayalam>Malayalam text</block>
+
+it will keep those language-markers in the UNICODE file.
+
+known languages: (languages are sometimes known in several dialects or
+otherwish variations, I suggest some kind of standard here)
+
+dutch
+english
+english.american
+english.phonetic
+french
+german
+german.fractur
+hindi
+hindi.transcription
+bahasa-indonesia
+malay
+malay.arabic
+malayalam
+malayalam.traditional
+malayalam.transcription
+marathi
+sanskrit
+sanskrit.transcription
+urdu
+
+unknown
+unknown.transcribed
+
+----
+
+UNICODE representation of Malayalam
+
+U+0D00 -- U+0D7F
+
+structure assumed in parsing:
+
+vowel
+consonant
+vowel-sign
+virama
+diacritic
+joiner
+non-joiner
+other
+
+syntax:
+
+primary ::== ( <consonant> | <vowel> ) [diacritic]
+secondary ::== ( <vowel-sign> | <virama> ) [diacritic]
+consonant-cluster ::== <primary> { [<join>|<non-join>] <virama> <primary> } | <other>
+modifiers ::== { [<join>] <secondary> }
+syllabe ::== <consonant-cluster> [<modifiers>]
+text ::== { <syllabe> }
+
+semantics:
+
+The algorithm reads a syllabe from the string.
+
+build-syllabe syllabe =
+ if prebuild syllabe
+ glyphs = prebuild syllabe
+ else
+ cluster-glyphs, rest-modifiers = build-cluster cluster with modifiers
+ glyphs = apply rest-modifiers to cluster-glyphs
+ endif
+
+build-cluster cluster with modifiers =
+ if prebuild cluster
+ glyphs = prebuild syllabe
+ else
+ split-off final ya, ra, la, try again
+ else
+ split-off front ra (for repham), try again
+ else
+ split first letter from
+ build-syllabe first-part with virama
+ build-syllabe second-part with modifiers
+ rest-modifiers = nil
+ endif
+
+apply modifiers to glyphs =
+ apply first-modifier to glyphs
+ apply rest-of-modifiers to glyphs
+
+
+
+
+The algorithm ignores joins, non-join will cause virama's to be
+used
+
+<eof>
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/adami.pat b/Master/texmf-dist/source/fonts/malayalam/tamil/adami.pat
new file mode 100644
index 00000000000..f04de4fbfb3
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/adami.pat
@@ -0,0 +1,86 @@
+% adami.pat -- patterns for ADAMI transliteration scheme for tamil.
+% Jeroen Hellingman
+% Last edit: 22-DEC-1992
+
+% a aa i ee u oo e E ai o O aw/au q
+% k/g n/NG ch n/NY t/d n/N th/dh n/nN p/b m y/Y r l v zh L R n
+% j sh s x/ksh
+
+% translates to
+
+% a aa i ii u uu e ee ai o oo au H
+% k n" c n~ T N t n p m y r l v zh L R n_
+% j S s h kS
+
+@patterns 0
+"<tamil>" 1 "<tamil>"
+"</tamil>" e "</tamil> found in roman-mode"
+"\t" p " "
+"\\" t % copy a tex command
+"%" s % skip comment
+
+@patterns 1
+"<tamil>" e "<tamil> found in tamil-mode"
+"</tamil>" 0 "</tamil>"
+"\\" t % copy a tex command
+"%" s % skip comment
+
+"a" p "a"
+"aa" p "aa"
+"i" p "i"
+"ee" p "ii"
+"u" p "u"
+"oo" p "uu"
+"e" p "e"
+"E" p "ee"
+"ai" p "ai"
+"o" p "o"
+"O" p "oo"
+"ow" p "au"
+"au" p "au"
+
+"q" p "H"
+
+"k" p "k"
+"g" p "g"
+"NG" p "n\""
+"nk" p "n\"k"
+"ng" p "n\"k"
+
+"ch" p "c"
+"j" p "j"
+"NY" p "n~"
+"nch" p "n~c"
+"nj" p "n~j"
+
+"t" p "T"
+"d" p "T"
+"N" p "N"
+"nt" p "NT"
+"nd" p "ND"
+
+"th" p "t"
+"dh" p "t"
+"nN" p "nN"
+"nth" p "nt"
+"ndh" p "nt"
+
+"p" p "p"
+"b" p "p"
+"m" p "m"
+
+"y" p "y"
+"Y" p "y"
+"r" p "r"
+"v" p "v"
+"l" p "l"
+"zh" p "zh"
+"n" p "n_"
+"L" p "L"
+"R" p "R"
+"sh" p "S"
+"s" p "s"
+"x" p "kS"
+"ksh" p "kS"
+
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.pat b/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.pat
new file mode 100644
index 00000000000..64c265dda55
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.pat
@@ -0,0 +1,496 @@
+% tamil.pat -- patterns for tamil.
+% Jeroen Hellingman
+% Last edit: 22-DEC-1992
+
+% a aa i ii u uu e ee ai o oo au H
+% ka n"a ca n~a Ta Na ta na pa ma ya ra la va zha La Ra n_a
+% ja Sa sa ha kSa
+
+@patterns 0
+"<tamil>" 1 "\\begintamil"
+"</tamil>" e "</tamil> found in roman-mode"
+"\t" p " "
+"\\" t % copy a tex command
+"%" s % skip comment
+
+@rpatterns 1
+"<tamil>" e "<tamil> found in tamil-mode"
+"</tamil>" 0 "\\endtamil"
+"\\" t % copy a tex command
+"%" s % skip comment
+%%%%%%% interpunction
+" " p " "
+"\t" p " "
+"\n" p "\n"
+"." p "{\\rm.}"
+"," p "{\\rm,}"
+":" p "{\\rm:}"
+";" p "{\\rm;}"
+"?" p "{\\rm?}"
+"!" p "{\\rm!}"
+"(" p "{\\rm(}"
+")" p "{\\rm)}"
+"`" p "{\\rm`}"
+"``" p "{\\rm``}"
+"'" p "{\\rm'}"
+"''" p "{\\rm''}"
+"-" p "{\\rm-}"
+"--" p "{\\rm--}"
+"---" p "{\\rm---}"
+%%%%%%% vowels
+"a" p "{\\TMa}"
+"aa" p "{\\TMaa}"
+"A" p "{\\TMaa}"
+"i" p "{\\TMi}"
+"ii" p "{\\TMii}"
+"I" p "{\\TMii}"
+"u" p "{\\TMu}"
+"uu" p "{\\TMuu}"
+"U" p "{\\TMuu}"
+"e" p "{\\TMe}"
+"ee" p "{\\TMee}"
+"E" p "{\\TMee}"
+"o" p "{\\TMo}"
+"oo" p "{\\TMoo}"
+"O" p "{\\TMoo}"
+"ai" p "{\\TMai}"
+"au" p "{\\TMau}"
+"H" p "{\\TMH}"
+%%%%%%% ka
+"k" p "{\\TMk}"
+"ka" p "{\\TMka}"
+"kaa" p "{\\TMkaa}"
+"kA" p "{\\TMkaa}"
+"ki" p "{\\TMki}"
+"kii" p "{\\TMkii}"
+"kI" p "{\\TMkii}"
+"ku" p "{\\TMku}"
+"kuu" p "{\\TMkuu}"
+"kU" p "{\\TMkuu}"
+"ke" p "{\\TMke}"
+"kee" p "{\\TMkee}"
+"kE" p "{\\TMkee}"
+"ko" p "{\\TMko}"
+"koo" p "{\\TMkoo}"
+"kO" p "{\\TMkoo}"
+"kai" p "{\\TMkai}"
+"kau" p "{\\TMkau}"
+%%%%%%% n"a
+"n\"" p "{\\TMng}"
+"n\"a" p "{\\TMnga}"
+"n\"aa" p "{\\TMngaa}"
+"n\"A" p "{\\TMngaa}"
+"n\"i" p "{\\TMngi}"
+"n\"ii" p "{\\TMngii}"
+"n\"I" p "{\\TMngii}"
+"n\"u" p "{\\TMngu}"
+"n\"uu" p "{\\TMnguu}"
+"n\"U" p "{\\TMnguu}"
+"n\"e" p "{\\TMnge}"
+"n\"ee" p "{\\TMngee}"
+"n\"E" p "{\\TMngee}"
+"n\"o" p "{\\TMngo}"
+"n\"oo" p "{\\TMngoo}"
+"n\"O" p "{\\TMngoo}"
+"n\"ai" p "{\\TMngai}"
+"n\"au" p "{\\TMngau}"
+%%%%%%% ca
+"c" p "{\\TMc}"
+"ca" p "{\\TMca}"
+"caa" p "{\\TMcaa}"
+"cA" p "{\\TMcaa}"
+"ci" p "{\\TMci}"
+"cii" p "{\\TMcii}"
+"cI" p "{\\TMcii}"
+"cu" p "{\\TMcu}"
+"cuu" p "{\\TMcuu}"
+"cU" p "{\\TMcuu}"
+"ce" p "{\\TMce}"
+"cee" p "{\\TMcee}"
+"cE" p "{\\TMcee}"
+"co" p "{\\TMco}"
+"coo" p "{\\TMcoo}"
+"cO" p "{\\TMcoo}"
+"cai" p "{\\TMcai}"
+"cau" p "{\\TMcau}"
+%%%%%%% n~a
+"n~" p "{\\TMNY}"
+"n~a" p "{\\TMNYa}"
+"n~aa" p "{\\TMNYaa}"
+"n~A" p "{\\TMNYaa}"
+"n~i" p "{\\TMNYi}"
+"n~ii" p "{\\TMNYii}"
+"n~I" p "{\\TMNYii}"
+"n~u" p "{\\TMNYu}"
+"n~uu" p "{\\TMNYuu}"
+"n~U" p "{\\TMNYuu}"
+"n~e" p "{\\TMNYe}"
+"n~ee" p "{\\TMNYee}"
+"n~E" p "{\\TMNYee}"
+"n~o" p "{\\TMNYo}"
+"n~oo" p "{\\TMNYoo}"
+"n~O" p "{\\TMNYoo}"
+"n~ai" p "{\\TMNYai}"
+"n~au" p "{\\TMNYau}"
+%%%%%%% Ta
+"T" p "{\\TMT}"
+"Ta" p "{\\TMTa}"
+"Taa" p "{\\TMTaa}"
+"TA" p "{\\TMTaa}"
+"Ti" p "{\\TMTi}"
+"Tii" p "{\\TMTii}"
+"TI" p "{\\TMTii}"
+"Tu" p "{\\TMTu}"
+"Tuu" p "{\\TMTuu}"
+"TU" p "{\\TMTuu}"
+"Te" p "{\\TMTe}"
+"Tee" p "{\\TMTee}"
+"TE" p "{\\TMTee}"
+"To" p "{\\TMTo}"
+"Too" p "{\\TMToo}"
+"TO" p "{\\TMToo}"
+"Tai" p "{\\TMTai}"
+"Tau" p "{\\TMTau}"
+%%%%%%% Na
+"N" p "{\\TMNN}"
+"Na" p "{\\TMNNa}"
+"Naa" p "{\\TMNNaa}"
+"NA" p "{\\TMNNaa}"
+"Ni" p "{\\TMNNi}"
+"Nii" p "{\\TMNNii}"
+"NI" p "{\\TMNNii}"
+"Nu" p "{\\TMNNu}"
+"Nuu" p "{\\TMNNuu}"
+"NU" p "{\\TMNNuu}"
+"Ne" p "{\\TMNNe}"
+"Nee" p "{\\TMNNee}"
+"NE" p "{\\TMNNee}"
+"No" p "{\\TMNNo}"
+"Noo" p "{\\TMNNoo}"
+"NO" p "{\\TMNNoo}"
+"Nai" p "{\\TMNNai}"
+"Nau" p "{\\TMNNau}"
+%%%%%%% ta
+"t" p "{\\TMt}"
+"ta" p "{\\TMta}"
+"taa" p "{\\TMtaa}"
+"tA" p "{\\TMtaa}"
+"ti" p "{\\TMti}"
+"tii" p "{\\TMtii}"
+"tI" p "{\\TMtii}"
+"tu" p "{\\TMtu}"
+"tuu" p "{\\TMtuu}"
+"tU" p "{\\TMtuu}"
+"te" p "{\\TMte}"
+"tee" p "{\\TMtee}"
+"tE" p "{\\TMtee}"
+"to" p "{\\TMto}"
+"too" p "{\\TMtoo}"
+"tO" p "{\\TMtoo}"
+"tai" p "{\\TMtai}"
+"tau" p "{\\TMtau}"
+%%%%%%% na
+"n" p "{\\TMn}"
+"na" p "{\\TMna}"
+"naa" p "{\\TMnaa}"
+"nA" p "{\\TMnaa}"
+"ni" p "{\\TMni}"
+"nii" p "{\\TMnii}"
+"nI" p "{\\TMnii}"
+"nu" p "{\\TMnu}"
+"nuu" p "{\\TMnuu}"
+"nU" p "{\\TMnuu}"
+"ne" p "{\\TMne}"
+"nee" p "{\\TMnee}"
+"nE" p "{\\TMnee}"
+"no" p "{\\TMno}"
+"noo" p "{\\TMnoo}"
+"nO" p "{\\TMnoo}"
+"nai" p "{\\TMnai}"
+"nau" p "{\\TMnau}"
+%%%%%%% pa
+"p" p "{\\TMp}"
+"pa" p "{\\TMpa}"
+"paa" p "{\\TMpaa}"
+"pA" p "{\\TMpaa}"
+"pi" p "{\\TMpi}"
+"pii" p "{\\TMpii}"
+"pI" p "{\\TMpii}"
+"pu" p "{\\TMpu}"
+"puu" p "{\\TMpuu}"
+"pU" p "{\\TMpuu}"
+"pe" p "{\\TMpe}"
+"pee" p "{\\TMpee}"
+"pE" p "{\\TMpee}"
+"po" p "{\\TMpo}"
+"poo" p "{\\TMpoo}"
+"pO" p "{\\TMpoo}"
+"pai" p "{\\TMpai}"
+"pau" p "{\\TMpau}"
+%%%%%%% ma
+"m" p "{\\TMm}"
+"ma" p "{\\TMma}"
+"maa" p "{\\TMmaa}"
+"mA" p "{\\TMmaa}"
+"mi" p "{\\TMmi}"
+"mii" p "{\\TMmii}"
+"mI" p "{\\TMmii}"
+"mu" p "{\\TMmu}"
+"muu" p "{\\TMmuu}"
+"mU" p "{\\TMmuu}"
+"me" p "{\\TMme}"
+"mee" p "{\\TMmee}"
+"mE" p "{\\TMmee}"
+"mo" p "{\\TMmo}"
+"moo" p "{\\TMmoo}"
+"mO" p "{\\TMmoo}"
+"mai" p "{\\TMmai}"
+"mau" p "{\\TMmau}"
+%%%%%%% ya
+"y" p "{\\TMy}"
+"ya" p "{\\TMya}"
+"yaa" p "{\\TMyaa}"
+"yA" p "{\\TMyaa}"
+"yi" p "{\\TMyi}"
+"yii" p "{\\TMyii}"
+"yI" p "{\\TMyii}"
+"yu" p "{\\TMyu}"
+"yuu" p "{\\TMyuu}"
+"yU" p "{\\TMyuu}"
+"ye" p "{\\TMye}"
+"yee" p "{\\TMyee}"
+"yE" p "{\\TMyee}"
+"yo" p "{\\TMyo}"
+"yoo" p "{\\TMyoo}"
+"yO" p "{\\TMyoo}"
+"yai" p "{\\TMyai}"
+"yau" p "{\\TMyau}"
+%%%%%%% ra
+"r" p "{\\TMr}"
+"ra" p "{\\TMra}"
+"raa" p "{\\TMraa}"
+"rA" p "{\\TMraa}"
+"ri" p "{\\TMri}"
+"rii" p "{\\TMrii}"
+"rI" p "{\\TMrii}"
+"ru" p "{\\TMru}"
+"ruu" p "{\\TMruu}"
+"rU" p "{\\TMruu}"
+"re" p "{\\TMre}"
+"ree" p "{\\TMree}"
+"rE" p "{\\TMree}"
+"ro" p "{\\TMro}"
+"roo" p "{\\TMroo}"
+"rO" p "{\\TMroo}"
+"rai" p "{\\TMrai}"
+"rau" p "{\\TMrau}"
+%%%%%%% la
+"l" p "{\\TMl}"
+"la" p "{\\TMla}"
+"laa" p "{\\TMlaa}"
+"lA" p "{\\TMlaa}"
+"li" p "{\\TMli}"
+"lii" p "{\\TMlii}"
+"lI" p "{\\TMlii}"
+"lu" p "{\\TMlu}"
+"luu" p "{\\TMluu}"
+"lU" p "{\\TMluu}"
+"le" p "{\\TMle}"
+"lee" p "{\\TMlee}"
+"lE" p "{\\TMlee}"
+"lo" p "{\\TMlo}"
+"loo" p "{\\TMloo}"
+"lO" p "{\\TMloo}"
+"lai" p "{\\TMlai}"
+"lau" p "{\\TMlau}"
+%%%%%%% va
+"v" p "{\\TMv}"
+"va" p "{\\TMva}"
+"vaa" p "{\\TMvaa}"
+"vA" p "{\\TMvaa}"
+"vi" p "{\\TMvi}"
+"vii" p "{\\TMvii}"
+"vI" p "{\\TMvii}"
+"vu" p "{\\TMvu}"
+"vuu" p "{\\TMvuu}"
+"vU" p "{\\TMvuu}"
+"ve" p "{\\TMve}"
+"vee" p "{\\TMvee}"
+"vE" p "{\\TMvee}"
+"vo" p "{\\TMvo}"
+"voo" p "{\\TMvoo}"
+"vO" p "{\\TMvoo}"
+"vai" p "{\\TMvai}"
+"vau" p "{\\TMvau}"
+%%%%%%% zha
+"zh" p "{\\TMZ}"
+"zha" p "{\\TMZa}"
+"zhaa" p "{\\TMZaa}"
+"zhA" p "{\\TMZaa}"
+"zhi" p "{\\TMZi}"
+"zhii" p "{\\TMZii}"
+"zhI" p "{\\TMZii}"
+"zhu" p "{\\TMZu}"
+"zhuu" p "{\\TMZuu}"
+"zhU" p "{\\TMZuu}"
+"zhe" p "{\\TMZe}"
+"zhee" p "{\\TMZee}"
+"zhE" p "{\\TMZee}"
+"zho" p "{\\TMZo}"
+"zhoo" p "{\\TMZoo}"
+"zhO" p "{\\TMZoo}"
+"zhai" p "{\\TMZai}"
+"zhau" p "{\\TMZau}"
+%%%%%%% La
+"L" p "{\\TML}"
+"La" p "{\\TMLa}"
+"Laa" p "{\\TMLaa}"
+"LA" p "{\\TMLaa}"
+"Li" p "{\\TMLi}"
+"Lii" p "{\\TMLii}"
+"LI" p "{\\TMLii}"
+"Lu" p "{\\TMLu}"
+"Luu" p "{\\TMLuu}"
+"LU" p "{\\TMLuu}"
+"Le" p "{\\TMLe}"
+"Lee" p "{\\TMLee}"
+"LE" p "{\\TMLee}"
+"Lo" p "{\\TMLo}"
+"Loo" p "{\\TMLoo}"
+"LO" p "{\\TMLoo}"
+"Lai" p "{\\TMLai}"
+"Lau" p "{\\TMLau}"
+%%%%%%% Ra
+"R" p "{\\TMR}"
+"Ra" p "{\\TMRa}"
+"Raa" p "{\\TMRaa}"
+"RA" p "{\\TMRaa}"
+"Ri" p "{\\TMRi}"
+"Rii" p "{\\TMRii}"
+"RI" p "{\\TMRii}"
+"Ru" p "{\\TMRu}"
+"Ruu" p "{\\TMRuu}"
+"RU" p "{\\TMRuu}"
+"Re" p "{\\TMRe}"
+"Ree" p "{\\TMRee}"
+"RE" p "{\\TMRee}"
+"Ro" p "{\\TMRo}"
+"Roo" p "{\\TMRoo}"
+"RO" p "{\\TMRoo}"
+"Rai" p "{\\TMRai}"
+"Rau" p "{\\TMRau}"
+%%%%%%% n_a
+"n_" p "{\\TMN}"
+"n_a" p "{\\TMNa}"
+"n_aa" p "{\\TMNaa}"
+"n_A" p "{\\TMNaa}"
+"n_i" p "{\\TMNi}"
+"n_ii" p "{\\TMNii}"
+"n_I" p "{\\TMNii}"
+"n_u" p "{\\TMNu}"
+"n_uu" p "{\\TMNuu}"
+"n_U" p "{\\TMNuu}"
+"n_e" p "{\\TMNe}"
+"n_ee" p "{\\TMNee}"
+"n_E" p "{\\TMNee}"
+"n_o" p "{\\TMNo}"
+"n_oo" p "{\\TMNoo}"
+"n_O" p "{\\TMNoo}"
+"n_ai" p "{\\TMNai}"
+"n_au" p "{\\TMNau}"
+%%%%%%% Sa
+"S" p "{\\TMS}"
+"Sa" p "{\\TMSa}"
+"Saa" p "{\\TMSaa}"
+"SA" p "{\\TMSaa}"
+"Si" p "{\\TMSi}"
+"Sii" p "{\\TMSii}"
+"SI" p "{\\TMSii}"
+"Su" p "{\\TMSu}"
+"Suu" p "{\\TMSuu}"
+"SU" p "{\\TMSuu}"
+"Se" p "{\\TMSe}"
+"See" p "{\\TMSee}"
+"SE" p "{\\TMSee}"
+"So" p "{\\TMSo}"
+"Soo" p "{\\TMSoo}"
+"SO" p "{\\TMSoo}"
+"Sai" p "{\\TMSai}"
+"Sau" p "{\\TMSau}"
+%%%%%%% sa
+"s" p "{\\TMs}"
+"sa" p "{\\TMsa}"
+"saa" p "{\\TMsaa}"
+"sA" p "{\\TMsaa}"
+"si" p "{\\TMsi}"
+"sii" p "{\\TMsii}"
+"sI" p "{\\TMsii}"
+"su" p "{\\TMsu}"
+"suu" p "{\\TMsuu}"
+"sU" p "{\\TMsuu}"
+"se" p "{\\TMse}"
+"see" p "{\\TMsee}"
+"sE" p "{\\TMsee}"
+"so" p "{\\TMso}"
+"soo" p "{\\TMsoo}"
+"sO" p "{\\TMsoo}"
+"sai" p "{\\TMsai}"
+"sau" p "{\\TMsau}"
+%%%%%%% ja
+"j" p "{\\TMj}"
+"ja" p "{\\TMja}"
+"jaa" p "{\\TMjaa}"
+"jA" p "{\\TMjaa}"
+"ji" p "{\\TMji}"
+"jii" p "{\\TMjii}"
+"jI" p "{\\TMjii}"
+"ju" p "{\\TMju}"
+"juu" p "{\\TMjuu}"
+"jU" p "{\\TMjuu}"
+"je" p "{\\TMje}"
+"jee" p "{\\TMjee}"
+"jE" p "{\\TMjee}"
+"jo" p "{\\TMjo}"
+"joo" p "{\\TMjoo}"
+"jO" p "{\\TMjoo}"
+"jai" p "{\\TMjai}"
+"jau" p "{\\TMjau}"
+%%%%%%% ha
+"h" p "{\\TMh}"
+"ha" p "{\\TMha}"
+"haa" p "{\\TMhaa}"
+"hA" p "{\\TMhaa}"
+"hi" p "{\\TMhi}"
+"hii" p "{\\TMhii}"
+"hI" p "{\\TMhii}"
+"hu" p "{\\TMhu}"
+"huu" p "{\\TMhuu}"
+"hU" p "{\\TMhuu}"
+"he" p "{\\TMhe}"
+"hee" p "{\\TMhee}"
+"hE" p "{\\TMhee}"
+"ho" p "{\\TMho}"
+"hoo" p "{\\TMhoo}"
+"hO" p "{\\TMhoo}"
+"hai" p "{\\TMhai}"
+"hau" p "{\\TMhau}"
+%%%%%%% kSa
+"kS" p "{\\TMx}"
+"kSa" p "{\\TMxa}"
+"kSaa" p "{\\TMxaa}"
+"kSA" p "{\\TMxaa}"
+"kSi" p "{\\TMxi}"
+"kSii" p "{\\TMxii}"
+"kSI" p "{\\TMxii}"
+"kSu" p "{\\TMxu}"
+"kSuu" p "{\\TMxuu}"
+"kSU" p "{\\TMxuu}"
+"kSe" p "{\\TMxe}"
+"kSee" p "{\\TMxee}"
+"kSE" p "{\\TMxee}"
+"kSo" p "{\\TMxo}"
+"kSoo" p "{\\TMxoo}"
+"kSO" p "{\\TMxoo}"
+"kSai" p "{\\TMxai}"
+"kSau" p "{\\TMxau}"
+@end
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.tex b/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.tex
new file mode 100644
index 00000000000..dbb568fcf12
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tamil.tex
@@ -0,0 +1,44 @@
+% tamil.tex -- guide for using wntml10 with Malayalam-TeX
+% Last edit: 25-DEC-1992
+
+\input tmlmacs
+\input mmtrmacs
+
+\beginsection How To Type Tamil
+
+Because all the ingredients where available and easily adaptable to
+Malayalam-\TeX, I decided to add the capability to typeset Tamil. The
+font used is {\tt wntml10}, available free from Washington State
+University. All you have to do to be able to type Tamil is say
+
+\medskip
+{\tt\bslash input tmlmacs}
+\medskip
+
+somewhere near the beginning of your document. Then you can enter
+{\it Tamil-mode} with {\tt<{}tamil>} and leave it with {\tt<{}/tamil>}.
+
+The following table shows the character(s) you have to type to produce
+a Tamil character.
+
+\bigskip
+\input tmltrans
+\bigskip
+
+When you use Tamil in your document, you have to run it once more
+through a pre-processor, to replace the transcription for \TeX-commands
+that typeset the Tamil characters. Say
+
+\medskip
+{\tt patc -p tamil.pat {\it input-file output-file}}
+\medskip
+to pre-process Tamil.
+
+If you
+have lots of text available in another transcription, you can convert
+it with {\tt patc} to this transcription. two pattern-files are
+provided. {\tt adami.pat} translates the ADAMI transcription scheme,
+and {\tt wntml.pat} translates the original transcription used
+at W.S.U.
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/test.tam b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tam
new file mode 100644
index 00000000000..1fad7894e09
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tam
@@ -0,0 +1,42 @@
+% test.tam -- test for tamil patterns
+% Jeroen Hellingman
+% last edit: 22-DEC-1992
+
+\input tmlmacs
+
+\parindent=0pt
+
+<tamil>
+a aa i ee u oo e E o O ai au
+
+ka NGa cha NYa ta Na tha nNa pa ma ya ra la va zha La Ra na
+
+ja sha sa ha ksha
+</tamil>
+
+\bigskip
+
+The following is a typical poem by Mahakavi:
+
+\medskip
+{\obeylines
+<tamil>
+ `chiRu naNdu maNal meethu padam onRu keeRum
+ chilavELai athai vanthu kadal koNdu pOkum
+ kaRi choRu pothiyOdu tharukinRa pOthum
+ kadal meethu ivaL koNda payam onRu kaaNum
+
+\medskip
+
+ veRu vaana veLi meethu mazhai vanthu cheeRum
+ veRi koNda puyal ninRu karakangaL aadum
+ eRikinRa kadal enRu manitharkaL anjaar
+ ethuvanthatheninenna athai venRu chelvaar\dots'
+</tamil>
+}
+\medskip
+
+ [from <tamil>`puthiyathoru veedu'</tamil>, published in 1989]
+
+
+\bye
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/test.tex b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tex
new file mode 100644
index 00000000000..8601cc9f6c6
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tex
@@ -0,0 +1,39 @@
+
+\input tmlmacs
+
+\parindent=0pt
+
+\begintamil
+{\TMa} {\TMaa} {\TMi} {\TMii} {\TMu} {\TMuu} {\TMe} {\TMee} {\TMo} {\TMoo} {\TMai} {\TMau}
+
+{\TMka} {\TMnga} {\TMca} {\TMNYa} {\TMTa} {\TMNNa} {\TMta} {\TMn}{\TMNNa} {\TMpa} {\TMma} {\TMya} {\TMra} {\TMla} {\TMva} {\TMZa} {\TMLa} {\TMRa} {\TMNa}
+
+{\TMja} {\TMSa} {\TMsa} {\TMha} {\TMxa}
+\endtamil
+
+\bigskip
+
+The following is a typical poem by Mahakavi:
+
+\medskip
+{\obeylines
+\begintamil
+ {\rm`}{\TMci}{\TMRu} {\TMNa}{\TMNN}{\TMTu} {\TMma}{\TMNNa}{\TMl} {\TMmii}{\TMtu} {\TMpa}{\TMTa}{\TMm} {\TMo}{\TMN}{\TMRu} {\TMkii}{\TMRu}{\TMm}
+ {\TMci}{\TMla}{\TMvee}{\TMLai} {\TMa}{\TMtai} {\TMva}{\TMn}{\TMtu} {\TMka}{\TMTa}{\TMl} {\TMko}{\TMNN}{\TMTu} {\TMpoo}{\TMku}{\TMm}
+ {\TMka}{\TMRi} {\TMco}{\TMRu} {\TMpo}{\TMti}{\TMyoo}{\TMTu} {\TMta}{\TMru}{\TMki}{\TMN}{\TMRa} {\TMpoo}{\TMtu}{\TMm}
+ {\TMka}{\TMTa}{\TMl} {\TMmii}{\TMtu} {\TMi}{\TMva}{\TML} {\TMko}{\TMNN}{\TMTa} {\TMpa}{\TMya}{\TMm} {\TMo}{\TMN}{\TMRu} {\TMkaa}{\TMNNu}{\TMm}
+
+\medskip
+
+ {\TMve}{\TMRu} {\TMvaa}{\TMNa} {\TMve}{\TMLi} {\TMmii}{\TMtu} {\TMma}{\TMZai} {\TMva}{\TMn}{\TMtu} {\TMcii}{\TMRu}{\TMm}
+ {\TMve}{\TMRi} {\TMko}{\TMNN}{\TMTa} {\TMpu}{\TMya}{\TMl} {\TMNi}{\TMN}{\TMRu} {\TMka}{\TMra}{\TMka}{\TMng}{\TMka}{\TML} {\TMaa}{\TMTu}{\TMm}
+ {\TMe}{\TMRi}{\TMki}{\TMN}{\TMRa} {\TMka}{\TMTa}{\TMl} {\TMe}{\TMN}{\TMRu} {\TMma}{\TMNi}{\TMta}{\TMr}{\TMka}{\TML} {\TMa}{\TMNY}{\TMjaa}{\TMr}
+ {\TMe}{\TMtu}{\TMva}{\TMn}{\TMta}{\TMte}{\TMNi}{\TMNe}{\TMN}{\TMNa} {\TMa}{\TMtai} {\TMve}{\TMN}{\TMRu} {\TMce}{\TMl}{\TMvaa}{\TMr}\dots{\rm'}
+\endtamil
+}
+\medskip
+
+ [from \begintamil{\rm`}{\TMpu}{\TMti}{\TMya}{\TMto}{\TMru} {\TMvii}{\TMTu}{\rm'}\endtamil, published in 1989]
+
+
+\bye
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/test.tml b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tml
new file mode 100644
index 00000000000..883beb4b04c
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/test.tml
@@ -0,0 +1,39 @@
+
+\input tmlmacs
+
+\parindent=0pt
+
+<tamil>
+a aa i ii u uu e ee o oo ai au
+
+ka n"a ca n~a Ta Na ta nNa pa ma ya ra la va zha La Ra n_a
+
+ja Sa sa ha kSa
+</tamil>
+
+\bigskip
+
+The following is a typical poem by Mahakavi:
+
+\medskip
+{\obeylines
+<tamil>
+ `ciRu n_aNTu maNal miitu paTam on_Ru kiiRum
+ cilaveeLai atai vantu kaTal koNTu pookum
+ kaRi coRu potiyooTu tarukin_Ra pootum
+ kaTal miitu ivaL koNTa payam on_Ru kaaNum
+
+\medskip
+
+ veRu vaan_a veLi miitu mazhai vantu ciiRum
+ veRi koNTa puyal n_in_Ru karakan"kaL aaTum
+ eRikin_Ra kaTal en_Ru man_itarkaL an~jaar
+ etuvantaten_in_en_n_a atai ven_Ru celvaar\dots'
+</tamil>
+}
+\medskip
+
+ [from <tamil>`putiyatoru viiTu'</tamil>, published in 1989]
+
+
+\bye
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tmlmacs.tex b/Master/texmf-dist/source/fonts/malayalam/tamil/tmlmacs.tex
new file mode 100644
index 00000000000..5b3c312c7ad
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tmlmacs.tex
@@ -0,0 +1,365 @@
+% tmlmacs.tex -- Macros for Tamil
+% Last edit: 22-DEC-1992
+
+% This file is adapted from tamilmax.tex. The following changes have
+% been made:
+% - all syllabe macros are prefixed with \TM
+% - macros for transcription removed
+% - \starttamil -> begintamil
+
+\font\tmlfnt=wntml10
+
+\def\begintamil{\begingroup\tmlfnt}
+\def\endtamil{\endgroup}
+
+\def\TMhyph{\discretionary{}{}{}}
+\def\TMviram{\accent241}
+\def\C{\char}
+
+%%%%%% macros for syllabes
+
+\def\TMzaa{\C97}
+\def\TMze{\C22}
+\def\TMzee{\C23}
+\def\TMzai{\C17}
+\def\TMzo#1{\TMze#1\TMzaa}
+\def\TMzoo#1{\TMzee#1\TMzaa}
+\def\TMzau#1{\TMze#1\TMLa}
+
+\def\TMa{\C0}
+\def\TMaa{\C1}
+\def\TMi{\C2}
+\def\TMii{\C3}
+\def\TMu{\C4}
+\def\TMuu{\C5}
+\def\TMe{\C6}
+\def\TMee{\C15}
+\def\TMai{\C7}
+\def\TMo{\C9}
+\def\TMoo{\C14}
+\def\TMau{\TMo\TMLa}
+\def\TMH{\C240}
+
+\def\TMk{\TMviram\C8\TMhyph}
+\def\TMka{\C8}
+\def\TMkaa{\C8\TMzaa}
+\def\TMki{\C10}
+\def\TMkii{\C11}
+\def\TMku{\C12}
+\def\TMkuu{\C13}
+\def\TMke{\TMze\C8}
+\def\TMkee{\TMzee\C8}
+\def\TMkai{\TMzai\C8}
+\def\TMko{\TMzo{\C8}}
+\def\TMkoo{\TMzoo{\C8}}
+\def\TMkau{\TMzau{\C8}}
+
+\def\TMng{\TMviram\C16\TMhyph}
+\def\TMnga{\C16}
+\def\TMngaa{\C16\TMzaa}
+\def\TMngi{\C18}
+\def\TMngii{\C19}
+\def\TMngu{\C20}
+\def\TMnguu{\C21}
+\def\TMnge{\TMze\C16}
+\def\TMngee{\TMzee\C16}
+\def\TMngai{\TMzai\C16}
+\def\TMngo{\TMzo{\C16}}
+\def\TMngoo{\TMzoo{\C16}}
+\def\TMngau{\TMzau{\C16}}
+
+\def\TMc{\TMviram\C24\TMhyph}
+\def\TMca{\C24}
+\def\TMcaa{\C24\TMzaa}
+\def\TMci{\C26}
+\def\TMcii{\C27}
+\def\TMcu{\C28}
+\def\TMcuu{\C29}
+\def\TMce{\TMze\C24}
+\def\TMcee{\TMzee\C24}
+\def\TMcai{\TMzai\C24}
+\def\TMco{\TMzo{\C24}}
+\def\TMcoo{\TMzoo{\C24}}
+\def\TMcau{\TMzau{\C24}}
+
+\def\TMNY{\TMviram\C32\TMhyph}
+\def\TMNYa{\C32}
+\def\TMNYaa{\C32\TMzaa}
+\def\TMNYi{\C34}
+\def\TMNYii{\C35}
+\def\TMNYu{\C36}
+\def\TMNYuu{\C37}
+\def\TMNYe{\TMze\C32}
+\def\TMNYee{\TMzee\C32}
+\def\TMNYai{\TMzai\C32}
+\def\TMNYo{\TMzo{\C32}}
+\def\TMNYoo{\TMzoo{\C32}}
+\def\TMNYau{\TMzau{\C32}}
+
+\def\TMT{\TMviram\C40\TMhyph}
+\def\TMTa{\C40}
+\def\TMTaa{\C40\TMzaa}
+\def\TMTi{\C42}
+\def\TMTii{\C43}
+\def\TMTu{\C44}
+\def\TMTuu{\C45}
+\def\TMTe{\TMze\C40}
+\def\TMTee{\TMzee\C40}
+\def\TMTai{\TMzai\C40}
+\def\TMTo{\TMzo{\C40}}
+\def\TMToo{\TMzoo{\C40}}
+\def\TMTau{\TMzau{\C40}}
+
+\def\TMNN{\TMviram\C48\TMhyph}
+\def\TMNNa{\C48}
+\def\TMNNaa{\C49}
+\def\TMNNi{\C50}
+\def\TMNNii{\C51}
+\def\TMNNu{\C52}
+\def\TMNNuu{\C53}
+\def\TMNNe{\TMze\C48}
+\def\TMNNee{\TMzee\C48}
+\def\TMNNai{\C54}
+\def\TMNNo{\TMze{\C49}}
+\def\TMNNoo{\TMzee{\C49}}
+\def\TMNNau{\TMzau{\C48}}
+
+\def\TMt{\TMviram\C56\TMhyph}
+\def\TMta{\C56}
+\def\TMtaa{\C56\TMzaa}
+\def\TMti{\C58}
+\def\TMtii{\C59}
+\def\TMtu{\C60}
+\def\TMtuu{\C61}
+\def\TMte{\TMze\C56}
+\def\TMtee{\TMzee\C56}
+\def\TMtai{\TMzai\C56}
+\def\TMto{\TMzo{\C56}}
+\def\TMtoo{\TMzoo{\C56}}
+\def\TMtau{\TMzau{\C56}}
+
+\def\TMn{\TMviram\C64\TMhyph}
+\def\TMna{\C64}
+\def\TMnaa{\C64\TMzaa}
+\def\TMni{\C66}
+\def\TMnii{\C67}
+\def\TMnu{\C68}
+\def\TMnuu{\C69}
+\def\TMne{\TMze\C64}
+\def\TMnee{\TMzee\C64}
+\def\TMnai{\TMzai\C64}
+\def\TMno{\TMzo{\C64}}
+\def\TMnoo{\TMzoo{\C64}}
+\def\TMnau{\TMzau{\C64}}
+
+\def\TMp{\TMviram\C72\TMhyph}
+\def\TMpa{\C72}
+\def\TMpaa{\C72\TMzaa}
+\def\TMpi{\C74}
+\def\TMpii{\C75}
+\def\TMpu{\C76}
+\def\TMpuu{\C77}
+\def\TMpe{\TMze\C72}
+\def\TMpee{\TMzee\C72}
+\def\TMpai{\TMzai\C72}
+\def\TMpo{\TMzo{\C72}}
+\def\TMpoo{\TMzoo{\C72}}
+\def\TMpau{\TMzau{\C72}}
+
+\def\TMm{\TMviram\C80\TMhyph}
+\def\TMma{\C80}
+\def\TMmaa{\C80\TMzaa}
+\def\TMmi{\C82}
+\def\TMmii{\C83}
+\def\TMmu{\C84}
+\def\TMmuu{\C85}
+\def\TMme{\TMze\C80}
+\def\TMmee{\TMzee\C80}
+\def\TMmai{\TMzai\C80}
+\def\TMmo{\TMzo{\C80}}
+\def\TMmoo{\TMzoo{\C80}}
+\def\TMmau{\TMzau{\C80}}
+
+\def\TMy{\TMviram\C88\TMhyph}
+\def\TMya{\C88}
+\def\TMyaa{\C88\TMzaa}
+\def\TMyi{\C90}
+\def\TMyii{\C91}
+\def\TMyu{\C92}
+\def\TMyuu{\C93}
+\def\TMye{\TMze\C88}
+\def\TMyee{\TMzee\C88}
+\def\TMyai{\TMzai\C88}
+\def\TMyo{\TMzo{\C88}}
+\def\TMyoo{\TMzoo{\C88}}
+\def\TMyau{\TMzau{\C88}}
+
+\def\TMr{\TMviram\C96\TMhyph}
+\def\TMra{\C96}
+\def\TMraa{\C96\TMzaa}
+\def\TMri{\C98}
+\def\TMrii{\C99}
+\def\TMru{\C100}
+\def\TMruu{\C101}
+\def\TMre{\TMze\C96}
+\def\TMree{\TMzee\C96}
+\def\TMrai{\TMzai\C96}
+\def\TMro{\TMzo{\C96}}
+\def\TMroo{\TMzoo{\C96}}
+\def\TMrau{\TMzau{\C96}}
+
+\def\TMl{\TMviram\C104\TMhyph}
+\def\TMla{\C104}
+\def\TMlaa{\C104\TMzaa}
+\def\TMli{\C106}
+\def\TMlii{\C107}
+\def\TMlu{\C108}
+\def\TMluu{\C109}
+\def\TMle{\TMze\C104}
+\def\TMlee{\TMzee\C104}
+\def\TMlai{\C110}
+\def\TMlo{\TMzo{\C104}}
+\def\TMloo{\TMzoo{\C104}}
+\def\TMlau{\TMzau{\C104}}
+
+\def\TMv{\TMviram\C112\TMhyph}
+\def\TMva{\C112}
+\def\TMvaa{\C112\TMzaa}
+\def\TMvi{\C114}
+\def\TMvii{\C115}
+\def\TMvu{\C116}
+\def\TMvuu{\C117}
+\def\TMve{\TMze\C112}
+\def\TMvee{\TMzee\C112}
+\def\TMvai{\TMzai\C112}
+\def\TMvo{\TMzo{\C112}}
+\def\TMvoo{\TMzoo{\C112}}
+\def\TMvau{\TMzau{\C112}}
+
+\def\TMZ{\TMviram\C120\TMhyph}
+\def\TMZa{\C120}
+\def\TMZaa{\C120\TMzaa}
+\def\TMZi{\C122}
+\def\TMZii{\C123}
+\def\TMZu{\C124}
+\def\TMZuu{\C125}
+\def\TMZe{\TMze\C120}
+\def\TMZee{\TMzee\C120}
+\def\TMZai{\TMzai\C120}
+\def\TMZo{\TMzo{\C120}}
+\def\TMZoo{\TMzoo{\C120}}
+\def\TMZau{\TMzau{\C120}}
+
+\def\TML{\TMviram\C128\TMhyph}
+\def\TMLa{\C128}
+\def\TMLaa{\C128\TMzaa}
+\def\TMLi{\C130}
+\def\TMLii{\C131}
+\def\TMLu{\C132}
+\def\TMLuu{\C133}
+\def\TMLe{\TMze\C128}
+\def\TMLee{\TMzee\C128}
+\def\TMLai{\C134}
+\def\TMLo{\TMzo{\C128}}
+\def\TMLoo{\TMzoo{\C128}}
+\def\TMLau{\TMzau{\C128}}
+
+\def\TMR{\TMviram\C136\TMhyph}
+\def\TMRa{\C136}
+\def\TMRaa{\C137}
+\def\TMRi{\C138}
+\def\TMRii{\C139}
+\def\TMRu{\C140}
+\def\TMRuu{\C141}
+\def\TMRe{\TMze\C136}
+\def\TMRee{\TMzee\C136}
+\def\TMRai{\TMzai\C136}
+\def\TMRo{\TMze{\C137}}
+\def\TMRoo{\TMzee{\C137}}
+\def\TMRau{\TMzau{\C136}}
+
+\def\TMN{\TMviram\C144\TMhyph}
+\def\TMNa{\C144}
+\def\TMNaa{\C145}
+\def\TMNi{\C146}
+\def\TMNii{\C147}
+\def\TMNu{\C148}
+\def\TMNuu{\C149}
+\def\TMNe{\TMze\C144}
+\def\TMNee{\TMzee\C144}
+\def\TMNai{\C150}
+\def\TMNo{\TMze{\C145}}
+\def\TMNoo{\TMzee{\C145}}
+\def\TMNau{\TMzau{\C144}}
+
+\def\TMS{\TMviram\C176\TMhyph}
+\def\TMSa{\C176}
+\def\TMSaa{\C176\TMzaa}
+\def\TMSi{\C178}
+\def\TMSii{\C179}
+\def\TMSu{\C176\C242}
+\def\TMSuu{\C176\C243}
+\def\TMSe{\TMze\C176}
+\def\TMSee{\TMzee\C176}
+\def\TMSai{\TMzai\C176}
+\def\TMSo{\TMzo{\C176}}
+\def\TMSoo{\TMzoo{\C176}}
+\def\TMSau{\TMzau{\C176}}
+
+\def\TMs{\TMviram\C184\TMhyph}
+\def\TMsa{\C184}
+\def\TMsaa{\C184\TMzaa}
+\def\TMsi{\C186}
+\def\TMsii{\C187}
+\def\TMsu{\C184\C242}
+\def\TMsuu{\C184\C243}
+\def\TMse{\TMze\C184}
+\def\TMsee{\TMzee\C184}
+\def\TMsai{\TMzai\C184}
+\def\TMso{\TMzo{\C184}}
+\def\TMsoo{\TMzoo{\C184}}
+\def\TMsau{\TMzau{\C184}}
+
+\def\TMj{\TMviram\C192\TMhyph}
+\def\TMja{\C192}
+\def\TMjaa{\C192\TMzaa}
+\def\TMji{\C194}
+\def\TMjii{\C195}
+\def\TMju{\C192\C242}
+\def\TMjuu{\C192\C243}
+\def\TMje{\TMze\C192}
+\def\TMjee{\TMzee\C192}
+\def\TMjai{\TMzai\C192}
+\def\TMjo{\TMzo{\C192}}
+\def\TMjoo{\TMzoo{\C192}}
+\def\TMjau{\TMzau{\C192}}
+
+\def\TMh{\TMviram\C200\TMhyph}
+\def\TMha{\C200}
+\def\TMhaa{\C200\TMzaa}
+\def\TMhi{\C202}
+\def\TMhii{\C203}
+\def\TMhu{\C200\C242}
+\def\TMhuu{\C200\C243}
+\def\TMhe{\TMze\C200}
+\def\TMhee{\TMzee\C200}
+\def\TMhai{\TMzai\C200}
+\def\TMho{\TMzo{\C200}}
+\def\TMhoo{\TMzoo{\C200}}
+\def\TMhau{\TMzau{\C200}}
+
+\def\TMx{\TMviram\C208\TMhyph}
+\def\TMxa{\C208}
+\def\TMxaa{\C208\TMzaa}
+\def\TMxi{\C210}
+\def\TMxii{\C211}
+\def\TMxu{\C208\C242}
+\def\TMxuu{\C208\C243}
+\def\TMxe{\TMze\C208}
+\def\TMxee{\TMzee\C208}
+\def\TMxai{\TMzai\C208}
+\def\TMxo{\TMzo{\C208}}
+\def\TMxoo{\TMzoo{\C208}}
+\def\TMxau{\TMzau{\C208}}
+
+% end of tmlmacs.tex
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tex b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tex
new file mode 100644
index 00000000000..fba98182f31
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tex
@@ -0,0 +1,52 @@
+
+\bgroup
+\def\tmlstrut{\vtop to4pt{}\vbox to10pt{}}
+\def\q{\quad\hfill}
+\def\x{\vrule\ }
+\def\xx{\vrule width.8pt}
+\offinterlineskip
+\halign{\tmlstrut\xx\ \tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\cr
+\noalign{\hrule height.8pt}
+a & \begintamil{\TMa}\endtamil & {\mmtr a} &
+ka & \begintamil{\TMka}\endtamil & {\mmtr ka} &
+va & \begintamil{\TMva}\endtamil & {\mmtr va} \cr
+aa, A & \begintamil{\TMaa}\endtamil & {\mmtr \=a} &
+n"a & \begintamil{\TMnga}\endtamil & {\mmtr \.na} &
+zha & \begintamil{\TMZa}\endtamil & {\mmtr \b za} \cr
+i & \begintamil{\TMi}\endtamil & {\mmtr i} &
+ca & \begintamil{\TMca}\endtamil & {\mmtr ca} &
+La & \begintamil{\TMLa}\endtamil & {\mmtr \d la} \cr
+ii, I & \begintamil{\TMii}\endtamil & {\mmtr {\=\i}} &
+n\~{}a & \begintamil{\TMNYa}\endtamil & {\mmtr \~na} &
+Ra & \begintamil{\TMRa}\endtamil & {\mmtr \b ra} \cr
+u & \begintamil{\TMu}\endtamil & {\mmtr u} &
+Ta & \begintamil{\TMTa}\endtamil & {\mmtr \d ta} &
+n\_a & \begintamil{\TMNa}\endtamil & {\mmtr \b na} \cr
+uu, U & \begintamil{\TMuu}\endtamil & {\mmtr \=u} &
+Na & \begintamil{\TMNNa}\endtamil & {\mmtr \d na} &
+ja & \begintamil{\TMja}\endtamil & {\mmtr ja} \cr
+e & \begintamil{\TMe}\endtamil & {\mmtr e} &
+ta & \begintamil{\TMta}\endtamil & {\mmtr ta} &
+Sa & \begintamil{\TMSa}\endtamil & {\mmtr \d sa} \cr
+ee, E & \begintamil{\TMee}\endtamil & {\mmtr \=e} &
+na & \begintamil{\TMna}\endtamil & {\mmtr na} &
+sa & \begintamil{\TMsa}\endtamil & {\mmtr sa} \cr
+ai & \begintamil{\TMai}\endtamil & {\mmtr ai} &
+pa & \begintamil{\TMpa}\endtamil & {\mmtr pa} &
+ha & \begintamil{\TMha}\endtamil & {\mmtr ha} \cr
+o & \begintamil{\TMo}\endtamil & {\mmtr o} &
+ma & \begintamil{\TMma}\endtamil & {\mmtr ma} &
+kSa & \begintamil{\TMxa}\endtamil & {\mmtr k\d sa} \cr
+oo, O & \begintamil{\TMoo}\endtamil & {\mmtr \=o} &
+ya & \begintamil{\TMya}\endtamil & {\mmtr ya} &
+ & & \cr
+au & \begintamil{\TMau}\endtamil & {\mmtr au} &
+ra & \begintamil{\TMra}\endtamil & {\mmtr ra} &
+ & & \cr
+H & \begintamil{\TMH}\endtamil & {\mmtr \d h} &
+la & \begintamil{\TMla}\endtamil & {\mmtr la} &
+ & & \cr
+\noalign{\hrule height.8pt}
+}\egroup
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tml b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tml
new file mode 100644
index 00000000000..afaef08cdad
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.tml
@@ -0,0 +1,52 @@
+
+\bgroup
+\def\tmlstrut{\vtop to4pt{}\vbox to10pt{}}
+\def\q{\quad\hfill}
+\def\x{\vrule\ }
+\def\xx{\vrule width.8pt}
+\offinterlineskip
+\halign{\tmlstrut\xx\ \tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\cr
+\noalign{\hrule height.8pt}
+a & <tamil>a</tamil> & {\mmtr a} &
+ka & <tamil>ka</tamil> & {\mmtr ka} &
+va & <tamil>va</tamil> & {\mmtr va} \cr
+aa, A & <tamil>aa</tamil> & {\mmtr \=a} &
+n"a & <tamil>n"a</tamil> & {\mmtr \.na} &
+zha & <tamil>zha</tamil> & {\mmtr \b la} \cr
+i & <tamil>i</tamil> & {\mmtr i} &
+ca & <tamil>ca</tamil> & {\mmtr ca} &
+La & <tamil>La</tamil> & {\mmtr \d la} \cr
+ii, I & <tamil>ii</tamil> & {\mmtr {\=\i}} &
+n\~{}a & <tamil>n~a</tamil> & {\mmtr \~na} &
+Ra & <tamil>Ra</tamil> & {\mmtr \b ra} \cr
+u & <tamil>u</tamil> & {\mmtr u} &
+Ta & <tamil>Ta</tamil> & {\mmtr \d ta} &
+n\_a & <tamil>n_a</tamil> & {\mmtr \b na} \cr
+uu, U & <tamil>uu</tamil> & {\mmtr \=u} &
+Na & <tamil>Na</tamil> & {\mmtr \d na} &
+ja & <tamil>ja</tamil> & {\mmtr ja} \cr
+e & <tamil>e</tamil> & {\mmtr e} &
+ta & <tamil>ta</tamil> & {\mmtr ta} &
+Sa & <tamil>Sa</tamil> & {\mmtr \d sa} \cr
+ee, E & <tamil>ee</tamil> & {\mmtr \=e} &
+na & <tamil>na</tamil> & {\mmtr na} &
+sa & <tamil>sa</tamil> & {\mmtr sa} \cr
+ai & <tamil>ai</tamil> & {\mmtr ai} &
+pa & <tamil>pa</tamil> & {\mmtr pa} &
+ha & <tamil>ha</tamil> & {\mmtr ha} \cr
+o & <tamil>o</tamil> & {\mmtr o} &
+ma & <tamil>ma</tamil> & {\mmtr ma} &
+kSa & <tamil>kSa</tamil> & {\mmtr k\d sa} \cr
+oo, O & <tamil>oo</tamil> & {\mmtr \=o} &
+ya & <tamil>ya</tamil> & {\mmtr ya} &
+ & & \cr
+au & <tamil>au</tamil> & {\mmtr au} &
+ra & <tamil>ra</tamil> & {\mmtr ra} &
+ & & \cr
+H & <tamil>H</tamil> & {\mmtr \d h} &
+la & <tamil>la</tamil> & {\mmtr la} &
+ & & \cr
+\noalign{\hrule height.8pt}
+}\egroup
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.txt b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.txt
new file mode 100644
index 00000000000..0fb57129cc4
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/tmltrans.txt
@@ -0,0 +1,55 @@
+% tmltrans.tml -- Tamil transcription table
+% (c) Jeroen Hellingman 1992
+% Last edit: 22-DEC-1992
+
+\bgroup
+\def\tmlstrut{\vtop to4pt{}\vbox to10pt{}}
+\def\q{\quad\hfill}
+\def\x{\vrule\ }
+\def\xx{\vrule width.8pt}
+\offinterlineskip
+\halign{\tmlstrut\xx\ \tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\ &\tt#\q&\x#\q&\x#\q\xx\cr
+\noalign{\hrule height.8pt}
+a & <tamil>a</tamil> & $$a$$ &
+ka & <tamil>ka</tamil> & $$ka$$ &
+va & <tamil>va</tamil> & $$va$$ \cr
+aa, A & <tamil>aa</tamil> & $$aa$$ &
+n"a & <tamil>n"a</tamil> & $$n"a$$ &
+zha & <tamil>zha</tamil> & $$zha$$ \cr
+i & <tamil>i</tamil> & $$i$$ &
+ca & <tamil>ca</tamil> & $$ca$$ &
+La & <tamil>La</tamil> & $$La$$ \cr
+ii, I & <tamil>ii</tamil> & $$ii$$ &
+n\~{}a & <tamil>n~a</tamil> & $$n~a$$ &
+Ra & <tamil>Ra</tamil> & $$Ra$$ \cr
+u & <tamil>u</tamil> & $$u$$ &
+Ta & <tamil>Ta</tamil> & $$Ta$$ &
+n\_a & <tamil>n_a</tamil> & $$n_a$$ \cr
+uu, U & <tamil>uu</tamil> & $$uu$$ &
+Na & <tamil>Na</tamil> & $$Na$$ &
+ja & <tamil>ja</tamil> & $$ja$$ \cr
+e & <tamil>e</tamil> & $$e$$ &
+ta & <tamil>ta</tamil> & $$ta$$ &
+Sa & <tamil>Sa</tamil> & $$Sa$$ \cr
+ee, E & <tamil>ee</tamil> & $$ee$$ &
+na & <tamil>na</tamil> & $$na$$ &
+sa & <tamil>sa</tamil> & $$sa$$ \cr
+ai & <tamil>ai</tamil> & $$ai$$ &
+pa & <tamil>pa</tamil> & $$pa$$ &
+ha & <tamil>ha</tamil> & $$ha$$ \cr
+o & <tamil>o</tamil> & $$o$$ &
+ma & <tamil>ma</tamil> & $$ma$$ &
+kSa & <tamil>kSa</tamil> & $$kSa$$ \cr
+oo, O & <tamil>oo</tamil> & $$oo$$ &
+ya & <tamil>ya</tamil> & $$ya$$ &
+ & & \cr
+au & <tamil>au</tamil> & $$au$$ &
+ra & <tamil>ra</tamil> & $$ra$$ &
+ & & \cr
+H & <tamil>H</tamil> & $$H$$ &
+la & <tamil>la</tamil> & $$la$$ &
+ & & \cr
+\noalign{\hrule height.8pt}
+}\egroup
+
+\endinput
diff --git a/Master/texmf-dist/source/fonts/malayalam/tamil/wntml.pat b/Master/texmf-dist/source/fonts/malayalam/tamil/wntml.pat
new file mode 100644
index 00000000000..ddf57e584e2
--- /dev/null
+++ b/Master/texmf-dist/source/fonts/malayalam/tamil/wntml.pat
@@ -0,0 +1,69 @@
+% wntml.pat -- patterns for wntml transliteration scheme for tamil.
+% Jeroen Hellingman
+% Last edit: 22-DEC-1992
+
+% a aa i ii u uu e ee ai o oo au
+% k ng c 5 8 3 t n p m y r l v 7 9 6 2
+% j 4 s x
+
+% translates to
+
+% a aa i ii u uu e ee ai o oo au H
+% k n" c n~ T N t n p m y r l v zh L R n_
+% j S s h kS
+
+@patterns 0
+"\\input tamilmax" p "\\input tamilmax\n\\input tmlmacs"
+"\\input tamilmax.tex" p "\\input tamilmax\n\\input tmlmacs"
+"~" 1 "<tamil>"
+"\t" p " "
+"\\" t % copy a tex command
+"%" s % skip comment
+
+@patterns 1
+"~" 0 "</tamil>"
+"\\" t % copy a tex command
+"%" s % skip comment
+
+"a" p "a"
+"aa" p "aa"
+"i" p "i"
+"ii" p "ii"
+"u" p "u"
+"uu" p "uu"
+"e" p "e"
+"ee" p "ee"
+"ai" p "ai"
+"o" p "o"
+"oo" p "oo"
+"au" p "au"
+
+"k" p "k"
+"ng" p "n\""
+
+"c" p "c"
+"j" p "j"
+"5" p "n~"
+
+"8" p "T"
+"3" p "N"
+
+"t" p "t"
+"n" p "n"
+
+"p" p "p"
+"m" p "m"
+
+"y" p "y"
+"r" p "r"
+"l" p "l"
+"v" p "v"
+"7" p "zh"
+"9" p "L"
+"6" p "R"
+"2" p "n_"
+"4" p "S"
+"s" p "s"
+"x" p "kS"
+
+@end