122 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Header$ */
 | |
| /*
 | |
|  * (c) copyright 1983 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | |
|  *
 | |
|  *          This product is part of the Amsterdam Compiler Kit.
 | |
|  *
 | |
|  * Permission to use, sell, duplicate or disclose this software must be
 | |
|  * obtained in writing. Requests for such permissions may be sent to
 | |
|  *
 | |
|  *      Dr. Andrew S. Tanenbaum
 | |
|  *      Wiskundig Seminarium
 | |
|  *      Vrije Universiteit
 | |
|  *      Postbox 7161
 | |
|  *      1007 MC Amsterdam
 | |
|  *      The Netherlands
 | |
|  *
 | |
|  */
 | |
| 
 | |
| extern double	_fif();
 | |
| 
 | |
| /*
 | |
|  *	_ecvt converts to decimal
 | |
|  *	the number of digits is specified by ndigit
 | |
|  *	decpt is set to the position of the decimal point
 | |
|  *	sign is set to 0 for positive, 1 for negative
 | |
|  */
 | |
| 
 | |
| #define	NDIG	80
 | |
| 
 | |
| static char*
 | |
| cvt(arg, ndigits, decpt, sign, eflag)
 | |
| double arg;
 | |
| int ndigits, *decpt, *sign, eflag;
 | |
| {
 | |
| 	register int r2;
 | |
| 	double fi, fj;
 | |
| 	register char *p, *p1;
 | |
| 	static char buf[NDIG];
 | |
| 	int i;  /*!*/
 | |
| 
 | |
| 	if (ndigits<0)
 | |
| 		ndigits = 0;
 | |
| 	if (ndigits>=NDIG-1)
 | |
| 		ndigits = NDIG-2;
 | |
| 	r2 = 0;
 | |
| 	*sign = 0;
 | |
| 	p = &buf[0];
 | |
| 	if (arg<0) {
 | |
| 		*sign = 1;
 | |
| 		arg = -arg;
 | |
| 	}
 | |
| 	arg = _fif(arg, 1.0, &fi);
 | |
| 	/*
 | |
| 	 * Do integer part
 | |
| 	 */
 | |
| 	if (fi != 0) {
 | |
| 		p1 = &buf[NDIG];
 | |
| 		while (fi != 0) {
 | |
| 			i = (_fif(fi, 0.1, &fi) + 0.03) * 10;
 | |
| 			*--p1 = i + '0';
 | |
| 			r2++;
 | |
| 		}
 | |
| 		while (p1 < &buf[NDIG])
 | |
| 			*p++ = *p1++;
 | |
| 	} else if (arg > 0) {
 | |
| 		while ((fj = arg*10) < 1) {
 | |
| 			arg = fj;
 | |
| 			r2--;
 | |
| 		}
 | |
| 	}
 | |
| 	p1 = &buf[ndigits];
 | |
| 	if (eflag==0)
 | |
| 		p1 += r2;
 | |
| 	*decpt = r2;
 | |
| 	if (p1 < &buf[0]) {
 | |
| 		buf[0] = '\0';
 | |
| 		return(buf);
 | |
| 	}
 | |
| 	while (p<=p1 && p<&buf[NDIG]) {
 | |
| 		arg = _fif(arg, 10.0, &fj);
 | |
| 		i = fj;
 | |
| 		*p++ = i + '0';
 | |
| 	}
 | |
| 	if (p1 >= &buf[NDIG]) {
 | |
| 		buf[NDIG-1] = '\0';
 | |
| 		return(buf);
 | |
| 	}
 | |
| 	p = p1;
 | |
| 	*p1 += 5;
 | |
| 	while (*p1 > '9') {
 | |
| 		*p1 = '0';
 | |
| 		if (p1>buf) {
 | |
| 			p1--; *p1 += 1;
 | |
| 		} else {
 | |
| 			*p1 = '1';
 | |
| 			(*decpt)++;
 | |
| 			if (eflag==0) {
 | |
| 				if (p>buf)
 | |
| 					*p = '0';
 | |
| 				p++;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 	*p = '\0';
 | |
| 	return(buf);
 | |
| }
 | |
| 
 | |
| char*
 | |
| _ecvt(arg, ndigits, decpt, sign)
 | |
| double arg;
 | |
| int ndigits, *decpt, *sign;
 | |
| {
 | |
| 	return(cvt(arg, ndigits, decpt, sign, 1));
 | |
| }
 | |
| 
 | |
| char*
 | |
| _fcvt(arg, ndigits, decpt, sign)
 | |
| double arg;
 | |
| int ndigits, *decpt, *sign;
 | |
| {
 | |
| 	return(cvt(arg, ndigits, decpt, sign, 0));
 | |
| }
 |