• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3  %                                                                             %
4  %                                                                             %
5  %                                                                             %
6  %                 M   M   AAA    GGGG  IIIII   CCCC  K   K                    %
7  %                 MM MM  A   A  G        I    C      K  K                     %
8  %                 M M M  AAAAA  G GGG    I    C      KKK                      %
9  %                 M   M  A   A  G   G    I    C      K  K                     %
10  %                 M   M  A   A   GGGG  IIIII   CCCC  K   K                    %
11  %                                                                             %
12  %                                                                             %
13  %       Perform "Magick" on Images via the Command Line Interface             %
14  %                                                                             %
15  %                             Dragon Computing                                %
16  %                             Anthony Thyssen                                 %
17  %                               January 2012                                  %
18  %                                                                             %
19  %                                                                             %
20  %  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
21  %  dedicated to making software imaging solutions freely available.           %
22  %                                                                             %
23  %  You may not use this file except in compliance with the License.  You may  %
24  %  obtain a copy of the License at                                            %
25  %                                                                             %
26  %    http://www.imagemagick.org/script/license.php                            %
27  %                                                                             %
28  %  Unless required by applicable law or agreed to in writing, software        %
29  %  distributed under the License is distributed on an "AS IS" BASIS,          %
30  %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
31  %  See the License for the specific language governing permissions and        %
32  %  limitations under the License.                                             %
33  %                                                                             %
34  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
35  %
36  %  Read CLI arguments, script files, and pipelines, to provide options that
37  %  manipulate images from many different formats.
38  %
39  */
40  
41  /*
42    Include declarations.
43  */
44  #include "MagickWand/studio.h"
45  #include "MagickWand/MagickWand.h"
46  
47  /*
48  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
49  %                                                                             %
50  %                                                                             %
51  %                                                                             %
52  %  M a i n                                                                    %
53  %                                                                             %
54  %                                                                             %
55  %                                                                             %
56  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
57  %
58  %
59  */
60  
MagickMain(int argc,char ** argv)61  static int MagickMain(int argc,char **argv)
62  {
63  #define MagickCommandSize(name,use_metadata,command) \
64    { (name), sizeof(name)-1, (use_metadata), (command) }
65  
66    typedef struct _CommandInfo
67    {
68      const char
69        *client_name;
70  
71      size_t
72        extent;
73  
74      MagickBooleanType
75        use_metadata;
76  
77      MagickCommand
78        command;
79    } CommandInfo;
80  
81    const CommandInfo
82      MagickCommands[] =
83      {
84        MagickCommandSize("magick", MagickFalse, MagickImageCommand),
85        MagickCommandSize("convert", MagickFalse, ConvertImageCommand),
86        MagickCommandSize("composite", MagickFalse, CompositeImageCommand),
87        MagickCommandSize("identify", MagickTrue, IdentifyImageCommand),
88        MagickCommandSize("animate", MagickFalse, AnimateImageCommand),
89        MagickCommandSize("compare", MagickTrue, CompareImagesCommand),
90        MagickCommandSize("conjure", MagickFalse, ConjureImageCommand),
91        MagickCommandSize("display", MagickFalse, DisplayImageCommand),
92        MagickCommandSize("import", MagickFalse, ImportImageCommand),
93        MagickCommandSize("mogrify", MagickFalse, MogrifyImageCommand),
94        MagickCommandSize("montage", MagickFalse, MontageImageCommand),
95        MagickCommandSize("stream", MagickFalse, StreamImageCommand)
96      };
97  
98    char
99      client_name[MagickPathExtent],
100      *metadata;
101  
102    ExceptionInfo
103      *exception;
104  
105    ImageInfo
106      *image_info;
107  
108    int
109      exit_code,
110      offset;
111  
112    MagickBooleanType
113      status;
114  
115    register ssize_t
116      i;
117  
118    MagickCoreGenesis(*argv,MagickTrue);
119    exception=AcquireExceptionInfo();
120    image_info=AcquireImageInfo();
121    GetPathComponent(argv[0],TailPath,client_name);
122    for (i=0; i < (ssize_t) (sizeof(MagickCommands)/sizeof(MagickCommands[0])); i++)
123    {
124      offset=LocaleNCompare(MagickCommands[i].client_name,client_name,
125        MagickCommands[i].extent);
126      if (offset == 0)
127        break;
128    }
129    i%=(sizeof(MagickCommands)/sizeof(MagickCommands[0]));
130    if ((i == 0) && (argc > 1))
131      {
132        for (i=1; i < (ssize_t) (sizeof(MagickCommands)/sizeof(MagickCommands[0])); i++)
133        {
134          offset=LocaleCompare(MagickCommands[i].client_name,argv[1]);
135          if (offset == 0)
136            {
137              argc--;
138              argv++;
139              break;
140            }
141        }
142        i%=(sizeof(MagickCommands)/sizeof(MagickCommands[0]));
143      }
144    metadata=(char *) NULL;
145    status=MagickCommandGenesis(image_info,MagickCommands[i].command,argc,argv,
146      MagickCommands[i].use_metadata ? &metadata : (char **) NULL,exception);
147    if (metadata != (char *) NULL)
148      {
149        (void) fputs(metadata,stdout);
150        metadata=DestroyString(metadata);
151      }
152    if (MagickCommands[i].command != CompareImagesCommand)
153      exit_code=status != MagickFalse ? 0 : 1;
154    else
155      {
156        if (status == MagickFalse)
157          exit_code=2;
158        else
159        {
160          const char
161            *option;
162  
163          option=GetImageOption(image_info,"compare:dissimilar");
164          exit_code=IsStringTrue(option) ? 1 : 0;
165        }
166      }
167    image_info=DestroyImageInfo(image_info);
168    exception=DestroyExceptionInfo(exception);
169    MagickCoreTerminus();
170    return(exit_code);
171  }
172  
173  #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
main(int argc,char ** argv)174  int main(int argc,char **argv)
175  {
176    return(MagickMain(argc,argv));
177  }
178  #else
wmain(int argc,wchar_t * argv[])179  int wmain(int argc,wchar_t *argv[])
180  {
181    char
182      **utf8;
183  
184    int
185      status;
186  
187    register int
188      i;
189  
190    utf8=NTArgvToUTF8(argc,argv);
191    status=MagickMain(argc,utf8);
192    for (i=0; i < argc; i++)
193      utf8[i]=DestroyString(utf8[i]);
194    utf8=(char **) RelinquishMagickMemory(utf8);
195    return(status);
196  }
197  #endif
198