* Updating common/lib * Updating lib/csu * Updating lib/libc * Updating libexec/ld.elf_so * Corrected test on __minix in featuretest to actually follow the meaning of the comment. * Cleaned up _REENTRANT-related defintions. * Disabled -D_REENTRANT for libfetch * Removing some unneeded __NBSD_LIBC defines and tests Change-Id: Ic1394baef74d11b9f86b312f5ff4bbc3cbf72ce2
		
			
				
	
	
		
			159 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/****************************************************************
 | 
						|
 | 
						|
The author of this software is David M. Gay.
 | 
						|
 | 
						|
Copyright (C) 2009 by David M. Gay
 | 
						|
All Rights Reserved
 | 
						|
 | 
						|
Permission to use, copy, modify, and distribute this software and
 | 
						|
its documentation for any purpose and without fee is hereby
 | 
						|
granted, provided that the above copyright notice appear in all
 | 
						|
source-code copies and that both that the copyright notice and this
 | 
						|
permission notice and warranty disclaimer appear in supporting
 | 
						|
documentation.
 | 
						|
 | 
						|
THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 | 
						|
INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
 | 
						|
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 | 
						|
CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
 | 
						|
USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
 | 
						|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 | 
						|
PERFORMANCE OF THIS SOFTWARE.
 | 
						|
 | 
						|
****************************************************************/
 | 
						|
#include "stdio1.h"
 | 
						|
#include "gdtoa.h"
 | 
						|
#include <string.h>
 | 
						|
 | 
						|
#undef allow_Quad
 | 
						|
#undef want_Quad
 | 
						|
#undef want_Ux
 | 
						|
#define want_LD
 | 
						|
typedef union Ud {double x; unsigned int u[2]; } Ud;
 | 
						|
#ifdef __x86_64 /*{{*/
 | 
						|
#define want_Ux
 | 
						|
#ifndef NO_GDTOA_i386_Quad /*{*/
 | 
						|
typedef union UQ {__float128 x; unsigned int u[4]; } UQ;
 | 
						|
#define allow_Quad(x) x
 | 
						|
#define want_Quad
 | 
						|
#endif /*}*/
 | 
						|
#else /*}{*/
 | 
						|
#ifdef __i386 /*{{*/
 | 
						|
#define want_Ux
 | 
						|
#else /*}{*/
 | 
						|
#ifdef __sparc /*{{*/
 | 
						|
typedef union UQ {long double x; unsigned int u[4]; } Ux;
 | 
						|
#else /*}{*/
 | 
						|
#ifdef __INTEL_COMPILER /*{*/
 | 
						|
#undef want_Quad
 | 
						|
#undef want_Ux
 | 
						|
#undef want_LD
 | 
						|
#endif /*}*/
 | 
						|
#endif /*}}*/
 | 
						|
#endif /*}}*/
 | 
						|
#endif /*}}*/
 | 
						|
 | 
						|
#ifndef allow_Quad
 | 
						|
#define allow_Quad(x) /*nothing*/
 | 
						|
#endif
 | 
						|
 | 
						|
#ifdef want_Ux /*{{*/
 | 
						|
typedef union Ux {long double x; unsigned short u[5]; } Ux;
 | 
						|
#else /*}{*/
 | 
						|
#ifdef __sparc
 | 
						|
#define want_Ux
 | 
						|
#endif
 | 
						|
#endif /*}}*/
 | 
						|
 | 
						|
 int
 | 
						|
main(void)
 | 
						|
{
 | 
						|
	Ud d;
 | 
						|
	allow_Quad(UQ q;)
 | 
						|
	char *b, buf[256], fmt[32], *s;
 | 
						|
#ifdef want_Ux
 | 
						|
	Ux x;
 | 
						|
	x.x = 0.;
 | 
						|
#endif
 | 
						|
	int k;
 | 
						|
 | 
						|
	k = 0;
 | 
						|
	strcpy(fmt, "%.g");
 | 
						|
	d.x = 0.;
 | 
						|
	allow_Quad(q.x = 0.;)
 | 
						|
	while(fgets(buf, sizeof(buf), stdin)) {
 | 
						|
		for(b = buf; *b && *b != '\n'; ++b);
 | 
						|
		*b = 0;
 | 
						|
		if (b == buf)
 | 
						|
			continue;
 | 
						|
		b = buf;
 | 
						|
		if (*b == '%') {
 | 
						|
			for(k = 0; *b > ' '; ++b)
 | 
						|
#ifdef want_LD /*{{*/
 | 
						|
				switch(*b) {
 | 
						|
				  case 'L':
 | 
						|
					k = 1;
 | 
						|
#ifdef want_Quad
 | 
						|
					break;
 | 
						|
				  case 'q':
 | 
						|
					if (k >= 1)
 | 
						|
						k = 2;
 | 
						|
#endif
 | 
						|
				  }
 | 
						|
#else /*}{*/
 | 
						|
				;
 | 
						|
#endif /*}}*/
 | 
						|
			if (*b)
 | 
						|
				*b++ = 0;
 | 
						|
			if (b - buf < sizeof(fmt)) {
 | 
						|
				strcpy(fmt, buf);
 | 
						|
				}
 | 
						|
			}
 | 
						|
		if (*b) {
 | 
						|
			switch(k) {
 | 
						|
			  case 0:
 | 
						|
				d.x = strtod(b,&s);
 | 
						|
				break;
 | 
						|
			  case 1:
 | 
						|
#ifdef want_Ux
 | 
						|
#ifdef __sparc
 | 
						|
				strtopQ(b,&s,&x.x);
 | 
						|
#else
 | 
						|
				strtopx(b,&s,&x.x);
 | 
						|
#endif
 | 
						|
#else
 | 
						|
				strtopQ(b,&s,&q.x);
 | 
						|
#endif
 | 
						|
				break;
 | 
						|
			  allow_Quad(case 2: strtopQ(b,&s,&q.x);)
 | 
						|
			  }
 | 
						|
			if (*s)
 | 
						|
				printf("Ignoring \"%s\"\n", s);
 | 
						|
			}
 | 
						|
		switch(k) {
 | 
						|
			case 0:
 | 
						|
				printf("d.x = %.g = #%x %x; %s ==> ", d.x, d.u[1], d.u[0], fmt);
 | 
						|
				printf(fmt, d.x);
 | 
						|
				break;
 | 
						|
			case 1:
 | 
						|
#ifdef __sparc
 | 
						|
				printf("x.x = %.Lg = #%x %x %x %x; %s ==> ", x.x,
 | 
						|
					x.u[0], x.u[1], x.u[2], x.u[3], fmt);
 | 
						|
#else
 | 
						|
				printf("x.x = %.Lg = #%x %x %x %x %x; %s ==> ", x.x,
 | 
						|
					x.u[4], x.u[3], x.u[2], x.u[1], x.u[0], fmt);
 | 
						|
#endif
 | 
						|
				printf(fmt, x.x);
 | 
						|
#ifdef want_Quad
 | 
						|
				break;
 | 
						|
			case 2:
 | 
						|
				printf("q.x = %.Lqg = #%x %x %x %x; %s ==> ", q.x,
 | 
						|
					q.u[3], q.u[2], q.u[1], q.u[0], fmt);
 | 
						|
				printf(fmt, q.x);
 | 
						|
#endif
 | 
						|
			}
 | 
						|
		putchar('\n');
 | 
						|
		}
 | 
						|
	return 0;
 | 
						|
	}
 |