1 1.1 mrg /* GCC Quad-Precision Math Library 2 1.1 mrg Copyright (C) 2011 Free Software Foundation, Inc. 3 1.1 mrg Written by Jakub Jelinek <jakub (at) redhat.com> 4 1.1 mrg 5 1.1 mrg This file is part of the libquadmath library. 6 1.1 mrg Libquadmath is free software; you can redistribute it and/or 7 1.1 mrg modify it under the terms of the GNU Library General Public 8 1.1 mrg License as published by the Free Software Foundation; either 9 1.1 mrg version 2 of the License, or (at your option) any later version. 10 1.1 mrg 11 1.1 mrg Libquadmath is distributed in the hope that it will be useful, 12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of 13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 1.1 mrg Library General Public License for more details. 15 1.1 mrg 16 1.1 mrg You should have received a copy of the GNU Library General Public 17 1.1 mrg License along with libquadmath; see the file COPYING.LIB. If 18 1.1 mrg not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, 19 1.1 mrg Boston, MA 02110-1301, USA. */ 20 1.1 mrg 21 1.1 mrg #include <stdlib.h> 22 1.1 mrg #include <stdio.h> 23 1.1 mrg #ifdef HAVE_LIMITS_H 24 1.1 mrg #include <limits.h> 25 1.1 mrg #endif 26 1.1 mrg #ifdef HAVE_LANGINFO_H 27 1.1 mrg #include <langinfo.h> 28 1.1 mrg #endif 29 1.1 mrg #ifdef HAVE_CTYPE_H 30 1.1 mrg #include <ctype.h> 31 1.1 mrg #endif 32 1.1 mrg #ifdef HAVE_WCHAR_H 33 1.1 mrg #include <wchar.h> 34 1.1 mrg #endif 35 1.1 mrg #ifdef HAVE_WCTYPE_H 36 1.1 mrg #include <wctype.h> 37 1.1 mrg #endif 38 1.1 mrg #ifdef HAVE_PRINTF_HOOKS 39 1.1 mrg #include <printf.h> 40 1.1 mrg #endif 41 1.1 mrg #ifdef HAVE_LOCALE_H 42 1.1 mrg #include <locale.h> 43 1.1 mrg #endif 44 1.1 mrg #include "quadmath-imp.h" 45 1.1 mrg #include "gmp-impl.h" 46 1.1 mrg 47 1.1 mrg #ifdef HAVE_WCHAR_H 48 1.1 mrg #define L_(x) L##x 49 1.1 mrg #else 50 1.1 mrg #define L_(x) x 51 1.1 mrg #undef wchar_t 52 1.1 mrg #undef wint_t 53 1.1 mrg #undef putwc 54 1.1 mrg #undef WEOF 55 1.1 mrg #define wchar_t char 56 1.1 mrg #define wint_t int 57 1.1 mrg #define putwc(c,f) putc(c,f) 58 1.1 mrg #define WEOF EOF 59 1.1 mrg #endif 60 1.1 mrg 61 1.1 mrg #ifndef HAVE_CTYPE_H 62 1.1 mrg /* Won't work for EBCDIC. */ 63 1.1 mrg #undef isupper 64 1.1 mrg #undef isdigit 65 1.1 mrg #undef isxdigit 66 1.1 mrg #undef tolower 67 1.1 mrg #define isupper(x) \ 68 1.1 mrg ({__typeof(x) __is_x = (x); __is_x >= 'A' && __is_x <= 'Z'; }) 69 1.1 mrg #define isdigit(x) \ 70 1.1 mrg ({__typeof(x) __is_x = (x); __is_x >= '0' && __is_x <= '9'; }) 71 1.1 mrg #define isxdigit(x) \ 72 1.1 mrg ({__typeof(x) __is_x = (x); \ 73 1.1 mrg (__is_x >= '0' && __is_x <= '9') \ 74 1.1 mrg || ((x) >= 'A' && (x) <= 'F') \ 75 1.1 mrg || ((x) >= 'a' && (x) <= 'f'); }) 76 1.1 mrg #define tolower(x) \ 77 1.1 mrg ({__typeof(x) __is_x = (x); \ 78 1.1 mrg (__is_x >= 'A' && __is_x <= 'Z') ? __is_x - 'A' + 'a' : __is_x; }) 79 1.1 mrg #endif 80 1.1 mrg 81 1.1 mrg #ifndef CHAR_MAX 82 1.1 mrg #ifdef __CHAR_UNSIGNED__ 83 1.1 mrg #define CHAR_MAX (2 * __SCHAR_MAX__ + 1) 84 1.1 mrg #else 85 1.1 mrg #define CHAR_MAX __SCHAR_MAX__ 86 1.1 mrg #endif 87 1.1 mrg #endif 88 1.1 mrg 89 1.1 mrg #ifndef HAVE_PRINTF_HOOKS 90 1.1 mrg #define printf_info __quadmath_printf_info 91 1.1 mrg struct printf_info 92 1.1 mrg { 93 1.1 mrg int prec; /* Precision. */ 94 1.1 mrg int width; /* Width. */ 95 1.1 mrg wchar_t spec; /* Format letter. */ 96 1.1 mrg unsigned int is_long_double:1;/* L flag. */ 97 1.1 mrg unsigned int is_short:1; /* h flag. */ 98 1.1 mrg unsigned int is_long:1; /* l flag. */ 99 1.1 mrg unsigned int alt:1; /* # flag. */ 100 1.1 mrg unsigned int space:1; /* Space flag. */ 101 1.1 mrg unsigned int left:1; /* - flag. */ 102 1.1 mrg unsigned int showsign:1; /* + flag. */ 103 1.1 mrg unsigned int group:1; /* ' flag. */ 104 1.1 mrg unsigned int extra:1; /* For special use. */ 105 1.1 mrg unsigned int is_char:1; /* hh flag. */ 106 1.1 mrg unsigned int wide:1; /* Nonzero for wide character streams. */ 107 1.1 mrg unsigned int i18n:1; /* I flag. */ 108 1.1 mrg unsigned short int user; /* Bits for user-installed modifiers. */ 109 1.1 mrg wchar_t pad; /* Padding character. */ 110 1.1 mrg }; 111 1.1 mrg #endif 112 1.1 mrg 113 1.1 mrg struct __quadmath_printf_file 114 1.1 mrg { 115 1.1 mrg FILE *fp; 116 1.1 mrg char *str; 117 1.1 mrg size_t size; 118 1.1 mrg size_t len; 119 1.1 mrg int file_p; 120 1.1 mrg }; 121 1.1 mrg 122 1.1 mrg int 123 1.1 mrg __quadmath_printf_fp (struct __quadmath_printf_file *fp, 124 1.1 mrg const struct printf_info *info, 125 1.1 mrg const void *const *args) attribute_hidden; 126 1.1 mrg int 127 1.1 mrg __quadmath_printf_fphex (struct __quadmath_printf_file *fp, 128 1.1 mrg const struct printf_info *info, 129 1.1 mrg const void *const *args) attribute_hidden; 130 1.1 mrg 131 1.1 mrg size_t __quadmath_do_pad (struct __quadmath_printf_file *fp, int wide, 132 1.1 mrg int c, size_t n) attribute_hidden; 133 1.1 mrg 134 1.1 mrg static inline __attribute__((__unused__)) size_t 135 1.1 mrg __quadmath_do_put (struct __quadmath_printf_file *fp, int wide, 136 1.1 mrg const char *s, size_t n) 137 1.1 mrg { 138 1.1 mrg size_t len; 139 1.1 mrg if (fp->file_p) 140 1.1 mrg { 141 1.1 mrg if (wide) 142 1.1 mrg { 143 1.1 mrg size_t cnt; 144 1.1 mrg const wchar_t *ls = (const wchar_t *) s; 145 1.1 mrg for (cnt = 0; cnt < n; cnt++) 146 1.1 mrg if (putwc (ls[cnt], fp->fp) == WEOF) 147 1.1 mrg break; 148 1.1 mrg return cnt; 149 1.1 mrg } 150 1.1 mrg return fwrite (s, 1, n, fp->fp); 151 1.1 mrg } 152 1.1 mrg len = MIN (fp->size, n); 153 1.1 mrg memcpy (fp->str, s, len); 154 1.1 mrg fp->str += len; 155 1.1 mrg fp->size -= len; 156 1.1 mrg fp->len += n; 157 1.1 mrg return n; 158 1.1 mrg } 159 1.1 mrg 160 1.1 mrg static inline __attribute__((__unused__)) int 161 1.1 mrg __quadmath_do_putc (struct __quadmath_printf_file *fp, int wide, 162 1.1 mrg wchar_t c) 163 1.1 mrg { 164 1.1 mrg if (fp->file_p) 165 1.1 mrg return wide ? (int) putwc (c, fp->fp) : putc (c, fp->fp); 166 1.1 mrg if (fp->size) 167 1.1 mrg { 168 1.1 mrg *(fp->str++) = c; 169 1.1 mrg fp->size--; 170 1.1 mrg } 171 1.1 mrg fp->len++; 172 1.1 mrg return (unsigned char) c; 173 1.1 mrg } 174 1.1 mrg 175 1.1 mrg #define PUT(f, s, n) __quadmath_do_put (f, wide, s, n) 176 1.1 mrg #define PAD(f, c, n) __quadmath_do_pad (f, wide, c, n) 177 1.1 mrg #define PUTC(c, f) __quadmath_do_putc (f, wide, c) 178 1.1 mrg 179 1.1 mrg #define nl_langinfo_wc(x) \ 180 1.1 mrg ({ union { const char *mb; wchar_t wc; } u; u.mb = nl_langinfo (x); u.wc; }) 181 1.1 mrg 182 1.1 mrg #undef _itoa 183 1.1 mrg #define _itoa __quadmath_itoa 184 1.1 mrg 185 1.1 mrg #undef NAN 186 1.1 mrg #define NAN __builtin_nanf ("") 187