MagickWand  6.7.5
import.c
Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %                 IIIII  M   M  PPPP    OOO   RRRR   TTTTT                    %
00007 %                   I    MM MM  P   P  O   O  R   R    T                      %
00008 %                   I    M M M  PPPP   O   O  RRRR     T                      %
00009 %                   I    M   M  P      O   O  R R      T                      %
00010 %                 IIIII  M   M  P       OOO   R  R     T                      %
00011 %                                                                             %
00012 %                                                                             %
00013 %                       Import Image from X11 Screen                          %
00014 %                                                                             %
00015 %                           Software Design                                   %
00016 %                             John Cristy                                     %
00017 %                              July 1992                                      %
00018 %                                                                             %
00019 %                                                                             %
00020 %  Copyright 1999-2012 ImageMagick Studio LLC, a non-profit organization      %
00021 %  dedicated to making software imaging solutions freely available.           %
00022 %                                                                             %
00023 %  You may not use this file except in compliance with the License.  You may  %
00024 %  obtain a copy of the License at                                            %
00025 %                                                                             %
00026 %    http://www.imagemagick.org/script/license.php                            %
00027 %                                                                             %
00028 %  Unless required by applicable law or agreed to in writing, software        %
00029 %  distributed under the License is distributed on an "AS IS" BASIS,          %
00030 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
00031 %  See the License for the specific language governing permissions and        %
00032 %  limitations under the License.                                             %
00033 %                                                                             %
00034 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00035 %
00036 %  Use the import program to capture some or all of an X server screen and
00037 %  save the image to a file.
00038 %
00039 */
00040 
00041 /*
00042   Include declarations.
00043 */
00044 #include "MagickWand/studio.h"
00045 #include "MagickWand/MagickWand.h"
00046 #include "MagickWand/mogrify-private.h"
00047 #include "MagickCore/string-private.h"
00048 #include "MagickCore/xwindow-private.h"
00049 
00050 /*
00051 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00052 %                                                                             %
00053 %                                                                             %
00054 %                                                                             %
00055 +   I m p o r t I m a g e C o m m a n d                                       %
00056 %                                                                             %
00057 %                                                                             %
00058 %                                                                             %
00059 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00060 %
00061 %  ImportImageCommand() reads an image from any visible window on an X server
00062 %  and outputs it as an image file. You can capture a single window, the
00063 %  entire screen, or any rectangular portion of the screen.  You can use the
00064 %  display utility for redisplay, printing, editing, formatting, archiving,
00065 %  image processing, etc. of the captured image.</dd>
00066 %
00067 %  The target window can be specified by id, name, or may be selected by
00068 %  clicking the mouse in the desired window. If you press a button and then
00069 %  drag, a rectangle will form which expands and contracts as the mouse moves.
00070 %  To save the portion of the screen defined by the rectangle, just release
00071 %  the button. The keyboard bell is rung once at the beginning of the screen
00072 %  capture and twice when it completes.
00073 %
00074 %  The format of the ImportImageCommand method is:
00075 %
00076 %      MagickBooleanType ImportImageCommand(ImageInfo *image_info,int argc,
00077 %        char **argv,char **metadata,ExceptionInfo *exception)
00078 %
00079 %  A description of each parameter follows:
00080 %
00081 %    o image_info: the image info.
00082 %
00083 %    o argc: the number of elements in the argument vector.
00084 %
00085 %    o argv: A text array containing the command line arguments.
00086 %
00087 %    o metadata: any metadata is returned here.
00088 %
00089 %    o exception: return any errors or warnings in this structure.
00090 %
00091 */
00092 
00093 static MagickBooleanType ImportUsage(void)
00094 {
00095   const char
00096     **p;
00097 
00098   static const char
00099     *miscellaneous[]=
00100     {
00101       "-debug events        display copious debugging information",
00102       "-help                print program options",
00103       "-list type           print a list of supported option arguments",
00104       "-log format          format of debugging information",
00105       "-version             print version information",
00106       (char *) NULL
00107     },
00108     *operators[]=
00109     {
00110       "-annotate geometry text",
00111       "                     annotate the image with text",
00112       "-colors value        preferred number of colors in the image",
00113       "-crop geometry       preferred size and location of the cropped image",
00114       "-encipher filename   convert plain pixels to cipher pixels",
00115       "-geometry geometry   preferred size or location of the image",
00116       "-help                print program options",
00117       "-monochrome          transform image to black and white",
00118       "-negate              replace every pixel with its complementary color ",
00119       "-repage geometry     size and location of an image canvas",
00120       "-quantize colorspace reduce colors in this colorspace",
00121       "-resize geometry     resize the image",
00122       "-rotate degrees      apply Paeth rotation to the image",
00123       "-strip               strip image of all profiles and comments",
00124       "-thumbnail geometry  create a thumbnail of the image",
00125       "-transparent color   make this color transparent within the image",
00126       "-trim                trim image edges",
00127       "-type type           image type",
00128       (char *) NULL
00129     },
00130     *settings[]=
00131     {
00132       "-adjoin              join images into a single multi-image file",
00133       "-border              include window border in the output image",
00134       "-channel type        apply option to select image channels",
00135       "-colorspace type     alternate image colorspace",
00136       "-comment string      annotate image with comment",
00137       "-compress type       type of pixel compression when writing the image",
00138       "-define format:option",
00139       "                     define one or more image format options",
00140       "-density geometry    horizontal and vertical density of the image",
00141       "-depth value         image depth",
00142       "-descend             obtain image by descending window hierarchy",
00143       "-display server      X server to contact",
00144       "-dispose method      layer disposal method",
00145       "-dither method       apply error diffusion to image",
00146       "-delay value         display the next image after pausing",
00147       "-encipher filename   convert plain pixels to cipher pixels",
00148       "-endian type         endianness (MSB or LSB) of the image",
00149       "-encoding type       text encoding type",
00150       "-filter type         use this filter when resizing an image",
00151       "-format \"string\"     output formatted image characteristics",
00152       "-frame               include window manager frame",
00153       "-gravity direction   which direction to gravitate towards",
00154       "-identify            identify the format and characteristics of the image",
00155       "-interlace type      None, Line, Plane, or Partition",
00156       "-interpolate method  pixel color interpolation method",
00157       "-label string        assign a label to an image",
00158       "-limit type value    Area, Disk, Map, or Memory resource limit",
00159       "-monitor             monitor progress",
00160       "-page geometry       size and location of an image canvas",
00161       "-pause value         seconds delay between snapshots",
00162       "-pointsize value     font point size",
00163       "-quality value       JPEG/MIFF/PNG compression level",
00164       "-quiet               suppress all warning messages",
00165       "-regard-warnings     pay attention to warning messages",
00166       "-respect-parentheses settings remain in effect until parenthesis boundary",
00167       "-sampling-factor geometry",
00168       "                     horizontal and vertical sampling factor",
00169       "-scene value         image scene number",
00170       "-screen              select image from root window",
00171       "-seed value          seed a new sequence of pseudo-random numbers",
00172       "-set property value  set an image property",
00173       "-silent              operate silently, i.e. don't ring any bells ",
00174       "-snaps value         number of screen snapshots",
00175       "-synchronize         synchronize image to storage device",
00176       "-taint               declare the image as modified",
00177       "-transparent-color color",
00178       "                     transparent color",
00179       "-treedepth value     color tree depth",
00180       "-verbose             print detailed information about the image",
00181       "-virtual-pixel method",
00182       "                     Constant, Edge, Mirror, or Tile",
00183       "-window id           select window with this id or name",
00184       (char *) NULL
00185     };
00186 
00187   (void) printf("Version: %s\n",GetMagickVersion((size_t *) NULL));
00188   (void) printf("Copyright: %s\n",GetMagickCopyright());
00189   (void) printf("Features: %s\n\n",GetMagickFeatures());
00190   (void) printf("Usage: %s [options ...] [ file ]\n",
00191     GetClientName());
00192   (void) printf("\nImage Settings:\n");
00193   for (p=settings; *p != (char *) NULL; p++)
00194     (void) printf("  %s\n",*p);
00195   (void) printf("\nImage Operators:\n");
00196   for (p=operators; *p != (char *) NULL; p++)
00197     (void) printf("  %s\n",*p);
00198   (void) printf("\nMiscellaneous Options:\n");
00199   for (p=miscellaneous; *p != (char *) NULL; p++)
00200     (void) printf("  %s\n",*p);
00201   (void) printf(
00202   "\nBy default, 'file' is written in the MIFF image format.  To\n");
00203   (void) printf(
00204     "specify a particular image format, precede the filename with an image\n");
00205   (void) printf(
00206     "format name and a colon (i.e. ps:image) or specify the image type as\n");
00207   (void) printf(
00208     "the filename suffix (i.e. image.ps).  Specify 'file' as '-' for\n");
00209   (void) printf("standard input or output.\n");
00210   return(MagickFalse);
00211 }
00212 
00213 static inline ssize_t MagickMax(const ssize_t x,const ssize_t y)
00214 {
00215   if (x > y)
00216     return(x);
00217   return(y);
00218 }
00219 
00220 WandExport MagickBooleanType ImportImageCommand(ImageInfo *image_info,
00221   int argc,char **argv,char **wand_unused(metadata),ExceptionInfo *exception)
00222 {
00223 #if defined(MAGICKCORE_X11_DELEGATE)
00224 #define DestroyImport() \
00225 { \
00226   XDestroyResourceInfo(&resource_info); \
00227   if (display != (Display *) NULL) \
00228     { \
00229       XCloseDisplay(display); \
00230       display=(Display *) NULL; \
00231     } \
00232   DestroyImageStack(); \
00233   if (target_window != (char *) NULL) \
00234     target_window=DestroyString(target_window); \
00235   for (i=0; i < (ssize_t) argc; i++) \
00236     argv[i]=DestroyString(argv[i]); \
00237   argv=(char **) RelinquishMagickMemory(argv); \
00238 }
00239 #define ThrowImportException(asperity,tag,option) \
00240 { \
00241   (void) ThrowMagickException(exception,GetMagickModule(),asperity,tag,"`%s'", \
00242      option); \
00243   DestroyImport(); \
00244   return(MagickFalse); \
00245 }
00246 #define ThrowImportInvalidArgumentException(option,argument) \
00247 { \
00248   (void) ThrowMagickException(exception,GetMagickModule(),OptionError, \
00249     "InvalidArgument","`%s': %s",option,argument); \
00250   DestroyImport(); \
00251   return(MagickFalse); \
00252 }
00253 
00254   char
00255     *filename,
00256     *option,
00257     *resource_value,
00258     *server_name,
00259     *target_window;
00260 
00261   Display
00262     *display;
00263 
00264   Image
00265     *image;
00266 
00267   ImageStack
00268     image_stack[MaxImageStackDepth+1];
00269 
00270   MagickBooleanType
00271     fire,
00272     pend,
00273     respect_parenthesis;
00274 
00275   MagickStatusType
00276     status;
00277 
00278   QuantizeInfo
00279     *quantize_info;
00280 
00281   register ssize_t
00282     i;
00283 
00284   ssize_t
00285     j,
00286     k,
00287     snapshots;
00288 
00289   XImportInfo
00290     ximage_info;
00291 
00292   XResourceInfo
00293     resource_info;
00294 
00295   XrmDatabase
00296     resource_database;
00297 
00298   /*
00299     Set defaults.
00300   */
00301   assert(image_info != (ImageInfo *) NULL);
00302   assert(image_info->signature == MagickSignature);
00303   if (image_info->debug != MagickFalse)
00304     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
00305   assert(exception != (ExceptionInfo *) NULL);
00306   if (argc == 2)
00307     {
00308       option=argv[1];
00309       if ((LocaleCompare("version",option+1) == 0) ||
00310           (LocaleCompare("-version",option+1) == 0))
00311         {
00312           (void) FormatLocaleFile(stdout,"Version: %s\n",
00313             GetMagickVersion((size_t *) NULL));
00314           (void) FormatLocaleFile(stdout,"Copyright: %s\n",
00315             GetMagickCopyright());
00316           (void) FormatLocaleFile(stdout,"Features: %s\n\n",
00317             GetMagickFeatures());
00318           return(MagickFalse);
00319         }
00320     }
00321   display=(Display *) NULL;
00322   j=1;
00323   k=0;
00324   NewImageStack();
00325   option=(char *) NULL;
00326   pend=MagickFalse;
00327   resource_database=(XrmDatabase) NULL;
00328   respect_parenthesis=MagickFalse;
00329   (void) ResetMagickMemory(&resource_info,0,sizeof(resource_info));
00330   server_name=(char *) NULL;
00331   status=MagickTrue;
00332   SetNotifyHandlers;
00333   target_window=(char *) NULL;
00334   /*
00335     Check for server name specified on the command line.
00336   */
00337   ReadCommandlLine(argc,&argv);
00338   status=ExpandFilenames(&argc,&argv);
00339   if (status == MagickFalse)
00340     ThrowImportException(ResourceLimitError,"MemoryAllocationFailed",
00341       GetExceptionMessage(errno));
00342   for (i=1; i < (ssize_t) argc; i++)
00343   {
00344     /*
00345       Check command line for server name.
00346     */
00347     option=argv[i];
00348     if (LocaleCompare("display",option+1) == 0)
00349       {
00350         /*
00351           User specified server name.
00352         */
00353         i++;
00354         if (i == (ssize_t) argc)
00355           ThrowImportException(OptionError,"MissingArgument",option);
00356         server_name=argv[i];
00357       }
00358     if ((LocaleCompare("help",option+1) == 0) ||
00359         (LocaleCompare("-help",option+1) == 0))
00360       return(ImportUsage());
00361   }
00362   /*
00363     Get user defaults from X resource database.
00364   */
00365   display=XOpenDisplay(server_name);
00366   if (display == (Display *) NULL)
00367     ThrowImportException(XServerError,"UnableToOpenXServer",
00368       XDisplayName(server_name));
00369   (void) XSetErrorHandler(XError);
00370   resource_database=XGetResourceDatabase(display,GetClientName());
00371   XGetImportInfo(&ximage_info);
00372   XGetResourceInfo(image_info,resource_database,GetClientName(),
00373     &resource_info);
00374   quantize_info=resource_info.quantize_info;
00375   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00376     "border","False");
00377   ximage_info.borders=IsMagickTrue(resource_value);
00378   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00379     "delay","0");
00380   resource_info.delay=(unsigned int) StringToUnsignedLong(resource_value);
00381   image_info->density=XGetResourceInstance(resource_database,GetClientName(),
00382     "density",(char *) NULL);
00383   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00384     "descend","True");
00385   ximage_info.descend=IsMagickTrue(resource_value);
00386   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00387     "frame","False");
00388   ximage_info.frame=IsMagickTrue(resource_value);
00389   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00390     "interlace","none");
00391   image_info->interlace=UndefinedInterlace;
00392   if (LocaleCompare("None",resource_value) == 0)
00393     image_info->interlace=NoInterlace;
00394   if (LocaleCompare("Line",resource_value) == 0)
00395     image_info->interlace=LineInterlace;
00396   if (LocaleCompare("Plane",resource_value) == 0)
00397     image_info->interlace=PlaneInterlace;
00398   if (LocaleCompare("Partition",resource_value) == 0)
00399     image_info->interlace=PartitionInterlace;
00400   if (image_info->interlace == UndefinedInterlace)
00401     ThrowImportException(OptionError,"Unrecognized interlace type",
00402       resource_value);
00403   image_info->page=XGetResourceInstance(resource_database,GetClientName(),
00404     "pageGeometry",(char *) NULL);
00405   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00406     "pause","0");
00407   resource_info.pause=(unsigned int) StringToUnsignedLong(resource_value);
00408   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00409     "quality","85");
00410   image_info->quality=StringToUnsignedLong(resource_value);
00411   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00412     "screen","False");
00413   ximage_info.screen=IsMagickTrue(resource_value);
00414   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00415     "silent","False");
00416   ximage_info.silent=IsMagickTrue(resource_value);
00417   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00418     "verbose","False");
00419   image_info->verbose=IsMagickTrue(resource_value);
00420   resource_value=XGetResourceInstance(resource_database,GetClientName(),
00421     "dither","True");
00422   quantize_info->dither=IsMagickTrue(resource_value);
00423   snapshots=1;
00424   status=MagickTrue;
00425   filename=(char *) NULL;
00426   /*
00427     Check command syntax.
00428   */
00429   for (i=1; i < (ssize_t) argc; i++)
00430   {
00431     option=argv[i];
00432     if (LocaleCompare(option,"(") == 0)
00433       {
00434         FireImageStack(MagickFalse,MagickTrue,pend);
00435         if (k == MaxImageStackDepth)
00436           ThrowImportException(OptionError,"ParenthesisNestedTooDeeply",
00437             option);
00438         PushImageStack();
00439         continue;
00440       }
00441     if (LocaleCompare(option,")") == 0)
00442       {
00443         FireImageStack(MagickFalse,MagickTrue,MagickTrue);
00444         if (k == 0)
00445           ThrowImportException(OptionError,"UnableToParseExpression",option);
00446         PopImageStack();
00447         continue;
00448       }
00449     if (IsCommandOption(option) == MagickFalse)
00450       {
00451         Image
00452           *images;
00453 
00454         size_t
00455           scene;
00456 
00457         /*
00458           Read image from X server.
00459         */
00460         FireImageStack(MagickFalse,MagickFalse,pend);
00461         filename=argv[i];
00462         if (target_window != (char *) NULL)
00463           (void) CopyMagickString(image_info->filename,target_window,
00464             MaxTextExtent);
00465         for (scene=0; scene < (size_t) MagickMax(snapshots,1); scene++)
00466         {
00467           (void) sleep(resource_info.pause);
00468           images=XImportImage(image_info,&ximage_info,exception);
00469           status&=(images != (Image *) NULL) &&
00470             (exception->severity < ErrorException);
00471           if (images == (Image *) NULL)
00472             continue;
00473           (void) CopyMagickString(images->filename,filename,MaxTextExtent);
00474           (void) CopyMagickString(images->magick,"PS",MaxTextExtent);
00475           images->scene=scene;
00476           AppendImageStack(images);
00477         }
00478         continue;
00479       }
00480     pend=image != (Image *) NULL ? MagickTrue : MagickFalse;
00481     switch(*(option+1))
00482     {
00483       case 'a':
00484       {
00485         if (LocaleCompare("adjoin",option+1) == 0)
00486           break;
00487         if (LocaleCompare("annotate",option+1) == 0)
00488           {
00489             if (*option == '+')
00490               break;
00491             i++;
00492             if (i == (ssize_t) (argc-1))
00493               ThrowImportException(OptionError,"MissingArgument",option);
00494             if (IsGeometry(argv[i]) == MagickFalse)
00495               ThrowImportInvalidArgumentException(option,argv[i]);
00496             if (i == (ssize_t) (argc-1))
00497               ThrowImportException(OptionError,"MissingArgument",option);
00498             i++;
00499             break;
00500           }
00501         ThrowImportException(OptionError,"UnrecognizedOption",option);
00502       }
00503       case 'b':
00504       {
00505         if (LocaleCompare("border",option+1) == 0)
00506           {
00507             (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
00508             ximage_info.borders=(*option == '-') ? MagickTrue : MagickFalse;
00509             break;
00510           }
00511         if (LocaleCompare("bordercolor",option+1) == 0)
00512           {
00513             if (*option == '+')
00514               break;
00515             i++;
00516             if (i == (ssize_t) argc)
00517               ThrowImportException(OptionError,"MissingArgument",option);
00518             break;
00519           }
00520         ThrowImportException(OptionError,"UnrecognizedOption",option);
00521       }
00522       case 'c':
00523       {
00524         if (LocaleCompare("cache",option+1) == 0)
00525           {
00526             if (*option == '+')
00527               break;
00528             i++;
00529             if (i == (ssize_t) argc)
00530               ThrowImportException(OptionError,"MissingArgument",option);
00531             if (IsGeometry(argv[i]) == MagickFalse)
00532               ThrowImportInvalidArgumentException(option,argv[i]);
00533             break;
00534           }
00535         if (LocaleCompare("channel",option+1) == 0)
00536           {
00537             ssize_t
00538               channel;
00539 
00540             if (*option == '+')
00541               break;
00542             i++;
00543             if (i == (ssize_t) (argc-1))
00544               ThrowImportException(OptionError,"MissingArgument",option);
00545             channel=ParseChannelOption(argv[i]);
00546             if (channel < 0)
00547               ThrowImportException(OptionError,"UnrecognizedChannelType",
00548                 argv[i]);
00549             break;
00550           }
00551         if (LocaleCompare("colors",option+1) == 0)
00552           {
00553             quantize_info->number_colors=0;
00554             if (*option == '+')
00555               break;
00556             i++;
00557             if (i == (ssize_t) argc)
00558               ThrowImportException(OptionError,"MissingArgument",option);
00559             if (IsGeometry(argv[i]) == MagickFalse)
00560               ThrowImportInvalidArgumentException(option,argv[i]);
00561             quantize_info->number_colors=StringToUnsignedLong(argv[i]);
00562             break;
00563           }
00564         if (LocaleCompare("colorspace",option+1) == 0)
00565           {
00566             ssize_t
00567               colorspace;
00568 
00569             if (*option == '+')
00570               break;
00571             i++;
00572             if (i == (ssize_t) argc)
00573               ThrowImportException(OptionError,"MissingArgument",option);
00574             colorspace=ParseCommandOption(MagickColorspaceOptions,MagickFalse,
00575               argv[i]);
00576             if (colorspace < 0)
00577               ThrowImportException(OptionError,"UnrecognizedColorspace",
00578                 argv[i]);
00579             break;
00580           }
00581         if (LocaleCompare("comment",option+1) == 0)
00582           {
00583             if (*option == '+')
00584               break;
00585             i++;
00586             if (i == (ssize_t) argc)
00587               ThrowImportException(OptionError,"MissingArgument",option);
00588             status=SetImageOption(image_info,"comment",argv[i]);
00589             if (status == MagickFalse)
00590               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
00591             break;
00592           }
00593         if (LocaleCompare("compress",option+1) == 0)
00594           {
00595             ssize_t
00596               compress;
00597 
00598             if (*option == '+')
00599               break;
00600             i++;
00601             if (i == (ssize_t) argc)
00602               ThrowImportException(OptionError,"MissingArgument",option);
00603             compress=ParseCommandOption(MagickCompressOptions,MagickFalse,
00604               argv[i]);
00605             if (compress < 0)
00606               ThrowImportException(OptionError,"UnrecognizedImageCompression",
00607                 argv[i]);
00608             break;
00609           }
00610         if (LocaleCompare("concurrent",option+1) == 0)
00611           break;
00612         if (LocaleCompare("crop",option+1) == 0)
00613           {
00614             if (*option == '+')
00615               break;
00616             i++;
00617             if (i == (ssize_t) argc)
00618               ThrowImportException(OptionError,"MissingArgument",option);
00619             if (IsGeometry(argv[i]) == MagickFalse)
00620               ThrowImportInvalidArgumentException(option,argv[i]);
00621             break;
00622           }
00623         ThrowImportException(OptionError,"UnrecognizedOption",option);
00624       }
00625       case 'd':
00626       {
00627         if (LocaleCompare("debug",option+1) == 0)
00628           {
00629             ssize_t
00630               event;
00631 
00632             if (*option == '+')
00633               break;
00634             i++;
00635             if (i == (ssize_t) argc)
00636               ThrowImportException(OptionError,"MissingArgument",option);
00637             event=ParseCommandOption(MagickLogEventOptions,MagickFalse,argv[i]);
00638             if (event < 0)
00639               ThrowImportException(OptionError,"UnrecognizedEventType",argv[i]);
00640             (void) SetLogEventMask(argv[i]);
00641             break;
00642           }
00643         if (LocaleCompare("define",option+1) == 0)
00644           {
00645             i++;
00646             if (i == (ssize_t) argc)
00647               ThrowImportException(OptionError,"MissingArgument",option);
00648             if (*option == '+')
00649               {
00650                 const char
00651                   *define;
00652 
00653                 define=GetImageOption(image_info,argv[i]);
00654                 if (define == (char *) NULL)
00655                   ThrowImportException(OptionError,"NoSuchOption",argv[i]);
00656                 break;
00657               }
00658             break;
00659           }
00660         if (LocaleCompare("delay",option+1) == 0)
00661           {
00662             if (*option == '+')
00663               break;
00664             i++;
00665             if (i == (ssize_t) argc)
00666               ThrowImportException(OptionError,"MissingArgument",option);
00667             if (IsGeometry(argv[i]) == MagickFalse)
00668               ThrowImportInvalidArgumentException(option,argv[i]);
00669             status=SetImageOption(image_info,"delay",argv[i]);
00670             if (status == MagickFalse)
00671               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
00672             break;
00673           }
00674         if (LocaleCompare("density",option+1) == 0)
00675           {
00676             if (*option == '+')
00677               break;
00678             i++;
00679             if (i == (ssize_t) argc)
00680               ThrowImportException(OptionError,"MissingArgument",option);
00681             if (IsGeometry(argv[i]) == MagickFalse)
00682               ThrowImportInvalidArgumentException(option,argv[i]);
00683             break;
00684           }
00685         if (LocaleCompare("depth",option+1) == 0)
00686           {
00687             if (*option == '+')
00688               break;
00689             i++;
00690             if (i == (ssize_t) argc)
00691               ThrowImportException(OptionError,"MissingArgument",option);
00692             if (IsGeometry(argv[i]) == MagickFalse)
00693               ThrowImportInvalidArgumentException(option,argv[i]);
00694             break;
00695           }
00696         if (LocaleCompare("descend",option+1) == 0)
00697           {
00698             ximage_info.descend=(*option == '-') ? MagickTrue : MagickFalse;
00699             break;
00700           }
00701         if (LocaleCompare("display",option+1) == 0)
00702           {
00703             if (*option == '+')
00704               break;
00705             i++;
00706             if (i == (ssize_t) argc)
00707               ThrowImportException(OptionError,"MissingArgument",option);
00708             break;
00709           }
00710         if (LocaleCompare("dispose",option+1) == 0)
00711           {
00712             ssize_t
00713               dispose;
00714 
00715             if (*option == '+')
00716               break;
00717             i++;
00718             if (i == (ssize_t) argc)
00719               ThrowImportException(OptionError,"MissingArgument",option);
00720             dispose=ParseCommandOption(MagickDisposeOptions,MagickFalse,argv[i]);
00721             if (dispose < 0)
00722               ThrowImportException(OptionError,"UnrecognizedDisposeMethod",
00723                 argv[i]);
00724             break;
00725           }
00726         if (LocaleCompare("dither",option+1) == 0)
00727           {
00728             ssize_t
00729               method;
00730 
00731             quantize_info->dither=MagickFalse;
00732             if (*option == '+')
00733               break;
00734             i++;
00735             if (i == (ssize_t) argc)
00736               ThrowImportException(OptionError,"MissingArgument",option);
00737             method=ParseCommandOption(MagickDitherOptions,MagickFalse,argv[i]);
00738             if (method < 0)
00739               ThrowImportException(OptionError,"UnrecognizedDitherMethod",
00740                 argv[i]);
00741             quantize_info->dither=MagickTrue;
00742             quantize_info->dither_method=(DitherMethod) method;
00743             break;
00744           }
00745         if (LocaleCompare("duration",option+1) == 0)
00746           {
00747             if (*option == '+')
00748               break;
00749             i++;
00750             if (i == (ssize_t) (argc-1))
00751               ThrowImportException(OptionError,"MissingArgument",option);
00752             if (IsGeometry(argv[i]) == MagickFalse)
00753               ThrowImportInvalidArgumentException(option,argv[i]);
00754             break;
00755           }
00756         ThrowImportException(OptionError,"UnrecognizedOption",option);
00757       }
00758       case 'e':
00759       {
00760         if (LocaleCompare("encipher",option+1) == 0)
00761           {
00762             if (*option == '+')
00763               break;
00764             i++;
00765             if (i == (ssize_t) (argc-1))
00766               ThrowImportException(OptionError,"MissingArgument",option);
00767             break;
00768           }
00769         if (LocaleCompare("encoding",option+1) == 0)
00770           {
00771             if (*option == '+')
00772               break;
00773             i++;
00774             if (i == (ssize_t) argc)
00775               ThrowImportException(OptionError,"MissingArgument",option);
00776             break;
00777           }
00778         if (LocaleCompare("endian",option+1) == 0)
00779           {
00780             ssize_t
00781               endian;
00782 
00783             if (*option == '+')
00784               break;
00785             i++;
00786             if (i == (ssize_t) argc)
00787               ThrowImportException(OptionError,"MissingArgument",option);
00788             endian=ParseCommandOption(MagickEndianOptions,MagickFalse,
00789               argv[i]);
00790             if (endian < 0)
00791               ThrowImportException(OptionError,"UnrecognizedEndianType",
00792                 argv[i]);
00793             break;
00794           }
00795         ThrowImportException(OptionError,"UnrecognizedOption",option);
00796       }
00797       case 'f':
00798       {
00799         if (LocaleCompare("filter",option+1) == 0)
00800           {
00801             ssize_t
00802               filter;
00803 
00804             if (*option == '+')
00805               break;
00806             i++;
00807             if (i == (ssize_t) (argc-1))
00808               ThrowImportException(OptionError,"MissingArgument",option);
00809             filter=ParseCommandOption(MagickFilterOptions,MagickFalse,argv[i]);
00810             if (filter < 0)
00811               ThrowImportException(OptionError,"UnrecognizedImageFilter",
00812                 argv[i]);
00813             break;
00814           }
00815         if (LocaleCompare("frame",option+1) == 0)
00816           {
00817             (void) CopyMagickString(argv[i]+1,"sans0",MaxTextExtent);
00818             ximage_info.frame=(*option == '-') ? MagickTrue : MagickFalse;
00819             break;
00820           }
00821         if (LocaleCompare("format",option+1) == 0)
00822           {
00823             if (*option == '+')
00824               break;
00825             i++;
00826             if (i == (ssize_t) (argc-1))
00827               ThrowImportException(OptionError,"MissingArgument",option);
00828             break;
00829           }
00830         ThrowImportException(OptionError,"UnrecognizedOption",option);
00831       }
00832       case 'g':
00833       {
00834         if (LocaleCompare("geometry",option+1) == 0)
00835           {
00836             if (*option == '+')
00837               break;
00838             i++;
00839             if (i == (ssize_t) argc)
00840               ThrowImportException(OptionError,"MissingArgument",option);
00841             if (IsGeometry(argv[i]) == MagickFalse)
00842               ThrowImportInvalidArgumentException(option,argv[i]);
00843             break;
00844           }
00845         if (LocaleCompare("gravity",option+1) == 0)
00846           {
00847             ssize_t
00848               gravity;
00849 
00850             if (*option == '+')
00851               break;
00852             i++;
00853             if (i == (ssize_t) argc)
00854               ThrowImportException(OptionError,"MissingArgument",option);
00855             gravity=ParseCommandOption(MagickGravityOptions,MagickFalse,argv[i]);
00856             if (gravity < 0)
00857               ThrowImportException(OptionError,"UnrecognizedGravityType",
00858                 argv[i]);
00859             break;
00860           }
00861         ThrowImportException(OptionError,"UnrecognizedOption",option);
00862       }
00863       case 'h':
00864       {
00865         if (LocaleCompare("help",option+1) == 0)
00866           break;
00867         ThrowImportException(OptionError,"UnrecognizedOption",option);
00868       }
00869       case 'i':
00870       {
00871         if (LocaleCompare("identify",option+1) == 0)
00872           break;
00873         if (LocaleCompare("interlace",option+1) == 0)
00874           {
00875             ssize_t
00876               interlace;
00877 
00878             if (*option == '+')
00879               break;
00880             i++;
00881             if (i == (ssize_t) argc)
00882               ThrowImportException(OptionError,"MissingArgument",option);
00883             interlace=ParseCommandOption(MagickInterlaceOptions,MagickFalse,
00884               argv[i]);
00885             if (interlace < 0)
00886               ThrowImportException(OptionError,"UnrecognizedInterlaceType",
00887                 argv[i]);
00888             break;
00889           }
00890         if (LocaleCompare("interpolate",option+1) == 0)
00891           {
00892             ssize_t
00893               interpolate;
00894 
00895             if (*option == '+')
00896               break;
00897             i++;
00898             if (i == (ssize_t) argc)
00899               ThrowImportException(OptionError,"MissingArgument",option);
00900             interpolate=ParseCommandOption(MagickInterpolateOptions,MagickFalse,
00901               argv[i]);
00902             if (interpolate < 0)
00903               ThrowImportException(OptionError,"UnrecognizedInterpolateMethod",
00904                 argv[i]);
00905             break;
00906           }
00907         ThrowImportException(OptionError,"UnrecognizedOption",option);
00908       }
00909       case 'l':
00910       {
00911         if (LocaleCompare("label",option+1) == 0)
00912           {
00913             if (*option == '+')
00914               break;
00915             i++;
00916             if (i == (ssize_t) argc)
00917               ThrowImportException(OptionError,"MissingArgument",option);
00918             status=SetImageOption(image_info,"label",argv[i]);
00919             if (status == MagickFalse)
00920               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
00921             break;
00922           }
00923         if (LocaleCompare("limit",option+1) == 0)
00924           {
00925             char
00926               *p;
00927 
00928             double
00929               value;
00930 
00931             ssize_t
00932               resource;
00933 
00934             if (*option == '+')
00935               break;
00936             i++;
00937             if (i == (ssize_t) argc)
00938               ThrowImportException(OptionError,"MissingArgument",option);
00939             resource=ParseCommandOption(MagickResourceOptions,MagickFalse,
00940               argv[i]);
00941             if (resource < 0)
00942               ThrowImportException(OptionError,"UnrecognizedResourceType",
00943                 argv[i]);
00944             i++;
00945             if (i == (ssize_t) argc)
00946               ThrowImportException(OptionError,"MissingArgument",option);
00947             value=StringToDouble(argv[i],&p);
00948             (void) value;
00949             if ((p == argv[i]) && (LocaleCompare("unlimited",argv[i]) != 0))
00950               ThrowImportInvalidArgumentException(option,argv[i]);
00951             break;
00952           }
00953         if (LocaleCompare("list",option+1) == 0)
00954           {
00955             ssize_t
00956               list;
00957 
00958             if (*option == '+')
00959               break;
00960             i++;
00961             if (i == (ssize_t) argc)
00962               ThrowImportException(OptionError,"MissingArgument",option);
00963             list=ParseCommandOption(MagickListOptions,MagickFalse,argv[i]);
00964             if (list < 0)
00965               ThrowImportException(OptionError,"UnrecognizedListType",argv[i]);
00966             status=MogrifyImageInfo(image_info,(int) (i-j+1),(const char **)
00967               argv+j,exception);
00968             DestroyImport();
00969             return(status != 0 ? MagickFalse : MagickTrue);
00970           }
00971         if (LocaleCompare("log",option+1) == 0)
00972           {
00973             if (*option == '+')
00974               break;
00975             i++;
00976             if ((i == (ssize_t) argc) || (strchr(argv[i],'%') == (char *) NULL))
00977               ThrowImportException(OptionError,"MissingArgument",option);
00978             break;
00979           }
00980         ThrowImportException(OptionError,"UnrecognizedOption",option);
00981       }
00982       case 'm':
00983       {
00984         if (LocaleCompare("monitor",option+1) == 0)
00985           break;
00986         if (LocaleCompare("monochrome",option+1) == 0)
00987           {
00988             if (*option == '+')
00989               break;
00990             quantize_info->number_colors=2;
00991             quantize_info->colorspace=GRAYColorspace;
00992             break;
00993           }
00994         ThrowImportException(OptionError,"UnrecognizedOption",option);
00995       }
00996       case 'n':
00997       {
00998         if (LocaleCompare("negate",option+1) == 0)
00999           break;
01000         ThrowImportException(OptionError,"UnrecognizedOption",option);
01001       }
01002       case 'p':
01003       {
01004         if (LocaleCompare("page",option+1) == 0)
01005           {
01006             if (*option == '+')
01007               break;
01008             i++;
01009             if (i == (ssize_t) argc)
01010               ThrowImportException(OptionError,"MissingArgument",option);
01011             status=SetImageOption(image_info,"page",argv[i]);
01012             if (status == MagickFalse)
01013               ThrowImportException(OptionError,"UnrecognizedOption",argv[i]);
01014             break;
01015           }
01016         if (LocaleCompare("pause",option+1) == 0)
01017           {
01018             resource_info.pause=0;
01019             if (*option == '+')
01020               break;
01021             i++;
01022             if (i == (ssize_t) argc)
01023               ThrowImportException(OptionError,"MissingArgument",option);
01024             if (IsGeometry(argv[i]) == MagickFalse)
01025               ThrowImportInvalidArgumentException(option,argv[i]);
01026             resource_info.pause=(unsigned int) StringToUnsignedLong(argv[i]);
01027             break;
01028           }
01029         if (LocaleCompare("ping",option+1) == 0)
01030           break;  /* deprecated option */
01031         if (LocaleCompare("pointsize",option+1) == 0)
01032           {
01033             if (*option == '+')
01034               break;
01035             i++;
01036             if (i == (ssize_t) argc)
01037               ThrowImportException(OptionError,"MissingArgument",option);
01038             if (IsGeometry(argv[i]) == MagickFalse)
01039               ThrowImportInvalidArgumentException(option,argv[i]);
01040             break;
01041           }
01042         ThrowImportException(OptionError,"UnrecognizedOption",option);
01043       }
01044       case 'q':
01045       {
01046         if (LocaleCompare("quality",option+1) == 0)
01047           {
01048             if (*option == '+')
01049               break;
01050             i++;
01051             if (i == (ssize_t) argc)
01052               ThrowImportException(OptionError,"MissingArgument",option);
01053             if (IsGeometry(argv[i]) == MagickFalse)
01054               ThrowImportInvalidArgumentException(option,argv[i]);
01055             break;
01056           }
01057         if (LocaleCompare("quantize",option+1) == 0)
01058           {
01059             ssize_t
01060               colorspace;
01061 
01062             if (*option == '+')
01063               break;
01064             i++;
01065             if (i == (ssize_t) (argc-1))
01066               ThrowImportException(OptionError,"MissingArgument",option);
01067             colorspace=ParseCommandOption(MagickColorspaceOptions,
01068               MagickFalse,argv[i]);
01069             if (colorspace < 0)
01070               ThrowImportException(OptionError,"UnrecognizedColorspace",
01071                 argv[i]);
01072             break;
01073           }
01074         if (LocaleCompare("quiet",option+1) == 0)
01075           break;
01076         ThrowImportException(OptionError,"UnrecognizedOption",option);
01077       }
01078       case 'r':
01079       {
01080         if (LocaleCompare("regard-warnings",option+1) == 0)
01081           break;
01082         if (LocaleCompare("repage",option+1) == 0)
01083           {
01084             if (*option == '+')
01085               break;
01086             i++;
01087             if (i == (ssize_t) (argc-1))
01088               ThrowImportException(OptionError,"MissingArgument",option);
01089             if (IsGeometry(argv[i]) == MagickFalse)
01090               ThrowImportInvalidArgumentException(option,argv[i]);
01091             break;
01092           }
01093         if (LocaleCompare("resize",option+1) == 0)
01094           {
01095             if (*option == '+')
01096               break;
01097             i++;
01098             if (i == (ssize_t) argc)
01099               ThrowImportException(OptionError,"MissingArgument",option);
01100             if (IsGeometry(argv[i]) == MagickFalse)
01101               ThrowImportInvalidArgumentException(option,argv[i]);
01102             break;
01103           }
01104         if (LocaleNCompare("respect-parentheses",option+1,17) == 0)
01105           {
01106             respect_parenthesis=(*option == '-') ? MagickTrue : MagickFalse;
01107             break;
01108           }
01109         if (LocaleCompare("rotate",option+1) == 0)
01110           {
01111             i++;
01112             if (i == (ssize_t) argc)
01113               ThrowImportException(OptionError,"MissingArgument",option);
01114             if (IsGeometry(argv[i]) == MagickFalse)
01115               ThrowImportInvalidArgumentException(option,argv[i]);
01116             break;
01117           }
01118         ThrowImportException(OptionError,"UnrecognizedOption",option);
01119       }
01120       case 's':
01121       {
01122         if (LocaleCompare("sampling-factor",option+1) == 0)
01123           {
01124             if (*option == '+')
01125               break;
01126             i++;
01127             if (i == (ssize_t) argc)
01128               ThrowImportException(OptionError,"MissingArgument",option);
01129             if (IsGeometry(argv[i]) == MagickFalse)
01130               ThrowImportInvalidArgumentException(option,argv[i]);
01131             break;
01132           }
01133         if (LocaleCompare("scene",option+1) == 0)
01134           {
01135             if (*option == '+')
01136               break;
01137             i++;
01138             if (i == (ssize_t) argc)
01139               ThrowImportException(OptionError,"MissingArgument",option);
01140             if (IsGeometry(argv[i]) == MagickFalse)
01141               ThrowImportInvalidArgumentException(option,argv[i]);
01142             break;
01143           }
01144         if (LocaleCompare("set",option+1) == 0)
01145           {
01146             i++;
01147             if (i == (ssize_t) argc)
01148               ThrowImportException(OptionError,"MissingArgument",option);
01149             if (*option == '+')
01150               break;
01151             i++;
01152             if (i == (ssize_t) argc)
01153               ThrowImportException(OptionError,"MissingArgument",option);
01154             break;
01155           }
01156         if (LocaleCompare("screen",option+1) == 0)
01157           {
01158             ximage_info.screen=(*option == '-') ? MagickTrue : MagickFalse;
01159             break;
01160           }
01161         if (LocaleCompare("seed",option+1) == 0)
01162           {
01163             if (*option == '+')
01164               break;
01165             i++;
01166             if (i == (ssize_t) (argc-1))
01167               ThrowImportException(OptionError,"MissingArgument",option);
01168             if (IsGeometry(argv[i]) == MagickFalse)
01169               ThrowImportInvalidArgumentException(option,argv[i]);
01170             break;
01171           }
01172         if (LocaleCompare("silent",option+1) == 0)
01173           {
01174             ximage_info.silent=(*option == '-') ? MagickTrue : MagickFalse;
01175             break;
01176           }
01177         if (LocaleCompare("snaps",option+1) == 0)
01178           {
01179             (void) CopyMagickString(argv[i]+1,"sans",MaxTextExtent);
01180             i++;
01181             if (i == (ssize_t) argc)
01182               ThrowImportException(OptionError,"MissingArgument",option);
01183             if (IsGeometry(argv[i]) == MagickFalse)
01184               ThrowImportInvalidArgumentException(option,argv[i]);
01185             snapshots=(ssize_t) StringToLong(argv[i]);
01186             break;
01187           }
01188         if (LocaleCompare("strip",option+1) == 0)
01189           break;
01190         if (LocaleCompare("support",option+1) == 0)
01191           {
01192             i++;  /* deprecated */
01193             break;
01194           }
01195         if (LocaleCompare("synchronize",option+1) == 0)
01196           break;
01197         ThrowImportException(OptionError,"UnrecognizedOption",option);
01198       }
01199       case 't':
01200       {
01201         if (LocaleCompare("taint",option+1) == 0)
01202           break;
01203         if (LocaleCompare("thumbnail",option+1) == 0)
01204           {
01205             if (*option == '+')
01206               break;
01207             i++;
01208             if (i == (ssize_t) argc)
01209               ThrowImportException(OptionError,"MissingArgument",option);
01210             if (IsGeometry(argv[i]) == MagickFalse)
01211               ThrowImportInvalidArgumentException(option,argv[i]);
01212             break;
01213           }
01214         if (LocaleCompare("transparent",option+1) == 0)
01215           {
01216             i++;
01217             if (i == (ssize_t) argc)
01218               ThrowImportException(OptionError,"MissingArgument",option);
01219             break;
01220           }
01221         if (LocaleCompare("transparent-color",option+1) == 0)
01222           {
01223             if (*option == '+')
01224               break;
01225             i++;
01226             if (i == (ssize_t) (argc-1))
01227               ThrowImportException(OptionError,"MissingArgument",option);
01228             break;
01229           }
01230         if (LocaleCompare("treedepth",option+1) == 0)
01231           {
01232             quantize_info->tree_depth=0;
01233             if (*option == '+')
01234               break;
01235             i++;
01236             if (i == (ssize_t) argc)
01237               ThrowImportException(OptionError,"MissingArgument",option);
01238             if (IsGeometry(argv[i]) == MagickFalse)
01239               ThrowImportInvalidArgumentException(option,argv[i]);
01240             quantize_info->tree_depth=StringToUnsignedLong(argv[i]);
01241             break;
01242           }
01243         if (LocaleCompare("trim",option+1) == 0)
01244           break;
01245         if (LocaleCompare("type",option+1) == 0)
01246           {
01247             ssize_t
01248               type;
01249 
01250             if (*option == '+')
01251               break;
01252             i++;
01253             if (i == (ssize_t) argc)
01254               ThrowImportException(OptionError,"MissingArgument",option);
01255             type=ParseCommandOption(MagickTypeOptions,MagickFalse,argv[i]);
01256             if (type < 0)
01257               ThrowImportException(OptionError,"UnrecognizedImageType",argv[i]);
01258             break;
01259           }
01260         ThrowImportException(OptionError,"UnrecognizedOption",option);
01261       }
01262       case 'w':
01263       {
01264         i++;
01265         if (i == (ssize_t) argc)
01266           ThrowImportException(OptionError,"MissingArgument",option);
01267         (void) CloneString(&target_window,argv[i]);
01268         break;
01269       }
01270       case 'v':
01271       {
01272         if (LocaleCompare("verbose",option+1) == 0)
01273           break;
01274         if ((LocaleCompare("version",option+1) == 0) ||
01275             (LocaleCompare("-version",option+1) == 0))
01276           {
01277             (void) FormatLocaleFile(stdout,"Version: %s\n",
01278               GetMagickVersion((size_t *) NULL));
01279             (void) FormatLocaleFile(stdout,"Copyright: %s\n",
01280               GetMagickCopyright());
01281             (void) FormatLocaleFile(stdout,"Features: %s\n\n",
01282               GetMagickFeatures());
01283             break;
01284           }
01285         ThrowImportException(OptionError,"UnrecognizedOption",option);
01286       }
01287       case '?':
01288         break;
01289       default:
01290         ThrowImportException(OptionError,"UnrecognizedOption",option);
01291     }
01292     fire=(GetCommandOptionFlags(MagickCommandOptions,MagickFalse,option) &
01293       FireOptionFlag) == 0 ?  MagickFalse : MagickTrue;
01294     if (fire != MagickFalse)
01295       FireImageStack(MagickFalse,MagickTrue,MagickTrue);
01296   }
01297   if (k != 0)
01298     ThrowImportException(OptionError,"UnbalancedParenthesis",argv[i]);
01299   if (i-- != (ssize_t) argc)
01300     ThrowImportException(OptionError,"MissingAnImageFilename",argv[i]);
01301   if (image == (Image *) NULL)
01302     ThrowImportException(OptionError,"MissingAnImageFilename",argv[argc-1]);
01303   FinalizeImageSettings(image_info,image,MagickTrue);
01304   status&=WriteImages(image_info,image,filename,exception);
01305   DestroyImport();
01306   return(status != 0 ? MagickTrue : MagickFalse);
01307 #else
01308   (void) argc;
01309   (void) argv;
01310   (void) ThrowMagickException(exception,GetMagickModule(),MissingDelegateError,
01311     "DelegateLibrarySupportNotBuiltIn","`%s' (X11)",image_info->filename);
01312   return(ImportUsage());
01313 #endif
01314 }