cat > script.c <<'+-+-+-+-+-END-OF-FILE-+-+-+-+-+'

/* This test is part of the standard user test. Hence, no
 * internal include file should be used here.
 */
#include	<mscc.h>

global_shared_func	void		msbacker_err_msg(char*, ...);

# define  TOL	1e-5
# define  err(a, b)	msbacker_err_msg ("%s %s", a, b);
# define  errput(s)	err ("can't putvs", s)
# define  errget(s)	err ("can't copyv", s)
# define  errequal(s)	err ("not accurate", s)

struct fs
{
	char	*ascii;
	float	internal;
} input[] =
{
	{ "1.0", 1.0 },
	{ "1.1", 1.1 },
	{ ".9",   .9 },
	{ "1.4e11", 1.4e11 },
	{ "1.4e-11", 1.4e-11 }
};
# define  NINPUT  (sizeof (input) / sizeof (struct fs))

int	fltequal (d1, d2)
	double	d1, d2;
{
	double	error;

	error = (d1 - d2) / d1;
	return (-TOL <= error  &&  error <= TOL);
}

int	msmain (argc, argv)
		int	argc;
		char	**argv;
{
	extern	double atof ();

	addr	tab_desc, rec_desc, attr_desc, fetch_desc;
	char	*flt_value;
	int	i;

	/* insert the numbers */

	tab_desc = mropen (argv[1], "tab", 'u');

	rec_desc = mrmkrec (tab_desc);
	attr_desc = mrngeta (tab_desc, "float");

	for (i=0; i < NINPUT; ++i)
	{
		if (! mrputvs (rec_desc, attr_desc, input[i].ascii))
			errput (input[i].ascii);
		mradd (rec_desc);
	}
	mraddend (rec_desc);

	mrfrrec (rec_desc);
	mrclose (tab_desc);

	/* retrieve the numbers, check for accurary */

	tab_desc = mropen (argv[1], "tab", 'r');

	rec_desc = mrmkrec (tab_desc);
	attr_desc = mrngeta (tab_desc, "float");
	flt_value = mrspv (attr_desc);

	fetch_desc = mrgetbegin (ADDRNIL, rec_desc, ADDRNIL);
	for (i=0; i < NINPUT; ++i)
	{
		if (mrget (fetch_desc) <= 0)
			errget (input[i].ascii);
		mrcopyv (rec_desc, attr_desc, flt_value);
# ifdef  DEBUG
		printf ("original = %s or %g, from db = %s or %g\n",
			input[i].ascii, input[i].internal,
			flt_value, atof (flt_value));
# endif
		if (! fltequal (input[i].internal, atof (flt_value)))
			errequal (input[i].ascii);
	}
	if (mrget (fetch_desc) > 0)
		err ("test out of sync", "");
	mrgetend (fetch_desc);

	mrfree (flt_value);
	mrfrrec (rec_desc);

	mrclose (tab_desc);
	printf ("float ok\n");
	return 0;
}
+-+-+-+-+-END-OF-FILE-+-+-+-+-+
chmod 644 script.c
cat > stdout <<'+-+-+-+-+-END-OF-FILE-+-+-+-+-+'
float ok
+-+-+-+-+-END-OF-FILE-+-+-+-+-+
chmod 644 stdout
cat > tag <<'+-+-+-+-+-END-OF-FILE-+-+-+-+-+'
Test float
+-+-+-+-+-END-OF-FILE-+-+-+-+-+
chmod 644 tag
