]>
git.saurik.com Git - wxWidgets.git/blob - src/xpm/RdFToI.c
   2  * Copyright (C) 1989-95 GROUPE BULL 
   4  * Permission is hereby granted, free of charge, to any person obtaining a copy 
   5  * of this software and associated documentation files (the "Software"), to 
   6  * deal in the Software without restriction, including without limitation the 
   7  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 
   8  * sell copies of the Software, and to permit persons to whom the Software is 
   9  * furnished to do so, subject to the following conditions: 
  11  * The above copyright notice and this permission notice shall be included in 
  12  * all copies or substantial portions of the Software. 
  14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
  17  * GROUPE BULL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 
  18  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
  19  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
  21  * Except as contained in this notice, the name of GROUPE BULL shall not be 
  22  * used in advertising or otherwise to promote the sale, use or other dealings 
  23  * in this Software without prior written authorization from GROUPE BULL. 
  26 /*****************************************************************************\ 
  30 *  Parse an XPM file and create the image and possibly its mask               * 
  32 *  Developed by Arnaud Le Hors                                                * 
  33 \*****************************************************************************/ 
  37 #if !defined(NO_ZPIPE) && defined(WIN32) 
  39 # define pclose _pclose 
  40 # if defined(STAT_ZFILE) 
  47 LFUNC(OpenReadFile
, int, (char *filename
, xpmData 
*mdata
)); 
  48 LFUNC(xpmDataClose
, void, (xpmData 
*mdata
)); 
  52 /* Visual Age cannot deal with old, non-ansi, code */ 
  53 int XpmReadFileToImage( 
  56 , XImage
**       image_return
 
  57 , XImage
**       shapeimage_return
 
  58 , XpmAttributes
* attributes
 
  62 XpmReadFileToImage(display
, filename
, 
  63                    image_return
, shapeimage_return
, attributes
) 
  66     XImage 
**image_return
; 
  67     XImage 
**shapeimage_return
; 
  68     XpmAttributes 
*attributes
; 
  76     xpmInitXpmImage(&image
); 
  77     xpmInitXpmInfo(&info
); 
  79     /* open file to read */ 
  80     if ((ErrorStatus 
= OpenReadFile(filename
, &mdata
)) != XpmSuccess
) 
  83     /* create the XImage from the XpmData */ 
  85         xpmInitAttributes(attributes
); 
  86         xpmSetInfoMask(&info
, attributes
); 
  87         ErrorStatus 
= xpmParseDataAndCreate(display
, &mdata
, 
  88                                             image_return
, shapeimage_return
, 
  89                                             &image
, &info
, attributes
); 
  91         ErrorStatus 
= xpmParseDataAndCreate(display
, &mdata
, 
  92                                             image_return
, shapeimage_return
, 
  93                                             &image
, NULL
, attributes
); 
  95         if (ErrorStatus 
>= 0)           /* no fatal error */ 
  96             xpmSetAttributes(attributes
, &image
, &info
); 
  97         XpmFreeXpmInfo(&info
); 
 100     xpmDataClose(&mdata
); 
 101     /* free the XpmImage */ 
 102     XpmFreeXpmImage(&image
); 
 104     return (ErrorStatus
); 
 109 #define pclose fclose 
 110 /* Visual Age cannot deal with old, non-ansi, code */ 
 111 int XpmReadFileToXpmImage( 
 118 XpmReadFileToXpmImage(filename
, image
, info
) 
 127     /* init returned values */ 
 128     xpmInitXpmImage(image
); 
 129     xpmInitXpmInfo(info
); 
 131     /* open file to read */ 
 132     if ((ErrorStatus 
= OpenReadFile(filename
, &mdata
)) != XpmSuccess
) 
 133         return (ErrorStatus
); 
 135     /* create the XpmImage from the XpmData */ 
 136     ErrorStatus 
= xpmParseData(&mdata
, image
, info
); 
 138     xpmDataClose(&mdata
); 
 140     return (ErrorStatus
); 
 142 #endif /* CXPMPROG */ 
 145  * open the given file to be read as an xpmData which is returned. 
 148 /* Visual Age cannot deal with old, non-ansi, code */ 
 149 static int OpenReadFile(char* filename
, xpmData
* mdata
) 
 152 OpenReadFile(filename
, mdata
) 
 166         mdata
->stream
.file 
= (stdin
); 
 167         mdata
->type 
= XPMFILE
; 
 170         int len 
= strlen(filename
); 
 171         if ((len 
> 2) && !strcmp(".Z", filename 
+ (len 
- 2))) { 
 172             mdata
->type 
= XPMPIPE
; 
 173             sprintf(buf
, "uncompress -c \"%s\"", filename
); 
 174             if (!(mdata
->stream
.file 
= popen(buf
, "r"))) 
 175                 return (XpmOpenFailed
); 
 177         } else if ((len 
> 3) && !strcmp(".gz", filename 
+ (len 
- 3))) { 
 178             mdata
->type 
= XPMPIPE
; 
 179             sprintf(buf
, "gunzip -qc \"%s\"", filename
); 
 180             if (!(mdata
->stream
.file 
= popen(buf
, "r"))) 
 181                 return (XpmOpenFailed
); 
 185             if (!(compressfile 
= (char *) XpmMalloc(len 
+ 4))) 
 186                 return (XpmNoMemory
); 
 188             sprintf(compressfile
, "%s.Z", filename
); 
 189             if (!stat(compressfile
, &status
)) { 
 190                 sprintf(buf
, "uncompress -c \"%s\"", compressfile
); 
 191                 if (!(mdata
->stream
.file 
= popen(buf
, "r"))) { 
 192                     XpmFree(compressfile
); 
 193                     return (XpmOpenFailed
); 
 195                 mdata
->type 
= XPMPIPE
; 
 197                 sprintf(compressfile
, "%s.gz", filename
); 
 198                 if (!stat(compressfile
, &status
)) { 
 199                     sprintf(buf
, "gunzip -c \"%s\"", compressfile
); 
 200                     if (!(mdata
->stream
.file 
= popen(buf
, "r"))) { 
 201                         XpmFree(compressfile
); 
 202                         return (XpmOpenFailed
); 
 204                     mdata
->type 
= XPMPIPE
; 
 208                     if (!(mdata
->stream
.file 
= fopen(filename
, "r"))) { 
 209 #if !defined(NO_ZPIPE) && defined(STAT_ZFILE) 
 210                         XpmFree(compressfile
); 
 212                         return (XpmOpenFailed
); 
 214                     mdata
->type 
= XPMFILE
; 
 219             XpmFree(compressfile
); 
 224     mdata
->CommentLength 
= 0; 
 233  * close the file related to the xpmData if any 
 236 /* Visual Age cannot deal with old, non-ansi, code */ 
 238 xpmDataClose(xpmData
* mdata
) 
 245     switch (mdata
->type
) { 
 247         if (mdata
->stream
.file 
!= (stdin
)) 
 248             fclose(mdata
->stream
.file
); 
 252         pclose(mdata
->stream
.file
);