#include "XpmI.h"
#include <sys/stat.h>
#if !defined(NO_ZPIPE) && defined(WIN32)
# define popen _popen
# define pclose _pclose
# if defined(STAT_ZFILE)
# include <io.h>
# define stat _stat
# define fstat _fstat
# endif
#endif
LFUNC(OpenReadFile, int, (char *filename, xpmData *mdata));
LFUNC(xpmDataClose, void, (xpmData *mdata));
#ifndef CXPMPROG
int
XpmReadFileToImage(display, filename,
image_return, shapeimage_return, attributes)
Display *display;
char *filename;
XImage **image_return;
XImage **shapeimage_return;
XpmAttributes *attributes;
{
XpmImage image;
XpmInfo info;
int ErrorStatus;
xpmData mdata;
xpmInitXpmImage(&image);
xpmInitXpmInfo(&info);
if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess)
return (ErrorStatus);
if (attributes) {
xpmInitAttributes(attributes);
xpmSetInfoMask(&info, attributes);
ErrorStatus = xpmParseDataAndCreate(display, &mdata,
image_return, shapeimage_return,
&image, &info, attributes);
} else
ErrorStatus = xpmParseDataAndCreate(display, &mdata,
image_return, shapeimage_return,
&image, NULL, attributes);
if (attributes) {
if (ErrorStatus >= 0)
xpmSetAttributes(attributes, &image, &info);
XpmFreeXpmInfo(&info);
}
xpmDataClose(&mdata);
XpmFreeXpmImage(&image);
return (ErrorStatus);
}
int
XpmReadFileToXpmImage(filename, image, info)
char *filename;
XpmImage *image;
XpmInfo *info;
{
xpmData mdata;
int ErrorStatus;
xpmInitXpmImage(image);
xpmInitXpmInfo(info);
if ((ErrorStatus = OpenReadFile(filename, &mdata)) != XpmSuccess)
return (ErrorStatus);
ErrorStatus = xpmParseData(&mdata, image, info);
xpmDataClose(&mdata);
return (ErrorStatus);
}
#endif
#ifndef NO_ZPIPE
FILE *s_popen(char *cmd, const char *type);
#else
# define s_popen popen
#endif
static int
OpenReadFile(filename, mdata)
char *filename;
xpmData *mdata;
{
#ifndef NO_ZPIPE
char buf[BUFSIZ];
# ifdef STAT_ZFILE
char *compressfile;
struct stat status;
# endif
#endif
if (!filename) {
mdata->stream.file = (stdin);
mdata->type = XPMFILE;
} else {
#ifndef NO_ZPIPE
size_t len = strlen(filename);
if(len == 0 ||
filename[len-1] == '/')
return(XpmOpenFailed);
if ((len > 2) && !strcmp(".Z", filename + (len - 2))) {
mdata->type = XPMPIPE;
snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", filename);
if (!(mdata->stream.file = s_popen(buf, "r")))
return (XpmOpenFailed);
} else if ((len > 3) && !strcmp(".gz", filename + (len - 3))) {
mdata->type = XPMPIPE;
snprintf(buf, sizeof(buf), "gunzip -qc \"%s\"", filename);
if (!(mdata->stream.file = s_popen(buf, "r")))
return (XpmOpenFailed);
} else {
# ifdef STAT_ZFILE
if (!(compressfile = (char *) XpmMalloc(len + 4)))
return (XpmNoMemory);
snprintf(compressfile, len+4, "%s.Z", filename);
if (!stat(compressfile, &status)) {
snprintf(buf, sizeof(buf), "uncompress -c \"%s\"", compressfile);
if (!(mdata->stream.file = s_popen(buf, "r"))) {
XpmFree(compressfile);
return (XpmOpenFailed);
}
mdata->type = XPMPIPE;
} else {
snprintf(compressfile, len+4, "%s.gz", filename);
if (!stat(compressfile, &status)) {
snprintf(buf, sizeof(buf), "gunzip -c \"%s\"", compressfile);
if (!(mdata->stream.file = s_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);
}
static void
xpmDataClose(mdata)
xpmData *mdata;
{
switch (mdata->type) {
case XPMFILE:
if (mdata->stream.file != (stdin))
fclose(mdata->stream.file);
break;
#ifndef NO_ZPIPE
case XPMPIPE:
fclose(mdata->stream.file);
break;
#endif
}
}