Home | History | Annotate | Download | only in MagickCore
      1 /*
      2   Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization
      3   dedicated to making software imaging solutions freely available.
      4 
      5   You may not use this file except in compliance with the License.
      6   obtain a copy of the License at
      7 
      8     http://www.imagemagick.org/script/license.php
      9 
     10   Unless required by applicable law or agreed to in writing, software
     11   distributed under the License is distributed on an "AS IS" BASIS,
     12   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13   See the License for the specific language governing permissions and
     14   limitations under the License.
     15 
     16   MagickCore private utility methods.
     17 */
     18 #ifndef MAGICKCORE_UTILITY_PRIVATE_H
     19 #define MAGICKCORE_UTILITY_PRIVATE_H
     20 
     21 #include "MagickCore/memory_.h"
     22 #include "MagickCore/nt-base.h"
     23 #include "MagickCore/nt-base-private.h"
     24 
     25 #if defined(__cplusplus) || defined(c_plusplus)
     26 extern "C" {
     27 #endif
     28 
     29 extern MagickPrivate char
     30   **GetPathComponents(const char *,size_t *),
     31   **ListFiles(const char *,const char *,size_t *);
     32 
     33 extern MagickPrivate MagickBooleanType
     34   GetExecutionPath(char *,const size_t),
     35   ShredFile(const char *);
     36 
     37 extern MagickPrivate ssize_t
     38   GetMagickPageSize(void);
     39 
     40 extern MagickPrivate void
     41   ChopPathComponents(char *,const size_t),
     42   ExpandFilename(char *);
     43 
     44 /*
     45   Windows UTF8 compatibility methods.
     46 */
     47 
     48 #if defined(MAGICKCORE_WINDOWS_SUPPORT)
     49 static inline wchar_t *create_wchar_path(const char *utf8)
     50 {
     51   int
     52     count;
     53 
     54   wchar_t
     55     *wideChar;
     56 
     57   count=MultiByteToWideChar(CP_UTF8,0,utf8,-1,NULL,0);
     58   if (count > MAX_PATH)
     59     {
     60       char
     61         buffer[MagickPathExtent];
     62 
     63       wchar_t
     64         shortPath[MAX_PATH],
     65         *longPath;
     66 
     67       (void) FormatLocaleString(buffer,MagickPathExtent,"\\\\?\\%s",utf8);
     68       count+=4;
     69       longPath=(wchar_t *) AcquireQuantumMemory(count,sizeof(*longPath));
     70       if (longPath == (wchar_t *) NULL)
     71         return((wchar_t *) NULL);
     72       count=MultiByteToWideChar(CP_UTF8,0,buffer,-1,longPath,count);
     73       if (count != 0)
     74         count=GetShortPathNameW(longPath,shortPath,MAX_PATH);
     75       longPath=(wchar_t *) RelinquishMagickMemory(longPath);
     76       if (count < 5)
     77         return((wchar_t *) NULL);
     78       wideChar=(wchar_t *) AcquireQuantumMemory(count-3,sizeof(*wideChar));
     79       wcscpy(wideChar,shortPath+4);
     80       return(wideChar);
     81     }
     82   wideChar=(wchar_t *) AcquireQuantumMemory(count,sizeof(*wideChar));
     83   if (wideChar == (wchar_t *) NULL)
     84     return((wchar_t *) NULL);
     85   count=MultiByteToWideChar(CP_UTF8,0,utf8,-1,wideChar,count);
     86   if (count == 0)
     87     {
     88       wideChar=(wchar_t *) RelinquishMagickMemory(wideChar);
     89       return((wchar_t *) NULL);
     90     }
     91   return(wideChar);
     92 }
     93 #endif
     94 
     95 static inline int access_utf8(const char *path,int mode)
     96 {
     97 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__)
     98   return(access(path,mode));
     99 #else
    100    int
    101      status;
    102 
    103    wchar_t
    104      *path_wide;
    105 
    106    path_wide=create_wchar_path(path);
    107    if (path_wide == (wchar_t *) NULL)
    108      return(-1);
    109    status=_waccess(path_wide,mode);
    110    path_wide=(wchar_t *) RelinquishMagickMemory(path_wide);
    111    return(status);
    112 #endif
    113 }
    114 
    115 static inline FILE *fopen_utf8(const char *path,const char *mode)
    116 {
    117 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    118   return(fopen(path,mode));
    119 #else
    120    FILE
    121      *file;
    122 
    123    wchar_t
    124      *mode_wide,
    125      *path_wide;
    126 
    127    path_wide=create_wchar_path(path);
    128    if (path_wide == (wchar_t *) NULL)
    129      return((FILE *) NULL);
    130    mode_wide=create_wchar_path(mode);
    131    if (mode_wide == (wchar_t *) NULL)
    132      {
    133        path_wide=(wchar_t *) RelinquishMagickMemory(path_wide);
    134        return((FILE *) NULL);
    135      }
    136    file=_wfopen(path_wide,mode_wide);
    137    mode_wide=(wchar_t *) RelinquishMagickMemory(mode_wide);
    138    path_wide=(wchar_t *) RelinquishMagickMemory(path_wide);
    139    return(file);
    140 #endif
    141 }
    142 
    143 static inline void getcwd_utf8(char *path,size_t extent)
    144 {
    145 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    146   char
    147     *directory;
    148 
    149    directory=getcwd(path,extent);
    150    (void) directory;
    151 #else
    152   wchar_t
    153     wide_path[MagickPathExtent];
    154 
    155   (void) _wgetcwd(wide_path,MagickPathExtent-1);
    156   (void) WideCharToMultiByte(CP_UTF8,0,wide_path,-1,path,(int) extent,NULL,NULL);
    157 #endif
    158 }
    159 
    160 #if defined(MAGICKCORE_WINDOWS_SUPPORT) && !defined(__CYGWIN__) && !defined(__MINGW32__) && !defined(__MINGW64__)
    161 typedef int
    162   mode_t;
    163 #endif
    164 
    165 static inline int open_utf8(const char *path,int flags,mode_t mode)
    166 {
    167 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    168   return(open(path,flags,mode));
    169 #else
    170    int
    171      status;
    172 
    173    wchar_t
    174      *path_wide;
    175 
    176    path_wide=create_wchar_path(path);
    177    if (path_wide == (wchar_t *) NULL)
    178      return(-1);
    179    status=_wopen(path_wide,flags,mode);
    180    path_wide=(wchar_t *) RelinquishMagickMemory(path_wide);
    181    return(status);
    182 #endif
    183 }
    184 
    185 static inline FILE *popen_utf8(const char *command,const char *type)
    186 {
    187 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    188   return(popen(command,type));
    189 #else
    190    FILE
    191      *file;
    192 
    193    wchar_t
    194      *type_wide,
    195      *command_wide;
    196 
    197    command_wide=create_wchar_path(command);
    198    if (command_wide == (wchar_t *) NULL)
    199      return((FILE *) NULL);
    200    type_wide=create_wchar_path(type);
    201    if (type_wide == (wchar_t *) NULL)
    202      {
    203        command_wide=(wchar_t *) RelinquishMagickMemory(command_wide);
    204        return((FILE *) NULL);
    205      }
    206    file=_wpopen(command_wide,type_wide);
    207    type_wide=(wchar_t *) RelinquishMagickMemory(type_wide);
    208    command_wide=(wchar_t *) RelinquishMagickMemory(command_wide);
    209    return(file);
    210 #endif
    211 }
    212 
    213 static inline int remove_utf8(const char *path)
    214 {
    215 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    216   return(unlink(path));
    217 #else
    218    int
    219      status;
    220 
    221    wchar_t
    222      *path_wide;
    223 
    224    path_wide=create_wchar_path(path);
    225    if (path_wide == (wchar_t *) NULL)
    226      return(-1);
    227    status=_wremove(path_wide);
    228    path_wide=(wchar_t *) RelinquishMagickMemory(path_wide);
    229    return(status);
    230 #endif
    231 }
    232 
    233 static inline int rename_utf8(const char *source,const char *destination)
    234 {
    235 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    236   return(rename(source,destination));
    237 #else
    238    int
    239      status;
    240 
    241    wchar_t
    242      *destination_wide,
    243      *source_wide;
    244 
    245    source_wide=create_wchar_path(source);
    246    if (source_wide == (wchar_t *) NULL)
    247      return(-1);
    248    destination_wide=create_wchar_path(destination);
    249    if (destination_wide == (wchar_t *) NULL)
    250      {
    251        source_wide=(wchar_t *) RelinquishMagickMemory(source_wide);
    252        return(-1);
    253      }
    254    status=_wrename(source_wide,destination_wide);
    255    destination_wide=(wchar_t *) RelinquishMagickMemory(destination_wide);
    256    source_wide=(wchar_t *) RelinquishMagickMemory(source_wide);
    257    return(status);
    258 #endif
    259 }
    260 
    261 static inline int stat_utf8(const char *path,struct stat *attributes)
    262 {
    263 #if !defined(MAGICKCORE_WINDOWS_SUPPORT) || defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__)
    264   return(stat(path,attributes));
    265 #else
    266    int
    267      status;
    268 
    269    wchar_t
    270      *path_wide;
    271 
    272    path_wide=create_wchar_path(path);
    273    if (path_wide == (WCHAR *) NULL)
    274      return(-1);
    275    status=wstat(path_wide,attributes);
    276    path_wide=(WCHAR *) RelinquishMagickMemory(path_wide);
    277    return(status);
    278 #endif
    279 }
    280 
    281 #if defined(__cplusplus) || defined(c_plusplus)
    282 }
    283 #endif
    284 
    285 #endif
    286