⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cvt.c

📁 刻录光盘的程序
💻 C
字号:
/* @(#)cvt.c	1.3 99/09/08 Copyright 1998 J. Schilling *//* *	Compatibility routines for 4.4BSD based C-libraries ecvt()/fcvt() *	and a working gcvt() that is needed on 4.4BSD and GNU libc systems. * *	On 4.4BSD, gcvt() is missing, the gcvt() implementation from GNU libc *	is not working correctly. * *	Neither __dtoa() nor [efg]cvt() are MT safe. * *	Copyright (c) 1998 J. Schilling *//* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; see the file COPYING.  If not, write to * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */#include <stdxlib.h>#include <utypes.h>#include <standard.h>#ifdef	HAVE_DTOA	/* 4.4BSD floating point implementation */extern	char *__dtoa	__PR((double value, int mode, int ndigit, int *decpt, int *sign, char **ep));#endif#ifndef	HAVE_ECVTEXPORT	char *ecvt	__PR((double value, int ndigit, int *decpt, int *sign));#endif#ifndef	HAVE_FCVTEXPORT	char *fcvt	__PR((double value, int ndigit, int *decpt, int *sign));#endif#ifndef	HAVE_GCVTEXPORT	char *gcvt	__PR((double value, int ndigit, char *buf));#endif#if	!defined(HAVE_ECVT) && defined(HAVE_DTOA)#define	HAVE_ECVTchar *ecvt(value, ndigit, decpt, sign)	double	value;	int	ndigit;	int	*decpt;	int	*sign;{static	Uint	bufsize;static	char	*buf;	char	*bufend;	char	*ep;	char	*bp = __dtoa(value, 2, ndigit, decpt, sign, &ep);	if (value == 0.0) {		/*		 * Handle __dtoa()'s deviation from ecvt():		 * 0.0 is converted to "0" instead of 'ndigit' zeroes.		 * The string "0" is not allocated, so		 * we need to allocate buffer to hold 'ndigit' zeroes.		 */		if (bufsize < ndigit + 1) {			if (buf != (char *)0)				free(buf);			bufsize = ndigit + 1;			buf = malloc(bufsize);		}		ep = bp = buf;	}	/*	 * Fill up trailing zeroes suppressed by __dtoa()	 * From an internal __dtoa() comment:	 *	Sufficient space is allocated to the return value	 *	to hold the suppressed trailing zeros.	 */	for (bufend = &bp[ndigit]; ep < bufend; )		*ep++ = '0';	*ep = '\0';	return (bp);}#endif#if	!defined(HAVE_FCVT) && defined(HAVE_DTOA)#define	HAVE_FCVTchar *fcvt(value, ndigit, decpt, sign)	double	value;	int	ndigit;	int	*decpt;	int	*sign;{static	Uint	bufsize;static	char	*buf;	char	*bufend;	char	*ep;	char	*bp = __dtoa(value, 3, ndigit, decpt, sign, &ep);	if (value == 0.0) {		/*		 * Handle __dtoa()'s deviation from fcvt():		 * 0.0 is converted to "0" instead of 'ndigit' zeroes.		 * The string "0" is not allocated, so		 * we need to allocate buffer to hold 'ndigit' zeroes.		 */		if (bufsize < ndigit + 1) {			if (buf != (char *)0)				free(buf);			bufsize = ndigit + 1;			buf = malloc(bufsize);		}		ep = bp = buf;		*decpt = 0;	}	/*	 * Fill up trailing zeroes suppressed by __dtoa()	 * From an internal __dtoa() comment:	 *	Sufficient space is allocated to the return value	 *	to hold the suppressed trailing zeros.	 */	for (bufend = &bp[*decpt + ndigit]; ep < bufend; )		*ep++ = '0';	*ep = '\0';	return (bp);}#endif#ifndef	HAVE_GCVT#define	HAVE_GCVTchar *gcvt(number, ndigit, buf)	double	number;	int	ndigit;	char	*buf;{		 int	sign;		 int	decpt;	register char	*b;	register char	*rs;	register int	i;	b = ecvt(number, ndigit, &decpt, &sign);	rs = buf;	if (sign)		*rs++ = '-';	for (i = ndigit-1; i > 0 && b[i] == '0'; i--)		ndigit--;#ifdef	V7_FLOATSTYLE	if ((decpt >= 0 && decpt-ndigit > 4) ||#else	if ((decpt >= 0 && decpt-ndigit > 0) ||#endif	    (decpt < 0 && decpt < -3)) {	/* e-format */		decpt--;		*rs++ = *b++;		*rs++ = '.';		for (i = 1; i < ndigit; i++)			*rs++ = *b++;		*rs++ = 'e';		if (decpt < 0) {			decpt = -decpt;			*rs++ = '-';		} else {			*rs++ = '+';		}		if (decpt >= 100) {			*rs++ = decpt / 100 + '0';			decpt %= 100;		}		*rs++ = decpt / 10 + '0';		*rs++ = decpt % 10 + '0';	} else {				/* f-format */		if (decpt <= 0) {			if (*b != '0') {#ifndef	V7_FLOATSTYLE				*rs++ = '0';#endif				*rs++ = '.';			}			while (decpt < 0) {				decpt++;				*rs++ = '0';			}		}		for (i = 1; i <= ndigit; i++) {			*rs++ = *b++;			if (i == decpt)				*rs++ = '.';		}		if (ndigit < decpt) {			while (ndigit++ < decpt)				*rs++ = '0';			*rs++ = '.';		}	}	if (rs[-1] == '.')		rs--;	*rs = '\0';	return (buf);}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -