1*d30dc8cbSJohn Marino /* logging.c -- "Dummy" functions logging calls to real mpc functions. 2*d30dc8cbSJohn Marino 3*d30dc8cbSJohn Marino Copyright (C) 2011 INRIA 4*d30dc8cbSJohn Marino 5*d30dc8cbSJohn Marino This file is part of GNU MPC. 6*d30dc8cbSJohn Marino 7*d30dc8cbSJohn Marino GNU MPC is free software; you can redistribute it and/or modify it under 8*d30dc8cbSJohn Marino the terms of the GNU Lesser General Public License as published by the 9*d30dc8cbSJohn Marino Free Software Foundation; either version 3 of the License, or (at your 10*d30dc8cbSJohn Marino option) any later version. 11*d30dc8cbSJohn Marino 12*d30dc8cbSJohn Marino GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY 13*d30dc8cbSJohn Marino WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 14*d30dc8cbSJohn Marino FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for 15*d30dc8cbSJohn Marino more details. 16*d30dc8cbSJohn Marino 17*d30dc8cbSJohn Marino You should have received a copy of the GNU Lesser General Public License 18*d30dc8cbSJohn Marino along with this program. If not, see http://www.gnu.org/licenses/ . 19*d30dc8cbSJohn Marino */ 20*d30dc8cbSJohn Marino 21*d30dc8cbSJohn Marino #include "config.h" 22*d30dc8cbSJohn Marino #include <stdio.h> 23*d30dc8cbSJohn Marino 24*d30dc8cbSJohn Marino #ifdef HAVE_INTTYPES_H 25*d30dc8cbSJohn Marino #include <inttypes.h> 26*d30dc8cbSJohn Marino #endif 27*d30dc8cbSJohn Marino #ifdef HAVE_STDINT_H 28*d30dc8cbSJohn Marino #include <stdint.h> 29*d30dc8cbSJohn Marino #endif 30*d30dc8cbSJohn Marino 31*d30dc8cbSJohn Marino #define __MPC_LIBRARY_BUILD 32*d30dc8cbSJohn Marino /* to indicate we are inside the library build; needed here since mpc-log.h 33*d30dc8cbSJohn Marino includes mpc.h and not mpc-impl.h */ 34*d30dc8cbSJohn Marino #include "mpc-log.h" 35*d30dc8cbSJohn Marino 36*d30dc8cbSJohn Marino #ifdef HAVE_DLFCN_H 37*d30dc8cbSJohn Marino #include <dlfcn.h> 38*d30dc8cbSJohn Marino #endif 39*d30dc8cbSJohn Marino 40*d30dc8cbSJohn Marino typedef int (*c_c_func_ptr) (mpc_ptr, mpc_srcptr, mpc_rnd_t); 41*d30dc8cbSJohn Marino typedef int (*c_cc_func_ptr) (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); 42*d30dc8cbSJohn Marino typedef int (*c_ccc_func_ptr) (mpc_ptr, mpc_srcptr, mpc_srcptr, mpc_srcptr, mpc_rnd_t); 43*d30dc8cbSJohn Marino typedef int (*cc_c_func_ptr) (mpc_ptr, mpc_ptr, mpc_srcptr, mpc_rnd_t, mpc_rnd_t); 44*d30dc8cbSJohn Marino 45*d30dc8cbSJohn Marino #define MPC_LOGGING_OUT_PREC(z) \ 46*d30dc8cbSJohn Marino do { \ 47*d30dc8cbSJohn Marino fprintf (stderr, " %li %li", (long) mpfr_get_prec (mpc_realref (z)), \ 48*d30dc8cbSJohn Marino (long) mpfr_get_prec (mpc_imagref (z))); \ 49*d30dc8cbSJohn Marino } while (0); 50*d30dc8cbSJohn Marino 51*d30dc8cbSJohn Marino #define MPC_LOGGING_OUT_C(z) \ 52*d30dc8cbSJohn Marino do { \ 53*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (z); \ 54*d30dc8cbSJohn Marino fprintf (stderr, " "); \ 55*d30dc8cbSJohn Marino mpc_out_str (stderr, 16, 0, z, MPC_RNDNN); \ 56*d30dc8cbSJohn Marino } while (0); 57*d30dc8cbSJohn Marino 58*d30dc8cbSJohn Marino #define MPC_LOGGING_FUNC_TYPE(funcname, type) \ 59*d30dc8cbSJohn Marino do { \ 60*d30dc8cbSJohn Marino fprintf (stderr, "mpc_"#funcname" "#type); \ 61*d30dc8cbSJohn Marino } while (0); 62*d30dc8cbSJohn Marino 63*d30dc8cbSJohn Marino #define MPC_LOGGING_C_C(funcname) \ 64*d30dc8cbSJohn Marino __MPC_DECLSPEC int mpc_log_##funcname (mpc_ptr rop, mpc_srcptr op, mpc_rnd_t rnd) \ 65*d30dc8cbSJohn Marino { \ 66*d30dc8cbSJohn Marino static c_c_func_ptr func = NULL; \ 67*d30dc8cbSJohn Marino if (func == NULL) \ 68*d30dc8cbSJohn Marino func = (c_c_func_ptr) (intptr_t) dlsym (NULL, "mpc_"#funcname); \ 69*d30dc8cbSJohn Marino MPC_LOGGING_FUNC_TYPE (funcname, c_c); \ 70*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (rop); \ 71*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op); \ 72*d30dc8cbSJohn Marino fprintf (stderr, "\n"); \ 73*d30dc8cbSJohn Marino return func (rop, op, rnd); \ 74*d30dc8cbSJohn Marino } 75*d30dc8cbSJohn Marino 76*d30dc8cbSJohn Marino #define MPC_LOGGING_C_CC(funcname) \ 77*d30dc8cbSJohn Marino __MPC_DECLSPEC int mpc_log_##funcname (mpc_ptr rop, mpc_srcptr op1, mpc_srcptr op2, mpc_rnd_t rnd) \ 78*d30dc8cbSJohn Marino { \ 79*d30dc8cbSJohn Marino static c_cc_func_ptr func = NULL; \ 80*d30dc8cbSJohn Marino if (func == NULL) \ 81*d30dc8cbSJohn Marino func = (c_cc_func_ptr) (intptr_t) dlsym (NULL, "mpc_"#funcname); \ 82*d30dc8cbSJohn Marino MPC_LOGGING_FUNC_TYPE (funcname, c_cc); \ 83*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (rop); \ 84*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op1); \ 85*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op2); \ 86*d30dc8cbSJohn Marino fprintf (stderr, "\n"); \ 87*d30dc8cbSJohn Marino return func (rop, op1, op2, rnd); \ 88*d30dc8cbSJohn Marino } 89*d30dc8cbSJohn Marino 90*d30dc8cbSJohn Marino #define MPC_LOGGING_C_CCC(funcname) \ 91*d30dc8cbSJohn Marino __MPC_DECLSPEC int mpc_log_##funcname (mpc_ptr rop, mpc_srcptr op1, mpc_srcptr op2, mpc_srcptr op3, mpc_rnd_t rnd) \ 92*d30dc8cbSJohn Marino { \ 93*d30dc8cbSJohn Marino static c_ccc_func_ptr func = NULL; \ 94*d30dc8cbSJohn Marino if (func == NULL) \ 95*d30dc8cbSJohn Marino func = (c_ccc_func_ptr) (intptr_t) dlsym (NULL, "mpc_"#funcname); \ 96*d30dc8cbSJohn Marino MPC_LOGGING_FUNC_TYPE (funcname, c_ccc); \ 97*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (rop); \ 98*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op1); \ 99*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op2); \ 100*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op3); \ 101*d30dc8cbSJohn Marino fprintf (stderr, "\n"); \ 102*d30dc8cbSJohn Marino return func (rop, op1, op2, op3, rnd); \ 103*d30dc8cbSJohn Marino } 104*d30dc8cbSJohn Marino 105*d30dc8cbSJohn Marino #define MPC_LOGGING_CC_C(funcname) \ 106*d30dc8cbSJohn Marino __MPC_DECLSPEC int mpc_log_##funcname (mpc_ptr rop1, mpc_ptr rop2, mpc_srcptr op, mpc_rnd_t rnd1, mpc_rnd_t rnd2) \ 107*d30dc8cbSJohn Marino { \ 108*d30dc8cbSJohn Marino static cc_c_func_ptr func = NULL; \ 109*d30dc8cbSJohn Marino if (func == NULL) \ 110*d30dc8cbSJohn Marino func = (cc_c_func_ptr) (intptr_t) dlsym (NULL, "mpc_"#funcname); \ 111*d30dc8cbSJohn Marino MPC_LOGGING_FUNC_TYPE (funcname, cc_c); \ 112*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (rop1); \ 113*d30dc8cbSJohn Marino MPC_LOGGING_OUT_PREC (rop2); \ 114*d30dc8cbSJohn Marino MPC_LOGGING_OUT_C (op); \ 115*d30dc8cbSJohn Marino fprintf (stderr, "\n"); \ 116*d30dc8cbSJohn Marino return func (rop1, rop2, op, rnd1, rnd2); \ 117*d30dc8cbSJohn Marino } 118*d30dc8cbSJohn Marino 119*d30dc8cbSJohn Marino MPC_LOGGING_C_C (sqr) 120*d30dc8cbSJohn Marino MPC_LOGGING_C_C (conj) 121*d30dc8cbSJohn Marino MPC_LOGGING_C_C (neg) 122*d30dc8cbSJohn Marino MPC_LOGGING_C_C (sqrt) 123*d30dc8cbSJohn Marino MPC_LOGGING_C_C (proj) 124*d30dc8cbSJohn Marino MPC_LOGGING_C_C (exp) 125*d30dc8cbSJohn Marino MPC_LOGGING_C_C (log) 126*d30dc8cbSJohn Marino MPC_LOGGING_C_C (sin) 127*d30dc8cbSJohn Marino MPC_LOGGING_C_C (cos) 128*d30dc8cbSJohn Marino MPC_LOGGING_C_C (tan) 129*d30dc8cbSJohn Marino MPC_LOGGING_C_C (sinh) 130*d30dc8cbSJohn Marino MPC_LOGGING_C_C (cosh) 131*d30dc8cbSJohn Marino MPC_LOGGING_C_C (tanh) 132*d30dc8cbSJohn Marino MPC_LOGGING_C_C (asin) 133*d30dc8cbSJohn Marino MPC_LOGGING_C_C (acos) 134*d30dc8cbSJohn Marino MPC_LOGGING_C_C (atan) 135*d30dc8cbSJohn Marino MPC_LOGGING_C_C (asinh) 136*d30dc8cbSJohn Marino MPC_LOGGING_C_C (acosh) 137*d30dc8cbSJohn Marino MPC_LOGGING_C_C (atanh) 138*d30dc8cbSJohn Marino 139*d30dc8cbSJohn Marino MPC_LOGGING_C_CC (add) 140*d30dc8cbSJohn Marino MPC_LOGGING_C_CC (sub) 141*d30dc8cbSJohn Marino MPC_LOGGING_C_CC (mul) 142*d30dc8cbSJohn Marino MPC_LOGGING_C_CC (div) 143*d30dc8cbSJohn Marino MPC_LOGGING_C_CC (pow) 144*d30dc8cbSJohn Marino 145*d30dc8cbSJohn Marino MPC_LOGGING_C_CCC (fma) 146*d30dc8cbSJohn Marino 147*d30dc8cbSJohn Marino MPC_LOGGING_CC_C (sin_cos) 148