/* * The Spar Library - modular math parser * Copyright (C) 2000,2001 Davide Angelocola * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. * */ #include #include #include static sl_precision precision = { integer:SL_DEFAULT_INTEGER_PRECISION, decimal:SL_DEFAULT_INTEGER_PRECISION }; /* * If there is any call to the sl_writer_set_precision * this flag is setted to 1 * */ static bool __is_changed = true; // use sl_size type for i and d void sl_writer_set_precision (int i, int d) { if (d < 0) d = -d; if (i < 0) i = -i; precision.integer = i; precision.decimal = d; __is_changed = true; } static void __precision_fmt (char *buf) { static char __prec[SL_MAX_BUFFER_LEN + 1]; if (!__is_changed) { strcpy (buf, __prec); } else { char __buf[SL_MAX_BUFFER_LEN + 1]; snprintf (__buf, SL_MAX_BUFFER_LEN, "-%d.%dg", precision.integer, precision.decimal); strcpy (buf, "%"); strcat (buf, __buf); strcpy (__prec, buf); __is_changed = false; //sl_writeln ("__prec CHANGED to '%s'", __prec); } } void sl_write_value_with_label (const char *msg, double v) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int c; __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, v); buf[c] = '\0'; sl_writeln ("%s = %s", msg, buf); } void sl_writeln_value_with_label (const char *msg, double v) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int c; __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, v); buf[c] = '\0'; sl_writeln ("%s = ", msg); } void sl_write_value (double n) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int c; __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_write ("%s", buf); } void sl_writeln_value (double n) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int c; __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_writeln ("%s", buf); } void sl_write_value_with_precision (double n, int integer, int decimal) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int save_integer_precision = precision.integer; int save_decimal_precision = precision.decimal; int c; sl_writer_set_precision (integer, decimal); __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_write ("%s", buf); sl_writer_set_precision (save_integer_precision, save_decimal_precision); } void sl_writeln_value_with_precision (double n, int integer, int decimal) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int save_integer_precision = precision.integer; int save_decimal_precision = precision.decimal; int c; sl_writer_set_precision (integer, decimal); __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_writeln ("%s", buf); sl_writer_set_precision (save_integer_precision, save_decimal_precision); } void sl_write_value_with_label_and_precision (const char *msg, double n, int integer, int decimal) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int save_integer_precision = precision.integer; int save_decimal_precision = precision.decimal; int c; sl_writer_set_precision (integer, decimal); __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_write ("%s = %s", msg, buf); sl_writer_set_precision (save_integer_precision, save_decimal_precision); } void sl_writeln_value_with_label_and_precision (const char *msg, double n, int integer, int decimal) { char buf[SL_MAX_BUFFER_LEN + 1]; char prec[SL_MAX_BUFFER_LEN + 1]; int save_integer_precision = precision.integer; int save_decimal_precision = precision.decimal; int c; sl_writer_set_precision (integer, decimal); __precision_fmt (prec); c = snprintf (buf, SL_MAX_BUFFER_LEN, prec, n); buf[c] = '\0'; sl_writeln ("%s = %s", msg, buf); sl_writer_set_precision (save_integer_precision, save_decimal_precision); }