Merge from vendor branch OPENSSH:
[dragonfly.git] / lib / libm / gen / nan.c
1 /*-
2  * Copyright (c) 2006 The NetBSD Foundation, Inc.
3  * All rights reserved.
4  *
5  * This code is derived from software contributed to The NetBSD Foundation
6  * by Klaus Klein.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. All advertising materials mentioning features or use of this software
17  *    must display the following acknowledgement:
18  *        This product includes software developed by the NetBSD
19  *        Foundation, Inc. and its contributors.
20  * 4. Neither the name of The NetBSD Foundation nor the names of its
21  *    contributors may be used to endorse or promote products derived
22  *    from this software without specific prior written permission.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
25  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
26  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
27  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
28  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  *
36  * $NetBSD: nan.c,v 1.1 2006/03/15 22:07:09 kleink Exp $
37  * $DragonFly: src/lib/libm/gen/nan.c,v 1.1 2007/06/17 17:46:01 pavalos Exp $
38  */
39
40 #include <assert.h>
41 #include <math.h>
42 #include <stddef.h>
43 #include <stdlib.h>
44 #include <string.h>
45
46
47 #ifndef NAN_FUNCTION
48 #define NAN_FUNCTION    nan
49 #define NAN_TYPE        double
50 #define NAN_STRTOD      strtod
51 #endif
52
53 NAN_TYPE
54 NAN_FUNCTION(const char *tagp)
55 {
56         const char *nstr;
57         char *buf;
58         NAN_TYPE res;
59
60         _DIAGASSERT(tagp != NULL);
61
62         nstr = "NAN()";
63         buf = NULL;
64
65         if (tagp[0] != '\0') {
66                 size_t l;
67
68                 l = strlen(tagp);
69                 buf = malloc(5 + l + 1);
70
71                 if (buf != NULL) {
72                         /* Avoiding stdio in libm. */
73                         memcpy(buf,             "NAN(", 4);
74                         memcpy(buf + 4,         tagp,   l);
75                         memcpy(buf + 4 + l,     ")",    2);
76                         nstr = buf;
77                 } else {
78                         /* Best effort: Fall back to "NAN()". */
79                 }
80         }
81
82         res = NAN_STRTOD(nstr, NULL);
83
84         if (buf != NULL)
85                 free(buf);
86
87         return res;
88 }