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(number, ndigits, decpt, sign)
     51 	double	number;
     52 	int	ndigits;
     53 	int	*decpt;
     54 	int	*sign;
     55 {
     56 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     57 
     58 	return (econvert(number, ndigits, decpt, sign, buf));
     59 }
     60 
     61 char *
     62 fcvt(number, ndigits, decpt, sign)
     63 	double	number;
     64 	int	ndigits;
     65 	int	*decpt;
     66 	int	*sign;
     67 {
     68 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     69 	char *ptr, *val;
     70 	char ch;
     71 	int deci_val;
     72 
     73 	ptr = fconvert(number, ndigits, decpt, sign, buf);
     74 	val = ptr;
     75 	deci_val = *decpt;
     76 
     77 	while ((ch = *ptr) != '\0') {
     78 		if (ch != '0') { /* You execute this if there are no */
     79 				/* leading zero's remaining. */
     80 			*decpt = deci_val; /* If there are leading zero's */
     81 			return (ptr);	/* gets updated. */
     82 		}
     83 		ptr++;
     84 		deci_val--;
     85 	}
     86 	return (val);
     87 }
     88 
     89 char *
     90 qecvt(number, ndigits, decpt, sign)
     91 	long double	number;
     92 	int		ndigits;
     93 	int		*decpt;
     94 	int		*sign;
     95 {
     96 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
     97 
     98 	return (qeconvert(&number, ndigits, decpt, sign, buf));
     99 }
    100 
    101 char *
    102 qfcvt(number, ndigits, decpt, sign)
    103 	long double	number;
    104 	int		ndigits;
    105 	int		*decpt;
    106 	int		*sign;
    107 {
    108 	char *buf = tsdalloc(_T_ECVT, DECIMAL_STRING_LENGTH, NULL);
    109 
    110 	return (qfconvert(&number, ndigits, decpt, sign, buf));
    111 }
    112 
    113 char *
    114 qgcvt(number, ndigits, buffer)
    115 	long double	number;
    116 	int		ndigits;
    117 	char		*buffer;
    118 {
    119 	return (qgconvert(&number, ndigits, 0, buffer));
    120 }
    121