%\iffalse
%<*internal>
\iffalse
%</internal>
%<*internal>
\fi
\begingroup
%</internal>
%<*batchfile>
\input docstrip.tex
\keepsilent
\preamble
  ________________________________________________________
  Copyright (C) 2007-2017  Will Robertson & Johannes Große
  License information appended.
\endpreamble
\postamble
Copyright (C) 2007-2017 by Will Robertson & Johannes Große

Distributable under the LaTeX Project Public License,
version 1.3c or higher (your choice). The latest version of
this license is at: http://www.latex-project.org/lppl.txt

This work is "author-maintained" by Will Robertson.

This work consists of the file  ifplatform.dtx
          and the derived files ifplatform.pdf,
                                ifplatform.sty, and
                                ifplatform.ins.
\endpostamble
\askforoverwritefalse
\generate{\file{ifplatform.sty}{\from{ifplatform.dtx}{package}}}
%</batchfile>
%<batchfile>\endbatchfile
%<*internal>
\generate{\file{\jobname.ins}{\from{\jobname.dtx}{batchfile}}}
\nopreamble\nopostamble
\endgroup
\immediate\write18{makeindex -s gind.ist -o \jobname.ind  \jobname.idx}
\immediate\write18{makeindex -s gglo.ist -o \jobname.gls  \jobname.glo}
%</internal>
%<*driver>
\documentclass{ltxdoc}
\errorcontextlines=999
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%\OnlyDescription
\usepackage{array,booktabs,color,enumitem,geometry,hologo,microtype}
\usepackage[sc,osf]{mathpazo}
\usepackage[colorlinks]{hyperref}
\geometry{b5paper}
\linespread{1.1}       % A bit more space between lines
\frenchspacing         % Remove ugly extra space after punctuation
\definecolor{niceblue}{rgb}{0.2,0.4,0.8}
\def\theCodelineNo{\textcolor{niceblue}{\sffamily\tiny\arabic{CodelineNo}}}
\newcommand*\pkg[1]{\textsf{#1}}
\hfuzz2pt
\usepackage{ifplatform}% for version info
\ifwindows
  \typeout{ifplatform debug: using Windows.}
\fi\iflinux
  \typeout{ifplatform debug: using Linux.}
\fi\ifmacosx
  \typeout{ifplatform debug: using Mac OS X.}
\fi\ifcygwin
  \typeout{ifplatform debug: using Cygwin.}
\fi
\begin{document}
\DocInput{ifplatform.dtx}
\end{document}
%</driver>
%\fi
%
% \GetFileInfo{\jobname.sty}
% \CheckSum{0}
% \makeatletter
%
% \title{The \pkg{\jobname} package}
% \author{Original code by Johannes Gro\ss{}e\\
%         Package by Will Robertson\\
%         \color[gray]{0.5}
%         \texttt{http://github.com/wspr/ifplatform}}
% \date{\fileversion\thanks{Thanks to Ken Brown, Joseph Wright, Zebb Prime, and others for testing this package.}\qquad \filedate}
%
% \maketitle
%
% \section{Main features and usage}
%
% This package provides the three following conditionals to test
% which operating system is being used to run \TeX:
% \begin{itemize}[nolistsep,label={}]
% \item \cs{ifwindows}
% \item \cs{iflinux}
% \item \cs{ifmacosx}
% \item \cs{ifcygwin}
% \end{itemize}
% If you only wish to detect \cs{ifwindows}, then it does not matter how you
% load this package. Note then that use of (Linux \emph{or} \macosxname\ \emph{or} Cygwin) can
% then be detected with \cs{ifwindows}\cs{else}.
%
% If you also wish to determine the difference between which Unix-variant
% you are using (i.e., also detect \cs{iflinux}, \cs{ifmacosx}, and \cs{ifcygwin}) then shell
% escape must be enabled.
% This is achieved by using the |-shell-escape| command line option when
% executing \LaTeX.
%
% If shell escape is not enabled, \cs{iflinux}, \cs{ifmacosx}, and \cs{ifcygwin} will all return \emph{false}. A warning will be printed in the console output to remind you in this case.
%
% \section{Auxiliary features}
%
% \cs{ifshellescape} is provided as a conditional to test whether
% shell escape is active or not. (Note: new versions of pdf\/\TeX\
% allow you to query shell escape with \verb|\ifnum\pdfshellescape>0|\,,
% and the \pkg{pdftexcmds} package provides the wrapper \cs{pdf@shellescape}
% which works with \hologo{XeTeX}, \hologo{pdfTeX}, and \hologo{LuaTeX}.)
%
% Also, the \cmd\platformname\ command is defined to expand to a
% macro that represents the operating system. Default definitions are
% (respectively):
% \begin{quote}
% \begin{tabular}{@{}l@{\quad$\to$\quad}l}
% \cmd\windowsname & `\windowsname' \\
% \cmd\notwindowsname & `\notwindowsname' (when shell escape is disabled) \\
% \cmd\linuxname & `\linuxname' \\
% \cmd\macosxname & `\macosxname' \\
% \cmd\cygwinname & `\cygwinname' \\
% \cmd\unknownplatform & \emph{whatever is returned by} |uname| \\
% \end{tabular}
% \end{quote}
% E.g., if \cs{ifwindows} is \emph{true} then \cs{platformname}
% expands to \cs{windowsname}, which expands to `\windowsname'.
% Redefine the macros above to customise
% the output of \cmd\platformname.
%
% \begin{center}\itshape
%  This documentation was compiled on \platformname.
% \end{center}
%
% \section{Other platforms}
%
% If greater granularity is required to differentiate between various \textsc{unix}-like operating systems, then \cmd\unknownplatform\ can be interrogated for the platform based on the output of |uname|. Table~\ref{table} lists possible outputs for a range of operating systems.
%
% For example, to test whether the AIX operating system is being used, you could use the following code:
% \begin{quote}
% \begin{verbatim}
%\def\myplatform{aix6}
%\ifx\myplatform\unknownplatform
%  ... AIX is being used ...
%\else
%  ... or not ...
%\fi
% \end{verbatim}
% \end{quote}
% The \pkg{ifthen} and \pkg{xifthen} packages might be of interest to those who prefer more \LaTeX-like methods of conditional testing.
%
% \begin{table}[hp]
% \centering
% \begin{tabular}{@{}l>{\ttfamily}c@{}}
% \toprule
% Platform & uname \textrm{string} \\
% \midrule
% FreeBSD & {FreeBSD} \\
% OpenBSD & {OpenBSD} \\
% Solaris & {SunOS} \\
% HPUX & {HP-UX} \\
% IRIX & {IRIX64} \\
% AIX & {aix6} \\
% Cray UNICOS & {sn5176} \\
% \bottomrule
% \end{tabular}
% \caption{List of operating systems and their \texttt{uname} strings. Adapted from % \url{http://en.wikipedia.org/wiki/Uname}.}
% \label{table}
% \end{table}
%
% \section{Limitations}
%
% Some technical information in case things go wrong.
% \begin{itemize}
% \item \pkg{ifplatform} checks for Windows by the presence or absence of the file `|nul:|'. If you have a file in your search path in *nix called `|nul:.tex|' (or without the |.tex|) then things may become confused.
%
% \item \pkg{ifplatform} checks for *nix by the presence or absence of the file `|/dev/null|'. If you have the file in Windows called |/dev/null.tex| (or without the extension) then things might similarly get mixed up.
%
% \item When both null files are detected (i.e., things aren't right with one of the two tests above), \pkg{ifplatform} uses another test to try and sort itself out. For interest, the test is: `|echo # > \jobname.w18|'. Under Windows you should end up with a text file containing an octothorpe. On *nix, the |#| will be seen as a comment char and the test will be ignored and the file will not be written.
%
% This `last resort' test will fail if shell escape is not enabled, or if the file |\jobname.w18|
% somehow already exists, or if the behaviour of |#| isn't as reliable as I think.
%
% \item Note that if you're running \TeX\ binaries from Cygwin on Windows, then your platform will \emph{not} be Windows. It will appear to be a *nix system, with platform name `Cygwin'.
%
% \item If you ever see the error
% \begin{quote}\ttfamily I can't tell if this is Windows or *nix; you
% appear to be neither.\end{quote}
% then I'd dearly like to know how it happened. It should
% never occur, as far as I know.
% (Update: in previous versions of this package, this message appeared when running under \hologo{LuaTeX}.)
% \end{itemize}
% Keep these points in mind and you'll never run into trouble.
% I hope you won't run into trouble in any case.
%
% \clearpage
% \StopEventually{\PrintIndex}
% \section{Implementation}
%\iffalse
%<*package>
%\fi
%    \begin{macrocode}
\ProvidesPackage{ifplatform}
  [2017/10/13 v0.4a  Testing for the operating system]
%    \end{macrocode}
% Packages required: (thanks Heiko)
%    \begin{macrocode}
\RequirePackage{shellesc,pdftexcmds,catchfile,ifluatex}
%    \end{macrocode}
% Conditionals we provide:
%    \begin{macrocode}
\newif\ifshellescape
\newif\ifwindows
\newif\ifmacosx
\newif\iflinux
\newif\ifcygwin
%    \end{macrocode}
% \begin{macro}{\windowsname}
% \begin{macro}{\notwindowsname}
% \begin{macro}{\linuxname}
% \begin{macro}{\macosxname}
% \begin{macro}{\cygwinname}
% \begin{macro}{\unknownplatform}
% Names of operating systems:
%    \begin{macrocode}
\newcommand\windowsname{Windows}
\newcommand\notwindowsname{*NIX}
\newcommand\linuxname{Linux}
\newcommand\macosxname{Mac\,OS\,X}
\newcommand\cygwinname{Cygwin}
\newcommand\unknownplatform{[Unknown]}
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
% For internal stuff later:
%    \begin{macrocode}
\edef\ip@file{\jobname.w18}
\newif\if@ip@nix@
%    \end{macrocode}
% \begin{macro}{\ifshellescape}
% Determine if shell escape is enabled:
%    \begin{macrocode}
\ifnum\pdf@shellescape=1\relax
  \shellescapetrue
\else
  \ifluatex\else
    \PackageWarningNoLine{ifplatform}{^^J \space\space\space
      shell escape is disabled,
      so I can only detect \@backslashchar ifwindows%
    }
  \fi
\fi
%    \end{macrocode}
% \end{macro}
% An error message for when things go wrong:
%    \begin{macrocode}
\def\ip@cantdecide{%
  \PackageWarningNoLine{ifplatform}{^^J \space\space\space
    I can't tell if this is Windows or *nix;
    you appear to be both%
  }%
}
%    \end{macrocode}
% Now the platform test. In Lua\TeX\ this is straightforward:
%    \begin{macrocode}
\ifluatex
  \csname\directlua{
      if os.type == "unix" then
        tex.sprint("@ip@nix@true")
      elseif os.type == "windows" then
        tex.sprint("windowstrue")
      end
    }\endcsname
\else
%    \end{macrocode}
% Otherwise we need to
% test for the null files of Windows and *nix.
% (This doesn't work at all in LuaTeX. Not sure why; haven't looked.)
% In a normal situation, this is all we need to do:
%    \begin{macrocode}
  \IfFileExists{nul:}{\@ip@nix@false}{\@ip@nix@true}
  \IfFileExists{/dev/null}{\windowsfalse}{\windowstrue}
%    \end{macrocode}
% \begin{table}
% \centering
% \begin{tabular}{@{}llll@{}}
% \toprule
% File & Exists & Windows? & *nix? \\
% \midrule
% \texttt{nul:} & true & Probably & Maybe \\
% &  false & Definitely not & Definitely \\
% \texttt{/dev/null} & true & Maybe & Probably \\
% & false & Definitely & Definitely not \\
% \bottomrule
% \end{tabular}
% \caption{Possibilities for testing null files and their prospects for determining the platform.}
% \label{tbl}
% \end{table}
% However, sometimes that's not good enough.
% If things go wrong above, we still don't know which platform. Can only proceed if shell escape is on; fallback heuristic:
% \begin{itemize}[nolistsep]
% \item If the tmp file exists
% \begin{itemize}[nolistsep]
% \item Tell them to delete it and abort.
% \item Otherwise:
% \end{itemize}
% \item Write to it with |echo| that only works on Windows
% \item Then see again if it exists
% \begin{itemize}[nolistsep]
% \item If the tmp file exists: Windows (and delete the file)
% \item Otherwise: *nix
% \end{itemize}
% \end{itemize}
% Here's the code for the above `last resort' test:
%    \begin{macrocode}
  \edef\ip@windows@echo@test{echo \string# > "\ip@file"}
  \def\ip@backupplan{%
    \IfFileExists{\ip@file}{%
      \PackageWarningNoLine{ifplatform}{^^J \space\space\space
        Please delete the file "\ip@file" and try again%
      }%
      \ip@cantdecide
    }{%
      \ShellEscape{\ip@windows@echo@test}%
      \IfFileExists{\ip@file}{%
        \ShellEscape{del "\ip@file"}%
        \windowstrue
      }{%
        \@ip@nix@true
      }%
    }%
  }
%    \end{macrocode}
% Now we use some odd logic to deduce what's happening in the edge cases when things go wrong: (see table~\ref{tbl})
%    \begin{macrocode}
  \ifwindows
    \if@ip@nix@
      \PackageWarningNoLine{ifplatform}{^^J \space\space\space
        I can't tell if this is Windows or *nix;
        you appear to be neither%
      }
    \fi
  \else
    \if@ip@nix@\else
      \ifshellescape
        \ip@backupplan
      \else
        \ip@cantdecide
      \fi
    \fi
  \fi
\fi
%    \end{macrocode}
% Needed below:
%    \begin{macrocode}
\def\ip@only@six#1#2#3#4#5#6#7\@nil{#1#2#3#4#5#6}
%    \end{macrocode}
%
% \begin{macro}{\iflinux}
% \begin{macro}{\ifmacosx}
% \begin{macro}{\ifcygwin}
% Now test for the others; directly test for Linux and Mac\,OS\,X; but what about Solaris or FreeBSD or \dots\ ?
% Define \cmd\unknownplatform\ as the output of |uname| rather than enumerate the possibilities.
%    \begin{macrocode}
\if@ip@nix@\ifshellescape
  \ifwindows\else
    \ShellEscape{uname -s > "\ip@file"}
    \CatchFileDef\@tempa{\ip@file}{}
    \ShellEscape{rm -- "\ip@file"}
%    \end{macrocode}
% Kill a trailing space:
%    \begin{macrocode}
    \edef\@tempa{\expandafter\zap@space\@tempa\@empty}
    \def\@tempb{Linux}
    \ifx\@tempa\@tempb
      \linuxtrue
    \else
      \def\@tempb{Darwin}
      \ifx\@tempa\@tempb
        \macosxtrue
      \else
        \def\@tempb{CYGWIN}
        \edef\@tempc{\expandafter\ip@only@six\@tempa------\@nil}
        \ifx\@tempb\@tempc
          \cygwintrue
        \else
          \edef\unknownplatform{\@tempa}
        \fi
      \fi
    \fi
  \fi
\fi\fi
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
%
% \begin{macro}{\platformname}
% Defined in terms of macros so the output is user-customisable.
%    \begin{macrocode}
\edef\platformname{%
  \ifwindows
    \noexpand\windowsname
  \else
    \ifshellescape
      \iflinux
        \noexpand\linuxname
      \else
        \ifmacosx
          \noexpand\macosxname
        \else
          \ifcygwin
            \noexpand\cygwinname
          \else
            \noexpand\unknownplatform
          \fi
        \fi
      \fi
    \else
      \noexpand\notwindowsname
    \fi
  \fi
}
%    \end{macrocode}
% \end{macro}
%\iffalse
%</package>
%\fi
%
% \Finale
%
% \typeout{------------------------------------------------------}
% \typeout{ To finish the installation please move the following}
% \typeout{ file into a directory searched by LaTeX:}
% \typeout{ \space- ifplatform.sty}
% \typeout{------------------------------------------------------}
%
\endinput
