190792Sgshapiro/*
2261363Sgshapiro * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
390792Sgshapiro *	All rights reserved.
490792Sgshapiro *
590792Sgshapiro * By using this file, you agree to the terms and conditions set
690792Sgshapiro * forth in the LICENSE file which can be found at the top level of
790792Sgshapiro * the sendmail distribution.
890792Sgshapiro */
990792Sgshapiro
1090792Sgshapiro#include <sm/gen.h>
11266692SgshapiroSM_IDSTR(id, "@(#)$Id: t-float.c,v 1.19 2013-11-22 20:51:43 ca Exp $")
1290792Sgshapiro
1390792Sgshapiro#include <sm/limits.h>
1490792Sgshapiro#include <sm/io.h>
1590792Sgshapiro#include <sm/string.h>
1690792Sgshapiro#include <sm/test.h>
1790792Sgshapiro#include <sm/types.h>
1890792Sgshapiro
1990792Sgshapiroint
2090792Sgshapiromain(argc, argv)
2190792Sgshapiro	int argc;
2290792Sgshapiro	char **argv;
2390792Sgshapiro{
2490792Sgshapiro	double d, d2;
2590792Sgshapiro	double ld;
2690792Sgshapiro	char buf[128];
2790792Sgshapiro	char *r;
2890792Sgshapiro
2990792Sgshapiro	/*
3090792Sgshapiro	**  Sendmail uses printf and scanf with doubles,
3190792Sgshapiro	**  so make sure that this works.
3290792Sgshapiro	*/
3390792Sgshapiro
3490792Sgshapiro	sm_test_begin(argc, argv, "test floating point stuff");
3590792Sgshapiro
3690792Sgshapiro	d = 1.125;
3790792Sgshapiro	sm_snprintf(buf, sizeof(buf), "%d %.3f %d", 0, d, 1);
3890792Sgshapiro	r = "0 1.125 1";
3990792Sgshapiro	if (!SM_TEST(strcmp(buf, r) == 0))
4090792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
4190792Sgshapiro				     "got %s instead\n", buf);
4290792Sgshapiro
4390792Sgshapiro	d = 1.125;
4490792Sgshapiro	sm_snprintf(buf, sizeof(buf), "%.3f", d);
4590792Sgshapiro	r = "1.125";
4690792Sgshapiro	if (!SM_TEST(strcmp(buf, r) == 0))
4790792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
4890792Sgshapiro				     "got %s instead\n", buf);
4990792Sgshapiro	d2 = 0.0;
5090792Sgshapiro	sm_io_sscanf(buf, "%lf", &d2);
5190792Sgshapiro#if SM_CONF_BROKEN_STRTOD
5290792Sgshapiro	if (d != d2)
5390792Sgshapiro	{
5490792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
5590792Sgshapiro				     "wanted %f, got %f\n", d, d2);
5690792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
5790792Sgshapiro				     "error ignored since SM_CONF_BROKEN_STRTOD is set for this OS\n");
5890792Sgshapiro	}
5990792Sgshapiro#else /* SM_CONF_BROKEN_STRTOD */
6090792Sgshapiro	if (!SM_TEST(d == d2))
6190792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
6290792Sgshapiro				     "wanted %f, got %f\n", d, d2);
6390792Sgshapiro#endif /* SM_CONF_BROKEN_STRTOD */
6490792Sgshapiro
6590792Sgshapiro	ld = 2.5;
6690792Sgshapiro	sm_snprintf(buf, sizeof(buf), "%.3f %.1f", d, ld);
6790792Sgshapiro	r = "1.125 2.5";
6890792Sgshapiro	if (!SM_TEST(strcmp(buf, r) == 0))
6990792Sgshapiro		(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
7090792Sgshapiro				     "got %s instead\n", buf);
7190792Sgshapiro	return sm_test_end();
7290792Sgshapiro}
73