011308d7478bea111e60af143d031f078724cfbc
[oweals/cde.git] / cde / programs / dtksh / ksh93 / src / lib / libast / sfio / sfputd.c
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: sfputd.c /main/3 1995/11/01 18:33:55 rswiston $ */
24 /***************************************************************
25 *                                                              *
26 *                      AT&T - PROPRIETARY                      *
27 *                                                              *
28 *         THIS IS PROPRIETARY SOURCE CODE LICENSED BY          *
29 *                          AT&T CORP.                          *
30 *                                                              *
31 *                Copyright (c) 1995 AT&T Corp.                 *
32 *                     All Rights Reserved                      *
33 *                                                              *
34 *           This software is licensed by AT&T Corp.            *
35 *       under the terms and conditions of the license in       *
36 *       http://www.research.att.com/orgs/ssr/book/reuse        *
37 *                                                              *
38 *               This software was created by the               *
39 *           Software Engineering Research Department           *
40 *                    AT&T Bell Laboratories                    *
41 *                                                              *
42 *               For further information contact                *
43 *                     gsf@research.att.com                     *
44 *                                                              *
45 ***************************************************************/
46 #include        "sfhdr.h"
47
48 /*      Write out a double value in a portable format
49 **
50 **      Written by Kiem-Phong Vo (08/05/90)
51 */
52
53 #if __STD_C
54 _sfputd(Sfio_t* f, reg double v)
55 #else
56 _sfputd(f,v)
57 Sfio_t          *f;
58 reg double      v;
59 #endif
60 {
61 #define N_ARRAY         (16*sizeof(double))
62         reg int         n, w;
63         reg double      x;
64         reg uchar       *s, *ends;
65         int             exp;
66         uchar           c[N_ARRAY];
67
68         if(f->mode != SF_WRITE && _sfmode(f,SF_WRITE,0) < 0)
69                 return -1;
70         SFLOCK(f,0);
71
72         /* get the sign of v */
73         if(v < 0.)
74         {       v = -v;
75                 n = 1;
76         }
77         else    n = 0;
78
79         /* make the magnitude of v < 1 */
80         if(v != 0.)
81                 v = frexp(v,&exp);
82         else    exp = 0;
83
84         /* code the sign of v and exp */
85         if((w = exp) < 0)
86         {       n |= 02;
87                 w = -w;
88         }
89
90         /* write out the signs and the exp */
91         SFOPEN(f,0);
92         if(sfputc(f,n) < 0 || (w = sfputu(f,w)) < 0)
93                 return -1;
94         SFLOCK(f,0);
95         w += 1;
96
97         s = (ends = &c[0])+sizeof(c);
98         while(s > ends)
99         {       /* get 2^SF_PRECIS precision at a time */
100                 n = (int)(x = ldexp(v,SF_PRECIS));
101                 *--s = n|SF_MORE;
102                 if((v = x-n) <= 0.)
103                         break;
104         }
105
106         /* last byte is not SF_MORE */
107         ends = &c[0] + sizeof(c) -1;
108         *ends &= ~SF_MORE;
109
110         /* write out coded bytes */
111         n = ends - s + 1;
112         w = SFWRITE(f,(Void_t*)s,n) == n ? w+n : -1;
113
114         SFOPEN(f,0);
115         return w;
116 }