% January 1993 %
% %
% %
-% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2012 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 %
#include "MagickCore/log.h"
#include "MagickCore/magick-private.h"
#include "MagickCore/memory_.h"
+#include "MagickCore/nt-base-private.h"
#include "MagickCore/option.h"
#include "MagickCore/policy.h"
#include "MagickCore/resource_.h"
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
-% ExpandFilenames() checks each argument of the command line vector and
-% expands it if they have a wildcard character. For example, *.jpg might
-% expand to: bird.jpg rose.jpg tiki.jpg.
+% ExpandFilenames() checks each argument of the given argument array, and
+% expands it if they have a wildcard character.
+%
+% Any coder prefix (EG: 'coder:filename') or read modifier postfix (EG:
+% 'filename[...]') are ignored during the file the expansion, but will be
+% included in the final argument. If no filename matching the meta-character
+% 'glob' is found the original argument is returned.
+%
+% For example, an argument of '*.gif[20x20]' will be replaced by the list
+% 'abc.gif[20x20]', 'foobar.gif[20x20]', 'xyzzy.gif[20x20]'
+% if such filenames exist, (in the current directory in this case).
+%
+% Meta-characters handled...
+% @ read a list of filenames (no further expansion performed)
+% ~ At start of filename expands to HOME environemtn variable
+% * matches any string including an empty string
+% ? matches by any single character
+%
+% WARNING: filenames starting with '.' (hidden files in a UNIX file system)
+% will never be expanded. Attempting to epand '.*' will produce no change.
+%
+% Expansion is ignored for coders "label:" "caption:" "pango:" and "vid:".
+% Which provide their own '@' meta-character handling.
+%
+% You can see the results of the expansion using "Configure" log
+% events.
+%
+%
+% The returned list should be freed using DestroyStringList().
+%
+% However the strings in the original pointed to argv are not
+% freed (TO BE CHECKED). So a copy of the original pointer (and count)
+% should be kept separate if they need to be freed later.
+%
%
% The format of the ExpandFilenames function is:
%
GetPathComponent(option,MagickPath,magick);
if ((LocaleCompare(magick,"CAPTION") == 0) ||
(LocaleCompare(magick,"LABEL") == 0) ||
+ (LocaleCompare(magick,"PANGO") == 0) ||
(LocaleCompare(magick,"VID") == 0))
continue;
- if ((IsGlob(filename) == MagickFalse) && (*filename != '@'))
+ if ((IsGlob(filename) == MagickFalse) && (*option != '@'))
continue;
- if (*filename != '@')
+ if (*option != '@')
{
/*
Generate file list from wildcard filename (e.g. *.jpg).
Generate file list from file list (e.g. @filelist.txt).
*/
exception=AcquireExceptionInfo();
- files=FileToString(filename+1,~0,exception);
+ files=FileToString(option+1,~0,exception);
exception=DestroyExceptionInfo(exception);
if (files == (char *) NULL)
continue;
}
(void) CopyMagickString(component,path,MaxTextExtent);
*magick='\0';
- *subimage='\0';
- p=component;
- if (*p != '\0')
- p=component+strlen(component)-1;
- if ((*p == ']') && (strchr(component,'[') != (char *) NULL) &&
- (IsPathAccessible(path) == MagickFalse))
- {
- /*
- Look for scene specification (e.g. img0001.pcd[4]).
- */
- for (q=p-1; q > component; q--)
- if (*q == '[')
- break;
- if (*q == '[')
- {
- (void) CopyMagickString(subimage,q+1,MaxTextExtent);
- subimage[p-q-1]='\0';
- if ((IsSceneGeometry(subimage,MagickFalse) == MagickFalse) &&
- (IsGeometry(subimage) == MagickFalse))
- *subimage='\0';
- }
- }
#if defined(__OS2__)
- if (path[1] != ':')
+ if (path[1] != ":")
#endif
for (p=component; *p != '\0'; p++)
{
if (*p == '\0')
break;
}
- if ((*p == ':') && (IsPathDirectory(component) < 0) &&
- (IsPathAccessible(component) == MagickFalse))
+ if ((*p == ':') && (IsPathDirectory(path) < 0) &&
+ (IsPathAccessible(path) == MagickFalse))
{
/*
Look for image format specification (e.g. ps3:image).
break;
}
}
+ *subimage='\0';
+ p=component;
+ if (*p != '\0')
+ p=component+strlen(component)-1;
+ if ((*p == ']') && (strchr(component,'[') != (char *) NULL) &&
+ (IsPathAccessible(path) == MagickFalse))
+ {
+ /*
+ Look for scene specification (e.g. img0001.pcd[4]).
+ */
+ for (q=p-1; q > component; q--)
+ if (*q == '[')
+ break;
+ if (*q == '[')
+ {
+ (void) CopyMagickString(subimage,q+1,MaxTextExtent);
+ subimage[p-q-1]='\0';
+ if ((IsSceneGeometry(subimage,MagickFalse) == MagickFalse) &&
+ (IsGeometry(subimage) == MagickFalse))
+ *subimage='\0';
+ else
+ *q='\0';
+ }
+ }
p=component;
if (*p != '\0')
for (p=component+strlen(component)-1; p > component; p--)
% %
% %
% %
-% I s M a g i c k T r u e %
-% %
-% %
-% %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-% IsMagickTrue() returns MagickTrue if the value is "true", "on", "yes" or
-% "1".
-%
-% The format of the IsMagickTrue method is:
-%
-% MagickBooleanType IsMagickTrue(const char *value)
-%
-% A description of each parameter follows:
-%
-% o option: either MagickTrue or MagickFalse depending on the value
-% parameter.
-%
-% o value: Specifies a pointer to a character array.
-%
-*/
-MagickExport MagickBooleanType IsMagickTrue(const char *value)
-{
- if (value == (const char *) NULL)
- return(MagickFalse);
- if (LocaleCompare(value,"true") == 0)
- return(MagickTrue);
- if (LocaleCompare(value,"on") == 0)
- return(MagickTrue);
- if (LocaleCompare(value,"yes") == 0)
- return(MagickTrue);
- if (LocaleCompare(value,"1") == 0)
- return(MagickTrue);
- return(MagickFalse);
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% %
-% %
-% %
% L i s t F i l e s %
% %
% %
{
errno=EPERM;
(void) ThrowMagickException(exception,GetMagickModule(),PolicyError,
- "NotAuthorized","`%s'",arguments[1]);
+ "NotAuthorized","'%s'",arguments[1]);
for (i=0; i < (ssize_t) number_arguments; i++)
arguments[i]=DestroyString(arguments[i]);
arguments=(char **) RelinquishMagickMemory(arguments);
#if !defined(MAGICKCORE_HAVE_EXECVP)
status=system(shell_command);
#else
- if ((asynchronous != MagickFalse) || (strspn(shell_command,"&;<>|") == 0))
+ if ((asynchronous != MagickFalse) ||
+ (strpbrk(shell_command,"&;<>|") != (char *) NULL))
status=system(shell_command);
else
{
/*
Call application directly rather than from a shell.
*/
- child_pid=fork();
+ child_pid=(pid_t) fork();
if (child_pid == (pid_t) -1)
status=system(command);
else
pid;
child_status=0;
- pid=waitpid(child_pid,&child_status,0);
+ pid=(pid_t) waitpid(child_pid,&child_status,0);
if (pid == -1)
status=(-1);
else
}
#endif
#elif defined(MAGICKCORE_WINDOWS_SUPPORT)
- {
- int
- mode;
-
- mode=_P_WAIT;
- if (asynchronous != MagickFalse)
- mode=_P_NOWAIT;
- status=spawnvp(mode,arguments[1],(const char **) (arguments+1));
- }
+ status=NTSystemCommand(shell_command);
#elif defined(macintosh)
status=MACSystemCommand(shell_command);
#elif defined(vms)
#endif
if (status < 0)
(void) ThrowMagickException(exception,GetMagickModule(),DelegateError,
- "`%s' (%d)",command,status);
+ "'%s' (%d)",command,status);
if (shell_command != command)
shell_command=DestroyString(shell_command);
for (i=0; i < (ssize_t) number_arguments; i++)