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:
Thomas E. Dickey 2024-10-30 19:16:09 -04:00
parent 8a1de72216
commit fbfe95e05f
No known key found for this signature in database
GPG key ID: CC2AF4472167BE03
2 changed files with 318 additions and 150 deletions

View file

@ -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;
if (width < 0 || height < 0) {
/* EMPTY */;
} else if (width > XCURSOR_IMAGE_MAX_SIZE
|| height > XCURSOR_IMAGE_MAX_SIZE) {
/* EMPTY */;
} else {
image = malloc (sizeof (XcursorImage) + image = malloc (sizeof (XcursorImage) +
(size_t) (width * height) * sizeof (XcursorPixel)); (size_t) (width * height) * sizeof (XcursorPixel));
if (!image) if (image) {
return NULL;
image->version = XCURSOR_IMAGE_VERSION; image->version = XCURSOR_IMAGE_VERSION;
image->pixels = (XcursorPixel *) (image + 1); image->pixels = (XcursorPixel *) (image + 1);
image->size = (XcursorDim) (width > height ? width : height); image->size = (XcursorDim) (width > height ? width : height);
image->width = (XcursorDim) width; image->width = (XcursorDim) width;
image->height = (XcursorDim) height; image->height = (XcursorDim) height;
image->delay = 0; image->delay = 0;
return image; }
}
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,23 +110,25 @@ 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]);
@ -84,23 +137,28 @@ XcursorImagesDestroy (XcursorImages *images)
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)
return;
if (new) {
if (images->name) if (images->name)
free (images->name); free (images->name);
images->name = new; images->name = new;
} }
}
returnVoid();
}
XcursorComment * XcursorComment *
XcursorCommentCreate (XcursorUInt comment_type, int length) XcursorCommentCreate (XcursorUInt comment_type, int length)
@ -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));
if (!file || !comments || !images) {
ret = XcursorFalse;
} else {
f = fopen (file, "w" FOPEN_CLOEXEC); f = fopen (file, "w" FOPEN_CLOEXEC);
if (!f) if (!f) {
return 0; ret = 0;
} else {
ret = XcursorFileSave (f, comments, images); ret = XcursorFileSave (f, comments, images);
return fclose (f) != EOF && ret; ret = fclose (f) != EOF && ret;
}
}
returnCode(ret);
} }

View file

@ -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_ */