X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/cfbe03c9c3ffecd6363dcc63e6fc27b8c6ed70aa..f23208caccf81b0b34c5c11b466c6bd64fdf0f9d:/src/xpm/rdftoi.c diff --git a/src/xpm/rdftoi.c b/src/xpm/rdftoi.c index d5aea86da9..89cdc4ec0f 100644 --- a/src/xpm/rdftoi.c +++ b/src/xpm/rdftoi.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 1989-94 GROUPE BULL + * Copyright (C) 1989-95 GROUPE BULL * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to @@ -24,7 +24,7 @@ */ /*****************************************************************************\ -* XpmRdFToI.c: * +* RdFToI.c: * * * * XPM library * * Parse an XPM file and create the image and possibly its mask * @@ -32,44 +32,94 @@ * Developed by Arnaud Le Hors * \*****************************************************************************/ -#include "xpm34p.h" +#include "XpmI.h" +#include +#if !defined(NO_ZPIPE) && defined(WIN32) +# define popen _popen +# define pclose _pclose +# if defined(STAT_ZFILE) +# include +# define stat _stat +# define fstat _fstat +# endif +#endif +LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata)); +LFUNC(xpmDataClose, void, (xpmData *mdata)); + +#ifndef CXPMPROG +#ifdef __OS2__ +/* Visual Age cannot deal with old, non-ansi, code */ +int XpmReadFileToImage( + Display* display +, char* filename +, XImage** image_return +, XImage** shapeimage_return +, XpmAttributes* attributes +) +#else int -XpmReadFileToImage(Display *display, char *filename, - XImage **image_return, XImage **shapeimage_return, XpmAttributes *attributes) +XpmReadFileToImage(display, filename, + image_return, shapeimage_return, attributes) + Display *display; + char *filename; + XImage **image_return; + XImage **shapeimage_return; + XpmAttributes *attributes; +#endif { XpmImage image; XpmInfo info; int ErrorStatus; + xpmData mdata; - /* create an XpmImage from the file */ + xpmInitXpmImage(&image); + xpmInitXpmInfo(&info); + + /* open file to read */ + if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess) + return (ErrorStatus); + + /* create the XImage from the XpmData */ if (attributes) { xpmInitAttributes(attributes); xpmSetInfoMask(&info, attributes); - ErrorStatus = XpmReadFileToXpmImage(filename, &image, &info); + ErrorStatus = xpmParseDataAndCreate(display, &mdata, + image_return, shapeimage_return, + &image, &info, attributes); } else - ErrorStatus = XpmReadFileToXpmImage(filename, &image, NULL); - - if (ErrorStatus != XpmSuccess) - return (ErrorStatus); - - /* create the related ximages */ - ErrorStatus = XpmCreateImageFromXpmImage(display, &image, - image_return, shapeimage_return, - attributes); + ErrorStatus = xpmParseDataAndCreate(display, &mdata, + image_return, shapeimage_return, + &image, NULL, attributes); if (attributes) { if (ErrorStatus >= 0) /* no fatal error */ xpmSetAttributes(attributes, &image, &info); XpmFreeXpmInfo(&info); } + + xpmDataClose(&mdata); /* free the XpmImage */ XpmFreeXpmImage(&image); return (ErrorStatus); } +#ifdef __OS2__ +#define popen fopen +#define pclose fclose +/* Visual Age cannot deal with old, non-ansi, code */ +int XpmReadFileToXpmImage( + char* filename +, XpmImage* image +, XpmInfo* info +) +#else int -XpmReadFileToXpmImage(char *filename, XpmImage *image, XpmInfo *info) +XpmReadFileToXpmImage(filename, image, info) + char *filename; + XpmImage *image; + XpmInfo *info; +#endif { xpmData mdata; int ErrorStatus; @@ -79,7 +129,7 @@ XpmReadFileToXpmImage(char *filename, XpmImage *image, XpmInfo *info) xpmInitXpmInfo(info); /* open file to read */ - if ((ErrorStatus = xpmReadFile(filename, &mdata)) != XpmSuccess) + if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess) return (ErrorStatus); /* create the XpmImage from the XpmData */ @@ -89,3 +139,117 @@ XpmReadFileToXpmImage(char *filename, XpmImage *image, XpmInfo *info) return (ErrorStatus); } +#endif /* CXPMPROG */ + +/* + * open the given file to be read as an xpmData which is returned. + */ +#ifdef __OS2__ +/* Visual Age cannot deal with old, non-ansi, code */ +static int OpenReadFile(char* filename, xpmData* mdata) +#else +static int +OpenReadFile(filename, mdata) + char *filename; + xpmData *mdata; +#endif +{ +#ifndef NO_ZPIPE + char *compressfile, buf[BUFSIZ]; +# ifdef STAT_ZFILE + struct stat status; +# endif +#endif + + if (!filename) { + mdata->stream.file = (stdin); + mdata->type = XPMFILE; + } else { +#ifndef NO_ZPIPE + int len = strlen(filename); + if ((len > 2) && !strcmp(".Z", filename + (len - 2))) { + mdata->type = XPMPIPE; + sprintf(buf, "uncompress -c \"%s\"", filename); + if (!(mdata->stream.file = popen(buf, "r"))) + return (XpmOpenFailed); + + } else if ((len > 3) && !strcmp(".gz", filename + (len - 3))) { + mdata->type = XPMPIPE; + sprintf(buf, "gunzip -qc \"%s\"", filename); + if (!(mdata->stream.file = popen(buf, "r"))) + return (XpmOpenFailed); + + } else { +# ifdef STAT_ZFILE + if (!(compressfile = (char *) XpmMalloc(len + 4))) + return (XpmNoMemory); + + sprintf(compressfile, "%s.Z", filename); + if (!stat(compressfile, &status)) { + sprintf(buf, "uncompress -c \"%s\"", compressfile); + if (!(mdata->stream.file = popen(buf, "r"))) { + XpmFree(compressfile); + return (XpmOpenFailed); + } + mdata->type = XPMPIPE; + } else { + sprintf(compressfile, "%s.gz", filename); + if (!stat(compressfile, &status)) { + sprintf(buf, "gunzip -c \"%s\"", compressfile); + if (!(mdata->stream.file = popen(buf, "r"))) { + XpmFree(compressfile); + return (XpmOpenFailed); + } + mdata->type = XPMPIPE; + } else { +# endif +#endif + if (!(mdata->stream.file = fopen(filename, "r"))) { +#if !defined(NO_ZPIPE) && defined(STAT_ZFILE) + XpmFree(compressfile); +#endif + return (XpmOpenFailed); + } + mdata->type = XPMFILE; +#ifndef NO_ZPIPE +# ifdef STAT_ZFILE + } + } + XpmFree(compressfile); +# endif + } +#endif + } + mdata->CommentLength = 0; +#ifdef CXPMPROG + mdata->lineNum = 0; + mdata->charNum = 0; +#endif + return (XpmSuccess); +} + +/* + * close the file related to the xpmData if any + */ +#ifdef __OS2__ +/* Visual Age cannot deal with old, non-ansi, code */ +static void +xpmDataClose(xpmData* mdata) +#else +static void +xpmDataClose(mdata) + xpmData *mdata; +#endif +{ + switch (mdata->type) { + case XPMFILE: + if (mdata->stream.file != (stdin)) + fclose(mdata->stream.file); + break; +#ifndef NO_ZPIPE + case XPMPIPE: + pclose(mdata->stream.file); + break; +#endif + } +}