basestring_vsnprintf.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:2k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifdef __sgi
  14. /* define on IRIX to get posix compliant vsnprintf */
  15. #define _XOPEN_SOURCE 500
  16. #endif
  17. #include <stdio.h>
  18. #include <basestring_vsnprintf.h>
  19. #include <my_config.h>
  20. #ifdef _WINDOWS
  21. #define SNPRINTF_RETURN_TRUNC
  22. #define snprintf _snprintf
  23. #define vsnprintf _vsnprintf
  24. #endif
  25. int
  26. basestring_snprintf(char *str, size_t size, const char *format, ...)
  27. {
  28.   int ret;
  29.   va_list ap;
  30.   va_start(ap, format);
  31.   ret= basestring_vsnprintf(str, size, format, ap);
  32.   va_end(ap);
  33.   return(ret);
  34. }
  35. #ifdef SNPRINTF_RETURN_TRUNC
  36. static char basestring_vsnprintf_buf[16*1024];
  37. #endif
  38. int
  39. basestring_vsnprintf(char *str, size_t size, const char *format, va_list ap)
  40. {
  41.   if (size == 0)
  42.   {
  43. #ifdef SNPRINTF_RETURN_TRUNC
  44.     return vsnprintf(basestring_vsnprintf_buf,
  45.      sizeof(basestring_vsnprintf_buf),
  46.      format, ap);
  47. #else
  48.     char buf[1];
  49.     return vsnprintf(buf, 1, format, ap);
  50. #endif
  51.   }
  52.   {
  53.     int ret= vsnprintf(str, size, format, ap);
  54. #ifdef SNPRINTF_RETURN_TRUNC
  55.     if (ret == size-1 || ret == -1)
  56.     {
  57.       ret= vsnprintf(basestring_vsnprintf_buf,
  58.      sizeof(basestring_vsnprintf_buf),
  59.      format, ap);
  60.     }
  61. #endif
  62.     return ret;
  63.   }
  64. }