Beispiel #1
0
DLL_EXPORTED
int
libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
{
  if (wcschr (format, '$') == NULL)
    return system_vswprintf (resultbuf, length, format, args);
  else
    {
      size_t maxlength = length;
      wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
      if (result != resultbuf)
	{
	  if (maxlength > 0)
	    {
	      if (length < maxlength)
		abort ();
	      memcpy (resultbuf, result, (maxlength - 1) * sizeof (wchar_t));
	      resultbuf[maxlength - 1] = 0;
	    }
	  free (result);
	  return -1;
	}
      else
	return length;
    }
}
Beispiel #2
0
DLL_EXPORTED
int
libintl_vswprintf (wchar_t *resultbuf, size_t length, const wchar_t *format, va_list args)
{
  if (wcschr (format, '$') == NULL)
    return system_vswprintf (resultbuf, length, format, args);
  else
    {
      size_t maxlength = length;
      wchar_t *result = libintl_vasnwprintf (resultbuf, &length, format, args);
      if (result == NULL)
        return -1;
      if (result != resultbuf)
        {
          if (maxlength > 0)
            {
              size_t pruned_length =
                (length < maxlength ? length : maxlength - 1);
              memcpy (resultbuf, result, pruned_length * sizeof (wchar_t));
              resultbuf[pruned_length] = 0;
            }
          free (result);
          /* Unlike vsnprintf, which has to return the number of character that
             would have been produced if the resultbuf had been sufficiently
             large, the vswprintf function has to return a negative value if
             the resultbuf was not sufficiently large.  */
          if (length >= maxlength)
            return -1;
        }
      if (length > INT_MAX)
        {
          errno = EOVERFLOW;
          return -1;
        }
      else
        return length;
    }
}