% \iffalse meta-comment
%
%% File: l3sys.dtx Copyright (C) 2015-2017 The LaTeX3 Project
%
% It may be distributed and/or modified under the conditions of the
% LaTeX Project Public License (LPPL), either version 1.3c of this
% license or (at your option) any later version.  The latest version
% of this license is in the file
%
%    http://www.latex-project.org/lppl.txt
%
% This file is part of the "l3kernel bundle" (The Work in LPPL)
% and all files in that bundle must be distributed together.
%
% -----------------------------------------------------------------------
%
% The development version of the bundle can be found at
%
%    https://github.com/latex3/latex3
%
% for those people who are interested.
%
%<*driver>
\documentclass[full]{l3doc}
\begin{document}
  \DocInput{\jobname.dtx}
\end{document}
%</driver>
% \fi
%
% \title{^^A
%   The \pkg{l3sys} package\\System/runtime functions^^A
% }
%
% \author{^^A
%  The \LaTeX3 Project\thanks
%    {^^A
%      E-mail:
%        \href{mailto:latex-team@latex-project.org}
%          {latex-team@latex-project.org}^^A
%    }^^A
% }
%
% \date{Released 2017/09/18}
%
% \maketitle
%
% \begin{documentation}
%
% \section{The name of the job}
%
% \begin{variable}[added = 2015-09-19]{\c_sys_jobname_str}
%   Constant that gets the \enquote{job name} assigned when \TeX{} starts.
%   \begin{texnote}
%     This copies the contents of the primitive \tn{jobname}. It is a constant
%     that is set by \TeX{} and should not be overwritten by the package.
%   \end{texnote}
% \end{variable}
%
% \section{Date and time}
% 
% \begin{variable}[added = 2015-09-22]
%   {
%     \c_sys_minute_int,
%     \c_sys_hour_int,
%     \c_sys_day_int,
%     \c_sys_month_int,
%     \c_sys_year_int,
%   }
%   The date and time at which the current job was started: these are
%   all reported as integers.
%   \begin{texnote}
%     Whilst the underlying primitives can be altered by the user, this
%     interface to the time and date is intended to be the \enquote{real}
%     values.
%   \end{texnote}
% \end{variable}
%
% \section{Engine}
%
% \begin{function}[added = 2015-09-07, EXP, pTF]
%   {
%     \sys_if_engine_luatex:,
%     \sys_if_engine_pdftex:,
%     \sys_if_engine_ptex:  ,
%     \sys_if_engine_uptex: ,
%     \sys_if_engine_xetex:
%   }
%   \begin{syntax}
%     \cs{sys_if_engine_pdftex:TF} \Arg{true code} \Arg{false code}
%   \end{syntax}
%   Conditionals which allow engine-specific code to be used. The names
%   follow naturally from those of the engine binaries: note that the
%   |(u)ptex| tests are for \epTeX{} and \eupTeX{} as \pkg{expl3} requires
%   the \eTeX{} extensions. Each conditional is true for
%   \emph{exactly one} supported engine. In particular,
%   |\sys_if_engine_ptex_p:| is true for \epTeX{} but false for \eupTeX{}.
% \end{function}
%
% \begin{variable}[added = 2015-09-19]{\c_sys_engine_str}
%   The current engine given as a lower case string: one of
%   |luatex|, |pdftex|, |ptex|, |uptex| or |xetex|.
% \end{variable}
%
% \section{Output format}
%
% \begin{function}[added = 2015-09-19, EXP, pTF]
%   {
%     \sys_if_output_dvi:,
%     \sys_if_output_pdf:
%   }
%   \begin{syntax}
%     \cs{sys_if_output_dvi:TF} \Arg{true code} \Arg{false code}
%   \end{syntax}
%   Conditionals which give the current output mode the \TeX{} run is
%   operating in. This is always one of two outcomes, DVI mode or
%   PDF mode. The two sets of conditionals are thus complementary and
%   are both provided to allow the programmer to emphasise the most
%   appropriate case.
% \end{function}
%
% \begin{variable}[added = 2015-09-19]{\c_sys_output_str}
%   The current output mode given as a lower case string: one of
%   |dvi| or |pdf|.
% \end{variable}
%
% \end{documentation}
%
% \begin{implementation}
%
% \section{\pkg{l3sys} implementation}
%
%    \begin{macrocode}
%<*initex|package>
%    \end{macrocode}
%
% \subsection{The name of the job}
%
% \begin{variable}{\c_sys_jobname_str}
%   Inherited from the \LaTeX3 name for the primitive: this needs to
%   actually contain the text of the job name rather than the name of
%   the primitive, of course.
%    \begin{macrocode}
%<*initex>
\tex_everyjob:D \exp_after:wN
  {
    \tex_the:D \tex_everyjob:D
    \str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
  }
%</initex>
%<*package>
\str_const:Nx \c_sys_jobname_str { \tex_jobname:D }
%</package>
%    \end{macrocode}
% \end{variable}
%
% \subsection{Time and date}
%
% \begin{variable}
%   {
%     \c_sys_minute_int,
%     \c_sys_hour_int,
%     \c_sys_day_int,
%     \c_sys_month_int,
%     \c_sys_year_int,
%   }
%   Copies of the information provided by \TeX{}
%    \begin{macrocode}
\int_const:Nn \c_sys_minute_int
  { \int_mod:nn { \tex_time:D } { 60 } }
\int_const:Nn \c_sys_hour_int
  { \int_div_truncate:nn { \tex_time:D } { 60 } }
\int_const:Nn \c_sys_day_int   { \tex_day:D }
\int_const:Nn \c_sys_month_int { \tex_month:D }
\int_const:Nn \c_sys_year_int  { \tex_year:D }
%    \end{macrocode}
% \end{variable}
%
% \subsection{Detecting the engine}
%
% \begin{macro}[pTF, EXP]
%   {
%     \sys_if_engine_luatex:,
%     \sys_if_engine_pdftex:,
%     \sys_if_engine_ptex:,
%     \sys_if_engine_uptex:,
%     \sys_if_engine_xetex:
%   }
% \begin{variable}{\c_sys_engine_str}
%   Set up the engine tests on the basis exactly one test should be true.
%   Mainly a case of looking for the appropriate marker primitive. For
%   \upTeX{}, there is a complexity in that setting |-kanji-internal=sjis|
%   or |-kanji-internal=euc| effective makes it more like \pTeX{}. In those
%   cases we therefore report \pTeX{} rather than \upTeX{}.
%    \begin{macrocode}
\clist_map_inline:nn { lua , pdf , p , up , xe }
  {
    \cs_new_eq:cN { sys_if_engine_ #1 tex:T }  \use_none:n
    \cs_new_eq:cN { sys_if_engine_ #1 tex:F }  \use:n
    \cs_new_eq:cN { sys_if_engine_ #1 tex:TF } \use_ii:nn
    \cs_new_eq:cN { sys_if_engine_ #1 tex_p: } \c_false_bool
  }
\cs_if_exist:NT \luatex_luatexversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_luatex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_luatex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_luatex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_luatex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { luatex }
  }
\cs_if_exist:NT \pdftex_pdftexversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_pdftex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_pdftex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_pdftex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_pdftex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { pdftex }
  }
\cs_if_exist:NT \ptex_kanjiskip:D
  {
    \bool_lazy_and:nnTF
      { \cs_if_exist_p:N \uptex_disablecjktoken:D }
      { \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } }
      {
        \cs_gset_eq:NN \sys_if_engine_uptex:T  \use:n
        \cs_gset_eq:NN \sys_if_engine_uptex:F  \use_none:n
        \cs_gset_eq:NN \sys_if_engine_uptex:TF \use_i:nn
        \cs_gset_eq:NN \sys_if_engine_uptex_p: \c_true_bool
        \str_const:Nn \c_sys_engine_str { uptex }
      }
      {
        \cs_gset_eq:NN \sys_if_engine_ptex:T  \use:n
        \cs_gset_eq:NN \sys_if_engine_ptex:F  \use_none:n
        \cs_gset_eq:NN \sys_if_engine_ptex:TF \use_i:nn
        \cs_gset_eq:NN \sys_if_engine_ptex_p: \c_true_bool
        \str_const:Nn \c_sys_engine_str { ptex }
      }
  }
\cs_if_exist:NT \xetex_XeTeXversion:D
  {
    \cs_gset_eq:NN \sys_if_engine_xetex:T  \use:n
    \cs_gset_eq:NN \sys_if_engine_xetex:F  \use_none:n
    \cs_gset_eq:NN \sys_if_engine_xetex:TF \use_i:nn
    \cs_gset_eq:NN \sys_if_engine_xetex_p: \c_true_bool
    \str_const:Nn \c_sys_engine_str { xetex }
  }
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
% \subsection{Detecting the output}
%
% \begin{macro}[pTF, EXP]
%   {
%     \sys_if_output_dvi:,
%     \sys_if_output_pdf:
%   }
% \begin{variable}{\c_sys_output_str}
%   This is a simple enough concept: the two views here are complementary.
%    \begin{macrocode}
\int_compare:nNnTF
  { \cs_if_exist_use:NF \pdftex_pdfoutput:D { 0 } } > { 0 }
  {
    \cs_new_eq:NN \sys_if_output_dvi:T  \use_none:n
    \cs_new_eq:NN \sys_if_output_dvi:F  \use:n
    \cs_new_eq:NN \sys_if_output_dvi:TF \use_ii:nn
    \cs_new_eq:NN \sys_if_output_dvi_p: \c_false_bool
    \cs_new_eq:NN \sys_if_output_pdf:T  \use:n
    \cs_new_eq:NN \sys_if_output_pdf:F  \use_none:n
    \cs_new_eq:NN \sys_if_output_pdf:TF \use_i:nn
    \cs_new_eq:NN \sys_if_output_pdf_p: \c_true_bool
    \str_const:Nn \c_sys_output_str { pdf }
  }
  {
    \cs_new_eq:NN \sys_if_output_dvi:T  \use:n
    \cs_new_eq:NN \sys_if_output_dvi:F  \use_none:n
    \cs_new_eq:NN \sys_if_output_dvi:TF \use_i:nn
    \cs_new_eq:NN \sys_if_output_dvi_p: \c_true_bool
    \cs_new_eq:NN \sys_if_output_pdf:T  \use_none:n
    \cs_new_eq:NN \sys_if_output_pdf:F  \use:n
    \cs_new_eq:NN \sys_if_output_pdf:TF \use_ii:nn
    \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool
    \str_const:Nn \c_sys_output_str { dvi }
  }
%    \end{macrocode}
% \end{variable}
% \end{macro}
%
%    \begin{macrocode}
%</initex|package>
%    \end{macrocode}
%
%\end{implementation}
%
%\PrintIndex
