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