comparison GEMBASSY-1.0.3/gsoap/custom/long_double.c @ 0:8300eb051bea draft

Initial upload
author ktnyt
date Fri, 26 Jun 2015 05:19:29 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:8300eb051bea
1 /*
2 long_double.c
3
4 Custom serializer for the long double (extended double) type as
5 xsd:decimal.
6
7 Compile this file and link it with your code.
8
9 gSOAP XML Web services tools
10 Copyright (C) 2000-2007, Robert van Engelen, Genivia Inc., All Rights Reserved.
11 This part of the software is released under ONE of the following licenses:
12 GPL, the gSOAP public license, OR Genivia's license for commercial use.
13 --------------------------------------------------------------------------------
14 gSOAP public license.
15
16 The contents of this file are subject to the gSOAP Public License Version 1.3
17 (the "License"); you may not use this file except in compliance with the
18 License. You may obtain a copy of the License at
19 http://www.cs.fsu.edu/~engelen/soaplicense.html
20 Software distributed under the License is distributed on an "AS IS" basis,
21 WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
22 for the specific language governing rights and limitations under the License.
23
24 The Initial Developer of the Original Code is Robert A. van Engelen.
25 Copyright (C) 2000-2007, Robert van Engelen, Genivia, Inc., All Rights Reserved.
26 --------------------------------------------------------------------------------
27 GPL license.
28
29 This program is free software; you can redistribute it and/or modify it under
30 the terms of the GNU General Public License as published by the Free Software
31 Foundation; either version 2 of the License, or (at your option) any later
32 version.
33
34 This program is distributed in the hope that it will be useful, but WITHOUT ANY
35 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
36 PARTICULAR PURPOSE. See the GNU General Public License for more details.
37
38 You should have received a copy of the GNU General Public License along with
39 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
40 Place, Suite 330, Boston, MA 02111-1307 USA
41
42 Author contact information:
43 engelen@genivia.com / engelen@acm.org
44
45 This program is released under the GPL with the additional exemption that
46 compiling, linking, and/or using OpenSSL is allowed.
47 --------------------------------------------------------------------------------
48 A commercial use license is available from Genivia, Inc., contact@genivia.com
49 --------------------------------------------------------------------------------
50 */
51
52 /* soapH.h generated by soapcpp2: */
53 #include "soapH.h"
54 #include <float.h>
55
56 int soap_s2decimal(struct soap *soap, const char *s, long double *p)
57 { if (s)
58 { if (!*s)
59 return soap->error = SOAP_TYPE;
60 if (!soap_tag_cmp(s, "INF"))
61 *p = (long double)DBL_PINFTY;
62 else if (!soap_tag_cmp(s, "+INF"))
63 *p = (long double)DBL_PINFTY;
64 else if (!soap_tag_cmp(s, "-INF"))
65 *p = (long double)DBL_NINFTY;
66 else if (!soap_tag_cmp(s, "NaN"))
67 *p = (long double)DBL_NAN;
68 else
69 {
70 #if defined(HAVE_STRTOLD_L)
71 char *r;
72 *p = strtold_l(s, &r, NULL);
73 if (*r)
74 #elif defined(HAVE_STRTOLD)
75 char *r;
76 *p = strtold(s, &r);
77 if (*r)
78 #endif
79 #if defined(HAVE_SSCANF_L)
80 if (sscanf_l(s, NULL, "%Lg", p) != 1)
81 soap->error = SOAP_TYPE;
82 #elif defined(HAVE_SSCANF)
83 if (sscanf(s, "%Lg", p) != 1)
84 soap->error = SOAP_TYPE;
85 #else
86 soap->error = SOAP_TYPE;
87 #endif
88 }
89 }
90 return soap->error;
91 }
92
93 const char *soap_decimal2s(struct soap *soap, long double n)
94 { char *s;
95 if (soap_isnan(n))
96 return "NaN";
97 if (soap_ispinfd(n))
98 return "INF";
99 if (soap_isninfd(n))
100 return "-INF";
101 s = soap->tmpbuf;
102 #if defined(HAVE_SPRINTF_L)
103 sprintf_l(s, NULL, "%.*Lg", LDBL_DIG, n);
104 #else
105 sprintf(s, "%.*Lg", LDBL_DIG, n);
106 s = strchr(s, ','); /* convert decimal comma to DP */
107 if (s)
108 *s = '.';
109 #endif
110 return soap->tmpbuf;
111 }
112
113 int
114 soap_outdecimal(struct soap *soap, const char *tag, int id, const long double *p, const char *type, int n)
115 { if (soap_element_begin_out(soap, tag, soap_embedded_id(soap, id, p, n), type)
116 || soap_string_out(soap, soap_decimal2s(soap, *p), 0))
117 return soap->error;
118 return soap_element_end_out(soap, tag);
119 }
120
121 long double *
122 soap_indecimal(struct soap *soap, const char *tag, long double *p, const char *type, int t)
123 { if (soap_element_begin_in(soap, tag, 0, type))
124 return NULL;
125 p = (long double*)soap_id_enter(soap, soap->id, p, t, sizeof(long double), 0, NULL, NULL, NULL);
126 if (*soap->href)
127 p = (long double*)soap_id_forward(soap, soap->href, p, 0, t, 0, sizeof(long double), 0, NULL);
128 else if (p)
129 { if (soap_s2decimal(soap, soap_value(soap), p))
130 return NULL;
131 }
132 if (soap->body && soap_element_end_in(soap, tag))
133 return NULL;
134 return p;
135 }