77 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* $Id$ */
 | |
| /*
 | |
|  * (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
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /* Author: J.W. Stevenson */
 | |
| 
 | |
| #include "pc.h"
 | |
| 
 | |
| #define BIG 1e17
 | |
| 
 | |
| static double r;
 | |
| static int pow10;
 | |
| 
 | |
| static void dig(int ch)
 | |
| {
 | |
| 
 | |
| 	if (r > BIG)
 | |
| 		pow10++;
 | |
| 	else
 | |
| 		r = r * 10.0 + ch;
 | |
| }
 | |
| 
 | |
| double _rdr(struct file* f)
 | |
| {
 | |
| 	int i;
 | |
| 	double e;
 | |
| 	int is_signed, ch;
 | |
| 
 | |
| 	r = 0;
 | |
| 	pow10 = 0;
 | |
| 	_rf(f);
 | |
| 	_skipsp(f);
 | |
| 	is_signed = _getsig(f);
 | |
| 	ch = _fstdig(f);
 | |
| 	do
 | |
| 		dig(ch);
 | |
| 	while ((ch = _nxtdig(f)) >= 0);
 | |
| 	if (*f->ptr == '.')
 | |
| 	{
 | |
| 		_incpt(f);
 | |
| 		ch = _fstdig(f);
 | |
| 		do
 | |
| 		{
 | |
| 			dig(ch);
 | |
| 			pow10--;
 | |
| 		} while ((ch = _nxtdig(f)) >= 0);
 | |
| 	}
 | |
| 	if ((*f->ptr == 'e') || (*f->ptr == 'E'))
 | |
| 	{
 | |
| 		_incpt(f);
 | |
| 		pow10 += _getint(f);
 | |
| 	}
 | |
| 	if ((i = pow10) < 0)
 | |
| 		i = -i;
 | |
| 	e = 1.0;
 | |
| 	while (--i >= 0)
 | |
| 		e *= 10.0;
 | |
| 	if (pow10 < 0)
 | |
| 		r /= e;
 | |
| 	else
 | |
| 		r *= e;
 | |
| 	return (is_signed ? -r : r);
 | |
| }
 |