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