#!/usr/bin/env texlua  

VERSION = "0.4"

--[[
     m-tx.lua: processes MusiXTeX files using prepmx and pmxab as pre-processors (and deletes intermediate files)

     (c) Copyright 2011-2012 Bob Tennent rdt@cs.queensu.ca

     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 2 of the License, 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.,
     51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

--]]

--[[

  ChangeLog:

     version 0.3   2012-04-09 RDT
       Change name to m-tx to avoid clash with another program.

     version 0.2   2011-11-28 RDT
       Added -i (retain intermediate files) option

     version 0.1.1 2011-07-18 RDT

       Removed a file check that caused it to fail (only on Windows!)

     version 0.1   2011-07-15 RDT

--]]

function usage()
  print("Usage:  [texlua] m-tx.lua { option | basename[.mtx] } ... ")
  print("options: -v  version")
  print("         -h  help")
  print("         -l  latex (or pdflatex)")
  print("         -p  pdfetex (or pdflatex)")
  print("         -d  dvipdfm")
  print("         -s  stop at dvi")
  print("         -t  stop at tex/mid")
  print("         -m  stop at pmx")
  print("         -i  retain intermediate files")
  print("         -f  restore default processing")
end

function whoami ()
  print("This is m-tx.lua version ".. VERSION .. ".")
end

whoami()
if #arg == 0 then
  usage()
  os.exit(0)
end

-- defaults:
prepmx = "prepmx"
pmx = "pmxab"
tex = "etex"  
musixflx = "musixflx"
dvi = "dvips"
ps2pdf = "ps2pdf"
intermediate = 1

exit_code = 0
narg = 1
repeat
  this_arg = arg[narg]
  if this_arg == "-v" then
    os.exit(0)
  elseif this_arg == "-h" then
    usage()
    os.exit(0)
  elseif this_arg == "-l" then
    if tex == "pdfetex" then
      tex = "pdflatex"
    else
      tex = "latex"
    end
  elseif this_arg == "-p" then
    if tex == "latex" then
      tex = "pdflatex"
    else
      tex = "pdfetex"
    end
    dvi = ""; ps2pdf = ""
  elseif this_arg == "-d" then
    dvi = "dvipdfm"; ps2pdf = ""
  elseif this_arg == "-s" then
    dvi = ""; ps2pdf = ""
  elseif this_arg == "-i" then
    intermediate = 0
  elseif this_arg == "-f" then
    pmx = "pmxab"; tex = "etex"; dvi = "dvips"; ps2pdf = "ps2pdf"; intermediate = 1
  elseif this_arg == "-t" then
    tex = ""; dvi = ""; ps2pdf = ""
  elseif this_arg == "-m" then
    pmx = ""; tex = ""; dvi = ""; ps2pdf = ""
  else
    filename = this_arg 
    if filename ~= "" and string.sub(filename, -4, -1) == ".mtx" then
        filename = string.sub(filename, 1, -5)
    end
    print("Processing ".. filename .. ".mtx.")
    OK = true
    if ( os.execute(prepmx .. " " .. filename ) ~= 0 ) then
      OK = false
    end
    if  (OK and pmx ~= "") then 
      os.execute(pmx .. " " .. filename)  -- does pmx return an error code?
      pmxaerr = io.open("pmxaerr.dat", "r")
      if (not pmxaerr) then
        print("No log file.")
        OK = false
      else
        linebuf = pmxaerr:read()
        err = tonumber(linebuf)
        if (err ~= 0) then
          OK = false
        end
        pmxaerr:close()
      end
    end
    os.remove( filename .. ".mx2" )
    if ( OK ) and
       (tex == "" or os.execute(tex .. " " .. filename) == 0) and
       (tex == "" or os.execute(musixflx .. " " .. filename) == 0) and
       (tex == "" or os.execute(tex .. " " .. filename) == 0) and
       ((tex ~= "latex" and tex ~= "pdflatex") 
         or (os.execute(tex .. " " .. filename) == 0)) and
       (dvi == "" or  (os.execute(dvi .. " " .. filename) == 0)) and
       (ps2pdf == "" or (os.execute(ps2pdf .. " " .. filename .. ".ps") == 0) )
    then 
      if ps2pdf ~= "" then 
        print(filename .. ".pdf generated by " .. ps2pdf .. ".")
      end
      if intermediate == 1 then -- clean-up:
        os.remove( "pmxaerr.dat" )
        os.remove( filename .. ".mx1" )
        os.remove( filename .. ".mx2" )
        if pmx ~= "" then
          os.remove( filename .. ".pmx" )
        end
        if dvi ~= "" then
          os.remove( filename .. ".dvi" )
        end
        if ps2pdf ~= "" then 
          os.remove( filename .. ".ps" )
        end
      end
    else
      print("M-Tx/pmx/MusiXTeX processing of " .. filename .. ".mtx fails.\n")
      exit_code = 2
      --[[ uncomment for debugging
      print("tex = ", tex)
      print("dvi = ", dvi)
      print("ps2pdf = ", ps2pdf)
      --]]
    end
  end --if this_arg == ...
  narg = narg+1
until narg > #arg 
os.exit( exit_code )
