diff options
author | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2015-04-08 21:52:51 +0200 |
---|---|---|
committer | Mike Gabriel <mike.gabriel@das-netzwerkteam.de> | 2015-04-16 21:51:40 +0200 |
commit | 422fe90717dde8ee451f37f29a11b0b4c319210c (patch) | |
tree | adcc63965ca20b96d27e1b2a0683c89205766922 /nx-X11/lib/Xcursor/file.c | |
parent | cfc0202b42ad307391202ca776937b28ea7d2b03 (diff) | |
download | nx-libs-422fe90717dde8ee451f37f29a11b0b4c319210c.tar.gz nx-libs-422fe90717dde8ee451f37f29a11b0b4c319210c.tar.bz2 nx-libs-422fe90717dde8ee451f37f29a11b0b4c319210c.zip |
library clean-up: Drop nx-X11/lib/Xcursor. Not used at build time.
Diffstat (limited to 'nx-X11/lib/Xcursor/file.c')
-rw-r--r-- | nx-X11/lib/Xcursor/file.c | 1101 |
1 files changed, 0 insertions, 1101 deletions
diff --git a/nx-X11/lib/Xcursor/file.c b/nx-X11/lib/Xcursor/file.c deleted file mode 100644 index 175676cc3..000000000 --- a/nx-X11/lib/Xcursor/file.c +++ /dev/null @@ -1,1101 +0,0 @@ -/* - * $Id: file.c,v 1.5 2005/07/03 07:00:56 daniels Exp $ - * - * Copyright © 2002 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "xcursorint.h" -#include <stdlib.h> -#include <string.h> - -XcursorImage * -XcursorImageCreate (int width, int height) -{ - XcursorImage *image; - - image = malloc (sizeof (XcursorImage) + - width * height * sizeof (XcursorPixel)); - if (!image) - return 0; - image->version = XCURSOR_IMAGE_VERSION; - image->pixels = (XcursorPixel *) (image + 1); - image->size = width > height ? width : height; - image->width = width; - image->height = height; - image->delay = 0; - return image; -} - -void -XcursorImageDestroy (XcursorImage *image) -{ - if (image) - free (image); -} - -XcursorImages * -XcursorImagesCreate (int size) -{ - XcursorImages *images; - - images = malloc (sizeof (XcursorImages) + - size * sizeof (XcursorImage *)); - if (!images) - return 0; - images->nimage = 0; - images->images = (XcursorImage **) (images + 1); - images->name = 0; - return images; -} - -void -XcursorImagesDestroy (XcursorImages *images) -{ - int n; - - if (!images) - return; - - for (n = 0; n < images->nimage; n++) - XcursorImageDestroy (images->images[n]); - if (images->name) - free (images->name); - free (images); -} - -void -XcursorImagesSetName (XcursorImages *images, const char *name) -{ - char *new; - - if (!images || !name) - return; - - new = malloc (strlen (name) + 1); - - if (!new) - return; - - strcpy (new, name); - if (images->name) - free (images->name); - images->name = new; -} - -XcursorComment * -XcursorCommentCreate (XcursorUInt comment_type, int length) -{ - XcursorComment *comment; - - if (length > XCURSOR_COMMENT_MAX_LEN) - return 0; - - comment = malloc (sizeof (XcursorComment) + length + 1); - if (!comment) - return 0; - comment->version = XCURSOR_COMMENT_VERSION; - comment->comment_type = comment_type; - comment->comment = (char *) (comment + 1); - comment->comment[0] = '\0'; - return comment; -} - -void -XcursorCommentDestroy (XcursorComment *comment) -{ - if (!comment) - free (comment); -} - -XcursorComments * -XcursorCommentsCreate (int size) -{ - XcursorComments *comments; - - comments = malloc (sizeof (XcursorComments) + - size * sizeof (XcursorComment *)); - if (!comments) - return 0; - comments->ncomment = 0; - comments->comments = (XcursorComment **) (comments + 1); - return comments; -} - -void -XcursorCommentsDestroy (XcursorComments *comments) -{ - int n; - - if (!comments) - return; - - for (n = 0; n < comments->ncomment; n++) - XcursorCommentDestroy (comments->comments[n]); - free (comments); -} - -static XcursorBool -_XcursorReadUInt (XcursorFile *file, XcursorUInt *u) -{ - unsigned char bytes[4]; - - if (!file || !u) - return XcursorFalse; - - if ((*file->read) (file, bytes, 4) != 4) - return XcursorFalse; - *u = ((bytes[0] << 0) | - (bytes[1] << 8) | - (bytes[2] << 16) | - (bytes[3] << 24)); - return XcursorTrue; -} - -static XcursorBool -_XcursorReadBytes (XcursorFile *file, char *bytes, int length) -{ - if (!file || !bytes || (*file->read) (file, (unsigned char *) bytes, length) != length) - return XcursorFalse; - return XcursorTrue; -} - -static XcursorBool -_XcursorWriteUInt (XcursorFile *file, XcursorUInt u) -{ - unsigned char bytes[4]; - - if (!file) - return XcursorFalse; - - bytes[0] = u; - bytes[1] = u >> 8; - bytes[2] = u >> 16; - bytes[3] = u >> 24; - if ((*file->write) (file, bytes, 4) != 4) - return XcursorFalse; - return XcursorTrue; -} - -static XcursorBool -_XcursorWriteBytes (XcursorFile *file, char *bytes, int length) -{ - if (!file || !bytes || (*file->write) (file, (unsigned char *) bytes, length) != length) - return XcursorFalse; - return XcursorTrue; -} - -static void -_XcursorFileHeaderDestroy (XcursorFileHeader *fileHeader) -{ - if (!fileHeader) - free (fileHeader); -} - -static XcursorFileHeader * -_XcursorFileHeaderCreate (int ntoc) -{ - XcursorFileHeader *fileHeader; - - if (ntoc > 0x10000) - return 0; - fileHeader = malloc (sizeof (XcursorFileHeader) + - ntoc * sizeof (XcursorFileToc)); - if (!fileHeader) - return 0; - fileHeader->magic = XCURSOR_MAGIC; - fileHeader->header = XCURSOR_FILE_HEADER_LEN; - fileHeader->version = XCURSOR_FILE_VERSION; - fileHeader->ntoc = ntoc; - fileHeader->tocs = (XcursorFileToc *) (fileHeader + 1); - return fileHeader; -} - -static XcursorFileHeader * -_XcursorReadFileHeader (XcursorFile *file) -{ - XcursorFileHeader head, *fileHeader; - XcursorUInt skip; - int n; - - if (!file) - return NULL; - - if (!_XcursorReadUInt (file, &head.magic)) - return 0; - if (head.magic != XCURSOR_MAGIC) - return 0; - if (!_XcursorReadUInt (file, &head.header)) - return 0; - if (!_XcursorReadUInt (file, &head.version)) - return 0; - if (!_XcursorReadUInt (file, &head.ntoc)) - return 0; - skip = head.header - XCURSOR_FILE_HEADER_LEN; - if (skip) - if ((*file->seek) (file, skip, SEEK_CUR) == EOF) - return 0; - fileHeader = _XcursorFileHeaderCreate (head.ntoc); - if (!fileHeader) - return 0; - fileHeader->magic = head.magic; - fileHeader->header = head.header; - fileHeader->version = head.version; - fileHeader->ntoc = head.ntoc; - for (n = 0; n < fileHeader->ntoc; n++) - { - if (!_XcursorReadUInt (file, &fileHeader->tocs[n].type)) - break; - if (!_XcursorReadUInt (file, &fileHeader->tocs[n].subtype)) - break; - if (!_XcursorReadUInt (file, &fileHeader->tocs[n].position)) - break; - } - if (n != fileHeader->ntoc) - { - _XcursorFileHeaderDestroy (fileHeader); - return 0; - } - return fileHeader; -} - -static XcursorUInt -_XcursorFileHeaderLength (XcursorFileHeader *fileHeader) -{ - return (XCURSOR_FILE_HEADER_LEN + - fileHeader->ntoc * XCURSOR_FILE_TOC_LEN); -} - -static XcursorBool -_XcursorWriteFileHeader (XcursorFile *file, XcursorFileHeader *fileHeader) -{ - int toc; - - if (!file || !fileHeader) - return XcursorFalse; - - if (!_XcursorWriteUInt (file, fileHeader->magic)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, fileHeader->header)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, fileHeader->version)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, fileHeader->ntoc)) - return XcursorFalse; - for (toc = 0; toc < fileHeader->ntoc; toc++) - { - if (!_XcursorWriteUInt (file, fileHeader->tocs[toc].type)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, fileHeader->tocs[toc].subtype)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, fileHeader->tocs[toc].position)) - return XcursorFalse; - } - return XcursorTrue; -} - -static XcursorBool -_XcursorSeekToToc (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc) -{ - if (!file || !fileHeader || \ - (*file->seek) (file, fileHeader->tocs[toc].position, SEEK_SET) == EOF) - return XcursorFalse; - return XcursorTrue; -} - -static XcursorBool -_XcursorFileReadChunkHeader (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc, - XcursorChunkHeader *chunkHeader) -{ - if (!file || !fileHeader || !chunkHeader) - return XcursorFalse; - if (!_XcursorSeekToToc (file, fileHeader, toc)) - return XcursorFalse; - if (!_XcursorReadUInt (file, &chunkHeader->header)) - return XcursorFalse; - if (!_XcursorReadUInt (file, &chunkHeader->type)) - return XcursorFalse; - if (!_XcursorReadUInt (file, &chunkHeader->subtype)) - return XcursorFalse; - if (!_XcursorReadUInt (file, &chunkHeader->version)) - return XcursorFalse; - /* sanity check */ - if (chunkHeader->type != fileHeader->tocs[toc].type || - chunkHeader->subtype != fileHeader->tocs[toc].subtype) - return XcursorFalse; - return XcursorTrue; -} - -static XcursorBool -_XcursorFileWriteChunkHeader (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc, - XcursorChunkHeader *chunkHeader) -{ - if (!file || !fileHeader || !chunkHeader) - return XcursorFalse; - if (!_XcursorSeekToToc (file, fileHeader, toc)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, chunkHeader->header)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, chunkHeader->type)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, chunkHeader->subtype)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, chunkHeader->version)) - return XcursorFalse; - return XcursorTrue; -} - -#define dist(a,b) ((a) > (b) ? (a) - (b) : (b) - (a)) - -static XcursorDim -_XcursorFindBestSize (XcursorFileHeader *fileHeader, - XcursorDim size, - int *nsizesp) -{ - int n; - int nsizes = 0; - XcursorDim bestSize = 0; - XcursorDim thisSize; - - if (!fileHeader || !nsizesp) - return 0; - - for (n = 0; n < fileHeader->ntoc; n++) - { - if (fileHeader->tocs[n].type != XCURSOR_IMAGE_TYPE) - continue; - thisSize = fileHeader->tocs[n].subtype; - if (!bestSize || dist (thisSize, size) < dist (bestSize, size)) - { - bestSize = thisSize; - nsizes = 1; - } - else if (thisSize == bestSize) - nsizes++; - } - *nsizesp = nsizes; - return bestSize; -} - -static int -_XcursorFindImageToc (XcursorFileHeader *fileHeader, - XcursorDim size, - int count) -{ - int toc; - XcursorDim thisSize; - - if (!fileHeader) - return 0; - - for (toc = 0; toc < fileHeader->ntoc; toc++) - { - if (fileHeader->tocs[toc].type != XCURSOR_IMAGE_TYPE) - continue; - thisSize = fileHeader->tocs[toc].subtype; - if (thisSize != size) - continue; - if (!count) - break; - count--; - } - if (toc == fileHeader->ntoc) - return -1; - return toc; -} - -static XcursorImage * -_XcursorReadImage (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc) -{ - XcursorChunkHeader chunkHeader; - XcursorImage head; - XcursorImage *image; - int n; - XcursorPixel *p; - - if (!file || !fileHeader) - return NULL; - - if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader)) - return 0; - if (!_XcursorReadUInt (file, &head.width)) - return 0; - if (!_XcursorReadUInt (file, &head.height)) - return 0; - if (!_XcursorReadUInt (file, &head.xhot)) - return 0; - if (!_XcursorReadUInt (file, &head.yhot)) - return 0; - if (!_XcursorReadUInt (file, &head.delay)) - return 0; - /* sanity check data */ - if (head.width >= 0x10000 || head.height > 0x10000) - return 0; - if (head.width == 0 || head.height == 0) - return 0; - if (head.xhot > head.width || head.yhot > head.height) - return 0; - - /* Create the image and initialize it */ - image = XcursorImageCreate (head.width, head.height); - if (chunkHeader.version < image->version) - image->version = chunkHeader.version; - image->size = chunkHeader.subtype; - image->xhot = head.xhot; - image->yhot = head.yhot; - image->delay = head.delay; - n = image->width * image->height; - p = image->pixels; - while (n--) - { - if (!_XcursorReadUInt (file, p)) - { - XcursorImageDestroy (image); - return 0; - } - p++; - } - return image; -} - -static XcursorUInt -_XcursorImageLength (XcursorImage *image) -{ - if (!image) - return 0; - - return XCURSOR_IMAGE_HEADER_LEN + (image->width * image->height) * 4; -} - -static XcursorBool -_XcursorWriteImage (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc, - XcursorImage *image) -{ - XcursorChunkHeader chunkHeader; - int n; - XcursorPixel *p; - - if (!file || !fileHeader || !image) - return XcursorFalse; - - /* sanity check data */ - if (image->width > XCURSOR_IMAGE_MAX_SIZE || - image->height > XCURSOR_IMAGE_MAX_SIZE) - return XcursorFalse; - if (image->width == 0 || image->height == 0) - return XcursorFalse; - if (image->xhot > image->width || image->yhot > image->height) - return XcursorFalse; - - /* write chunk header */ - chunkHeader.header = XCURSOR_IMAGE_HEADER_LEN; - chunkHeader.type = XCURSOR_IMAGE_TYPE; - chunkHeader.subtype = image->size; - chunkHeader.version = XCURSOR_IMAGE_VERSION; - - if (!_XcursorFileWriteChunkHeader (file, fileHeader, toc, &chunkHeader)) - return XcursorFalse; - - /* write extra image header fields */ - if (!_XcursorWriteUInt (file, image->width)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, image->height)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, image->xhot)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, image->yhot)) - return XcursorFalse; - if (!_XcursorWriteUInt (file, image->delay)) - return XcursorFalse; - - /* write the image */ - n = image->width * image->height; - p = image->pixels; - while (n--) - { - if (!_XcursorWriteUInt (file, *p)) - return XcursorFalse; - p++; - } - return XcursorTrue; -} - -static XcursorComment * -_XcursorReadComment (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc) -{ - XcursorChunkHeader chunkHeader; - XcursorUInt length; - XcursorComment *comment; - - if (!file || !fileHeader) - return NULL; - - /* read chunk header */ - if (!_XcursorFileReadChunkHeader (file, fileHeader, toc, &chunkHeader)) - return 0; - /* read extra comment header fields */ - if (!_XcursorReadUInt (file, &length)) - return 0; - comment = XcursorCommentCreate (chunkHeader.subtype, length); - if (!comment) - return 0; - if (!_XcursorReadBytes (file, comment->comment, length)) - { - XcursorCommentDestroy (comment); - return 0; - } - comment->comment[length] = '\0'; - return comment; -} - -static XcursorUInt -_XcursorCommentLength (XcursorComment *comment) -{ - return XCURSOR_COMMENT_HEADER_LEN + strlen (comment->comment); -} - -static XcursorBool -_XcursorWriteComment (XcursorFile *file, - XcursorFileHeader *fileHeader, - int toc, - XcursorComment *comment) -{ - XcursorChunkHeader chunkHeader; - XcursorUInt length; - - if (!file || !fileHeader || !comment || !comment->comment) - return XcursorFalse; - - length = strlen (comment->comment); - - /* sanity check data */ - if (length > XCURSOR_COMMENT_MAX_LEN) - return XcursorFalse; - - /* read chunk header */ - chunkHeader.header = XCURSOR_COMMENT_HEADER_LEN; - chunkHeader.type = XCURSOR_COMMENT_TYPE; - chunkHeader.subtype = comment->comment_type; - chunkHeader.version = XCURSOR_COMMENT_VERSION; - - if (!_XcursorFileWriteChunkHeader (file, fileHeader, toc, &chunkHeader)) - return XcursorFalse; - - /* write extra comment header fields */ - if (!_XcursorWriteUInt (file, length)) - return XcursorFalse; - - if (!_XcursorWriteBytes (file, comment->comment, length)) - return XcursorFalse; - return XcursorTrue; -} - -XcursorImage * -XcursorXcFileLoadImage (XcursorFile *file, int size) -{ - XcursorFileHeader *fileHeader; - XcursorDim bestSize; - int nsize; - int toc; - XcursorImage *image; - - if (size < 0) - return 0; - fileHeader = _XcursorReadFileHeader (file); - if (!fileHeader) - return 0; - bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize); - if (!bestSize) - return 0; - toc = _XcursorFindImageToc (fileHeader, bestSize, 0); - if (toc < 0) - return 0; - image = _XcursorReadImage (file, fileHeader, toc); - _XcursorFileHeaderDestroy (fileHeader); - return image; -} - -XcursorImages * -XcursorXcFileLoadImages (XcursorFile *file, int size) -{ - XcursorFileHeader *fileHeader; - XcursorDim bestSize; - int nsize; - XcursorImages *images; - int n; - int toc; - - if (!file || size < 0) - return 0; - fileHeader = _XcursorReadFileHeader (file); - if (!fileHeader) - return 0; - bestSize = _XcursorFindBestSize (fileHeader, (XcursorDim) size, &nsize); - if (!bestSize) - return 0; - images = XcursorImagesCreate (nsize); - if (!images) - return 0; - for (n = 0; n < nsize; n++) - { - toc = _XcursorFindImageToc (fileHeader, bestSize, n); - if (toc < 0) - break; - images->images[images->nimage] = _XcursorReadImage (file, fileHeader, - toc); - if (!images->images[images->nimage]) - break; - images->nimage++; - } - _XcursorFileHeaderDestroy (fileHeader); - if (images->nimage != nsize) - { - XcursorImagesDestroy (images); - images = 0; - } - return images; -} - -XcursorImages * -XcursorXcFileLoadAllImages (XcursorFile *file) -{ - XcursorFileHeader *fileHeader; - XcursorImage *image; - XcursorImages *images; - int nimage; - int n; - int toc; - - if (!file) - return 0; - - fileHeader = _XcursorReadFileHeader (file); - if (!fileHeader) - return 0; - nimage = 0; - for (n = 0; n < fileHeader->ntoc; n++) - { - switch (fileHeader->tocs[n].type) { - case XCURSOR_IMAGE_TYPE: - nimage++; - break; - } - } - images = XcursorImagesCreate (nimage); - if (!images) - return 0; - for (toc = 0; toc < fileHeader->ntoc; toc++) - { - switch (fileHeader->tocs[toc].type) { - case XCURSOR_IMAGE_TYPE: - image = _XcursorReadImage (file, fileHeader, toc); - if (image) - { - images->images[images->nimage] = image; - images->nimage++; - } - break; - } - } - _XcursorFileHeaderDestroy (fileHeader); - if (images->nimage != nimage) - { - XcursorImagesDestroy (images); - images = 0; - } - return images; -} - -XcursorBool -XcursorXcFileLoad (XcursorFile *file, - XcursorComments **commentsp, - XcursorImages **imagesp) -{ - XcursorFileHeader *fileHeader; - int nimage; - int ncomment; - XcursorImages *images; - XcursorImage *image; - XcursorComment *comment; - XcursorComments *comments; - int toc; - - if (!file) - return 0; - fileHeader = _XcursorReadFileHeader (file); - if (!fileHeader) - return 0; - nimage = 0; - ncomment = 0; - for (toc = 0; toc < fileHeader->ntoc; toc++) - { - switch (fileHeader->tocs[toc].type) { - case XCURSOR_COMMENT_TYPE: - ncomment++; - break; - case XCURSOR_IMAGE_TYPE: - nimage++; - break; - } - } - images = XcursorImagesCreate (nimage); - if (!images) - return 0; - comments = XcursorCommentsCreate (ncomment); - if (!comments) - { - XcursorImagesDestroy (images); - return 0; - } - for (toc = 0; toc < fileHeader->ntoc; toc++) - { - switch (fileHeader->tocs[toc].type) { - case XCURSOR_COMMENT_TYPE: - comment = _XcursorReadComment (file, fileHeader, toc); - if (comment) - { - comments->comments[comments->ncomment] = comment; - comments->ncomment++; - } - break; - case XCURSOR_IMAGE_TYPE: - image = _XcursorReadImage (file, fileHeader, toc); - if (image) - { - images->images[images->nimage] = image; - images->nimage++; - } - break; - } - } - _XcursorFileHeaderDestroy (fileHeader); - if (images->nimage != nimage || comments->ncomment != ncomment) - { - XcursorImagesDestroy (images); - XcursorCommentsDestroy (comments); - images = 0; - comments = 0; - return XcursorFalse; - } - *imagesp = images; - *commentsp = comments; - return XcursorTrue; -} - -XcursorBool -XcursorXcFileSave (XcursorFile *file, - const XcursorComments *comments, - const XcursorImages *images) -{ - XcursorFileHeader *fileHeader; - XcursorUInt position; - int n; - int toc; - - if (!file || !comments || !images) - return XcursorFalse; - - fileHeader = _XcursorFileHeaderCreate (comments->ncomment + images->nimage); - if (!fileHeader) - return XcursorFalse; - - position = _XcursorFileHeaderLength (fileHeader); - - /* - * Compute the toc. Place the images before the comments - * as they're more often read - */ - - toc = 0; - for (n = 0; n < images->nimage; n++) - { - fileHeader->tocs[toc].type = XCURSOR_IMAGE_TYPE; - fileHeader->tocs[toc].subtype = images->images[n]->size; - fileHeader->tocs[toc].position = position; - position += _XcursorImageLength (images->images[n]); - toc++; - } - - for (n = 0; n < comments->ncomment; n++) - { - fileHeader->tocs[toc].type = XCURSOR_COMMENT_TYPE; - fileHeader->tocs[toc].subtype = comments->comments[n]->comment_type; - fileHeader->tocs[toc].position = position; - position += _XcursorCommentLength (comments->comments[n]); - toc++; - } - - /* - * Write the header and the toc - */ - if (!_XcursorWriteFileHeader (file, fileHeader)) - goto bail; - - /* - * Write the images - */ - toc = 0; - for (n = 0; n < images->nimage; n++) - { - if (!_XcursorWriteImage (file, fileHeader, toc, images->images[n])) - goto bail; - toc++; - } - - /* - * Write the comments - */ - for (n = 0; n < comments->ncomment; n++) - { - if (!_XcursorWriteComment (file, fileHeader, toc, comments->comments[n])) - goto bail; - toc++; - } - - _XcursorFileHeaderDestroy (fileHeader); - return XcursorTrue; -bail: - _XcursorFileHeaderDestroy (fileHeader); - return XcursorFalse; -} - -static int -_XcursorStdioFileRead (XcursorFile *file, unsigned char *buf, int len) -{ - FILE *f = file->closure; - return fread (buf, 1, len, f); -} - -static int -_XcursorStdioFileWrite (XcursorFile *file, unsigned char *buf, int len) -{ - FILE *f = file->closure; - return fwrite (buf, 1, len, f); -} - -static int -_XcursorStdioFileSeek (XcursorFile *file, long offset, int whence) -{ - FILE *f = file->closure; - return fseek (f, offset, whence); -} - -static void -_XcursorStdioFileInitialize (FILE *stdfile, XcursorFile *file) -{ - file->closure = stdfile; - file->read = _XcursorStdioFileRead; - file->write = _XcursorStdioFileWrite; - file->seek = _XcursorStdioFileSeek; -} - -XcursorImage * -XcursorFileLoadImage (FILE *file, int size) -{ - XcursorFile f; - - if (!file) - return NULL; - - _XcursorStdioFileInitialize (file, &f); - return XcursorXcFileLoadImage (&f, size); -} - -XcursorImages * -XcursorFileLoadImages (FILE *file, int size) -{ - XcursorFile f; - - if (!file) - return NULL; - - _XcursorStdioFileInitialize (file, &f); - return XcursorXcFileLoadImages (&f, size); -} - -XcursorImages * -XcursorFileLoadAllImages (FILE *file) -{ - XcursorFile f; - - if (!file) - return NULL; - - _XcursorStdioFileInitialize (file, &f); - return XcursorXcFileLoadAllImages (&f); -} - -XcursorBool -XcursorFileLoad (FILE *file, - XcursorComments **commentsp, - XcursorImages **imagesp) -{ - XcursorFile f; - - if (!file || !commentsp || !imagesp) - return XcursorFalse; - - _XcursorStdioFileInitialize (file, &f); - return XcursorXcFileLoad (&f, commentsp, imagesp); -} - -XcursorBool -XcursorFileSaveImages (FILE *file, const XcursorImages *images) -{ - XcursorComments *comments = XcursorCommentsCreate (0); - XcursorFile f; - XcursorBool ret; - if (!comments || !file || !images) - return 0; - _XcursorStdioFileInitialize (file, &f); - ret = XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF; - XcursorCommentsDestroy (comments); - return ret; -} - -XcursorBool -XcursorFileSave (FILE * file, - const XcursorComments *comments, - const XcursorImages *images) -{ - XcursorFile f; - - if (!file || !comments || !images) - return XcursorFalse; - - _XcursorStdioFileInitialize (file, &f); - return XcursorXcFileSave (&f, comments, images) && fflush (file) != EOF; -} - -XcursorImage * -XcursorFilenameLoadImage (const char *file, int size) -{ - FILE *f; - XcursorImage *image; - - if (!file || size < 0) - return NULL; - - f = fopen (file, "r"); - if (!f) - return 0; - image = XcursorFileLoadImage (f, size); - fclose (f); - return image; -} - -XcursorImages * -XcursorFilenameLoadImages (const char *file, int size) -{ - FILE *f; - XcursorImages *images; - - if (!file || size < 0) - return NULL; - - f = fopen (file, "r"); - if (!f) - return 0; - images = XcursorFileLoadImages (f, size); - fclose (f); - return images; -} - -XcursorImages * -XcursorFilenameLoadAllImages (const char *file) -{ - FILE *f; - XcursorImages *images; - - if (!file) - return NULL; - - f = fopen (file, "r"); - if (!f) - return 0; - images = XcursorFileLoadAllImages (f); - fclose (f); - return images; -} - -XcursorBool -XcursorFilenameLoad (const char *file, - XcursorComments **commentsp, - XcursorImages **imagesp) -{ - FILE *f; - XcursorBool ret; - - if (!file) - return XcursorFalse; - - f = fopen (file, "r"); - if (!f) - return 0; - ret = XcursorFileLoad (f, commentsp, imagesp); - fclose (f); - return ret; -} - -XcursorBool -XcursorFilenameSaveImages (const char *file, const XcursorImages *images) -{ - FILE *f; - XcursorBool ret; - - if (!file || !images) - return XcursorFalse; - - f = fopen (file, "w"); - if (!f) - return 0; - ret = XcursorFileSaveImages (f, images); - return fclose (f) != EOF && ret; -} - -XcursorBool -XcursorFilenameSave (const char *file, - const XcursorComments *comments, - const XcursorImages *images) -{ - FILE *f; - XcursorBool ret; - - if (!file || !comments || !images) - return XcursorFalse; - - f = fopen (file, "w"); - if (!f) - return 0; - ret = XcursorFileSave (f, comments, images); - return fclose (f) != EOF && ret; -} |