| /* |
| * 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); |
| } |