diff options
Diffstat (limited to 'src/xpm/misc.c')
-rw-r--r-- | src/xpm/misc.c | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/src/xpm/misc.c b/src/xpm/misc.c new file mode 100644 index 0000000..a34608c --- /dev/null +++ b/src/xpm/misc.c @@ -0,0 +1,206 @@ +/* Copyright 1990-92 GROUPE BULL -- See license conditions in file COPYRIGHT */ +/*****************************************************************************\ +* misc.c: * +* * +* XPM library * +* Miscellaneous utilities * +* * +* Developed by Arnaud Le Hors * +\*****************************************************************************/ + +#include "xpmP.h" + +/* + * Free the computed color table + */ + +xpmFreeColorTable(colorTable, ncolors) + char ***colorTable; + int ncolors; +{ + int a, b; + char ***ct, **cts; + + if (colorTable) { + for (a = 0, ct = colorTable; a < ncolors; a++, ct++) + if (*ct) { + for (b = 0, cts = *ct; b <= NKEYS; b++, cts++) + if (*cts) + free(*cts); + free(*ct); + } + free(colorTable); + } +} + + +/* + * Intialize the xpmInternAttrib pointers to Null to know + * which ones must be freed later on. + */ + +xpmInitInternAttrib(attrib) + xpmInternAttrib *attrib; +{ + attrib->ncolors = 0; + attrib->colorTable = NULL; + attrib->pixelindex = NULL; + attrib->xcolors = NULL; + attrib->colorStrings = NULL; + attrib->mask_pixel = UNDEF_PIXEL; +} + + +/* + * Free the xpmInternAttrib pointers which have been allocated + */ + +xpmFreeInternAttrib(attrib) + xpmInternAttrib *attrib; +{ + unsigned int a, ncolors; + char **sptr; + + if (attrib->colorTable) + xpmFreeColorTable(attrib->colorTable, attrib->ncolors); + if (attrib->pixelindex) + free(attrib->pixelindex); + if (attrib->xcolors) + free(attrib->xcolors); + if (attrib->colorStrings) { + ncolors = attrib->ncolors; + for (a = 0, sptr = attrib->colorStrings; a < ncolors; a++, sptr++) + if (*sptr) + free(*sptr); + free(attrib->colorStrings); + } +} + + +/* + * Free array of extensions + */ +XpmFreeExtensions(extensions, nextensions) + XpmExtension *extensions; + int nextensions; +{ + unsigned int i, j, nlines; + XpmExtension *ext; + char **sptr; + + if (extensions) { + for (i = 0, ext = extensions; i < nextensions; i++, ext++) { + if (ext->name) + free(ext->name); + nlines = ext->nlines; + for (j = 0, sptr = ext->lines; j < nlines; j++, sptr++) + if (*sptr) + free(*sptr); + if (ext->lines) + free(ext->lines); + } + free(extensions); + } +} + + +/* + * Return the XpmAttributes structure size + */ + +XpmAttributesSize() +{ + return sizeof(XpmAttributes); +} + + +/* + * Free the XpmAttributes structure members + * but the structure itself + */ + +XpmFreeAttributes(attributes) + XpmAttributes *attributes; +{ + if (attributes) { + if (attributes->valuemask & XpmReturnPixels && attributes->pixels) { + free(attributes->pixels); + attributes->pixels = NULL; + attributes->npixels = 0; + } + if (attributes->valuemask & XpmInfos) { + if (attributes->colorTable) { + xpmFreeColorTable(attributes->colorTable, attributes->ncolors); + attributes->colorTable = NULL; + attributes->ncolors = 0; + } + if (attributes->hints_cmt) { + free(attributes->hints_cmt); + attributes->hints_cmt = NULL; + } + if (attributes->colors_cmt) { + free(attributes->colors_cmt); + attributes->colors_cmt = NULL; + } + if (attributes->pixels_cmt) { + free(attributes->pixels_cmt); + attributes->pixels_cmt = NULL; + } + if (attributes->pixels) { + free(attributes->pixels); + attributes->pixels = NULL; + } + } + if (attributes->valuemask & XpmReturnExtensions + && attributes->nextensions) { + XpmFreeExtensions(attributes->extensions, attributes->nextensions); + attributes->nextensions = 0; + attributes->extensions = NULL; + } + attributes->valuemask = 0; + } +} + + +/* + * Store into the XpmAttributes structure the required informations stored in + * the xpmInternAttrib structure. + */ + +xpmSetAttributes(attrib, attributes) + xpmInternAttrib *attrib; + XpmAttributes *attributes; +{ + if (attributes) { + if (attributes->valuemask & XpmReturnInfos) { + attributes->cpp = attrib->cpp; + attributes->ncolors = attrib->ncolors; + attributes->colorTable = attrib->colorTable; + + attrib->ncolors = 0; + attrib->colorTable = NULL; + } + attributes->width = attrib->width; + attributes->height = attrib->height; + attributes->valuemask |= XpmSize; + } +} + +#ifdef NEED_STRDUP + +/* + * in case strdup is not provided by the system here is one + * which does the trick + */ +char * +strdup (s1) + char *s1; +{ + char *s2; + int l = strlen(s1) + 1; + if (s2 = (char *) malloc(l)) + strncpy(s2, s1, l); + return s2; +} + +#endif |