home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / useful / dist / text / tex / pastex / mf / rexx / maketexfont.rexx < prev    next >
OS/2 REXX Batch file  |  1993-09-07  |  8KB  |  280 lines

  1. /*RX
  2.     MakeTeXFont 0.91 */
  3.  
  4. /* Send new features and bug reports to 
  5.    
  6.    Martin Bokaemper
  7.    Reuthstr. 12
  8.    W-8521 Poxdorf
  9.    Germany
  10.  
  11.    Email: mnbokaem@cip.e-technik.uni-erlangen.de (Internet)
  12.           mab@ame.zer (Zerberus)
  13.  
  14. History:
  15. 0.80: My 'works-fine-for-me' version modified by Georg Hessmann 13.4.91
  16.       + Variables for all directories and filenames
  17.       + ^C and ^D detection 
  18.       + support for a 'modefile' containing site-specific information
  19.       + searches for standard magsteps 
  20.       + support for different format-files
  21.  
  22. 0.81: + take new Parameters 'drivertype' and 'pkfilename' 
  23.       Georg Hessmann 17.4.91
  24.       
  25. 0.82: + History 
  26.       + a lot of small improvements and bugfixes
  27.       + looking for PK-directory for each device 
  28.       + checking if the font already exists
  29.       Martin Bokaemper 21.4.91
  30.  
  31. 0.84: + add new parameter 'pkdir' (new since driver version V1.10)
  32.       Georg Hessmann 9.6.91
  33.  
  34. 0.85: + fixed a pkdir/pkfilename mixing bug
  35.       + slight modifications, now works with old driver versions
  36.       + changed exit codes
  37.       + always calls uses plain.base (absolutely no gain in using cmbase)
  38.       J\"org H\"ohle    24.6.91, 1-Aug-91
  39.  
  40. 0.86: + fixed makedir(pkname) bug
  41.       J\"org H\"ohle    6-Aug-91
  42.  
  43. 0.90: + add makedir(pkdir)
  44.       + delete localfont entry in 'modes' file
  45.       Georg Hessmann    28-Aug-91
  46.  
  47. 0.91: + change scrollmode arg
  48.       + delete cmbase format
  49.       + comment out ERROR/FAILURE 
  50.       Georg Hessmann    4-Sep-93
  51.       
  52. */
  53.  
  54. /* TRACE RESULTS */
  55.  
  56. /* files / directories */
  57. logdir       = "MF:log"         /* directory of the logfiles    */
  58.                     /* without trailing slash!    */
  59. logname      = logdir"/MakeTeXFont.log"    /* logfile            */
  60. modefilename = "MF:config/modes"    /* description of the modes    */
  61. textfm       = "TeX:fonts/"        /* TeX tfm-files directory    */
  62. /*pkdir        "TeX:pk/"         * Where pk fonts are copied to    */
  63.  
  64. /* programs: */
  65. virmf  = "MF:bin/virmf"
  66. gftopk = "MF:bin/gftopk"
  67.  
  68. format = "plain"        /* base file for all fonts    */
  69.  
  70. /* SIGNAL ON ERROR */
  71. /* SIGNAL ON FAILURE */
  72. SIGNAL ON BREAK_C
  73. SIGNAL ON BREAK_D
  74.  
  75. /* TRACE RESULTS */
  76.  
  77. if ~show('Libraries', 'rexxsupport.library') then do
  78.    if ~addlib('rexxsupport.library', 0, -30) then do
  79.       say "no RexxSupport ... no Metafont"
  80.       exit 20
  81.    end
  82. end
  83.  
  84. dummy = time("Reset");
  85.  
  86. IF ~exists(logdir) THEN DO
  87.     CALL makedir(logdir)
  88.         say "logfile-directory ("logdir"/) did not exist. It was created."
  89.     END
  90.  
  91. IF ~exists(logname) THEN DO
  92.         ADDRESS COMMAND 'echo >'||logname
  93.         say "logfile did not exist. It was created."
  94.         END
  95.  
  96. /**** arguments *****/
  97. parse arg fntname dpi hbasedpi vbasedpi drivertype pkfilename pkdir .
  98.  
  99. IF pkdir == "" THEN pkdir = "TeX:pk/"    /* default for driver types < V1.10 */
  100.  
  101. say "Making font with name = "fntname" dpi = "dpi" and base x = "hbasedpi"  y = "vbasedpi
  102.  
  103. mag   = dpi/hbasedpi    /* what magstep should the font have? */
  104.  
  105.  
  106. magmult.0      = 13    /* number of saved magsteps */
  107.  
  108. magmult.num.1  = 1.000000    /* magstep(0)   */
  109. magmult.str.1  = "0"
  110. magmult.num.2  = 1.095445    /* magstep(0.5) */
  111. magmult.str.2  = "0.5"
  112. magmult.num.3  = 1.200000    /* magstep(1)   */
  113. magmult.str.3  = "1"
  114. magmult.num.4  = 1.314534    /* magstep(1.5) */
  115. magmult.str.4  = "1.5"
  116. magmult.num.5  = 1.440000    /* magstep(2)    */
  117. magmult.str.5  = "2"
  118. magmult.num.6  = 1.577441    /* magstep(2.5)    */
  119. magmult.str.6  = "2.5"
  120. magmult.num.7  = 1.728000    /* magstep(3)    */
  121. magmult.str.7  = "3"
  122. magmult.num.8  = 2.073600    /* magstep(4)    */
  123. magmult.str.8  = "4"
  124. magmult.num.9  = 2.488320    /* magstep(5)    */
  125. magmult.str.9  = "5"
  126. magmult.num.10 = 2.985984    /* magstep(6)    */
  127. magmult.str.10 = "6"
  128. magmult.num.11 = 3.583180    /* magstep(7)    */
  129. magmult.str.11 = "7"
  130. magmult.num.12 = 4.299817    /* magstep(8)    */
  131. magmult.str.12 = "8"
  132. magmult.num.13 = 5.159780    /* magstep(9)    */
  133. magmult.str.13 = "9"
  134.  
  135. magmult.str.default = "???"
  136.  
  137. magstr = magmult.str.default
  138.  
  139. eps = 0.005        /* erlaubte Abweichung    */
  140.  
  141. DO i=1 to magmult.0
  142.   IF abs(magmult.num.i - mag) < eps THEN DO
  143.     mag    = magmult.num.i
  144.     magstr = magmult.str.i
  145.     LEAVE i
  146.   END
  147. END
  148.  
  149.  
  150. /* modes ... search the correct mode in the file MF:config/modes */
  151. IF ~open('modefile', modefilename, 'read') THEN DO
  152.   call log("Can't find file "modefilename"!");
  153.   exit 10
  154. END
  155. DO  UNTIL (xres == hbasedpi & yres == vbasedpi) | eof('modefile')
  156.   PARSE VALUE translate(readln('modefile'), '', '2009'X) WITH mode xres yres .
  157. /**
  158.   line = readln('modefile')
  159.   line = strip(translate(line, '', '2009'X))    / * a space and a tab * /
  160.   mode = word(line,1)
  161.   xres = word(line,2)
  162.   yres = word(line,3)
  163.   /* pkdir = word(line,4) */
  164. **/
  165. END
  166. IF ~close('modefile') THEN call log("Can't close mode-file!")
  167. IF xres ~= hbasedpi | yres ~= vbasedpi THEN DO
  168.   call log("Can't find matching mode! Make an update in your "modefilename" file.")
  169.   EXIT 5
  170. END;
  171.  
  172. /* Produce the complete name of the file */
  173. IF pkfilename="" THEN DO
  174.     pkname = pkdir||dpi'/'fntname'.'dpi'pk'
  175. END; ELSE DO
  176.         pkname = pkdir||pkfilename
  177. END
  178.  
  179. /* Looks if the font already is there */
  180. IF exists(pkname) THEN DO
  181.   say "The font "pkname" already exists!"
  182.   say "check your driver's configuration!"
  183.   call log(pkname" already exists")
  184.   EXIT 0
  185. END;
  186.  
  187. /* Metafont options */
  188. IF magstr ~= magmult.str.default THEN
  189.   options = "\scrollmode; \mode:="mode"; mag:=magstep("magstr"); input "fntname""
  190. ELSE
  191.   options = "\scrollmode; \mode:="mode"; \mag:="mag"; \input "fntname""
  192.  
  193. say "MF commands: '"options"'"
  194.  
  195. dummy = pragma("directory","MF:");
  196.  
  197. ADDRESS COMMAND
  198.  
  199. /* first: create all needet directories.... */
  200.  
  201.  
  202.   /* Don't include last '/' in pkdir, makedir doesn't like it */
  203. pkdir2 = LEFT(pkdir, LASTPOS("/",pkdir)-1)
  204. IF ~exists(pkdir2) THEN DO
  205.   IF ~makedir(pkdir2) THEN DO
  206.     call log("MakeDir "pkdir2" failed");
  207.     EXIT 10
  208.   END
  209. END
  210.  
  211.   /* a '/' is required to exist in pkname. */
  212.   /* Don't include last '/' in fulldir, makedir doesn't like it */
  213. fulldir = LEFT(pkname, LASTPOS("/",pkname)-1)
  214. IF ~exists(fulldir) THEN DO
  215.   IF ~makedir(fulldir) THEN DO
  216.     call log("MakeDir "fulldir" failed");
  217.     EXIT 10
  218.   END
  219. END
  220.  
  221.  
  222. /* second: create gf-file */
  223. virmf '&'format' "'options'"'
  224.  
  225. /* copy/delete instead rename to overwrite existing logfile (eg. from a
  226.    failed call of MakeTeXfont). Replace by 'move' if you have ARP:
  227.    i.e. add a line here ``copy = "move" or "mv"'' */
  228.  
  229. CALL delete(logdir'/'fntname'.'dpi'log')
  230. CALL rename(fntname'.log', logdir'/'fntname'.'dpi'log')
  231.  
  232. /* tfm-file ?? */
  233. IF exists(textfm) & ~exists(textfm||fntname'.tfm') THEN DO
  234.     copy fntname'.tfm' textfm
  235.     protect textfm||fntname'.tfm' SUB ew
  236.     END
  237. CALL delete(fntname'.tfm')
  238.  
  239.  
  240. /* third: create pk-file */
  241. gftopk fntname'.'dpi'gf' pkname
  242.  
  243. IF 0 = RC THEN DO /* never called because of 'signal on failure' ? */
  244.   /* don't delete .gf file on failure */
  245.   protect pkname SUB ew
  246.   filenote pkname '"mode='mode',magstep='magstr'"'
  247.   CALL delete(fntname'.'dpi'gf')
  248.   END
  249.  
  250. elapsed = time("Elapsed");
  251. call log("in "elapsed%3600":"Right(elapsed%60//60,2,'0')":"Right(elapsed%1//60,2,'0'))
  252.  
  253. EXIT 0
  254.  
  255. /**** log - function ****/
  256. log: PROCEDURE EXPOSE logname fntname mode hbasedpi vbasedpi dpi magstr
  257.      PARSE ARG msg
  258.  
  259.      message = date()" "time()": "fntname" for "mode"("hbasedpi","vbasedpi") with "dpi" dpi (mag="magstr") "msg
  260.      say message
  261.      IF ~open(logfile, logname, 'Append') THEN DO
  262.        say "Can't open logfile!"
  263.        RETURN
  264.      END
  265.      dummy = writeln(logfile,message);
  266.      IF ~close(logfile) THEN say "Can't close logfile!"
  267. RETURN
  268.  
  269. /**** signal - functions ****/
  270. error:
  271. failure: call log "errorlevel "rc" in line "sigl": "sourceline(sigl)
  272.          EXIT 10
  273.  
  274. BREAK_C:
  275. BREAK_D:
  276.          call log "execution aborted!"
  277.          IF exists(fntname'.'dpi'gf') THEN dummy = delete(fntname'.'dpi'gf')
  278.          IF exists(fntname'.log') THEN dummy = delete(fntname'.log')
  279.          EXIT 5
  280.