\chapter{Execution}\label{ch:execution}

\section{Aprepro Execution and Program Options}
\aprepro{} is executed with the command:
\begin{apinp}
aprepro [--parameters] [-dsviehMWCq] [-I path] [-c char] [var=val] filein fileout
\end{apinp}

The effects of the parameters are:
\begin{longtable}{lp{5.0in}}
--debug (-d) &  Dump all variables, debug loops/if/endif \\
--dumpvars (-D) & Dump all variables at end of run \\
--dumpvars\_json (-J) & Dump all variables at end of run in json format \\
--version (-v) &  Print version number to stderr           \\
--comment char (-c char) &  Change comment character to 'char'       \\
--immutable (-X) &  All variables are immutable--cannot be modified \\
--errors\_fatal (-f) & Exit program with nonzero status if errors are encountered \\
--errors\_and\_warnings\_fatal (-F) & Exit program with nonzero status if warnings are encountered \\
--require\_defined (-R) & Treat undefined variable warnings as fatal \\
--interactive (-i) &  Interactive use, no buffering of output.       \\
--include path (-I path) &  Include file or include path. Any variables defined in the include file will be immutable.\\
--one\_based\_index (-1) & Array indexing is one-based (default = zero-based) \\
--exit\_on (-e) &  If this is enabled, \aprepro{} will exit when any of the strings
EXIT, Exit, exit, QUIT, Quit, or quit are entered. Otherwise, \aprepro{} will exit at end of
file. \\
--message (-M) &  Print INFO messages. (See Chapter~\ref{ch:errors} for a list of INFO messages.) \\
--info=file & Output INFO messages (e.g. DUMP() output) to file. \\
--nowarning (-W) &  Do not print warning messages. (See Chapter~\ref{ch:errors} for a list of warning messages.) \\
--copyright (-c) &  Print copyright message                  \\
--quiet (-q) &  Do not anything extra to stdout          \\
--help (-h) &  Print this list                          \\

var=val &  Assign value \var{val} to variable \var{var}. This lets you dynamically set
the value of a variable and change it between runs without editing the
input file.  Multiple \textit{var=val} pairs can be specified on the
command line.  A variable that is defined on the command line will be
an immutable variable whose value cannot be changed\footnote{Unless
the variable name begins with an underscore.}.  If \var{var} is a string variable, then
\var{val} needs to be surrounded by escaped double quotes. For example \cmd{name=\textbackslash{}"My\textbackslash Name\textbackslash{}"} will define the string variable \var{name}.\footnote{Note that any spaces in the string variables value must be escaped also.}\\

input\_file &  specifies  the  file  that  contains  the \aprepro{} input. If this parameter is
omitted, \aprepro{} will run interactively. \\

output\_file &  specifies   the   file \aprepro{} will write the processed data to. If this
parameter is omitted, \aprepro{} will write the data to the terminal.   (stdout) \\
\end{longtable}

The \cmd{-} followed by a single letter shown in the parameter descriptions above are optional short-options
that can be specified instead of the long options. For example, the following
two lines are equivalent:

\begin{apinp}
aprepro --debug --nowarning --statistics --comment \#
aprepro -dWsc\#
\end{apinp}
Note that the short options can be concatenated.

\section{Interactive Input}

If no input file is specified when \aprepro{} is executed, then all
input will be read from standard input; or in other words, typed in by
the user.  In this mode, there are a few command-line editing and
recall capabilities provided.

The command-line editing provides Emacs style key bindings and
history functionality.  The key bindings are shown in the following
table. The syntax \cmd{\^{}X} indicates that the user should press and
hold the ``control'' key and then press the \cmd{X} key. The syntax
\cmd{M-X} indicates pressing the ``meta'' key followed by the \cmd{X}
key. The meta key is sometimes escape, or sometimes ``alt'', or some
other key depending on the users keymap.

\begin{longtable}{lp{4.0in}}
\caption{Key Bindings used in the interactive input to \aprepro{}} \\
\hline
Key & Function \\
\hline
\endhead
\^{}A/\^{}E & Move cursor to beginning/end of the line. \\
\^{}F/\^{}B & Move cursor forward/backward one character. \\
\^{}D       & Delete the character under the cursor. \\
\^{}H       & Delete the character to the left of the cursor. \\
\^{}K       & Kill from the cursor to the end of line. \\
\^{}L       & Redraw current line. \\
\^{}O       & Toggle overwrite/insert mode. Initially in insert mode. Text
              added in overwrite mode (including yanks) overwrite
              existing text, while insert mode does not overwrite. \\
\^{}P/\^{}N & Move to previous/next item on history list. \\
\^{}R/\^{}S & Perform incremental reverse/forward search for string on
              the history list.  Typing normal characters adds to the current
              search string and searches for a match. Typing \^{}R/\^{}S marks
              the start of a new search, and moves on to the next match.
              Typing \^{}H deletes the last character from the search
              string, and searches from the starting location of the last search.
              Therefore, repeated \^{}H's appear to unwind to the match nearest
              the point at which the last \^{}R or \^{}S was typed.  If \^{}H is
              repeated until the search string is empty the search location
              begins from the start of the history list.  Typing ESC or
              any other editing character accepts the current match and
              loads it into the buffer, terminating the search.  \\
\^{}T       & Toggle the characters under and to the left of the cursor.  \\
\^{}U       & Kill from beginning to the end of the line. \\
\^{}Y       & Yank previously killed text back at current location.  Note that
              this will overwrite or insert, depending on the current mode. \\
M-F/M-B     & Move cursor forward/backward one word. \\
\^{}SPC     & Set mark. \\
\^{}W       & Kill from mark to point. \\
\^{}X       & Exchange mark and point. \\
RETURN      & returns current buffer to the program.
\end{longtable}
