Home | History | Annotate | Download | only in gen
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License (the "License").
      6  * You may not use this file except in compliance with the License.
      7  *
      8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9  * or http://www.opensolaris.org/os/licensing.
     10  * See the License for the specific language governing permissions
     11  * and limitations under the License.
     12  *
     13  * When distributing Covered Code, include this CDDL HEADER in each
     14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15  * If applicable, add the following below this CDDL HEADER, with the
     16  * fields enclosed by brackets "[]" replaced with your own identifying
     17  * information: Portions Copyright [yyyy] [name of copyright owner]
     18  *
     19  * CDDL HEADER END
     20  */
     21 
     22 /*
     23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     24  * Use is subject to license terms.
     25  */
     26 
     27 /*	Copyright (c) 1988 AT&T	*/
     28 /*	  All Rights Reserved  	*/
     29 
     30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     31 
     32 /*
     33  *	ecvt converts to decimal
     34  *	the number of digits is specified by ndigit
     35  *	decpt is set to the position of the decimal point
     36  *	sign is set to 0 for positive, 1 for negative
     37  *
     38  */
     39 
     40 #pragma weak _ecvt = ecvt
     41 #pragma weak _fcvt = fcvt
     42 
     43 #include "lint.h"
     44 #include <sys/types.h>
     45 #include <stdlib.h>
     46 #include <floatingpoint.h>
     47 #include "tsd.h"
     48 
     49 char *
     50 ecvt(double number, int ndigits, int *decpt, int *sign)
     51 {
     52 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     53 
     54 	return (econvert(number, ndigits, decpt, sign, buf));
     55 }
     56 
     57 char *
     58 fcvt(double number, int ndigits, int *decpt, int *sign)
     59 {
     60 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     61 	char *ptr, *val;
     62 	char ch;
     63 	int deci_val;
     64 
     65 	ptr = fconvert(number, ndigits, decpt, sign, buf);
     66 
     67 	val = ptr;
     68 	deci_val = *decpt;
     69 
     70 	while ((ch = *ptr) != 0) {
     71 		if (ch != '0') { /* You execute this if there are no */
     72 				    /* leading zero's remaining. */
     73 			*decpt = deci_val; /* If there are leading zero's */
     74 			return (ptr);		/* gets updated. */
     75 		}
     76 		ptr++;
     77 		deci_val--;
     78 	}
     79 	return (val);
     80 }
     81 
     82 char *
     83 qecvt(number, ndigits, decpt, sign)
     84 	long double	number;
     85 	int		ndigits;
     86 	int		*decpt;
     87 	int		*sign;
     88 {
     89 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     90 
     91 	return (qeconvert(&number, ndigits, decpt, sign, buf));
     92 }
     93 
     94 char *
     95 qfcvt(long double number, int ndigits, int *decpt, int *sign)
     96 {
     97 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     98 
     99 	return (qfconvert(&number, ndigits, decpt, sign, buf));
    100 }
    101 
    102 char *
    103 qgcvt(long double number, int ndigits, char *buffer)
    104 {
    105 	return (qgconvert(&number, ndigits, 0, buffer));
    106 }
    107