/*
 * The Spar Library - modular math parser
 * Copyright (C) 2000,2001 Davide Angelocola <davide178@inwind.it>
 *
 * 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 <stdio.h>
#include <string.h>
#include <spar/sl_io.h>


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);
}


syntax highlighted by Code2HTML, v. 0.9.1