/*
 * *****************************************************************************
 *
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 * *****************************************************************************
 *
 * The dc help text.
 *
 */

usage: %s [options] [file...]

dc is a reverse-polish notation command-line calculator which supports unlimited
precision arithmetic. For details, use `man %s` or see the online documentation
at https://git.yzena.com/gavin/bc/src/tag/%s/manuals/bc/%s.1.md.

This dc is (mostly) compatible with the OpenBSD dc and the GNU dc. See the
OpenBSD man page (http://man.openbsd.org/OpenBSD-current/man1/dc.1) and the GNU
dc manual (https://www.gnu.org/software/bc/manual/dc-1.05/html_mono/dc.html)
for details.

This dc has a few differences from the two above:

  1) When printing a byte stream (command "P"), this bc follows what the FreeBSD
     dc does.
  2) This dc implements the GNU extensions for divmod ("~") and modular
     exponentiation ("|").
  3) This dc implements all FreeBSD extensions, except for "J" and "M".
  4) This dc does not implement the run command ("!"), for security reasons.
  5) Like the FreeBSD dc, this dc supports extended registers. However, they are
     implemented differently. When it encounters whitespace where a register
     should be, it skips the whitespace. If the character following is not
     a lowercase letter, an error is issued. Otherwise, the register name is
     parsed by the following regex:

       [a-z][a-z0-9_]*

     This generally means that register names will be surrounded by whitespace.

     Examples:

       l idx s temp L index S temp2 < do_thing

     Also note that, unlike the FreeBSD dc, extended registers are not even
     parsed unless the "-x" option is given. Instead, the space after a command
     that requires a register name is taken as the register name.

Options:

  -e  expr  --expression=expr

      Run "expr" and quit. If multiple expressions or files (see below) are
      given, they are all run. After running, dc will exit.

  -f  file  --file=file

      Run the dc code in "file" and exit. See above.

  -h  --help

      Print this usage message and exit.

  -i  --interactive

      Put dc into interactive mode. See the man page for more details.

  -P  --no-prompt

      Disable the prompts in interactive mode.

  -R  --no-read-prompt

      Disable the read prompt in interactive mode.

  -V  --version

      Print version and copyright and exit.

  -x  --extended-register

      Enable extended register mode.

Environment variables:

  DC_ENV_ARGS

      Command-line arguments to use on every run.

  DC_LINE_LENGTH

      If an integer, the number of characters to print on a line before
      wrapping.

  DC_SIGINT_RESET

      If an integer and non-zero, reset on SIGINT, rather than exit, when in
      interactive mode.

      Overrides the default, which is %s.

  DC_TTY_MODE

      If an integer and non-zero, enable TTY mode when it is available.

      Overrides the default, which is TTY mode %s.

  DC_PROMPT

      If an integer and non-zero, enable prompt when TTY mode is possible.

      Overrides the default, which is prompt %s.
