xref: /dragonfly/contrib/mpfr/src/printf.c (revision ab6d115f)
14a238c70SJohn Marino /* mpfr_printf -- printf function and friends.
24a238c70SJohn Marino 
3*ab6d115fSJohn Marino Copyright 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
4*ab6d115fSJohn Marino Contributed by the AriC and Caramel projects, INRIA.
54a238c70SJohn Marino 
64a238c70SJohn Marino This file is part of the GNU MPFR Library.
74a238c70SJohn Marino 
84a238c70SJohn Marino The GNU MPFR Library is free software; you can redistribute it and/or modify
94a238c70SJohn Marino it under the terms of the GNU Lesser General Public License as published by
104a238c70SJohn Marino the Free Software Foundation; either version 3 of the License, or (at your
114a238c70SJohn Marino option) any later version.
124a238c70SJohn Marino 
134a238c70SJohn Marino The GNU MPFR Library is distributed in the hope that it will be useful, but
144a238c70SJohn Marino WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
154a238c70SJohn Marino or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
164a238c70SJohn Marino License for more details.
174a238c70SJohn Marino 
184a238c70SJohn Marino You should have received a copy of the GNU Lesser General Public License
194a238c70SJohn Marino along with the GNU MPFR Library; see the file COPYING.LESSER.  If not, see
204a238c70SJohn Marino http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
214a238c70SJohn Marino 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */
224a238c70SJohn Marino 
234a238c70SJohn Marino #ifdef HAVE_CONFIG_H
244a238c70SJohn Marino #include "config.h"
254a238c70SJohn Marino #endif
264a238c70SJohn Marino 
274a238c70SJohn Marino /* The mpfr_printf-like functions are defined only if <stdarg.h> exists */
284a238c70SJohn Marino #ifdef HAVE_STDARG
294a238c70SJohn Marino 
304a238c70SJohn Marino #include <stdarg.h>
314a238c70SJohn Marino 
324a238c70SJohn Marino #ifndef HAVE_VA_COPY
334a238c70SJohn Marino # ifdef HAVE___VA_COPY
344a238c70SJohn Marino #  define va_copy(dst,src) __va_copy(dst, src)
354a238c70SJohn Marino # else
364a238c70SJohn Marino /* autoconf manual advocates this fallback.
374a238c70SJohn Marino    This is also the solution chosen by gmp */
384a238c70SJohn Marino #  define va_copy(dst,src) \
394a238c70SJohn Marino   do { memcpy(&(dst), &(src), sizeof(va_list)); } while (0)
404a238c70SJohn Marino # endif /* HAVE___VA_COPY */
414a238c70SJohn Marino #endif /* HAVE_VA_COPY */
424a238c70SJohn Marino 
434a238c70SJohn Marino #include <errno.h>
444a238c70SJohn Marino #include "mpfr-impl.h"
454a238c70SJohn Marino 
464a238c70SJohn Marino #ifdef _MPFR_H_HAVE_FILE
474a238c70SJohn Marino 
484a238c70SJohn Marino /* Each printf-like function calls mpfr_vasprintf which
494a238c70SJohn Marino    - returns the number of characters in the returned string excluding the
504a238c70SJohn Marino    terminating null
514a238c70SJohn Marino    - returns -1 and sets the erange flag if the number of produced characters
524a238c70SJohn Marino    exceeds INT_MAX (in that case, also sets errno to EOVERFLOW in POSIX
534a238c70SJohn Marino    systems) */
544a238c70SJohn Marino 
554a238c70SJohn Marino #define GET_STR_VA(sz, str, fmt, ap)            \
564a238c70SJohn Marino   do                                            \
574a238c70SJohn Marino     {                                           \
584a238c70SJohn Marino       sz = mpfr_vasprintf (&(str), fmt, ap);    \
594a238c70SJohn Marino       if (sz < 0)                               \
604a238c70SJohn Marino         {                                       \
614a238c70SJohn Marino           if (str)                              \
624a238c70SJohn Marino             mpfr_free_str (str);                \
634a238c70SJohn Marino           return -1;                            \
644a238c70SJohn Marino         }                                       \
654a238c70SJohn Marino     } while (0)
664a238c70SJohn Marino 
674a238c70SJohn Marino #define GET_STR(sz, str, fmt)                   \
684a238c70SJohn Marino   do                                            \
694a238c70SJohn Marino     {                                           \
704a238c70SJohn Marino       va_list ap;                               \
714a238c70SJohn Marino       va_start(ap, fmt);                        \
724a238c70SJohn Marino       sz = mpfr_vasprintf (&(str), fmt, ap);    \
734a238c70SJohn Marino       va_end (ap);                              \
744a238c70SJohn Marino       if (sz < 0)                               \
754a238c70SJohn Marino         {                                       \
764a238c70SJohn Marino           if (str)                              \
774a238c70SJohn Marino             mpfr_free_str (str);                \
784a238c70SJohn Marino           return -1;                            \
794a238c70SJohn Marino         }                                       \
804a238c70SJohn Marino     } while (0)
814a238c70SJohn Marino 
824a238c70SJohn Marino int
mpfr_printf(const char * fmt,...)834a238c70SJohn Marino mpfr_printf (const char *fmt, ...)
844a238c70SJohn Marino {
854a238c70SJohn Marino   char *str;
864a238c70SJohn Marino   int ret;
874a238c70SJohn Marino 
884a238c70SJohn Marino   GET_STR (ret, str, fmt);
894a238c70SJohn Marino   ret = printf ("%s", str);
904a238c70SJohn Marino 
914a238c70SJohn Marino   mpfr_free_str (str);
924a238c70SJohn Marino   return ret;
934a238c70SJohn Marino }
944a238c70SJohn Marino 
954a238c70SJohn Marino int
mpfr_vprintf(const char * fmt,va_list ap)964a238c70SJohn Marino mpfr_vprintf (const char *fmt, va_list ap)
974a238c70SJohn Marino {
984a238c70SJohn Marino   char *str;
994a238c70SJohn Marino   int ret;
1004a238c70SJohn Marino 
1014a238c70SJohn Marino   GET_STR_VA (ret, str, fmt, ap);
1024a238c70SJohn Marino   ret = printf ("%s", str);
1034a238c70SJohn Marino 
1044a238c70SJohn Marino   mpfr_free_str (str);
1054a238c70SJohn Marino   return ret;
1064a238c70SJohn Marino }
1074a238c70SJohn Marino 
1084a238c70SJohn Marino 
1094a238c70SJohn Marino int
mpfr_fprintf(FILE * fp,const char * fmt,...)1104a238c70SJohn Marino mpfr_fprintf (FILE *fp, const char *fmt, ...)
1114a238c70SJohn Marino {
1124a238c70SJohn Marino   char *str;
1134a238c70SJohn Marino   int ret;
1144a238c70SJohn Marino 
1154a238c70SJohn Marino   GET_STR (ret, str, fmt);
1164a238c70SJohn Marino   ret = fprintf (fp, "%s", str);
1174a238c70SJohn Marino 
1184a238c70SJohn Marino   mpfr_free_str (str);
1194a238c70SJohn Marino   return ret;
1204a238c70SJohn Marino }
1214a238c70SJohn Marino 
1224a238c70SJohn Marino int
mpfr_vfprintf(FILE * fp,const char * fmt,va_list ap)1234a238c70SJohn Marino mpfr_vfprintf (FILE *fp, const char *fmt, va_list ap)
1244a238c70SJohn Marino {
1254a238c70SJohn Marino   char *str;
1264a238c70SJohn Marino   int ret;
1274a238c70SJohn Marino 
1284a238c70SJohn Marino   GET_STR_VA (ret, str, fmt, ap);
1294a238c70SJohn Marino   ret = fprintf (fp, "%s", str);
1304a238c70SJohn Marino 
1314a238c70SJohn Marino   mpfr_free_str (str);
1324a238c70SJohn Marino   return ret;
1334a238c70SJohn Marino }
1344a238c70SJohn Marino #endif /* _MPFR_H_HAVE_FILE */
1354a238c70SJohn Marino 
1364a238c70SJohn Marino int
mpfr_sprintf(char * buf,const char * fmt,...)1374a238c70SJohn Marino mpfr_sprintf (char *buf, const char *fmt, ...)
1384a238c70SJohn Marino {
1394a238c70SJohn Marino   char *str;
1404a238c70SJohn Marino   int ret;
1414a238c70SJohn Marino 
1424a238c70SJohn Marino   GET_STR (ret, str, fmt);
1434a238c70SJohn Marino   ret = sprintf (buf, "%s", str);
1444a238c70SJohn Marino 
1454a238c70SJohn Marino   mpfr_free_str (str);
1464a238c70SJohn Marino   return ret;
1474a238c70SJohn Marino }
1484a238c70SJohn Marino 
1494a238c70SJohn Marino int
mpfr_vsprintf(char * buf,const char * fmt,va_list ap)1504a238c70SJohn Marino mpfr_vsprintf (char *buf, const char *fmt, va_list ap)
1514a238c70SJohn Marino {
1524a238c70SJohn Marino   char *str;
1534a238c70SJohn Marino   int ret;
1544a238c70SJohn Marino 
1554a238c70SJohn Marino   GET_STR_VA (ret, str, fmt, ap);
1564a238c70SJohn Marino   ret = sprintf (buf, "%s", str);
1574a238c70SJohn Marino 
1584a238c70SJohn Marino   mpfr_free_str (str);
1594a238c70SJohn Marino   return ret;
1604a238c70SJohn Marino }
1614a238c70SJohn Marino 
1624a238c70SJohn Marino int
mpfr_snprintf(char * buf,size_t size,const char * fmt,...)1634a238c70SJohn Marino mpfr_snprintf (char *buf, size_t size, const char *fmt, ...)
1644a238c70SJohn Marino {
1654a238c70SJohn Marino   char *str;
1664a238c70SJohn Marino   int ret;
1674a238c70SJohn Marino   size_t min_size;
1684a238c70SJohn Marino 
1694a238c70SJohn Marino   GET_STR (ret, str, fmt);
1704a238c70SJohn Marino 
1714a238c70SJohn Marino   /* C99 allows SIZE to be zero */
1724a238c70SJohn Marino   if (size != 0)
1734a238c70SJohn Marino     {
1744a238c70SJohn Marino       MPFR_ASSERTN (buf != NULL);
1754a238c70SJohn Marino       min_size = (size_t)ret < size ? (size_t)ret : size - 1;
1764a238c70SJohn Marino       strncpy (buf, str, min_size);
1774a238c70SJohn Marino       buf[min_size] = '\0';
1784a238c70SJohn Marino     }
1794a238c70SJohn Marino 
1804a238c70SJohn Marino   mpfr_free_str (str);
1814a238c70SJohn Marino   return ret;
1824a238c70SJohn Marino }
1834a238c70SJohn Marino 
1844a238c70SJohn Marino int
mpfr_vsnprintf(char * buf,size_t size,const char * fmt,va_list ap)1854a238c70SJohn Marino mpfr_vsnprintf (char *buf, size_t size, const char *fmt, va_list ap)
1864a238c70SJohn Marino {
1874a238c70SJohn Marino   char *str;
1884a238c70SJohn Marino   int ret;
1894a238c70SJohn Marino   int min_size;
1904a238c70SJohn Marino 
1914a238c70SJohn Marino   GET_STR_VA (ret, str, fmt, ap);
1924a238c70SJohn Marino 
1934a238c70SJohn Marino   /* C99 allows SIZE to be zero */
1944a238c70SJohn Marino   if (size != 0)
1954a238c70SJohn Marino     {
1964a238c70SJohn Marino       MPFR_ASSERTN (buf != NULL);
1974a238c70SJohn Marino       min_size = (size_t)ret < size ? (size_t)ret : size - 1;
1984a238c70SJohn Marino       strncpy (buf, str, min_size);
1994a238c70SJohn Marino       buf[min_size] = '\0';
2004a238c70SJohn Marino     }
2014a238c70SJohn Marino 
2024a238c70SJohn Marino   mpfr_free_str (str);
2034a238c70SJohn Marino   return ret;
2044a238c70SJohn Marino }
2054a238c70SJohn Marino 
2064a238c70SJohn Marino int
mpfr_asprintf(char ** pp,const char * fmt,...)2074a238c70SJohn Marino mpfr_asprintf (char **pp, const char *fmt, ...)
2084a238c70SJohn Marino {
2094a238c70SJohn Marino   int ret;
2104a238c70SJohn Marino 
2114a238c70SJohn Marino   GET_STR (ret, *pp, fmt);
2124a238c70SJohn Marino 
2134a238c70SJohn Marino   return ret;
2144a238c70SJohn Marino }
2154a238c70SJohn Marino #endif /* HAVE_STDARG */
216