/*
  Copyright 1999-2019 ImageMagick Studio LLC, a non-profit organization
  dedicated to making software imaging solutions freely available.

  You may not use this file except in compliance with the License.  You may
  obtain a copy of the License at

    https://imagemagick.org/script/license.php

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

  ImageMagick pixel wand API.
*/
#ifndef MAGICKWAND_WANDCLI_PRIVATE_H
#define MAGICKWAND_WANDCLI_PRIVATE_H

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

#define CLIWandException(severity,tag,option) \
  (void) CLIThrowException(cli_wand,GetMagickModule(),severity,tag, \
       "`%s'",option)

#define CLIWandExceptionArg(severity,tag,option,arg) \
  (void) CLIThrowException(cli_wand,GetMagickModule(),severity,tag, \
       "'%s' '%s'",option, arg)

#define CLIWandWarnReplaced(message) \
  if ( (cli_wand->process_flags & ProcessWarnDeprecated) != 0 ) \
    (void) CLIThrowException(cli_wand,GetMagickModule(),OptionWarning, \
       "ReplacedOption", "'%s', use \"%s\"",option,message)

#define CLIWandExceptionFile(severity,tag,context) \
{ char *message=GetExceptionMessage(errno); \
  (void) CLIThrowException(cli_wand,GetMagickModule(),severity,tag, \
       "'%s': %s",context,message); \
  message=DestroyString(message); \
}

#define CLIWandExceptionBreak(severity,tag,option) \
  { CLIWandException(severity,tag,option); break; }

#define CLIWandExceptionReturn(severity,tag,option) \
  { CLIWandException(severity,tag,option); return; }

#define CLIWandExceptArgBreak(severity,tag,option,arg) \
  { CLIWandExceptionArg(severity,tag,option,arg); break; }

#define CLIWandExceptArgReturn(severity,tag,option,arg) \
  { CLIWandExceptionArg(severity,tag,option,arg); return; }



/* Define how options should be processed */
typedef enum
{
  /* General Option Handling */
  ProcessImplictRead          = 0x0001,  /* Non-options are image reads.
                                            If not set then skip implied read
                                            without producing an error.
                                            For use with "mogrify" handling */
  ProcessInterpretProperities = 0x0010,  /* allow general escapes in args */

  /* Special Option Handling */
  ProcessExitOption           = 0x0100,  /* allow '-exit' use */
  ProcessScriptOption         = 0x0200,  /* allow '-script' use */
  ProcessReadOption           = 0x0400,  /* allow '-read' use */
  ProcessWarnDeprecated       = 0x0800,  /* warn about deprecated options */

  /* Option Processing Flags */
  ProcessOneOptionOnly        = 0x4000,  /* Process one option only */
  ProcessImplictWrite         = 0x8000,  /* Last arg is an implict write */

  /* Flag Groups for specific Situations */
  MagickCommandOptionFlags    = 0x8FFF,  /* Magick Command Flags */
  ConvertCommandOptionFlags   = 0x800F,  /* Convert Command Flags */
  MagickScriptArgsFlags       = 0x000F,  /* Script CLI Process Args Flags */
} ProcessOptionFlags;


/* Define a generic stack linked list, for pushing and popping
   user defined ImageInfo settings, and Image lists.
   See '(' ')' and '-clone' CLI options.
*/
typedef struct _Stack
{
  struct _Stack  *next;
  void           *data;
} Stack;

/* Note this defines an extension to the normal MagickWand
   Which adds extra elements specific to the Shell API interface
   while still allowing the Wand to be passed to MagickWand API
   for specific operations.
*/
struct _MagickCLI       /* CLI interface version of MagickWand */
{
  struct _MagickWand    /* This must be the first structure */
     wand;              /* The Image List and Global Option Settings */

  QuantizeInfo
    *quantize_info;     /* for CLI API usage, not used by MagickWand API */

  DrawInfo
    *draw_info;         /* for CLI API usage, not used by MagickWand API */

  ProcessOptionFlags
    process_flags;      /* When handling CLI, what options do we process? */

  const OptionInfo
    *command;           /* The option entry that is being processed */

  Stack
    *image_list_stack,  /* Stacks of Image Lists and Image Info settings */
    *image_info_stack;

  const char            /* Location of option being processed for exception */
    *location,          /* location format string for exception reports */
    *filename;          /* "CLI", "unknown", or the script filename */

  size_t
    line,               /* location of current option from source */
    column;             /* note: line also used for cli argument count */

  size_t
    signature;
};



#if defined(__cplusplus) || defined(c_plusplus)
}
#endif

#endif
