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