mirror of
https://gitlab.freedesktop.org/xorg/lib/libxcursor.git
synced 2025-12-20 14:00:03 +01:00
add debug-logging for file.c, to help with analysis
Signed-off-by: Thomas E. Dickey <dickey@invisible-island.net>
This commit is contained in:
parent
8a1de72216
commit
fbfe95e05f
2 changed files with 318 additions and 150 deletions
445
src/file.c
445
src/file.c
|
|
@ -25,33 +25,84 @@
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef DEBUG_XCURSOR
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
void _XcursorTrace(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
FILE *fp = fopen("/tmp/xcursor.log", "a");
|
||||||
|
if (fp != NULL) {
|
||||||
|
unsigned save = umask(0);
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vfprintf(fp, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
fclose(fp);
|
||||||
|
umask(save);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned _XcursorReturnUint(unsigned code)
|
||||||
|
{
|
||||||
|
_XcursorTrace(T_RETURN(u), code);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _XcursorReturnCode(int code)
|
||||||
|
{
|
||||||
|
_XcursorTrace(T_RETURN(d), code);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *_XcursorReturnAddr(void *addr)
|
||||||
|
{
|
||||||
|
_XcursorTrace(T_RETURN(p), addr);
|
||||||
|
return addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _XcursorReturnVoid(void)
|
||||||
|
{
|
||||||
|
_XcursorTrace(T_RETURN(s), "");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif /* DEBUG_XCURSOR */
|
||||||
|
|
||||||
XcursorImage *
|
XcursorImage *
|
||||||
XcursorImageCreate (int width, int height)
|
XcursorImageCreate (int width, int height)
|
||||||
{
|
{
|
||||||
XcursorImage *image;
|
XcursorImage *image = NULL;
|
||||||
|
|
||||||
if (width < 0 || height < 0)
|
enterFunc((T_CALLED(XcursorImageCreate) "(%d, %d)\n", width, height));
|
||||||
return NULL;
|
|
||||||
if (width > XCURSOR_IMAGE_MAX_SIZE || height > XCURSOR_IMAGE_MAX_SIZE)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
image = malloc (sizeof (XcursorImage) +
|
if (width < 0 || height < 0) {
|
||||||
(size_t) (width * height) * sizeof (XcursorPixel));
|
/* EMPTY */;
|
||||||
if (!image)
|
} else if (width > XCURSOR_IMAGE_MAX_SIZE
|
||||||
return NULL;
|
|| height > XCURSOR_IMAGE_MAX_SIZE) {
|
||||||
image->version = XCURSOR_IMAGE_VERSION;
|
/* EMPTY */;
|
||||||
image->pixels = (XcursorPixel *) (image + 1);
|
} else {
|
||||||
image->size = (XcursorDim) (width > height ? width : height);
|
image = malloc (sizeof (XcursorImage) +
|
||||||
image->width = (XcursorDim) width;
|
(size_t) (width * height) * sizeof (XcursorPixel));
|
||||||
image->height = (XcursorDim) height;
|
if (image) {
|
||||||
image->delay = 0;
|
image->version = XCURSOR_IMAGE_VERSION;
|
||||||
return image;
|
image->pixels = (XcursorPixel *) (image + 1);
|
||||||
|
image->size = (XcursorDim) (width > height ? width : height);
|
||||||
|
image->width = (XcursorDim) width;
|
||||||
|
image->height = (XcursorDim) height;
|
||||||
|
image->delay = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
returnAddr(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
XcursorImageDestroy (XcursorImage *image)
|
XcursorImageDestroy (XcursorImage *image)
|
||||||
{
|
{
|
||||||
|
enterFunc((T_CALLED(XcursorImageDestroy ) "(%p)\n", (void*)image));
|
||||||
|
|
||||||
free (image);
|
free (image);
|
||||||
|
|
||||||
|
returnVoid();
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -59,47 +110,54 @@ XcursorImagesCreate (int size)
|
||||||
{
|
{
|
||||||
XcursorImages *images;
|
XcursorImages *images;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorImagesCreate) "(%d)\n", size));
|
||||||
|
|
||||||
images = malloc (sizeof (XcursorImages) +
|
images = malloc (sizeof (XcursorImages) +
|
||||||
(size_t) size * sizeof (XcursorImage *));
|
(size_t) size * sizeof (XcursorImage *));
|
||||||
if (!images)
|
if (images) {
|
||||||
return NULL;
|
images->nimage = 0;
|
||||||
images->nimage = 0;
|
images->images = (XcursorImage **) (images + 1);
|
||||||
images->images = (XcursorImage **) (images + 1);
|
images->name = NULL;
|
||||||
images->name = NULL;
|
}
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
XcursorImagesDestroy (XcursorImages *images)
|
XcursorImagesDestroy (XcursorImages *images)
|
||||||
{
|
{
|
||||||
int n;
|
enterFunc((T_CALLED(XcursorImagesDestroy) "(%p)\n", (void*)images));
|
||||||
|
|
||||||
if (!images)
|
if (images) {
|
||||||
return;
|
int n;
|
||||||
|
|
||||||
for (n = 0; n < images->nimage; n++)
|
for (n = 0; n < images->nimage; n++)
|
||||||
XcursorImageDestroy (images->images[n]);
|
XcursorImageDestroy (images->images[n]);
|
||||||
if (images->name)
|
if (images->name)
|
||||||
free (images->name);
|
free (images->name);
|
||||||
free (images);
|
free (images);
|
||||||
|
}
|
||||||
|
|
||||||
|
returnVoid();
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
XcursorImagesSetName (XcursorImages *images, const char *name)
|
XcursorImagesSetName (XcursorImages *images, const char *name)
|
||||||
{
|
{
|
||||||
char *new;
|
enterFunc((T_CALLED(XcursorImagesSetName) "(%p, \"%s\")\n",
|
||||||
|
(void*)images,
|
||||||
|
NonNull(name)));
|
||||||
|
|
||||||
if (!images || !name)
|
if (images && name) {
|
||||||
return;
|
char *new = strdup (name);
|
||||||
|
|
||||||
new = strdup (name);
|
if (new) {
|
||||||
|
if (images->name)
|
||||||
|
free (images->name);
|
||||||
|
images->name = new;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!new)
|
returnVoid();
|
||||||
return;
|
|
||||||
|
|
||||||
if (images->name)
|
|
||||||
free (images->name);
|
|
||||||
images->name = new;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorComment *
|
XcursorComment *
|
||||||
|
|
@ -383,8 +441,11 @@ _XcursorFindBestSize (XcursorFileHeader *fileHeader,
|
||||||
XcursorDim bestSize = 0;
|
XcursorDim bestSize = 0;
|
||||||
XcursorDim thisSize;
|
XcursorDim thisSize;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFindBestSize) "(%p, %u, %p)\n",
|
||||||
|
(void*)fileHeader, size, (void*)nsizesp));
|
||||||
|
|
||||||
if (!fileHeader || !nsizesp)
|
if (!fileHeader || !nsizesp)
|
||||||
return 0;
|
returnUint(0);
|
||||||
|
|
||||||
for (n = 0; n < fileHeader->ntoc; n++)
|
for (n = 0; n < fileHeader->ntoc; n++)
|
||||||
{
|
{
|
||||||
|
|
@ -400,7 +461,7 @@ _XcursorFindBestSize (XcursorFileHeader *fileHeader,
|
||||||
nsizes++;
|
nsizes++;
|
||||||
}
|
}
|
||||||
*nsizesp = nsizes;
|
*nsizesp = nsizes;
|
||||||
return bestSize;
|
returnUint(bestSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -411,8 +472,11 @@ _XcursorFindImageToc (XcursorFileHeader *fileHeader,
|
||||||
XcursorUInt toc;
|
XcursorUInt toc;
|
||||||
XcursorDim thisSize;
|
XcursorDim thisSize;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFindImageToc) "(%p, %u, %d)\n",
|
||||||
|
(void*)fileHeader, size, count));
|
||||||
|
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return 0;
|
returnCode(0);
|
||||||
|
|
||||||
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
||||||
{
|
{
|
||||||
|
|
@ -426,8 +490,8 @@ _XcursorFindImageToc (XcursorFileHeader *fileHeader,
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
if (toc == fileHeader->ntoc)
|
if (toc == fileHeader->ntoc)
|
||||||
return -1;
|
returnCode(-1);
|
||||||
return (int) toc;
|
returnCode((int) toc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorImage *
|
static XcursorImage *
|
||||||
|
|
@ -441,34 +505,37 @@ _XcursorReadImage (XcursorFile *file,
|
||||||
int n;
|
int n;
|
||||||
XcursorPixel *p;
|
XcursorPixel *p;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorReadImage) "(%p, %p, %d)\n",
|
||||||
|
(void*)file, (void*)fileHeader, toc));
|
||||||
|
|
||||||
if (!file || !fileHeader)
|
if (!file || !fileHeader)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader))
|
if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadUInt (file, &head.width))
|
if (!_XcursorReadUInt (file, &head.width))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadUInt (file, &head.height))
|
if (!_XcursorReadUInt (file, &head.height))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadUInt (file, &head.xhot))
|
if (!_XcursorReadUInt (file, &head.xhot))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadUInt (file, &head.yhot))
|
if (!_XcursorReadUInt (file, &head.yhot))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadUInt (file, &head.delay))
|
if (!_XcursorReadUInt (file, &head.delay))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
/* sanity check data */
|
/* sanity check data */
|
||||||
if (head.width > XCURSOR_IMAGE_MAX_SIZE ||
|
if (head.width > XCURSOR_IMAGE_MAX_SIZE ||
|
||||||
head.height > XCURSOR_IMAGE_MAX_SIZE)
|
head.height > XCURSOR_IMAGE_MAX_SIZE)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (head.width == 0 || head.height == 0)
|
if (head.width == 0 || head.height == 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (head.xhot > head.width || head.yhot > head.height)
|
if (head.xhot > head.width || head.yhot > head.height)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
/* Create the image and initialize it */
|
/* Create the image and initialize it */
|
||||||
image = XcursorImageCreate ((int) head.width, (int) head.height);
|
image = XcursorImageCreate ((int) head.width, (int) head.height);
|
||||||
if (image == NULL)
|
if (image == NULL)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (chunkHeader.version < image->version)
|
if (chunkHeader.version < image->version)
|
||||||
image->version = chunkHeader.version;
|
image->version = chunkHeader.version;
|
||||||
image->size = chunkHeader.subtype;
|
image->size = chunkHeader.subtype;
|
||||||
|
|
@ -482,20 +549,22 @@ _XcursorReadImage (XcursorFile *file,
|
||||||
if (!_XcursorReadUInt (file, p))
|
if (!_XcursorReadUInt (file, p))
|
||||||
{
|
{
|
||||||
XcursorImageDestroy (image);
|
XcursorImageDestroy (image);
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
}
|
}
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
return image;
|
returnAddr(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorUInt
|
static XcursorUInt
|
||||||
_XcursorImageLength (XcursorImage *image)
|
_XcursorImageLength (XcursorImage *image)
|
||||||
{
|
{
|
||||||
if (!image)
|
enterFunc((T_CALLED(_XcursorImageLength) "(%p)\n", (void*)image));
|
||||||
return 0;
|
|
||||||
|
|
||||||
return XCURSOR_IMAGE_HEADER_LEN + (image->width * image->height) * 4;
|
if (!image)
|
||||||
|
returnUint(0);
|
||||||
|
|
||||||
|
returnUint(XCURSOR_IMAGE_HEADER_LEN + (image->width * image->height) * 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorBool
|
static XcursorBool
|
||||||
|
|
@ -508,17 +577,20 @@ _XcursorWriteImage (XcursorFile *file,
|
||||||
int n;
|
int n;
|
||||||
XcursorPixel *p;
|
XcursorPixel *p;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorWriteImage) "(%p, %p, %d, %p)\n",
|
||||||
|
(void*)file, (void*)fileHeader, toc, (void*)image));
|
||||||
|
|
||||||
if (!file || !fileHeader || !image)
|
if (!file || !fileHeader || !image)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
/* sanity check data */
|
/* sanity check data */
|
||||||
if (image->width > XCURSOR_IMAGE_MAX_SIZE ||
|
if (image->width > XCURSOR_IMAGE_MAX_SIZE ||
|
||||||
image->height > XCURSOR_IMAGE_MAX_SIZE)
|
image->height > XCURSOR_IMAGE_MAX_SIZE)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (image->width == 0 || image->height == 0)
|
if (image->width == 0 || image->height == 0)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (image->xhot > image->width || image->yhot > image->height)
|
if (image->xhot > image->width || image->yhot > image->height)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
/* write chunk header */
|
/* write chunk header */
|
||||||
chunkHeader.header = XCURSOR_IMAGE_HEADER_LEN;
|
chunkHeader.header = XCURSOR_IMAGE_HEADER_LEN;
|
||||||
|
|
@ -527,19 +599,19 @@ _XcursorWriteImage (XcursorFile *file,
|
||||||
chunkHeader.version = XCURSOR_IMAGE_VERSION;
|
chunkHeader.version = XCURSOR_IMAGE_VERSION;
|
||||||
|
|
||||||
if (!_XcursorFileWriteChunkHeader (file, fileHeader, toc, &chunkHeader))
|
if (!_XcursorFileWriteChunkHeader (file, fileHeader, toc, &chunkHeader))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
/* write extra image header fields */
|
/* write extra image header fields */
|
||||||
if (!_XcursorWriteUInt (file, image->width))
|
if (!_XcursorWriteUInt (file, image->width))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (!_XcursorWriteUInt (file, image->height))
|
if (!_XcursorWriteUInt (file, image->height))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (!_XcursorWriteUInt (file, image->xhot))
|
if (!_XcursorWriteUInt (file, image->xhot))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (!_XcursorWriteUInt (file, image->yhot))
|
if (!_XcursorWriteUInt (file, image->yhot))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
if (!_XcursorWriteUInt (file, image->delay))
|
if (!_XcursorWriteUInt (file, image->delay))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
/* write the image */
|
/* write the image */
|
||||||
n = (int) (image->width * image->height);
|
n = (int) (image->width * image->height);
|
||||||
|
|
@ -547,10 +619,10 @@ _XcursorWriteImage (XcursorFile *file,
|
||||||
while (n--)
|
while (n--)
|
||||||
{
|
{
|
||||||
if (!_XcursorWriteUInt (file, *p))
|
if (!_XcursorWriteUInt (file, *p))
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
p++;
|
p++;
|
||||||
}
|
}
|
||||||
return XcursorTrue;
|
returnCode(XcursorTrue);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorComment *
|
static XcursorComment *
|
||||||
|
|
@ -562,25 +634,28 @@ _XcursorReadComment (XcursorFile *file,
|
||||||
XcursorUInt length;
|
XcursorUInt length;
|
||||||
XcursorComment *comment;
|
XcursorComment *comment;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorReadComment) "(%p, %p, %d)\n",
|
||||||
|
(void*)file, (void*)fileHeader, toc));
|
||||||
|
|
||||||
if (!file || !fileHeader)
|
if (!file || !fileHeader)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
/* read chunk header */
|
/* read chunk header */
|
||||||
if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader))
|
if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
/* read extra comment header fields */
|
/* read extra comment header fields */
|
||||||
if (!_XcursorReadUInt (file, &length))
|
if (!_XcursorReadUInt (file, &length))
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
comment = XcursorCommentCreate (chunkHeader.subtype, (int) length);
|
comment = XcursorCommentCreate (chunkHeader.subtype, (int) length);
|
||||||
if (!comment)
|
if (!comment)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
if (!_XcursorReadBytes (file, comment->comment, (int) length))
|
if (!_XcursorReadBytes (file, comment->comment, (int) length))
|
||||||
{
|
{
|
||||||
XcursorCommentDestroy (comment);
|
XcursorCommentDestroy (comment);
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
}
|
}
|
||||||
comment->comment[length] = '\0';
|
comment->comment[length] = '\0';
|
||||||
return comment;
|
returnAddr(comment);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorUInt
|
static XcursorUInt
|
||||||
|
|
@ -630,9 +705,14 @@ _XcursorResizeImage (XcursorImage *src, int size)
|
||||||
{
|
{
|
||||||
XcursorDim dest_y, dest_x;
|
XcursorDim dest_y, dest_x;
|
||||||
double scale = (double) size / src->size;
|
double scale = (double) size / src->size;
|
||||||
XcursorImage *dest = XcursorImageCreate ((int) (src->width * scale), (int) (src->height * scale));
|
XcursorImage *dest;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorResizeImage) "(%p, %d)\n", (void*)src, size));
|
||||||
|
|
||||||
|
dest = XcursorImageCreate ((int) (src->width * scale),
|
||||||
|
(int) (src->height * scale));
|
||||||
if (!dest)
|
if (!dest)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
dest->size = (XcursorDim) size;
|
dest->size = (XcursorDim) size;
|
||||||
dest->xhot = (XcursorDim) (src->xhot * scale);
|
dest->xhot = (XcursorDim) (src->xhot * scale);
|
||||||
|
|
@ -651,7 +731,7 @@ _XcursorResizeImage (XcursorImage *src, int size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return dest;
|
returnAddr(dest);
|
||||||
}
|
}
|
||||||
|
|
||||||
static XcursorImage *
|
static XcursorImage *
|
||||||
|
|
@ -663,17 +743,20 @@ _XcursorXcFileLoadImage (XcursorFile *file, int size, XcursorBool resize)
|
||||||
int toc;
|
int toc;
|
||||||
XcursorImage *image;
|
XcursorImage *image;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorXcFileLoadImage) "(%p, %d, %d)\n",
|
||||||
|
(void*)file, size, resize));
|
||||||
|
|
||||||
if (size < 0)
|
if (size < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
fileHeader = _XcursorReadFileHeader (file);
|
fileHeader = _XcursorReadFileHeader (file);
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize);
|
bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize);
|
||||||
if (!bestSize)
|
if (!bestSize)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
toc = _XcursorFindImageToc (fileHeader, bestSize, 0);
|
toc = _XcursorFindImageToc (fileHeader, bestSize, 0);
|
||||||
if (toc < 0)
|
if (toc < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
image = _XcursorReadImage (file, fileHeader, toc);
|
image = _XcursorReadImage (file, fileHeader, toc);
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
|
|
||||||
|
|
@ -684,13 +767,15 @@ _XcursorXcFileLoadImage (XcursorFile *file, int size, XcursorBool resize)
|
||||||
image = resized_image;
|
image = resized_image;
|
||||||
}
|
}
|
||||||
|
|
||||||
return image;
|
returnAddr(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImage *
|
XcursorImage *
|
||||||
XcursorXcFileLoadImage (XcursorFile *file, int size)
|
XcursorXcFileLoadImage (XcursorFile *file, int size)
|
||||||
{
|
{
|
||||||
return _XcursorXcFileLoadImage (file, size, XcursorFalse);
|
enterFunc((T_CALLED(XcursorXcFileLoadImage) "(%p, %d)\n", (void*)file, size));
|
||||||
|
|
||||||
|
returnAddr(_XcursorXcFileLoadImage (file, size, XcursorFalse));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -703,22 +788,25 @@ _XcursorXcFileLoadImages (XcursorFile *file, int size, XcursorBool resize)
|
||||||
int n;
|
int n;
|
||||||
XcursorImage *image;
|
XcursorImage *image;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorXcFileLoadImages) "(%p, %d, %d)\n",
|
||||||
|
(void*)file, size, resize));
|
||||||
|
|
||||||
if (!file || size < 0)
|
if (!file || size < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
fileHeader = _XcursorReadFileHeader (file);
|
fileHeader = _XcursorReadFileHeader (file);
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize);
|
bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize);
|
||||||
if (!bestSize)
|
if (!bestSize)
|
||||||
{
|
{
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
}
|
}
|
||||||
images = XcursorImagesCreate (nsize);
|
images = XcursorImagesCreate (nsize);
|
||||||
if (!images)
|
if (!images)
|
||||||
{
|
{
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
}
|
}
|
||||||
for (n = 0; n < nsize; n++)
|
for (n = 0; n < nsize; n++)
|
||||||
{
|
{
|
||||||
|
|
@ -744,13 +832,15 @@ _XcursorXcFileLoadImages (XcursorFile *file, int size, XcursorBool resize)
|
||||||
XcursorImagesDestroy (images);
|
XcursorImagesDestroy (images);
|
||||||
images = NULL;
|
images = NULL;
|
||||||
}
|
}
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
XcursorXcFileLoadImages (XcursorFile *file, int size)
|
XcursorXcFileLoadImages (XcursorFile *file, int size)
|
||||||
{
|
{
|
||||||
return _XcursorXcFileLoadImages (file, size, XcursorFalse);
|
enterFunc((T_CALLED(XcursorXcFileLoadImages) "(%p, %d)\n", (void*)file, size));
|
||||||
|
|
||||||
|
returnAddr(_XcursorXcFileLoadImages (file, size, XcursorFalse));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -763,12 +853,14 @@ XcursorXcFileLoadAllImages (XcursorFile *file)
|
||||||
XcursorUInt n;
|
XcursorUInt n;
|
||||||
XcursorUInt toc;
|
XcursorUInt toc;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorXcFileLoadAllImages) "(%p)\n", (void*)file));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
fileHeader = _XcursorReadFileHeader (file);
|
fileHeader = _XcursorReadFileHeader (file);
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
nimage = 0;
|
nimage = 0;
|
||||||
for (n = 0; n < fileHeader->ntoc; n++)
|
for (n = 0; n < fileHeader->ntoc; n++)
|
||||||
{
|
{
|
||||||
|
|
@ -782,7 +874,7 @@ XcursorXcFileLoadAllImages (XcursorFile *file)
|
||||||
if (!images)
|
if (!images)
|
||||||
{
|
{
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
}
|
}
|
||||||
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
||||||
{
|
{
|
||||||
|
|
@ -803,7 +895,7 @@ XcursorXcFileLoadAllImages (XcursorFile *file)
|
||||||
XcursorImagesDestroy (images);
|
XcursorImagesDestroy (images);
|
||||||
images = NULL;
|
images = NULL;
|
||||||
}
|
}
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -820,11 +912,14 @@ XcursorXcFileLoad (XcursorFile *file,
|
||||||
XcursorComments *comments;
|
XcursorComments *comments;
|
||||||
XcursorUInt toc;
|
XcursorUInt toc;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorXcFileLoad) "(%p, %p, %p)\n",
|
||||||
|
(void*)file, (void*)commentsp, (void*)imagesp));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return 0;
|
returnCode(0);
|
||||||
fileHeader = _XcursorReadFileHeader (file);
|
fileHeader = _XcursorReadFileHeader (file);
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return 0;
|
returnCode(0);
|
||||||
nimage = 0;
|
nimage = 0;
|
||||||
ncomment = 0;
|
ncomment = 0;
|
||||||
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
||||||
|
|
@ -842,14 +937,14 @@ XcursorXcFileLoad (XcursorFile *file,
|
||||||
if (!images)
|
if (!images)
|
||||||
{
|
{
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return 0;
|
returnCode(0);
|
||||||
}
|
}
|
||||||
comments = XcursorCommentsCreate (ncomment);
|
comments = XcursorCommentsCreate (ncomment);
|
||||||
if (!comments)
|
if (!comments)
|
||||||
{
|
{
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
XcursorImagesDestroy (images);
|
XcursorImagesDestroy (images);
|
||||||
return 0;
|
returnCode(0);
|
||||||
}
|
}
|
||||||
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
for (toc = 0; toc < fileHeader->ntoc; toc++)
|
||||||
{
|
{
|
||||||
|
|
@ -879,11 +974,11 @@ XcursorXcFileLoad (XcursorFile *file,
|
||||||
XcursorCommentsDestroy (comments);
|
XcursorCommentsDestroy (comments);
|
||||||
images = NULL;
|
images = NULL;
|
||||||
comments = NULL;
|
comments = NULL;
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
}
|
}
|
||||||
*imagesp = images;
|
*imagesp = images;
|
||||||
*commentsp = comments;
|
*commentsp = comments;
|
||||||
return XcursorTrue;
|
returnCode(XcursorTrue);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -896,12 +991,15 @@ XcursorXcFileSave (XcursorFile *file,
|
||||||
int n;
|
int n;
|
||||||
int toc;
|
int toc;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorXcFileSave) "(%p, %p, %p)\n",
|
||||||
|
(void*)file, (const void*)comments, (const void*)images));
|
||||||
|
|
||||||
if (!file || !comments || !images)
|
if (!file || !comments || !images)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
fileHeader = _XcursorFileHeaderCreate ((XcursorUInt) (comments->ncomment + images->nimage));
|
fileHeader = _XcursorFileHeaderCreate ((XcursorUInt) (comments->ncomment + images->nimage));
|
||||||
if (!fileHeader)
|
if (!fileHeader)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
position = _XcursorFileHeaderLength (fileHeader);
|
position = _XcursorFileHeaderLength (fileHeader);
|
||||||
|
|
||||||
|
|
@ -957,10 +1055,11 @@ XcursorXcFileSave (XcursorFile *file,
|
||||||
}
|
}
|
||||||
|
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return XcursorTrue;
|
returnCode(XcursorTrue);
|
||||||
|
|
||||||
bail:
|
bail:
|
||||||
_XcursorFileHeaderDestroy (fileHeader);
|
_XcursorFileHeaderDestroy (fileHeader);
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
@ -998,11 +1097,13 @@ _XcursorFileLoadImage (FILE *file, int size, XcursorBool resize)
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFileLoadImage) "(%p, %d, %d)\n", (void*)file, size, resize));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return _XcursorXcFileLoadImage (&f, size, resize);
|
returnAddr(_XcursorXcFileLoadImage (&f, size, resize));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1010,11 +1111,13 @@ _XcursorFileLoadImages (FILE *file, int size, XcursorBool resize)
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFileLoadImages) "(%p, %d, %d)\n", (void*)file, size, resize));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return _XcursorXcFileLoadImages (&f, size, resize);
|
returnAddr(_XcursorXcFileLoadImages (&f, size, resize));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImage *
|
XcursorImage *
|
||||||
|
|
@ -1022,11 +1125,13 @@ XcursorFileLoadImage (FILE *file, int size)
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFileLoadImage) "(%p, %d)\n", (void*)file, size));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return XcursorXcFileLoadImage (&f, size);
|
returnAddr(XcursorXcFileLoadImage (&f, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1034,11 +1139,13 @@ XcursorFileLoadImages (FILE *file, int size)
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFileLoadImages) "(%p, %d)\n", (void*)file, size));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return XcursorXcFileLoadImages (&f, size);
|
returnAddr(XcursorXcFileLoadImages (&f, size));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1046,11 +1153,13 @@ XcursorFileLoadAllImages (FILE *file)
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFileLoadAllImages) "(%p)\n", (void*)file));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return XcursorXcFileLoadAllImages (&f);
|
returnAddr(XcursorXcFileLoadAllImages (&f));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1060,11 +1169,14 @@ XcursorFileLoad (FILE *file,
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFileLoad) "(%p, %p, %p)\n",
|
||||||
|
(void*)file, (void*)commentsp, (void*)imagesp));
|
||||||
|
|
||||||
if (!file || !commentsp || !imagesp)
|
if (!file || !commentsp || !imagesp)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return XcursorXcFileLoad (&f, commentsp, imagesp);
|
returnCode(XcursorXcFileLoad (&f, commentsp, imagesp));
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1074,14 +1186,17 @@ XcursorFileSaveImages (FILE *file, const XcursorImages *images)
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
XcursorBool ret;
|
XcursorBool ret;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFileSaveImages) "(%p, %p)\n",
|
||||||
|
(void*)file, (const void*)images));
|
||||||
|
|
||||||
if (!file || !images)
|
if (!file || !images)
|
||||||
return 0;
|
returnCode(0);
|
||||||
if ((comments = XcursorCommentsCreate (0)) == NULL)
|
if ((comments = XcursorCommentsCreate (0)) == NULL)
|
||||||
return 0;
|
returnCode(0);
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
ret = XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF;
|
ret = XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF;
|
||||||
XcursorCommentsDestroy (comments);
|
XcursorCommentsDestroy (comments);
|
||||||
return ret;
|
returnCode(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1091,11 +1206,14 @@ XcursorFileSave (FILE * file,
|
||||||
{
|
{
|
||||||
XcursorFile f;
|
XcursorFile f;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFileSave) "(%p, %p, %p)\n",
|
||||||
|
(void*)file, (const void*)comments, (const void*)images));
|
||||||
|
|
||||||
if (!file || !comments || !images)
|
if (!file || !comments || !images)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
_XcursorStdioFileInitialize (file, &f);
|
_XcursorStdioFileInitialize (file, &f);
|
||||||
return XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF;
|
returnCode(XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImage *
|
XcursorImage *
|
||||||
|
|
@ -1104,15 +1222,18 @@ XcursorFilenameLoadImage (const char *file, int size)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorImage *image;
|
XcursorImage *image;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFilenameLoadImage) "(\"%s\", %d)\n",
|
||||||
|
NonNull(file), size));
|
||||||
|
|
||||||
if (!file || size < 0)
|
if (!file || size < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
f = fopen (file, "r" FOPEN_CLOEXEC);
|
f = fopen (file, "r" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
image = XcursorFileLoadImage (f, size);
|
image = XcursorFileLoadImage (f, size);
|
||||||
fclose (f);
|
fclose (f);
|
||||||
return image;
|
returnAddr(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1121,15 +1242,18 @@ _XcursorFilenameLoadImages (const char *file, int size, XcursorBool resize)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorImages *images;
|
XcursorImages *images;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(_XcursorFilenameLoadImages) "(\"%s\", %d, %d)\n",
|
||||||
|
NonNull(file), size, resize));
|
||||||
|
|
||||||
if (!file || size < 0)
|
if (!file || size < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
f = fopen (file, "r" FOPEN_CLOEXEC);
|
f = fopen (file, "r" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
images = _XcursorFileLoadImages (f, size, resize);
|
images = _XcursorFileLoadImages (f, size, resize);
|
||||||
fclose (f);
|
fclose (f);
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1138,15 +1262,18 @@ XcursorFilenameLoadImages (const char *file, int size)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorImages *images;
|
XcursorImages *images;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFilenameLoadImages) "(\"%s\", %d)\n",
|
||||||
|
NonNull(file), size));
|
||||||
|
|
||||||
if (!file || size < 0)
|
if (!file || size < 0)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
f = fopen (file, "r" FOPEN_CLOEXEC);
|
f = fopen (file, "r" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
images = XcursorFileLoadImages (f, size);
|
images = XcursorFileLoadImages (f, size);
|
||||||
fclose (f);
|
fclose (f);
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
|
|
@ -1155,15 +1282,18 @@ XcursorFilenameLoadAllImages (const char *file)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorImages *images;
|
XcursorImages *images;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFilenameLoadAllImages) "(\"%s\")\n",
|
||||||
|
NonNull(file)));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
|
|
||||||
f = fopen (file, "r" FOPEN_CLOEXEC);
|
f = fopen (file, "r" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
returnAddr(NULL);
|
||||||
images = XcursorFileLoadAllImages (f);
|
images = XcursorFileLoadAllImages (f);
|
||||||
fclose (f);
|
fclose (f);
|
||||||
return images;
|
returnAddr(images);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1174,15 +1304,18 @@ XcursorFilenameLoad (const char *file,
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorBool ret;
|
XcursorBool ret;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED() "(\"%s\", %p, %p)\n",
|
||||||
|
NonNull(file), (void*)commentsp, (void*)imagesp));
|
||||||
|
|
||||||
if (!file)
|
if (!file)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
f = fopen (file, "r" FOPEN_CLOEXEC);
|
f = fopen (file, "r" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return 0;
|
returnCode(0);
|
||||||
ret = XcursorFileLoad (f, commentsp, imagesp);
|
ret = XcursorFileLoad (f, commentsp, imagesp);
|
||||||
fclose (f);
|
fclose (f);
|
||||||
return ret;
|
returnCode(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1191,14 +1324,17 @@ XcursorFilenameSaveImages (const char *file, const XcursorImages *images)
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorBool ret;
|
XcursorBool ret;
|
||||||
|
|
||||||
|
enterFunc((T_CALLED(XcursorFilenameSaveImages) "(\"%s\", %p)\n",
|
||||||
|
NonNull(file), (const void*)images));
|
||||||
|
|
||||||
if (!file || !images)
|
if (!file || !images)
|
||||||
return XcursorFalse;
|
returnCode(XcursorFalse);
|
||||||
|
|
||||||
f = fopen (file, "w" FOPEN_CLOEXEC);
|
f = fopen (file, "w" FOPEN_CLOEXEC);
|
||||||
if (!f)
|
if (!f)
|
||||||
return 0;
|
returnCode(0);
|
||||||
ret = XcursorFileSaveImages (f, images);
|
ret = XcursorFileSaveImages (f, images);
|
||||||
return fclose (f) != EOF && ret;
|
returnCode(fclose (f) != EOF && ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
XcursorBool
|
XcursorBool
|
||||||
|
|
@ -1209,12 +1345,21 @@ XcursorFilenameSave (const char *file,
|
||||||
FILE *f;
|
FILE *f;
|
||||||
XcursorBool ret;
|
XcursorBool ret;
|
||||||
|
|
||||||
if (!file || !comments || !images)
|
enterFunc((T_CALLED(XcursorFilenameSave ) "(\"%s\", %p, %p)\n",
|
||||||
return XcursorFalse;
|
NonNull(file),
|
||||||
|
(const void *) comments,
|
||||||
|
(const void *) images));
|
||||||
|
|
||||||
f = fopen (file, "w" FOPEN_CLOEXEC);
|
if (!file || !comments || !images) {
|
||||||
if (!f)
|
ret = XcursorFalse;
|
||||||
return 0;
|
} else {
|
||||||
ret = XcursorFileSave (f, comments, images);
|
f = fopen (file, "w" FOPEN_CLOEXEC);
|
||||||
return fclose (f) != EOF && ret;
|
if (!f) {
|
||||||
|
ret = 0;
|
||||||
|
} else {
|
||||||
|
ret = XcursorFileSave (f, comments, images);
|
||||||
|
ret = fclose (f) != EOF && ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
returnCode(ret);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -125,4 +125,27 @@ _XcursorFileLoadImages (FILE *file, int size, XcursorBool resize);
|
||||||
XcursorImages *
|
XcursorImages *
|
||||||
_XcursorFilenameLoadImages (const char *file, int size, XcursorBool resize);
|
_XcursorFilenameLoadImages (const char *file, int size, XcursorBool resize);
|
||||||
|
|
||||||
|
#ifdef DEBUG_XCURSOR
|
||||||
|
void _XcursorTrace(const char *fmt, ...) __attribute__((format(printf,1,2)));
|
||||||
|
unsigned _XcursorReturnUint(unsigned code);
|
||||||
|
int _XcursorReturnCode(int code);
|
||||||
|
void *_XcursorReturnAddr(void *addr);
|
||||||
|
void _XcursorReturnVoid(void);
|
||||||
|
#define T_CALLED(func) "called: { " #func
|
||||||
|
#define T_RETURN(form) "return: } %" #form "\n"
|
||||||
|
#define enterFunc(params) _XcursorTrace params
|
||||||
|
#define returnUint(code) return _XcursorReturnUint(code)
|
||||||
|
#define returnCode(code) return _XcursorReturnCode(code)
|
||||||
|
#define returnAddr(addr) return _XcursorReturnAddr(addr)
|
||||||
|
#define returnVoid() do { _XcursorReturnVoid(); return; } while (0)
|
||||||
|
#else
|
||||||
|
#define enterFunc(params) /* nothing */
|
||||||
|
#define returnUint(code) return (code)
|
||||||
|
#define returnCode(code) return (code)
|
||||||
|
#define returnAddr(addr) return (addr)
|
||||||
|
#define returnVoid() return
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NonNull(p) ((p) != NULL ? (p) : "<null>")
|
||||||
|
|
||||||
#endif /* _XCURSORINT_H_ */
|
#endif /* _XCURSORINT_H_ */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue