diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /fonts/utilities/t1install/toil/toila.awk |
Initial commit
Diffstat (limited to 'fonts/utilities/t1install/toil/toila.awk')
-rw-r--r-- | fonts/utilities/t1install/toil/toila.awk | 442 |
1 files changed, 442 insertions, 0 deletions
diff --git a/fonts/utilities/t1install/toil/toila.awk b/fonts/utilities/t1install/toil/toila.awk new file mode 100644 index 0000000000..26d2138856 --- /dev/null +++ b/fonts/utilities/t1install/toil/toila.awk @@ -0,0 +1,442 @@ +#This file belongs to the TOIL package : Ten plik nale/zy do pakietu TOIL +#This package is public domain : Pakiet stanowi dobro powszechne +#For more info see `0TOILENG.LIC' : Wi/ecej informacji w ,,0TOILPOL.LIC'' +#============================================================================ +# GOVERNING FILE +# ========================================================================== +# PARMETERS: +# CLP -- an auxiliary file containing in the first line a comment, +# in the second one -- the font name, and then a list of options ensues +# No input is expected +# ========================================================================== +BEGIN { +# FIX BASIC CONSTANTS + fix_const() + +# WRITE A BANNER + mess("This is a configurable Type One Install utiLity (TOIL), ver.", VER_NO) + +# INSPECT CONFIG FILE AND ANALYSE COMMAND LINE + clear(Q_COND); list_files(ENV_CFG, "", CFG_PAT, Q_COND, cfg_lst) + CFG=cfg_lst[1]; if (cfg_lst[1]=="") errmess(1, CFG_PAT " file not found") + get_config(cfg_lst[1]) + analyse_command_line_parameters(CLP) + if (err_par!="") errmess(2, "Offending parameter:", err_par) + +# CHECK WHETHER THE REMAINING AWK PROGRAMS EXIST + clear(Q_COND); Q_COND[AWK1_PAT]=1; Q_COND[AWK2_PAT]=1 + list_files(ENV_CFG, "", AWK_PAT, Q_COND, awk_lst) + AWK1=first_fit(awk_lst, AWK1_PAT) + AWK2=first_fit(awk_lst, AWK2_PAT) + if ((AWK1=="") || (AWK2=="")) errmess(4, "AWK program(s) not found") + +# CHECK WHETHER THE COMPONENT MF FILES EXIST + clear(Q_COND); Q_COND[MF1_PAT]=1; Q_COND[MF2_PAT]=1; Q_COND[MF3_PAT]=1 + list_files(ENV_CFG, "", MF_PAT, Q_COND, mf_lst) + MF1=first_fit(mf_lst, MF1_PAT) + MF2=first_fit(mf_lst, MF2_PAT) + MF3=first_fit(mf_lst, MF3_PAT) + if ((MF1=="")||(MF2=="")||(MF3=="")) errmess(5,"MF component(s) not found") + +# FIX BASIC NAMES + if ((MF=="") && ((X_SCALE!="") || (IT_ANGLE!=""))) { + warn("It is advisable to use an alternate name (option `-M')", + "if you rescale or slant a font (options `-X' or `-I')") + } + if (MF=="") MF=FONT + TFM=MF + MF_MF=MF ".mf" + if (ENC_NAME=="") ENC_NAME=MF + if (ENC_GVN!="") { + clear(Q_COND) + list_files(".;" ENV_CFG, + sys_hull_dir(ENC_GVN), sys_hull_namex(ENC_GVN), Q_COND, enc_lst) + ENC_ACT=enc_lst[1] + } + if (LIG_GVN!="") { + clear(Q_COND) + list_files(".;" ENV_CFG, + sys_hull_dir(LIG_GVN), sys_hull_namex(LIG_GVN), Q_COND, lig_lst) + LIG_ACT=lig_lst[1] + } + +# FIND AFM AND PFB/PFA FILES + mess("Seeking for " FONT ".afm and " FONT ".pfa or " FONT ".pfb") + clear(Q_COND); Q_COND[AFM_PAT]=1; Q_COND[PSF_PAT]=1 + list_files(CV["T1PSTREE"], + sys_hull_dir(FONT_GVN), FONT T1_PAT, Q_COND, t1_lst) + AFM_FILE=first_fit(t1_lst, AFM_PAT) + PSF_FILE=unix_name(first_fit(t1_lst, PSF_PAT)) + if (AFM_FILE=="") errmess(6, FONT ".afm not found") + if (PSF_FILE=="") warn("Neither " FONT ".pfb nor " FONT ".pfa not found") + +# RESOLVE INTERNAL REFERENCES + AFM_DIR=sys_hull_dir(AFM_FILE) + PSF_DIR=sys_hull_dir(PSF_FILE) + CV["ENC_XNAME"]=sys_conc(CV["RES_ENC_PFX"], ENC_NAME CV["RES_ENC_EXT"]) + CV["PSF_XNAME"]=sys_conc(CV["RES_PSF_PFX"], sys_hull_namex(PSF_FILE)) + for (v in CV) { + if (CV[v] ~ /\*(((AFM|PSF)_DIR)|((ENC|FONT|MF)_NAME))\*/) { + gsub(/\*AFM_DIR\*/, AFM_DIR, CV[v]); CV[v]=sys_name(CV[v]) + gsub(/\*PSF_DIR\*/, PSF_DIR, CV[v]); CV[v]=sys_name(CV[v]) + gsub(/\*ENC_NAME\*/, ENC_NAME, CV[v]); CV[v]=sys_name(CV[v]) + gsub(/\*FONT_NAME\*/, FONT, CV[v]); CV[v]=sys_name(CV[v]) + gsub(/\*MF_NAME\*/, MF, CV[v]); CV[v]=sys_name(CV[v]) + } + } + CV["ENC_XNAME"]=unix_name(CV["ENC_XNAME"]) + CV["PSF_XNAME"]=unix_name(CV["PSF_XNAME"]) + +# FIND FONT MAP FILE + clear(Q_COND) + list_files(CV["RES_MAP_DIR"], "", CV["USER_MAP"], Q_COND, loc_lst) + MAP=loc_lst[1] + if ((MAP=="") && CV["USE_GLB_MAP"]) {# MAP doesn't exist yet, use global one + clear(Q_COND) + list_files(".;" CV["DVIPS_PATH"], "", CV["DVIPS_MAP"], Q_COND, glb_lst) + MAP=glb_lst[1] + } + +# PERFORM (UPPER|LOWER)CASING, DEPENDING ON CONFIG FILE SETTINGS + if (CV["LC_PSF_NAME"]) { + CV["ENC_XNAME"]=lc(CV["ENC_XNAME"]); CV["PSF_XNAME"]=lc(CV["PSF_XNAME"]) + ENC_NAME=lc(ENC_NAME) + } + if (CV["UC_TFM_NAME"]) TFM=uc(TFM) + +# WRITE TEMPORARY CONFIG FILE (EXTEND THE USER'S CONFIG) + for (v in CV) print v, CV[v] > TMP_CFG + print "FONT", FONT > TMP_CFG + print "MF1", MF1 > TMP_CFG + print "MF2", MF2 > TMP_CFG + print "MF3", MF3 > TMP_CFG + print "MF", MF > TMP_CFG + print "MF_MF", MF_MF > TMP_CFG + print "LIG_GVN", LIG_GVN > TMP_CFG + print "LIG_ACT", LIG_ACT > TMP_CFG + print "ENC_GVN", ENC_GVN > TMP_CFG + print "ENC_ACT", ENC_ACT > TMP_CFG + print "ENC_NAME", ENC_NAME > TMP_CFG + print "AFM", AFM_FILE > TMP_CFG + print "TFM", TFM > TMP_CFG + print "MAP", MAP > TMP_CFG + print "AFM_DIR", AFM_DIR > TMP_CFG + print "PSF_DIR", PSF_DIR > TMP_CFG + print "TMP_ENC", TMP_ENC > TMP_CFG + print "TMP_MAP", TMP_MAP > TMP_CFG + print "TMP_TMP", TMP_TMP > TMP_CFG + print "PPI", PPI > TMP_CFG + print "VER_NO", VER_NO > TMP_CFG + print "B_CHAR", B_CHAR > TMP_CFG + +# WRITE SYSTEM SCRIPTS + # BAT1: +# print sys_copy(TMP_TMP) > BAT1 + print sys_del(TMP_MAP) > BAT1 + print sys_del(TMP_ENC) > BAT1 + print sys_del(TMP_TMP) > BAT1 + print sys_name(AWK_CALL) " -f" AWK1 > BAT1 + # BAT2: + MF_opt="\\batchmode;" + if (X_SCALE!="") {MF_opt=MF_opt "XS=" X_SCALE ";"} + if (IT_ANGLE!="") {MF_opt=MF_opt "IA=" IT_ANGLE ";"} + print sys_name(MF_CALL) " " MF_opt "input " MF > BAT2 + # BAT3: + if (MAP!="") { + print sys_copy(MAP, TMP_MAP) > BAT3 + print "echo Using", MAP > BAT3 + } + print sys_name(AWK_CALL) " -f" AWK2 " " MF ".log" > BAT3 + # BAT4: LOG and MF files should rather be kept in the case of MF crash + if (CV["DEL_MF_LOG"]) print sys_del(MF ".log") > BAT4 + if (CV["DEL_MF_FILE"]) print sys_del(MF ".mf") > BAT4 + print sys_del(MF ".ps") > BAT4 + # BAT5: + print sys_del(MF "." PPI "GF") > BAT5 + print sys_del(MF "." substr(PPI "GF",1,3)) > BAT5 + if (CV["RES_TFM_DIR"]!="\.") { + print sys_copy(MF ".tfm", sys_conc(CV["RES_TFM_DIR"], MF ".tfm")) > BAT5 + print sys_del(MF ".tfm") > BAT5 + } + print sys_copy(TMP_ENC, + sys_conc(CV["RES_ENC_DIR"], ENC_NAME CV["RES_ENC_EXT"])) > BAT5 + print sys_copy(TMP_MAP, + sys_conc(CV["RES_MAP_DIR"], CV["USER_MAP"])) > BAT5 + print sys_del(TMP_MAP) > BAT5 + print sys_del(TMP_ENC) > BAT5 + print sys_del(TMP_TMP) > BAT5 + print sys_del(TMP_CFG) > BAT5 +} + +# ========================================================================== + +function uc(s, i) { + for (i=1; i<=length(s); ++i) { + if (substr(s,i,1) in UC) + s=substr(s,1,i-1) UC[substr(s,i,1)] substr(s,i+1) + } + return s +} + +function lc(s, i) { + for (i=1; i<=length(s); ++i) { + if (substr(s,i,1) in LC) + s=substr(s,1,i-1) LC[substr(s,i,1)] substr(s,i+1) + } + return s +} + +function analyse_command_line_parameters(CLP_FILE, glb_map, p, i) { + # CLP_FILE -- command line parameter file + getline FONT_GVN < CLP_FILE # get font name + FONT=sys_hull_name(FONT_GVN) + if (FONT=="") errmess(3, "Invalid font name", FONT_GVN) + while (getline < CLP_FILE > 0) p[++p[0]]=$0 # get options + i=1 + while ((i<=p[0]) && (p[i]!="") && (err_par=="")) { + if (p[i] ~ /^[-\/][BbEeGgIiLlMmNnXx]$/) { + if (p[i+1]=="") {err_par=p[i]} + else { + if (p[i] ~ /^[-\/][Bb]$/) B_CHAR=p[++i] + if (p[i] ~ /^[-\/][Ee]$/) ENC_GVN=p[++i] + if (p[i] ~ /^[-\/][Gg]$/) glb_map=p[++i]+0 + if (p[i] ~ /^[-\/][Ii]$/) IT_ANGLE=p[++i]+0 + if (p[i] ~ /^[-\/][Ll]$/) LIG_GVN=p[++i] + if (p[i] ~ /^[-\/][Mm]$/) MF=sys_hull_name(p[++i]) + if (p[i] ~ /^[-\/][Nn]$/) ENC_NAME=sys_hull_name(p[++i]) + if (p[i] ~ /^[-\/][Xx]$/) X_SCALE=p[++i]+0 + } + } else if (p[i] ~ /^[-\/][BbEeGgIiLlMmNnXx]/) { + if (p[i] ~ /^[-\/][Bb]/) B_CHAR=substr(p[i],3) + if (p[i] ~ /^[-\/][Ee]/) ENC_GVN=substr(p[i],3) + if (p[i] ~ /^[-\/][Gg]/) glb_map=substr(p[i],3)+0 + if (p[i] ~ /^[-\/][Ii]/) IT_ANGLE=substr(p[i],3)+0 + if (p[i] ~ /^[-\/][Ll]/) LIG_GVN=substr(p[i],3) + if (p[i] ~ /^[-\/][Mm]/) MF=sys_hull_name(substr(p[i],3)) + if (p[i] ~ /^[-\/][Nn]/) ENC_NAME=sys_hull_name(substr(p[i],3)) + if (p[i] ~ /^[-\/][Xx]/) X_SCALE=substr(p[i],3)+0 + } else {err_par=p[i]} + ++i + } + B_CHAR=(B_CHAR !~ /[\+\-]?[0-9]+/ ? -1 : B_CHAR+0) + if (LIG_GVN ~ /[\?\*]/) LIG_GVN="" + if (ENC_GVN ~ /[\?\*]/) ENC_GVN="" + if (MF ~ /[\?\*]/) MF="" + if (ENC_NAME ~ /[\?\*]/) ENC_NAME="" + gsub(/\.[Ee][Nn][Cc]$/, "", ENC_NAME) + if (glb_map!="") CV["USE_GLB_MAP"]=glb_map +} + +function errmess(e,s1,s2,s3) {# at most three parts may occur + mess("TOIL ERROR:",s1, s2, s3); exit(e) +} + +function mess(s1,s2,s3,s4, s) {# at most four parts may occur + s=s1; if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4 + if (length(s)<=max_line) { + if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG + } else { + if ((!CV["QUIET"]) && (s1!="")) print s1 > "CON" + if ((LOG!="") && (s1!="")) print s1 > LOG + if ((!CV["QUIET"]) && (s2!="")) print s2 > "CON" + if ((LOG!="") && (s2!="")) print s2 > LOG + if ((!CV["QUIET"]) && (s3!="")) print s3 > "CON" + if ((LOG!="") && (s3!="")) print s3 > LOG + if ((!CV["QUIET"]) && (s4!="")) print s4 > "CON" + if ((LOG!="") && (s4!="")) print s4 > LOG + } +} + +function warn(s1,s2,s3,s4, s) {# at most four parts may occur + s="WARNING: " s1 + if (s2!="") s=s " " s2; if (s3!="") s=s " " s3; if (s4!="") s=s " " s4 + if (length(s)<=max_line) { + if (!CV["QUIET"]) print s > "CON"; if (LOG!="") print s > LOG + } else { + if ((!CV["QUIET"]) && (s1!="")) print "WARNING:", s1 > "CON" + if ((LOG!="") && (s1!="")) print "WARNING:", s1 > LOG + if ((!CV["QUIET"]) && (s2!="")) print " ", s2 > "CON" + if ((LOG!="") && (s2!="")) print " ", s2 > LOG + if ((!CV["QUIET"]) && (s3!="")) print " ", s3 > "CON" + if ((LOG!="") && (s3!="")) print " ", s3 > LOG + if ((!CV["QUIET"]) && (s4!="")) print " ", s4 > "CON" + if ((LOG!="") && (s4!="")) print " ", s4 > LOG + } +} + +function clear(t, i) {for (i in t) delete t[i]} +function entries(t, i,j) {for (i in t) ++j; return j} + +function first_fit(list, item_pat, i, r) { + for (i=1; i<=list[0]; ++i) {if (list[i] ~ item_pat) {r=list[i]; break}} + return r +} + +function list_files(tree, dir_pfx, file_pat, q_cond, res, q, r, s, t) { + do_sys_del(TMP_TMP) + t[0]=split(tree,t,";"); + for (s=1; s<=t[0]; ++s) { + r=sys_conc_dir(t[s], dir_pfx) + if (r ~ /[^!]!!$/) { + r=substr(r,1,length(r)-2) + if (sys_is_dir(r)) lst_all_lev(r, file_pat, res) + } else if (r ~ /[^!]!$/) { + r=substr(r,1,length(r)-1) + if (sys_is_dir(r)) lst_one_lev(r, file_pat, res) + } else { + if (sys_is_dir(r)) lst_cur_lev(r, file_pat, res) + } + for (q in q_cond) + for (r=1; r<=res[0]; ++r) + if (res[r] ~ q) delete q_cond[q] + if ((res[0]>0) && (entries(q_cond)==0)) break + } +} + +function lst_all_lev(dir, file_pat, res) { + do_sys_call(sys_lst("-d /s") sys_conc(dir, file_pat) ">" TMP_TMP) + while (getline < TMP_TMP > 0) res[++res[0]]=$0 + do_sys_del(TMP_TMP) +} + +function lst_cur_lev(dir, file_pat, res) { + do_sys_call(sys_lst("-d") sys_conc(dir, file_pat) ">" TMP_TMP) + while (getline < TMP_TMP > 0) res[++res[0]]=sys_conc(dir, $0) + do_sys_del(TMP_TMP) +} + +function lst_one_lev(dir, file_pat, res, d, i) { + lst_cur_lev(dir, file_pat, res) + do_sys_call(sys_lst("d") sys_name(dir) ">" TMP_TMP) + while (getline < TMP_TMP > 0) d[++d[0]]=$0 + for (i=1; i<=d[0]; ++i) { + do_sys_del(TMP_TMP) + do_sys_call(sys_lst("-d") "\"" sys_conc(sys_conc(dir, d[i]), file_pat) "\">" TMP_TMP) + while (getline < TMP_TMP > 0) + res[++res[0]]=sys_conc(sys_conc(dir, d[i]), $0) + do_sys_del(TMP_TMP) + } +} + +function sys_is_dir(dir, s_n, f) { +# checks if a directory exists; introduced to avoid message ``path not found'' + s_n=sys_conc((dir=="" ? "." : dir), "nul") + do_sys_call("if exist " s_n " echo FOUND > " TMP_TMP) + getline f < TMP_TMP + do_sys_del(TMP_TMP) + return (f ~ "FOUND") +} + +function sys_hull_dir(n) {# n -- a file name + return (match(n,/[^:\\\/]*$/) ? substr(n,1,RSTART-1) : "") +} + +function sys_hull_namex(n) {# n -- a file name + return (match(n,/[^:\\\/]*$/) ? substr(n,RSTART) : n) +} + +function sys_hull_name(n) {# n -- a file name + gsub(/^.*[:\\\/]/, "", n) # truncate directory + gsub(/\.+[^\.]*$/, "", n) # truncate extension (and malformed names) + return n +} +function sys_conc(a, b) {# a -- directory, b -- file name + if ((a=="") || (b ~ /:/)) return b + else if (b=="") return a + else return sys_name(a (a ~ /:$/ ? "" : "/" ) b) +} +function sys_conc_dir(a, b) {# a and b directories, perhaps from a tree (path) + if ((a=="") || (b ~ /:/)) return b + else if ((b=="") || (a ~ /[^!]!!?$/)) return a + else return sys_name(a (a ~ /:$/ ? "" : "/" ) b) +} +function sys_name(n) {gsub(/\\+/,"/",n); gsub(/\/+/,"\\",n); return n} +function unix_name(n) {gsub(/\\+/,"/",n); return n} +function sys_lst(opt) {return "dir /on /b /a" opt " "} +function sys_del(what) {return "if exist " what " del " what} +function do_sys_del(what) {close(what); do_sys_call(sys_del(what))} +# --- +# ATTENTION: A DISCREPANCY DUE TO M$'S CRAZY LOCALIZATION! +# Uncomment the following declaration of `sys_copy' if the English +# MS DOS system is used (also see below): +# function sys_copy(i, o) {return "if exist " i " echo F|xcopy " i " " o ">" TMP_TMP} +# Uncomment the following declaration of `sys_copy' if the Polish +# MS DOS from Win95/98 system is used (`P' stands for Plik, while +# `F' stands for File): +function sys_copy(i, o) {return "if exist " i " echo P|xcopy " i " " o ">" TMP_TMP} +# --- +function do_sys_call(s) {system(s)} # print s > "ZZZ" + +function get_cfg_item(item_name, item) { + if ($1==item_name) { + item=$0 + gsub("^[ \t]*" item_name "[ \t]+","",item) + gsub(/[ \t]*(\|.*)?$/,"",item) + CV[item_name]=item + } +} + +function get_config (CFG, v,w) { + # list of actually recognized config variables: + in_CV["T1PSTREE"]=1 + in_CV["USE_DIGIT_KPX"]=1 + in_CV["LC_PSF_NAME"]=1 + in_CV["UC_TFM_NAME"]=1 + in_CV["RES_MAP_DIR"]=1 + in_CV["RES_TFM_DIR"]=1 + in_CV["RES_ENC_DIR"]=1 + in_CV["RES_ENC_PFX"]=1 + in_CV["RES_ENC_EXT"]=1 + in_CV["RES_PSF_PFX"]=1 + in_CV["DVIPS_MAP"]=1 + in_CV["DVIPS_PATH"]=1 + in_CV["USER_MAP"]=1 + in_CV["USE_GLB_MAP"]=1 + in_CV["DEL_MF_FILE"]=1 + in_CV["DEL_MF_LOG"]=1 + in_CV["QUIET"]=1 + in_CV["MATHEMATIZE"]=1 + while (getline < CFG > 0) for (v in in_CV) get_cfg_item(v) + + if (CV["MATHEMATIZE"]=="") CV["MATHEMATIZE"]=1 + if (CV["RES_MAP_DIR"]=="") CV["RES_MAP_DIR"]="." + if (CV["RES_TFM_DIR"]=="") CV["RES_TFM_DIR"]="." + if (CV["RES_ENC_DIR"]=="") CV["RES_ENC_DIR"]="." + for (w in in_CV) + while (match(CV[w],/<[^>]+>/)) { + v=substr(CV[w],RSTART+1,RLENGTH-2) + # references to non-existant environment variables are replaced by + # an empty string: + CV[w]=substr(CV[w],1,RSTART-1)\ + (v in ENVIRON ? ENVIRON[v] : "")\ + substr(CV[w],RSTART+RLENGTH) + } +# for (w in CV) printf("%20s %s\n",w, CV[w]) +} + +function fix_const() { +# GENERAL CONSTANTS (used also in toilb.awk and toilc.awk) + QQ="\"" + max_line=79 # screen limit + max_sys_line=127 # MSDOS limit + TMP_CFG="~t~m~p~.cfg" +# VERSION + VER_NO="1.07" +# PATHS, FILE NAMES AND NAME PATTERNS + ENV_CFG=("TOILPATH" in ENVIRON ? ENVIRON["TOILPATH"] : "") + MF_CALL="mpost &mfplain" + AWK_CALL=ARGV[0] + TMP_NAME="_t_m_p_" + TMP_TMP=TMP_NAME ".tmp"; TMP_ENC=TMP_NAME ".enc"; TMP_MAP=TMP_NAME ".map" + CFG_PAT="toil.cfg"; T1_PAT="\.?f?"; AWK_PAT="toil?\.awk" + AFM_PAT="\.(afm|AFM)$"; PSF_PAT="\.(pf[ab]|PF[AB])$"; + AWK1_PAT="(toilb|TOILB)\.(awk|AWK)" + AWK2_PAT="(toilc|TOILC)\.(awk|AWK)" + MF_PAT="toil.mf?"; MF1_PAT="1$"; MF2_PAT="2$"; MF3_PAT="3$" + BAT1="toiltmp1.bat"; BAT2="toiltmp2.bat"; BAT3="toiltmp3.bat"; + BAT4="toiltmp4.bat"; BAT5="toiltmp5.bat" + PPI=999 +# INITIALIZE lc AND uc FUNCTION: + for (i=97; i<=122; ++i) LC[sprintf("%c",i-32)]=sprintf("%c",i) + for (i=65; i<=90; ++i) UC[sprintf("%c",i+32)]=sprintf("%c",i) +} |