/* * Raster error handling for CUPS. * * Copyright © 2007-2018 by Apple Inc. * Copyright © 2007 by Easy Software Products. * * Licensed under Apache License v2.0. See the file "LICENSE" for more * information. */ /* * Include necessary headers... */ #include "cups-private.h" #include "raster-private.h" #include "debug-internal.h" /* * '_cupsRasterAddError()' - Add an error message to the error buffer. */ void _cupsRasterAddError(const char *f, /* I - Printf-style error message */ ...) /* I - Additional arguments as needed */ { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ va_list ap; /* Pointer to additional arguments */ char s[2048]; /* Message string */ ssize_t bytes; /* Bytes in message string */ DEBUG_printf(("_cupsRasterAddError(f=\"%s\", ...)", f)); va_start(ap, f); bytes = vsnprintf(s, sizeof(s), f, ap); va_end(ap); if (bytes <= 0) return; DEBUG_printf(("1_cupsRasterAddError: %s", s)); bytes ++; if ((size_t)bytes >= sizeof(s)) return; if (bytes > (ssize_t)(buf->end - buf->current)) { /* * Allocate more memory... */ char *temp; /* New buffer */ size_t size; /* Size of buffer */ size = (size_t)(buf->end - buf->start + 2 * bytes + 1024); if (buf->start) temp = realloc(buf->start, size); else temp = malloc(size); if (!temp) return; /* * Update pointers... */ buf->end = temp + size; buf->current = temp + (buf->current - buf->start); buf->start = temp; } /* * Append the message to the end of the current string... */ memcpy(buf->current, s, (size_t)bytes); buf->current += bytes - 1; } /* * '_cupsRasterClearError()' - Clear the error buffer. */ void _cupsRasterClearError(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ buf->current = buf->start; if (buf->start) *(buf->start) = '\0'; } /* * '_cupsRasterErrorString()' - Return the last error from a raster function. * * If there are no recent errors, NULL is returned. * * @since CUPS 1.3/macOS 10.5@ */ const char * /* O - Last error */ _cupsRasterErrorString(void) { _cups_globals_t *cg = _cupsGlobals(); /* Thread globals */ _cups_raster_error_t *buf = &cg->raster_error; /* Error buffer */ if (buf->current == buf->start) return (NULL); else return (buf->start); }