nan.c revision 1.1
11.1Skleink/* $NetBSD: nan.c,v 1.1 2006/03/15 22:07:09 kleink Exp $ */
21.1Skleink
31.1Skleink/*-
41.1Skleink * Copyright (c) 2006 The NetBSD Foundation, Inc.
51.1Skleink * All rights reserved.
61.1Skleink *
71.1Skleink * This code is derived from software contributed to The NetBSD Foundation
81.1Skleink * by Klaus Klein.
91.1Skleink *
101.1Skleink * Redistribution and use in source and binary forms, with or without
111.1Skleink * modification, are permitted provided that the following conditions
121.1Skleink * are met:
131.1Skleink * 1. Redistributions of source code must retain the above copyright
141.1Skleink *    notice, this list of conditions and the following disclaimer.
151.1Skleink * 2. Redistributions in binary form must reproduce the above copyright
161.1Skleink *    notice, this list of conditions and the following disclaimer in the
171.1Skleink *    documentation and/or other materials provided with the distribution.
181.1Skleink * 3. All advertising materials mentioning features or use of this software
191.1Skleink *    must display the following acknowledgement:
201.1Skleink *        This product includes software developed by the NetBSD
211.1Skleink *        Foundation, Inc. and its contributors.
221.1Skleink * 4. Neither the name of The NetBSD Foundation nor the names of its
231.1Skleink *    contributors may be used to endorse or promote products derived
241.1Skleink *    from this software without specific prior written permission.
251.1Skleink *
261.1Skleink * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
271.1Skleink * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
281.1Skleink * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
291.1Skleink * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
301.1Skleink * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
311.1Skleink * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
321.1Skleink * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
331.1Skleink * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
341.1Skleink * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
351.1Skleink * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
361.1Skleink * POSSIBILITY OF SUCH DAMAGE.
371.1Skleink */
381.1Skleink
391.1Skleink#include <sys/cdefs.h>
401.1Skleink#if defined(LIBM_SCCS) && !defined(lint) && !defined(NAN_FUNCTION)
411.1Skleink__RCSID("$NetBSD: nan.c,v 1.1 2006/03/15 22:07:09 kleink Exp $");
421.1Skleink#endif /* LIBM_SCCS and not lint */
431.1Skleink
441.1Skleink#include <assert.h>
451.1Skleink#include <math.h>
461.1Skleink#include <stddef.h>
471.1Skleink#include <stdlib.h>
481.1Skleink#include <string.h>
491.1Skleink
501.1Skleink
511.1Skleink#ifndef NAN_FUNCTION
521.1Skleink#define	NAN_FUNCTION	nan
531.1Skleink#define	NAN_TYPE	double
541.1Skleink#define	NAN_STRTOD	strtod
551.1Skleink#endif
561.1Skleink
571.1SkleinkNAN_TYPE
581.1SkleinkNAN_FUNCTION(const char *tagp)
591.1Skleink{
601.1Skleink	const char *nstr;
611.1Skleink	char *buf;
621.1Skleink	NAN_TYPE res;
631.1Skleink
641.1Skleink	_DIAGASSERT(tagp != NULL);
651.1Skleink
661.1Skleink	nstr = "NAN()";
671.1Skleink	buf = NULL;
681.1Skleink
691.1Skleink	if (tagp[0] != '\0') {
701.1Skleink		size_t l;
711.1Skleink
721.1Skleink		l = strlen(tagp);
731.1Skleink		buf = malloc(5 + l + 1);
741.1Skleink
751.1Skleink		if (buf != NULL) {
761.1Skleink			/* Avoiding stdio in libm. */
771.1Skleink			memcpy(buf,		"NAN(",	4);
781.1Skleink			memcpy(buf + 4,		tagp,	l);
791.1Skleink			memcpy(buf + 4 + l,	")",	2);
801.1Skleink			nstr = buf;
811.1Skleink		} else {
821.1Skleink			/* Best effort: Fall back to "NAN()". */
831.1Skleink		}
841.1Skleink	}
851.1Skleink
861.1Skleink	res = NAN_STRTOD(nstr, NULL);
871.1Skleink
881.1Skleink	if (buf != NULL)
891.1Skleink		free(buf);
901.1Skleink
911.1Skleink	return res;
921.1Skleink}
93