%%
%% This is file `pdftexcmds.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% pdftexcmds.dtx  (with options: `package')
%% 
%% This is a generated file.
%% 
%% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
%% 
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either
%% version 1.3 of this license or (at your option) any later
%% version. The latest version of this license is in
%%    http://www.latex-project.org/lppl.txt
%% and version 1.3 or later is part of all distributions of
%% LaTeX version 2005/12/01 or later.
%% 
%% This work has the LPPL maintenance status "maintained".
%% 
%% This Current Maintainer of this work is Heiko Oberdiek.
%% 
%% This work consists of the main source file pdftexcmds.dtx
%% and the derived files
%%    pdftexcmds.sty, pdftexcmds.pdf, pdftexcmds.ins, pdftexcmds.drv.
%% 
\begingroup
  \catcode44 12 % ,
  \catcode45 12 % -
  \catcode46 12 % .
  \catcode58 12 % :
  \catcode64 11 % @
  \expandafter\let\expandafter\x\csname ver@pdftexcmds.sty\endcsname
  \ifcase 0%
    \ifx\x\relax % plain
    \else
      \ifx\x\empty % LaTeX
      \else
        1%
      \fi
    \fi
  \else
    \catcode35 6 % #
    \catcode123 1 % {
    \catcode125 2 % }
    \expandafter\ifx\csname PackageInfo\endcsname\relax
      \def\x#1#2{%
        \immediate\write-1{Package #1 Info: #2.}%
      }%
    \else
      \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
    \fi
    \x{pdftexcmds}{The package is already loaded}%
    \endgroup
    \expandafter\endinput
  \fi
\endgroup
\begingroup
  \catcode35 6 % #
  \catcode40 12 % (
  \catcode41 12 % )
  \catcode44 12 % ,
  \catcode45 12 % -
  \catcode46 12 % .
  \catcode47 12 % /
  \catcode58 12 % :
  \catcode64 11 % @
  \catcode123 1 % {
  \catcode125 2 % }
  \expandafter\ifx\csname ProvidesPackage\endcsname\relax
    \def\x#1#2#3[#4]{\endgroup
      \immediate\write-1{Package: #3 #4}%
      \xdef#1{#4}%
    }%
  \else
    \def\x#1#2[#3]{\endgroup
      #2[{#3}]%
      \ifx#1\relax
        \xdef#1{#3}%
      \fi
    }%
  \fi
\expandafter\x\csname ver@pdftexcmds.sty\endcsname
\ProvidesPackage{pdftexcmds}%
  [2007/11/12 v0.2 LuaTeX support for pdfTeX utility functions (HO)]
\begingroup
  \catcode123 1 % {
  \catcode125 2 % }
  \def\x{\endgroup
    \expandafter\edef\csname pdftexcmds@AtEnd\endcsname{%
      \catcode35 \the\catcode35\relax
      \catcode64 \the\catcode64\relax
      \catcode123 \the\catcode123\relax
      \catcode125 \the\catcode125\relax
    }%
  }%
\x
\catcode35 6 % #
\catcode64 11 % @
\catcode123 1 % {
\catcode125 2 % }
\def\TMP@EnsureCode#1#2{%
  \edef\pdftexcmds@AtEnd{%
    \pdftexcmds@AtEnd
    \catcode#1 \the\catcode#1\relax
  }%
  \catcode#1 #2\relax
}
\TMP@EnsureCode{33}{12}% !
\TMP@EnsureCode{34}{12}% "
\TMP@EnsureCode{39}{12}% '
\TMP@EnsureCode{40}{12}% (
\TMP@EnsureCode{41}{12}% )
\TMP@EnsureCode{42}{12}% *
\TMP@EnsureCode{43}{12}% +
\TMP@EnsureCode{44}{12}% ,
\TMP@EnsureCode{45}{12}% -
\TMP@EnsureCode{46}{12}% .
\TMP@EnsureCode{47}{12}% /
\TMP@EnsureCode{58}{12}% :
\TMP@EnsureCode{60}{12}% <
\TMP@EnsureCode{61}{12}% =
\TMP@EnsureCode{62}{12}% >
\TMP@EnsureCode{95}{12}% _ (other)
\TMP@EnsureCode{126}{12}% ~ (other)
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname RequirePackage\endcsname\relax
  \input infwarerr.sty\relax
\else
  \RequirePackage{infwarerr}[2007/09/09]%
\fi
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname directlua\endcsname\relax
  \@PackageInfo{pdftexcmds}{LuaTeX not detected}%
  \def\pdftexcmds@nopdftex{%
    \@PackageInfoNoLine{pdftexcmds}{pdfTeX >= 1.30 not detected}%
    \let\pdftexcmds@nopdftex\relax
  }%
  \def\pdftexcmds@temp#1{%
    \begingroup\expandafter\expandafter\expandafter\endgroup
    \expandafter\ifx\csname pdf#1\endcsname\relax
      \pdftexcmds@nopdftex
    \else
      \expandafter\def\csname pdf@#1\expandafter\endcsname
      \expandafter##\expandafter{%
        \csname pdf#1\endcsname
      }%
    \fi
  }%
  \pdftexcmds@temp{strcmp}%
  \pdftexcmds@temp{escapehex}%
  \let\pdf@escapehexnative\pdf@escapehex
  \pdftexcmds@temp{unescapehex}%
  \let\pdf@unescapehexnative\pdf@unescapehex
  \pdftexcmds@temp{escapestring}%
  \pdftexcmds@temp{escapename}%
  \pdftexcmds@temp{filesize}%
  \pdftexcmds@temp{filemoddate}%
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdfshellescape\endcsname\relax
    \pdftexcmds@nopdftex
  \else
    \def\pdf@shellescape{%
      \pdfshellescape
    }%
  \fi
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdffiledump\endcsname\relax
    \pdftexcmds@nopdftex
  \else
    \def\pdf@filedump#1#2#3{%
      \pdffiledump offset#1 length#2{#3}%
    }%
  \fi
  \begingroup\expandafter\expandafter\expandafter\endgroup
  \expandafter\ifx\csname pdfmdfivesum\endcsname\relax
    \pdftexcmds@nopdftex
  \else
    \def\pdf@mdfivesum#{\pdfmdfivesum}%
    \let\pdf@mdfivesumnative\pdf@mdfivesum
    \def\pdf@filemdfivesum#{\pdfmdfivesum file}%
  \fi
  \def\pdf@system#{%
    \immediate\write18%
  }%
  \pdftexcmds@AtEnd
  \expandafter\endinput
\fi
\chardef\pdftexcmds@luastate=0 %
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname newtoks\endcsname\relax
  \toksdef\pdftexcmds@toks=0 %
\else
  \csname newtoks\endcsname\pdftexcmds@toks
\fi
\begingroup
  \escapechar=92 %
  \edef\\{\string\\}%
  \catcode35=12 % #
  \catcode37=12\relax
  \directlua\pdftexcmds@luastate{
    pdftexcmds = {}
    function pdftexcmds.strcmp(A, B)
      if A == B then
        tex.write("0")
      elseif A < B then
        tex.write("-1")
      else
        tex.write("1")
      end
    end
    function pdftexcmds.utf8_to_byte(str)
      local i = 0
      local n = string.len(str)
      local t = {}
      while i < n do
        i = i + 1
        local a = string.byte(str, i)
        if a < 128 then
          table.insert(t, string.char(a))
        else
          if a >= 192 and i < n then
            i = i + 1
            local b = string.byte(str, i)
            if b < 128 or b >= 192 then
              i = i - 1
            elseif a == 194 then
              table.insert(t, string.char(b))
            elseif a == 195 then
              table.insert(t, string.char(b + 64))
            end
          end
        end
      end
      return table.concat(t)
    end
    function pdftexcmds.escapehex(str, mode)
      if mode == "byte" then
        str = pdftexcmds.utf8_to_byte(str)
      end
      tex.write((string.gsub(str, ".",
        function (ch)
          return string.format("%02X", string.byte(ch))
        end
      )))
    end
    function pdftexcmds.unescapehex(str, mode)
      local a = 0
      local first = true
      local result = {}
      for i = 1, string.len(str), 1 do
        local ch = string.byte(str, i)
        if ch >= 48 and ch <= 57 then
          ch = ch - 48
        elseif ch >= 65 and ch <= 70 then
          ch = ch - 55
        elseif ch >= 97 and ch <= 102 then
          ch = ch - 87
        else
          ch = nil
        end
        if ch then
          if first then
            a = ch * 16
            first = false
          else
            table.insert(result, a + ch)
            first = true
          end
        end
      end
      if not first then
        table.insert(result, a)
      end
      if mode == "byte" then
        local utf8 = {}
        for i, a in ipairs(result) do
          if a < 128 then
            table.insert(utf8, a)
          else
            if a < 192 then
              table.insert(utf8, 194)
              a = a - 128
            else
              table.insert(utf8, 195)
              a = a - 192
            end
            table.insert(utf8, a + 128)
          end
        end
        result = utf8
      end
      tex.settoks(pdftexcmds.toks, string.char(unpack(result)))
    end
    function pdftexcmds.escapestring(str, mode)
      if mode == "byte" then
        str = pdftexcmds.utf8_to_byte(str)
      end
      tex.write((string.gsub(str, ".",
        function (ch)
          local b = string.byte(ch)
          if b < 33 or b > 126 then
            return string.format("\\%.3o", b)
          end
          if b == 40 or b == 41 or b == 92 then
            return "\\" .. ch
          end
          return nil
        end
      )))
    end
    function pdftexcmds.escapename(str, mode)
      if mode == "byte" then
        str = pdftexcmds.utf8_to_byte(str)
      end
      tex.write((string.gsub(str, ".",
        function (ch)
          local b = string.byte(ch)
          if b == 0 then
            return ""
          end
          if b <= 32 or b >= 127
              or b == 35 or b == 37 or b == 40 or b == 41
              or b == 47 or b == 60 or b == 62 or b == 91
              or b == 93 or b == 123 or b == 125 then
            return string.format("#%.2X", b)
          else
            return nil
          end
        end
      )))
    end
    function pdftexcmds.filesize(filename)
      local foundfile = kpse.find_file(filename, "tex", true)
      if foundfile then
        local size = lfs.attributes(foundfile, "size")
        if size then
          tex.write(size)
        end
      end
    end
    function pdftexcmds.filemoddate(filename)
      local foundfile = kpse.find_file(filename, "tex", true)
      if foundfile then
        local date = lfs.attributes(foundfile, "modification")
        if date then
          local d = os.date("*t", date)
          if d.sec >= 60 then
            d.sec = 59
          end
          local u = os.date("!*t", date)
          local off = 60 * (d.hour - u.hour) + d.min - u.min
          if d.year ~= u.year then
            if d.year > u.year then
              off = off + 1440
            else
              off = off - 1440
            end
          elseif d.yday ~= u.yday then
            if d.yday > u.yday then
              off = off + 1440
            else
              off = off - 1440
            end
          end
          local timezone
          if off == 0 then
            timezone = "Z"
          else
            local hours = math.floor(off / 60)
            local mins = math.abs(off - hours * 60)
            timezone = string.format("%+03d'%02d'", hours, mins)
          end
          tex.write(string.format("D:%04d%02d%02d%02d%02d%02d%s",
              d.year, d.month, d.day, d.hour, d.min, d.sec, timezone))
        end
      end
    end
    function pdftexcmds.filedump(offset, length, filename)
      length = tonumber(length)
      if length and length > 0 then
        local foundfile = kpse.find_file(filename, "tex", true)
        if foundfile then
          offset = tonumber(offset)
          if not offset then
            offset = 0
          end
          local filehandle = io.open(foundfile, "r")
          if filehandle then
            if offset > 0 then
              filehandle:seek("set", offset)
            end
            local dump = filehandle:read(length)
            pdftexcmds.escapehex(dump)
          end
        end
      end
    end
    function pdftexcmds.mdfivesum(str, mode)
      if mode == "byte" then
        str = pdftexcmds.utf8_to_byte(str)
      end
      pdftexcmds.escapehex(md5.sum(str))
    end
    function pdftexcmds.filemdfivesum(filename)
      local foundfile = kpse.find_file(filename, "tex", true)
      if foundfile then
        local filehandle = io.open(foundfile, "r")
        if filehandle then
          local contents = filehandle:read("*a")
          pdftexcmds.escapehex(md5.sum(contents))
        end
      end
    end
    function pdftexcmds.shellescape()
      if os.execute then
        tex.write("1")
      else
        tex.write("0")
      end
    end
    function pdftexcmds.system(cmdline)
      pdftexcmds.systemexitstatus = nil
      texio.write_nl("log", "system(" .. cmdline .. ") ")
      if os.execute then
        texio.write("log", "executed.")
        pdftexcmds.systemexitstatus = os.execute(cmdline)
      else
        texio.write("log", "disabled.")
      end
    end
    function pdftexcmds.lastsystemstatus()
      local result = tonumber(pdftexcmds.systemexitstatus)
      if result then
        local x = math.floor(result / 256)
        tex.write(result - 256 * math.floor(result / 256))
      end
    end
    function pdftexcmds.lastsystemexit()
      local result = tonumber(pdftexcmds.systemexitstatus)
      if result then
        tex.write(math.floor(result / 256))
      end
    end
    function pdftexcmds.pipe(cmdline)
      local result
      pdftexcmds.systemexitstatus = nil
      texio.write_nl("log", "pipe(" .. cmdline ..") ")
      if io.popen then
        texio.write("log", "executed.")
        local handle = io.popen(cmdline, "r")
        if handle then
          result = handle:read("*a")
          handle:close()
        end
      else
        texio.write("log", "disabled.")
      end
      if result then
        tex.settoks(pdftexcmds.toks, result)
      else
        tex.settoks(pdftexcmds.toks, "")
      end
    end
  }
\endgroup
\long\def\pdf@strcmp#1#2{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.strcmp("\luaescapestring{#1}",%
        "\luaescapestring{#2}")%
  }%
}%
\long\def\pdf@escapehex#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.escapehex("\luaescapestring{#1}", "byte")%
  }%
}%
\long\def\pdf@escapehexnative#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.escapehex("\luaescapestring{#1}")%
  }%
}%
\def\pdf@unescapehex#1{%
  \the\expandafter\pdftexcmds@toks
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.toks="pdftexcmds@toks"%
    pdftexcmds.unescapehex("\luaescapestring{#1}", "byte")%
  }%
}%
\def\pdf@unescapehexnative#1{%
  \the\expandafter\pdftexcmds@toks
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.toks="pdftexcmds@toks"%
    pdftexcmds.unescapehex("\luaescapestring{#1}")%
  }%
}%
\long\def\pdf@escapestring#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.escapestring("\luaescapestring{#1}", "byte")%
  }%
}
\long\def\pdf@escapename#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.escapename("\luaescapestring{#1}", "byte")%
  }%
}
\long\def\pdf@escapenamenative#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.escapename("\luaescapestring{#1}")%
  }%
}
\def\pdf@filesize#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.filesize("\luaescapestring{#1}")%
  }%
}
\def\pdf@filemoddate#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.filemoddate("\luaescapestring{#1}")%
  }%
}
\def\pdf@filedump#1#2#3{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.filedump("\luaescapestring{\number#1}",%
        "\luaescapestring{\number#2}",%
        "\luaescapestring{#3}")%
  }%
}%
\long\def\pdf@mdfivesum#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.mdfivesum("\luaescapestring{#1}", "byte")%
  }%
}%
\long\def\pdf@mdfivesumnative#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.mdfivesum("\luaescapestring{#1}")%
  }%
}%
\def\pdf@filemdfivesum#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.filemdfivesum("\luaescapestring{#1}")%
  }%
}%
\def\pdf@shellescape{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.shellescape()%
  }%
}
\def\pdf@system#1{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.system("\luaescapestring{#1}")%
  }%
}
\def\pdf@lastsystemstatus{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.lastsystemstatus()%
  }%
}
\def\pdf@lastsystemexit{%
  \directlua\pdftexcmds@luastate{%
    pdftexcmds.lastsystemexit()%
  }%
}
\ifnum0%
    \directlua\pdftexcmds@luastate{%
      if io.popen then %
        tex.write("1")%
      end%
    }%
    =1 %
  \def\pdf@pipe#1{%
    \the\expandafter\pdftexcmds@toks
    \directlua\pdftexcmds@luastate{%
      pdftexcmds.toks="pdftexcmds@toks"%
      pdftexcmds.pipe("\luaescapestring{#1}")%
    }%
  }%
\fi
\pdftexcmds@AtEnd
\endinput
%%
%% End of file `pdftexcmds.sty'.
