aboutsummaryrefslogtreecommitdiff
path: root/vendor/x11iraf/xpm/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/x11iraf/xpm/misc.c')
-rw-r--r--vendor/x11iraf/xpm/misc.c293
1 files changed, 293 insertions, 0 deletions
diff --git a/vendor/x11iraf/xpm/misc.c b/vendor/x11iraf/xpm/misc.c
new file mode 100644
index 00000000..071b655c
--- /dev/null
+++ b/vendor/x11iraf/xpm/misc.c
@@ -0,0 +1,293 @@
+/* Copyright 1990-93 GROUPE BULL -- See license conditions in file COPYRIGHT */
+/*****************************************************************************\
+* misc.c: *
+* *
+* XPM library *
+* Miscellaneous utilities *
+* *
+* Developed by Arnaud Le Hors *
+\*****************************************************************************/
+
+#include "xpmP.h"
+#ifdef VMS
+#include "sys$library:stat.h"
+#include "sys$library:fcntl.h"
+#else
+#include <sys/stat.h>
+#include <fcntl.h>
+#endif
+
+/*
+ * Free the computed color table
+ */
+void
+xpmFreeColorTable(colorTable, ncolors)
+ XpmColor *colorTable;
+ int ncolors;
+{
+ int a, b;
+ XpmColor *color;
+ xpmColorDefaults defaults;
+ char **sptr;
+
+ if (colorTable) {
+ for (a = 0, color = colorTable; a < ncolors; a++, color++) {
+ defaults = (xpmColorDefaults) color;
+ for (b = 0, sptr = (char **) defaults; b <= NKEYS; b++, sptr++)
+ if (*sptr)
+ XpmFree(*sptr);
+ }
+ XpmFree(colorTable);
+ }
+}
+
+
+/*
+ * Free array of extensions
+ */
+void
+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)
+ XpmFree(ext->name);
+ nlines = ext->nlines;
+ for (j = 0, sptr = ext->lines; j < nlines; j++, sptr++)
+ if (*sptr)
+ XpmFree(*sptr);
+ if (ext->lines)
+ XpmFree(ext->lines);
+ }
+ XpmFree(extensions);
+ }
+}
+
+
+/*
+ * Return the XpmAttributes structure size
+ */
+
+int
+XpmAttributesSize()
+{
+ return sizeof(XpmAttributes);
+}
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitAttributes(attributes)
+ XpmAttributes *attributes;
+{
+ if (attributes) {
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ attributes->extensions = NULL;
+ attributes->nextensions = 0;
+ }
+}
+
+/*
+ * Free the XpmAttributes structure members
+ * but the structure itself
+ */
+void
+XpmFreeAttributes(attributes)
+ XpmAttributes *attributes;
+{
+ if (attributes) {
+ if (attributes->valuemask & XpmReturnPixels && attributes->npixels) {
+ XpmFree(attributes->pixels);
+ attributes->pixels = NULL;
+ attributes->npixels = 0;
+ }
+ if (attributes->valuemask & XpmReturnExtensions
+ && attributes->nextensions) {
+ XpmFreeExtensions(attributes->extensions, attributes->nextensions);
+ attributes->extensions = NULL;
+ attributes->nextensions = 0;
+ }
+ attributes->valuemask = 0;
+ }
+}
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitXpmImage(image)
+ XpmImage *image;
+{
+ image->ncolors = 0;
+ image->colorTable = NULL;
+ image->data = NULL;
+}
+
+/*
+ * Free the XpmImage data which have been allocated
+ */
+void
+XpmFreeXpmImage(image)
+ XpmImage *image;
+{
+ if (image->colorTable)
+ xpmFreeColorTable(image->colorTable, image->ncolors);
+ XpmFree(image->data);
+ image->data = NULL;
+}
+
+/*
+ * Init returned data to free safely later on
+ */
+void
+xpmInitXpmInfos(infos)
+ XpmInfos *infos;
+{
+ if (infos) {
+ infos->hints_cmt = NULL;
+ infos->colors_cmt = NULL;
+ infos->pixels_cmt = NULL;
+ }
+}
+
+/*
+ * Free the XpmInfos data which have been allocated
+ */
+void
+XpmFreeXpmInfos(infos)
+ XpmInfos *infos;
+{
+ if (infos) {
+ if (infos->hints_cmt) {
+ XpmFree(infos->hints_cmt);
+ infos->hints_cmt = NULL;
+ }
+ if (infos->colors_cmt) {
+ XpmFree(infos->colors_cmt);
+ infos->colors_cmt = NULL;
+ }
+ if (infos->pixels_cmt) {
+ XpmFree(infos->pixels_cmt);
+ infos->pixels_cmt = NULL;
+ }
+ }
+}
+
+
+#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 *) XpmMalloc(l))
+ strncpy(s2, s1, l);
+ return s2;
+}
+
+#endif
+
+/*
+ * File / Buffer utilities
+ */
+int
+XpmReadFileToBuffer(filename, buffer_return)
+ char *filename;
+ char **buffer_return;
+{
+ int fd, fcheck, len;
+ char *ptr;
+ struct stat stats;
+ FILE *fp;
+
+ *buffer_return = NULL;
+
+ fd = open(filename, O_RDONLY);
+ if (fd < 0)
+ return XpmOpenFailed;
+
+ if (fstat(fd, &stats)) {
+ close(fd);
+ return XpmOpenFailed;
+ }
+ fp = fdopen(fd, "r");
+ if (!fp) {
+ close(fd);
+ return XpmOpenFailed;
+ }
+ len = (int) stats.st_size;
+ ptr = (char *) XpmMalloc(len + 1);
+ if (!ptr) {
+ fclose(fp);
+ return XpmNoMemory;
+ }
+ fcheck = fread(ptr, len, 1, fp);
+ fclose(fp);
+ if (fcheck != 1) {
+ XpmFree(ptr);
+ return XpmOpenFailed;
+ }
+ ptr[len] = '\0';
+ *buffer_return = ptr;
+ return XpmSuccess;
+}
+
+int
+XpmWriteFileFromBuffer(filename, buffer)
+ char *filename;
+ char *buffer;
+{
+ int fcheck, len;
+ FILE *fp = fopen(filename, "w");
+
+ if (!fp)
+ return XpmOpenFailed;
+
+ len = strlen(buffer);
+ fcheck = fwrite(buffer, len, 1, fp);
+ fclose(fp);
+ if (fcheck != 1)
+ return XpmOpenFailed;
+
+ return XpmSuccess;
+}
+
+
+/*
+ * Small utility function
+ */
+char *
+XpmGetErrorString(errcode)
+ int errcode;
+{
+ switch (errcode) {
+ case XpmColorError:
+ return ("XpmColorError");
+ case XpmSuccess:
+ return ("XpmSuccess");
+ case XpmOpenFailed:
+ return ("XpmOpenFailed");
+ case XpmFileInvalid:
+ return ("XpmFileInvalid");
+ case XpmNoMemory:
+ return ("XpmNoMemory");
+ case XpmColorFailed:
+ return ("XpmColorFailed");
+ default:
+ return ("Invalid XpmError");
+ }
+}