]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/utility.c
(no commit message)
[imagemagick] / MagickCore / utility.c
index 6b8867f6414e6c288723842ef74d35cd0e91a994..d44808332227a7f1f58cd060217cfd4f1014a7f2 100644 (file)
@@ -17,7 +17,7 @@
 %                              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  %
@@ -48,7 +48,9 @@
 #include "MagickCore/geometry.h"
 #include "MagickCore/list.h"
 #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"
 #include "MagickCore/signature-private.h"
 #include "MagickCore/statistic.h"
 #include "MagickCore/string_.h"
+#include "MagickCore/string-private.h"
 #include "MagickCore/token.h"
+#include "MagickCore/token-private.h"
 #include "MagickCore/utility.h"
+#include "MagickCore/utility-private.h"
 #if defined(MAGICKCORE_HAVE_PROCESS_H)
 #include <process.h>
 #endif
@@ -196,7 +201,7 @@ MagickExport MagickBooleanType AcquireUniqueSymbolicLink(const char *source,
   destination_file=AcquireUniqueFileResource(destination);
   if (destination_file == -1)
     return(MagickFalse);
-  source_file=open(source,O_RDONLY | O_BINARY);
+  source_file=open_utf8(source,O_RDONLY | O_BINARY,0);
   if (source_file == -1)
     {
       (void) close(destination_file);
@@ -564,7 +569,7 @@ MagickExport char *Base64Encode(const unsigned char *blob,
 %    o components:  The number of components to chop.
 %
 */
-MagickExport void ChopPathComponents(char *path,const size_t components)
+MagickPrivate void ChopPathComponents(char *path,const size_t components)
 {
   register ssize_t
     i;
@@ -596,7 +601,7 @@ MagickExport void ChopPathComponents(char *path,const size_t components)
 %      path.
 %
 */
-MagickExport void ExpandFilename(char *path)
+MagickPrivate void ExpandFilename(char *path)
 {
   char
     expand_path[MaxTextExtent];
@@ -670,9 +675,40 @@ MagickExport void ExpandFilename(char *path)
 %                                                                             %
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %
-%  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:
 %
@@ -763,11 +799,12 @@ MagickExport MagickBooleanType ExpandFilenames(int *number_arguments,
     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).
@@ -796,7 +833,7 @@ MagickExport MagickBooleanType ExpandFilenames(int *number_arguments,
           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;
@@ -937,7 +974,7 @@ MagickExport MagickBooleanType ExpandFilenames(int *number_arguments,
 %    o extent: the maximum extent of the path.
 %
 */
-MagickExport MagickBooleanType GetExecutionPath(char *path,const size_t extent)
+MagickPrivate MagickBooleanType GetExecutionPath(char *path,const size_t extent)
 {
   char
     *directory;
@@ -1059,7 +1096,7 @@ MagickExport MagickBooleanType GetExecutionPath(char *path,const size_t extent)
 %      ssize_t GetMagickPageSize()
 %
 */
-MagickExport ssize_t GetMagickPageSize(void)
+MagickPrivate ssize_t GetMagickPageSize(void)
 {
   static ssize_t
     page_size = -1;
@@ -1102,124 +1139,6 @@ MagickExport ssize_t GetMagickPageSize(void)
 %   o  attributes: the path attributes are returned here.
 %
 */
-
-#if defined(MAGICKCORE_HAVE__WFOPEN)
-static size_t UTF8ToUTF16(const unsigned char *utf8,wchar_t *utf16)
-{
-  register const unsigned char
-    *p;
-
-  if (utf16 != (wchar_t *) NULL)
-    {
-      register wchar_t
-        *q;
-
-      wchar_t
-        c;
-
-      /*
-        Convert UTF-8 to UTF-16.
-      */
-      q=utf16;
-      for (p=utf8; *p != '\0'; p++)
-      {
-        if ((*p & 0x80) == 0)
-          *q=(*p);
-        else
-          if ((*p & 0xE0) == 0xC0)
-            {
-              c=(*p);
-              *q=(c & 0x1F) << 6;
-              p++;
-              if ((*p & 0xC0) != 0x80)
-                return(0);
-              *q|=(*p & 0x3F);
-            }
-          else
-            if ((*p & 0xF0) == 0xE0)
-              {
-                c=(*p);
-                *q=c << 12;
-                p++;
-                if ((*p & 0xC0) != 0x80)
-                  return(0);
-                c=(*p);
-                *q|=(c & 0x3F) << 6;
-                p++;
-                if ((*p & 0xC0) != 0x80)
-                  return(0);
-                *q|=(*p & 0x3F);
-              }
-            else
-              return(0);
-        q++;
-      }
-      *q++='\0';
-      return(q-utf16);
-    }
-  /*
-    Compute UTF-16 string length.
-  */
-  for (p=utf8; *p != '\0'; p++)
-  {
-    if ((*p & 0x80) == 0)
-      ;
-    else
-      if ((*p & 0xE0) == 0xC0)
-        {
-          p++;
-          if ((*p & 0xC0) != 0x80)
-            return(0);
-        }
-      else
-        if ((*p & 0xF0) == 0xE0)
-          {
-            p++;
-            if ((*p & 0xC0) != 0x80)
-              return(0);
-            p++;
-            if ((*p & 0xC0) != 0x80)
-              return(0);
-         }
-       else
-         return(0);
-  }
-  return(p-utf8);
-}
-
-static wchar_t *ConvertUTF8ToUTF16(const unsigned char *source)
-{
-  size_t
-    length;
-
-  wchar_t
-    *utf16;
-
-  length=UTF8ToUTF16(source,(wchar_t *) NULL);
-  if (length == 0)
-    {
-      register ssize_t
-        i;
-
-      /*
-        Not UTF-8, just copy.
-      */
-      length=strlen((const char *) source);
-      utf16=(wchar_t *) AcquireQuantumMemory(length+1,sizeof(*utf16));
-      if (utf16 == (wchar_t *) NULL)
-        return((wchar_t *) NULL);
-      for (i=0; i <= (ssize_t) length; i++)
-        utf16[i]=source[i];
-      return(utf16);
-    }
-  utf16=(wchar_t *) AcquireQuantumMemory(length+1,sizeof(*utf16));
-  if (utf16 == (wchar_t *) NULL)
-    return((wchar_t *) NULL);
-  length=UTF8ToUTF16(source,utf16);
-  return(utf16);
-}
-#endif
-
 MagickExport MagickBooleanType GetPathAttributes(const char *path,
   void *attributes)
 {
@@ -1231,21 +1150,8 @@ MagickExport MagickBooleanType GetPathAttributes(const char *path,
       errno=EINVAL;
       return(MagickFalse);
     }
-#if !defined(MAGICKCORE_HAVE__WSTAT)
-  status=stat(path,(struct stat *) attributes) == 0 ? MagickTrue : MagickFalse;
-#else
-  {
-    wchar_t
-      *unicode_path;
-
-    unicode_path=ConvertUTF8ToUTF16((const unsigned char *) path);
-    if (unicode_path == (wchar_t *) NULL)
-      return(MagickFalse);
-    status=wstat(unicode_path,(struct stat *) attributes) == 0 ? MagickTrue :
-      MagickFalse;
-    unicode_path=(wchar_t *) RelinquishMagickMemory(unicode_path);
-  }
-#endif
+  status=stat_utf8(path,(struct stat *) attributes) == 0 ? MagickTrue :
+    MagickFalse;
   return(status);
 }
 \f
@@ -1263,6 +1169,9 @@ MagickExport MagickBooleanType GetPathAttributes(const char *path,
 %  GetPathComponent() returns the parent directory name, filename, basename, or
 %  extension of a file path.
 %
+%  The component string pointed to must have at least MaxTextExtent space
+%  for the results to be stored.
+%
 %  The format of the GetPathComponent function is:
 %
 %      GetPathComponent(const char *path,PathType type,char *component)
@@ -1450,7 +1359,7 @@ MagickExport void GetPathComponent(const char *path,PathType type,
 %    o number_components:  return the number of components in the list
 %
 */
-MagickExport char **GetPathComponents(const char *path,
+MagickPrivate char **GetPathComponents(const char *path,
   size_t *number_components)
 {
   char
@@ -1528,7 +1437,7 @@ MagickExport MagickBooleanType IsPathAccessible(const char *path)
     return(status);
   if (S_ISREG(attributes.st_mode) == 0)
     return(MagickFalse);
-  if (access(path,F_OK) != 0)
+  if (access_utf8(path,F_OK) != 0)
     return(MagickFalse);
   return(MagickTrue);
 }
@@ -1579,47 +1488,6 @@ static int IsPathDirectory(const char *path)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   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                                                         %
 %                                                                             %
 %                                                                             %
@@ -1682,7 +1550,7 @@ static inline int MagickReadDirectory(DIR *directory,struct dirent *entry,
 #endif
 }
 
-MagickExport char **ListFiles(const char *directory,const char *pattern,
+MagickPrivate char **ListFiles(const char *directory,const char *pattern,
   size_t *number_entries)
 {
   char
@@ -1803,7 +1671,7 @@ MagickExport char **ListFiles(const char *directory,const char *pattern,
 %      returning.
 %
 */
-MagickExport void MagickDelay(const MagickSizeType milliseconds)
+MagickPrivate void MagickDelay(const MagickSizeType milliseconds)
 {
   if (milliseconds == 0)
     return;
@@ -1868,7 +1736,6 @@ MagickExport void MagickDelay(const MagickSizeType milliseconds)
 %
 %   o  label:  This character string is the label.
 %
-%
 */
 MagickExport size_t MultilineCensus(const char *label)
 {
@@ -1891,67 +1758,6 @@ MagickExport size_t MultilineCensus(const char *label)
 %                                                                             %
 %                                                                             %
 %                                                                             %
-%   O p e n M a g i c k S t r e a m                                           %
-%                                                                             %
-%                                                                             %
-%                                                                             %
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%
-%  OpenMagickStream() opens the file at the specified path and return the
-%  associated stream.
-%
-%  The path of the OpenMagickStream method is:
-%
-%      FILE *OpenMagickStream(const char *path,const char *mode)
-%
-%  A description of each parameter follows.
-%
-%   o  path: the file path.
-%
-%   o  mode: the file mode.
-%
-*/
-MagickExport FILE *OpenMagickStream(const char *path,const char *mode)
-{
-  FILE
-    *file;
-
-  if ((path == (const char *) NULL) || (mode == (const char *) NULL))
-    {
-      errno=EINVAL;
-      return((FILE *) NULL);
-    }
-  file=(FILE *) NULL;
-#if defined(MAGICKCORE_HAVE__WFOPEN)
-  {
-    wchar_t
-      *unicode_mode,
-      *unicode_path;
-
-    unicode_path=ConvertUTF8ToUTF16((const unsigned char *) path);
-    if (unicode_path == (wchar_t *) NULL)
-      return((FILE *) NULL);
-    unicode_mode=ConvertUTF8ToUTF16((const unsigned char *) mode);
-    if (unicode_mode == (wchar_t *) NULL)
-      {
-        unicode_path=(wchar_t *) RelinquishMagickMemory(unicode_path);
-        return((FILE *) NULL);
-      }
-    file=_wfopen(unicode_path,unicode_mode);
-    unicode_mode=(wchar_t *) RelinquishMagickMemory(unicode_mode);
-    unicode_path=(wchar_t *) RelinquishMagickMemory(unicode_path);
-  }
-#endif
-  if (file == (FILE *) NULL)
-    file=fopen(path,mode);
-  return(file);
-}
-\f
-/*
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-%                                                                             %
-%                                                                             %
-%                                                                             %
 %   S y s t e m C o m m a n d                                                 %
 %                                                                             %
 %                                                                             %
@@ -2010,7 +1816,7 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
     {
       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);
@@ -2031,7 +1837,8 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
 #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
     {
@@ -2041,7 +1848,7 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
       /*
         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
@@ -2059,7 +1866,7 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
               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
@@ -2074,15 +1881,7 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
     }
 #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)
@@ -2092,7 +1891,7 @@ MagickExport int SystemCommand(const MagickBooleanType asynchronous,
 #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++)