home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cs.arizona.edu
/
ftp.cs.arizona.edu.tar
/
ftp.cs.arizona.edu
/
icon
/
historic
/
v941.tgz
/
icon.v941src.tar
/
icon.v941src
/
src
/
xpm
/
XpmWrFFrData.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-07-29
|
3KB
|
114 lines
/* Copyright 1990,91 GROUPE BULL -- See license conditions in file COPYRIGHT */
/*****************************************************************************\
* XpmWrFFrData.c: *
* *
* XPM library *
* Parse an Xpm array and write a file that corresponds to it. *
* *
* Developed by Dan Greening dgreen@cs.ucla.edu / dgreen@sti.com *
\*****************************************************************************/
#include "xpmP.h"
#ifdef VMS
#include "sys$library:string.h"
#else
#ifdef SYSV
#include <string.h>
#define index strchr
#define rindex strrchr
#else
#include <strings.h>
#endif
#endif
int
XpmWriteFileFromData(filename, data)
char *filename;
char **data;
{
xpmData mdata, mfile;
char *name, *dot, *s, *new_name = NULL;
int ErrorStatus;
XpmAttributes attributes;
xpmInternAttrib attrib;
int i;
attributes.valuemask = XpmReturnPixels|XpmReturnInfos|XpmReturnExtensions;
if ((ErrorStatus = xpmWriteFile(filename, &mfile)) != XpmSuccess)
return (ErrorStatus);
if (filename) {
#ifdef VMS
name = filename;
#else
if (!(name = rindex(filename, '/')))
name = filename;
else
name++;
#endif
if (dot = index(name, '.')) {
new_name = (char*)strdup(name);
if (!new_name) {
new_name = NULL;
name = "image_name";
} else {
/* change '.' to '_' to get a valid C syntax name */
name = s = new_name;
while (dot = index(s, '.')) {
*dot = '_';
s = dot;
}
}
}
} else
name = "image_name";
xpmInitInternAttrib(&attrib);
/*
* Parse data then write it out
*/
xpmOpenArray(data, &mdata);
ErrorStatus = xpmParseData(&mdata, &attrib, &attributes);
if (ErrorStatus == XpmSuccess) {
attributes.mask_pixel = UNDEF_PIXEL;
/* maximum of allocated pixels will be the number of colors */
attributes.pixels = (Pixel *) malloc(sizeof(Pixel) * attrib.ncolors);
attrib.xcolors = (XColor*) malloc(sizeof(XColor) * attrib.ncolors);
if (!attributes.pixels || !attrib.xcolors)
ErrorStatus == XpmNoMemory;
else {
int i;
for (i = 0; i < attrib.ncolors; i++) {
/* Fake colors */
attrib.xcolors[i].pixel = attributes.pixels[i] = i + 1;
}
xpmSetAttributes(&attrib, &attributes);
if (!(attrib.colorStrings =
(char**) malloc(attributes.ncolors * sizeof(char*))))
ErrorStatus == XpmNoMemory;
else {
attrib.ncolors = attributes.ncolors;
for (i = 0; i < attributes.ncolors; i++)
attrib.colorStrings[i] = attributes.colorTable[i][0];
attrib.name = name;
ErrorStatus = xpmWriteData(&mfile, &attrib, &attributes);
}
}
}
if (new_name)
free(name);
XpmFreeAttributes(&attributes);
xpmFreeInternAttrib(&attrib);
XpmDataClose(&mfile);
XpmDataClose(&mdata);
return (ErrorStatus);
}