/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing#kwsys for details.  */
#ifndef @KWSYS_NAMESPACE@_Terminal_h
#define @KWSYS_NAMESPACE@_Terminal_h

#include <@KWSYS_NAMESPACE@/Configure.h>

#include <stdio.h> /* For file stream type FILE. */

/* Redefine all public interface symbol names to be in the proper
   namespace.  These macros are used internally to kwsys only, and are
   not visible to user code.  Use kwsysHeaderDump.pl to reproduce
   these macros after making changes to the interface.  */
#if !defined(KWSYS_NAMESPACE)
#  define kwsys_ns(x) @KWSYS_NAMESPACE@##x
#  define kwsysEXPORT @KWSYS_NAMESPACE@_EXPORT
#endif
#if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#  define kwsysTerminal_cfprintf kwsys_ns(Terminal_cfprintf)
#  define kwsysTerminal_Color_e kwsys_ns(Terminal_Color_e)
#  define kwsysTerminal_Color_Normal kwsys_ns(Terminal_Color_Normal)
#  define kwsysTerminal_Color_ForegroundBlack                                 \
    kwsys_ns(Terminal_Color_ForegroundBlack)
#  define kwsysTerminal_Color_ForegroundRed                                   \
    kwsys_ns(Terminal_Color_ForegroundRed)
#  define kwsysTerminal_Color_ForegroundGreen                                 \
    kwsys_ns(Terminal_Color_ForegroundGreen)
#  define kwsysTerminal_Color_ForegroundYellow                                \
    kwsys_ns(Terminal_Color_ForegroundYellow)
#  define kwsysTerminal_Color_ForegroundBlue                                  \
    kwsys_ns(Terminal_Color_ForegroundBlue)
#  define kwsysTerminal_Color_ForegroundMagenta                               \
    kwsys_ns(Terminal_Color_ForegroundMagenta)
#  define kwsysTerminal_Color_ForegroundCyan                                  \
    kwsys_ns(Terminal_Color_ForegroundCyan)
#  define kwsysTerminal_Color_ForegroundWhite                                 \
    kwsys_ns(Terminal_Color_ForegroundWhite)
#  define kwsysTerminal_Color_ForegroundMask                                  \
    kwsys_ns(Terminal_Color_ForegroundMask)
#  define kwsysTerminal_Color_BackgroundBlack                                 \
    kwsys_ns(Terminal_Color_BackgroundBlack)
#  define kwsysTerminal_Color_BackgroundRed                                   \
    kwsys_ns(Terminal_Color_BackgroundRed)
#  define kwsysTerminal_Color_BackgroundGreen                                 \
    kwsys_ns(Terminal_Color_BackgroundGreen)
#  define kwsysTerminal_Color_BackgroundYellow                                \
    kwsys_ns(Terminal_Color_BackgroundYellow)
#  define kwsysTerminal_Color_BackgroundBlue                                  \
    kwsys_ns(Terminal_Color_BackgroundBlue)
#  define kwsysTerminal_Color_BackgroundMagenta                               \
    kwsys_ns(Terminal_Color_BackgroundMagenta)
#  define kwsysTerminal_Color_BackgroundCyan                                  \
    kwsys_ns(Terminal_Color_BackgroundCyan)
#  define kwsysTerminal_Color_BackgroundWhite                                 \
    kwsys_ns(Terminal_Color_BackgroundWhite)
#  define kwsysTerminal_Color_BackgroundMask                                  \
    kwsys_ns(Terminal_Color_BackgroundMask)
#  define kwsysTerminal_Color_ForegroundBold                                  \
    kwsys_ns(Terminal_Color_ForegroundBold)
#  define kwsysTerminal_Color_BackgroundBold                                  \
    kwsys_ns(Terminal_Color_BackgroundBold)
#  define kwsysTerminal_Color_AssumeTTY kwsys_ns(Terminal_Color_AssumeTTY)
#  define kwsysTerminal_Color_AssumeVT100 kwsys_ns(Terminal_Color_AssumeVT100)
#  define kwsysTerminal_Color_AttributeMask                                   \
    kwsys_ns(Terminal_Color_AttributeMask)
#endif

#if defined(__cplusplus)
extern "C" {
#endif

/**
 * Write colored and formatted text to a stream.  Color is used only
 * for streams supporting it.  The color specification is constructed
 * by bitwise-OR-ing enumeration values.  At most one foreground and
 * one background value may be given.
 *
 * Whether the a stream supports color is usually automatically
 * detected, but with two exceptions:
 *
 *   - When the stream is displayed in a terminal supporting VT100
 *   color but using an intermediate pipe for communication the
 *   detection of a tty fails.  (This typically occurs for a shell
 *   running in an rxvt terminal in MSYS.)  If the caller knows this
 *   to be the case, the attribute Color_AssumeTTY may be included in
 *   the color specification.
 *
 *   - When the stream is displayed in a terminal whose TERM
 *   environment variable is not set or is set to a value that is not
 *   known to support VT100 colors.  If the caller knows this to be
 *   the case, the attribute Color_AssumeVT100 may be included in the
 *   color specification.
 */
kwsysEXPORT void kwsysTerminal_cfprintf(int color, FILE* stream,
                                        const char* format, ...);
enum kwsysTerminal_Color_e
{
  /* Normal Text */
  kwsysTerminal_Color_Normal = 0,

  /* Foreground Color */
  kwsysTerminal_Color_ForegroundBlack = 0x1,
  kwsysTerminal_Color_ForegroundRed = 0x2,
  kwsysTerminal_Color_ForegroundGreen = 0x3,
  kwsysTerminal_Color_ForegroundYellow = 0x4,
  kwsysTerminal_Color_ForegroundBlue = 0x5,
  kwsysTerminal_Color_ForegroundMagenta = 0x6,
  kwsysTerminal_Color_ForegroundCyan = 0x7,
  kwsysTerminal_Color_ForegroundWhite = 0x8,
  kwsysTerminal_Color_ForegroundMask = 0xF,

  /* Background Color */
  kwsysTerminal_Color_BackgroundBlack = 0x10,
  kwsysTerminal_Color_BackgroundRed = 0x20,
  kwsysTerminal_Color_BackgroundGreen = 0x30,
  kwsysTerminal_Color_BackgroundYellow = 0x40,
  kwsysTerminal_Color_BackgroundBlue = 0x50,
  kwsysTerminal_Color_BackgroundMagenta = 0x60,
  kwsysTerminal_Color_BackgroundCyan = 0x70,
  kwsysTerminal_Color_BackgroundWhite = 0x80,
  kwsysTerminal_Color_BackgroundMask = 0xF0,

  /* Attributes */
  kwsysTerminal_Color_ForegroundBold = 0x100,
  kwsysTerminal_Color_BackgroundBold = 0x200,
  kwsysTerminal_Color_AssumeTTY = 0x400,
  kwsysTerminal_Color_AssumeVT100 = 0x800,
  kwsysTerminal_Color_AttributeMask = 0xF00
};

#if defined(__cplusplus)
} /* extern "C" */
#endif

/* If we are building a kwsys .c or .cxx file, let it use these macros.
   Otherwise, undefine them to keep the namespace clean.  */
#if !defined(KWSYS_NAMESPACE)
#  undef kwsys_ns
#  undef kwsysEXPORT
#  if !@KWSYS_NAMESPACE@_NAME_IS_KWSYS
#    undef kwsysTerminal_cfprintf
#    undef kwsysTerminal_Color_e
#    undef kwsysTerminal_Color_Normal
#    undef kwsysTerminal_Color_ForegroundBlack
#    undef kwsysTerminal_Color_ForegroundRed
#    undef kwsysTerminal_Color_ForegroundGreen
#    undef kwsysTerminal_Color_ForegroundYellow
#    undef kwsysTerminal_Color_ForegroundBlue
#    undef kwsysTerminal_Color_ForegroundMagenta
#    undef kwsysTerminal_Color_ForegroundCyan
#    undef kwsysTerminal_Color_ForegroundWhite
#    undef kwsysTerminal_Color_ForegroundMask
#    undef kwsysTerminal_Color_BackgroundBlack
#    undef kwsysTerminal_Color_BackgroundRed
#    undef kwsysTerminal_Color_BackgroundGreen
#    undef kwsysTerminal_Color_BackgroundYellow
#    undef kwsysTerminal_Color_BackgroundBlue
#    undef kwsysTerminal_Color_BackgroundMagenta
#    undef kwsysTerminal_Color_BackgroundCyan
#    undef kwsysTerminal_Color_BackgroundWhite
#    undef kwsysTerminal_Color_BackgroundMask
#    undef kwsysTerminal_Color_ForegroundBold
#    undef kwsysTerminal_Color_BackgroundBold
#    undef kwsysTerminal_Color_AssumeTTY
#    undef kwsysTerminal_Color_AssumeVT100
#    undef kwsysTerminal_Color_AttributeMask
#  endif
#endif

#endif
