2006-09-06 Eric Blake <ebb9@byu.net>
* libc/stdio/vfprintf.c (_vfprintf_r, get_arg): Add 'hh', 'j',
        't', and 'z' modifiers.
			
			
This commit is contained in:
		| @@ -1,3 +1,8 @@ | |||||||
|  | 2006-09-06  Eric Blake  <ebb9@byu.net> | ||||||
|  |  | ||||||
|  | 	* libc/stdio/vfprintf.c (_vfprintf_r, get_arg): Add 'hh', 'j', | ||||||
|  | 	't', and 'z' modifiers. | ||||||
|  |  | ||||||
| 2006-09-01  Kazu Hirata  <kazu@codesourcery.com> | 2006-09-01  Kazu Hirata  <kazu@codesourcery.com> | ||||||
|  |  | ||||||
| 	Merge from newlib-csl-20060320-branch: | 	Merge from newlib-csl-20060320-branch: | ||||||
|   | |||||||
| @@ -1,5 +1,5 @@ | |||||||
| /* | /* | ||||||
|  * Copyright (c) 1990 The Regents of the University of California. |  * Copyright (c) 1990, 2006 The Regents of the University of California. | ||||||
|  * All rights reserved. |  * All rights reserved. | ||||||
|  * |  * | ||||||
|  * This code is derived from software contributed to Berkeley by |  * This code is derived from software contributed to Berkeley by | ||||||
| @@ -182,6 +182,7 @@ static char *rcsid = "$Id$"; | |||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <limits.h> | #include <limits.h> | ||||||
|  | #include <stdint.h> | ||||||
| #include <wchar.h> | #include <wchar.h> | ||||||
| #include <string.h> | #include <string.h> | ||||||
| #include <sys/lock.h> | #include <sys/lock.h> | ||||||
| @@ -372,6 +373,7 @@ _EXFUN(get_arg, (struct _reent *data, int n, char *fmt, | |||||||
| #define	SHORTINT	0x040		/* short integer */ | #define	SHORTINT	0x040		/* short integer */ | ||||||
| #define	ZEROPAD		0x080		/* zero (as opposed to blank) pad */ | #define	ZEROPAD		0x080		/* zero (as opposed to blank) pad */ | ||||||
| #define FPT		0x100		/* Floating point number */ | #define FPT		0x100		/* Floating point number */ | ||||||
|  | #define CHARINT		0x200		/* char as integer */ | ||||||
|  |  | ||||||
| int _EXFUN(_VFPRINTF_R, (struct _reent *, FILE *, _CONST char *, va_list)); | int _EXFUN(_VFPRINTF_R, (struct _reent *, FILE *, _CONST char *, va_list)); | ||||||
|  |  | ||||||
| @@ -427,7 +429,7 @@ _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap), | |||||||
| #endif | #endif | ||||||
| 	int expt;		/* integer value of exponent */ | 	int expt;		/* integer value of exponent */ | ||||||
| 	int expsize = 0;	/* character count for expstr */ | 	int expsize = 0;	/* character count for expstr */ | ||||||
| 	int ndig;		/* actual number of digits returned by cvt */ | 	int ndig = 0;		/* actual number of digits returned by cvt */ | ||||||
| 	char expstr[7];		/* buffer for exponent string */ | 	char expstr[7];		/* buffer for exponent string */ | ||||||
| #endif | #endif | ||||||
| 	u_quad_t _uquad;	/* integer arguments %[diouxX] */ | 	u_quad_t _uquad;	/* integer arguments %[diouxX] */ | ||||||
| @@ -517,20 +519,24 @@ _DEFUN(_VFPRINTF_R, (data, fp, fmt0, ap), | |||||||
| 	(flags&QUADINT ? GET_ARG (N, ap, quad_t) : \ | 	(flags&QUADINT ? GET_ARG (N, ap, quad_t) : \ | ||||||
| 	    flags&LONGINT ? GET_ARG (N, ap, long) : \ | 	    flags&LONGINT ? GET_ARG (N, ap, long) : \ | ||||||
| 	    flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ | 	    flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ | ||||||
|  | 	    flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ | ||||||
| 	    (long)GET_ARG (N, ap, int)) | 	    (long)GET_ARG (N, ap, int)) | ||||||
| #define	UARG() \ | #define	UARG() \ | ||||||
| 	(flags&QUADINT ? GET_ARG (N, ap, u_quad_t) : \ | 	(flags&QUADINT ? GET_ARG (N, ap, u_quad_t) : \ | ||||||
| 	    flags&LONGINT ? GET_ARG (N, ap, u_long) : \ | 	    flags&LONGINT ? GET_ARG (N, ap, u_long) : \ | ||||||
| 	    flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ | 	    flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ | ||||||
|  | 	    flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ | ||||||
| 	    (u_long)GET_ARG (N, ap, u_int)) | 	    (u_long)GET_ARG (N, ap, u_int)) | ||||||
| #else | #else | ||||||
| #define	SARG() \ | #define	SARG() \ | ||||||
| 	(flags&LONGINT ? GET_ARG (N, ap, long) : \ | 	(flags&LONGINT ? GET_ARG (N, ap, long) : \ | ||||||
| 	    flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ | 	    flags&SHORTINT ? (long)(short)GET_ARG (N, ap, int) : \ | ||||||
|  | 	    flags&CHARINT ? (long)(signed char)GET_ARG (N, ap, int) : \ | ||||||
| 	    (long)GET_ARG (N, ap, int)) | 	    (long)GET_ARG (N, ap, int)) | ||||||
| #define	UARG() \ | #define	UARG() \ | ||||||
| 	(flags&LONGINT ? GET_ARG (N, ap, u_long) : \ | 	(flags&LONGINT ? GET_ARG (N, ap, u_long) : \ | ||||||
| 	    flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ | 	    flags&SHORTINT ? (u_long)(u_short)GET_ARG (N, ap, int) : \ | ||||||
|  | 	    flags&CHARINT ? (u_long)(unsigned char)GET_ARG (N, ap, int) : \ | ||||||
| 	    (u_long)GET_ARG (N, ap, u_int)) | 	    (u_long)GET_ARG (N, ap, u_int)) | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| @@ -747,7 +753,12 @@ reswitch:	switch (ch) { | |||||||
| 			goto rflag; | 			goto rflag; | ||||||
| #endif | #endif | ||||||
| 		case 'h': | 		case 'h': | ||||||
| 			flags |= SHORTINT; | 			if (*fmt == 'h') { | ||||||
|  | 				fmt++; | ||||||
|  | 				flags |= CHARINT; | ||||||
|  | 			} else { | ||||||
|  | 				flags |= SHORTINT; | ||||||
|  | 			} | ||||||
| 			goto rflag; | 			goto rflag; | ||||||
| 		case 'l': | 		case 'l': | ||||||
| 			if (*fmt == 'l') { | 			if (*fmt == 'l') { | ||||||
| @@ -760,6 +771,43 @@ reswitch:	switch (ch) { | |||||||
| 		case 'q': | 		case 'q': | ||||||
| 			flags |= QUADINT; | 			flags |= QUADINT; | ||||||
| 			goto rflag; | 			goto rflag; | ||||||
|  | 		case 'j': | ||||||
|  | 		  if (sizeof (intmax_t) == sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  goto rflag; | ||||||
|  | 		case 'z': | ||||||
|  | 		  if (sizeof (size_t) < sizeof (int)) | ||||||
|  | 		    /* POSIX states size_t is 16 or more bits, as is short.  */ | ||||||
|  | 		    flags |= SHORTINT; | ||||||
|  | 		  else if (sizeof (size_t) == sizeof (int)) | ||||||
|  | 		    /* no flag needed */; | ||||||
|  | 		  else if (sizeof (size_t) <= sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    /* POSIX states that at least one programming | ||||||
|  | 		       environment must support size_t no wider than | ||||||
|  | 		       long, but that means other environments can | ||||||
|  | 		       have size_t as wide as long long.  */ | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  goto rflag; | ||||||
|  | 		case 't': | ||||||
|  | 		  if (sizeof (ptrdiff_t) < sizeof (int)) | ||||||
|  | 		    /* POSIX states ptrdiff_t is 16 or more bits, as | ||||||
|  | 		       is short.  */ | ||||||
|  | 		    flags |= SHORTINT; | ||||||
|  | 		  else if (sizeof (ptrdiff_t) == sizeof (int)) | ||||||
|  | 		    /* no flag needed */; | ||||||
|  | 		  else if (sizeof (ptrdiff_t) <= sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    /* POSIX states that at least one programming | ||||||
|  | 		       environment must support ptrdiff_t no wider than | ||||||
|  | 		       long, but that means other environments can | ||||||
|  | 		       have ptrdiff_t as wide as long long.  */ | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  goto rflag; | ||||||
| 		case 'c': | 		case 'c': | ||||||
| 		case 'C': | 		case 'C': | ||||||
| 			cp = buf; | 			cp = buf; | ||||||
| @@ -916,6 +964,8 @@ reswitch:	switch (ch) { | |||||||
| 				*GET_ARG (N, ap, long_ptr_t) = ret; | 				*GET_ARG (N, ap, long_ptr_t) = ret; | ||||||
| 			else if (flags & SHORTINT) | 			else if (flags & SHORTINT) | ||||||
| 				*GET_ARG (N, ap, short_ptr_t) = ret; | 				*GET_ARG (N, ap, short_ptr_t) = ret; | ||||||
|  | 			else if (flags & CHARINT) | ||||||
|  | 				*GET_ARG (N, ap, char_ptr_t) = ret; | ||||||
| 			else | 			else | ||||||
| 				*GET_ARG (N, ap, int_ptr_t) = ret; | 				*GET_ARG (N, ap, int_ptr_t) = ret; | ||||||
| 			continue;	/* no output */ | 			continue;	/* no output */ | ||||||
| @@ -1526,7 +1576,7 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
|   ACTION action; |   ACTION action; | ||||||
|   int pos, last_arg; |   int pos, last_arg; | ||||||
|   int max_pos_arg = n; |   int max_pos_arg = n; | ||||||
|   enum types { INT, LONG_INT, SHORT_INT, QUAD_INT, CHAR, CHAR_PTR, DOUBLE, LONG_DOUBLE, WIDE_CHAR }; |   enum types { INT, LONG_INT, SHORT_INT, CHAR_INT, QUAD_INT, CHAR, CHAR_PTR, DOUBLE, LONG_DOUBLE, WIDE_CHAR }; | ||||||
| #ifdef _MB_CAPABLE | #ifdef _MB_CAPABLE | ||||||
|   wchar_t wc; |   wchar_t wc; | ||||||
|   mbstate_t wc_state; |   mbstate_t wc_state; | ||||||
| @@ -1585,7 +1635,13 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
| 	      switch (ch) | 	      switch (ch) | ||||||
| 		{ | 		{ | ||||||
| 		case 'h': | 		case 'h': | ||||||
| 		  flags |= SHORTINT; | 		  if (*fmt == 'h') | ||||||
|  | 		    { | ||||||
|  | 		      flags |= CHARINT; | ||||||
|  | 		      ++fmt; | ||||||
|  | 		    } | ||||||
|  | 		  else | ||||||
|  | 		    flags |= SHORTINT; | ||||||
| 		  break; | 		  break; | ||||||
| 		case 'L': | 		case 'L': | ||||||
| 		  flags |= LONGDBL; | 		  flags |= LONGDBL; | ||||||
| @@ -1593,6 +1649,43 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
| 		case 'q': | 		case 'q': | ||||||
| 		  flags |= QUADINT; | 		  flags |= QUADINT; | ||||||
| 		  break; | 		  break; | ||||||
|  | 		case 'j': | ||||||
|  | 		  if (sizeof (intmax_t) == sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  break; | ||||||
|  | 		case 'z': | ||||||
|  | 		  if (sizeof (size_t) < sizeof (int)) | ||||||
|  | 		    /* POSIX states size_t is 16 or more bits, as is short.  */ | ||||||
|  | 		    flags |= SHORTINT; | ||||||
|  | 		  else if (sizeof (size_t) == sizeof (int)) | ||||||
|  | 		    /* no flag needed */; | ||||||
|  | 		  else if (sizeof (size_t) <= sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    /* POSIX states that at least one programming | ||||||
|  | 		       environment must support size_t no wider than | ||||||
|  | 		       long, but that means other environments can | ||||||
|  | 		       have size_t as wide as long long.  */ | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  break; | ||||||
|  | 		case 't': | ||||||
|  | 		  if (sizeof (ptrdiff_t) < sizeof (int)) | ||||||
|  | 		    /* POSIX states ptrdiff_t is 16 or more bits, as | ||||||
|  | 		       is short.  */ | ||||||
|  | 		    flags |= SHORTINT; | ||||||
|  | 		  else if (sizeof (ptrdiff_t) == sizeof (int)) | ||||||
|  | 		    /* no flag needed */; | ||||||
|  | 		  else if (sizeof (ptrdiff_t) <= sizeof (long)) | ||||||
|  | 		    flags |= LONGINT; | ||||||
|  | 		  else | ||||||
|  | 		    /* POSIX states that at least one programming | ||||||
|  | 		       environment must support ptrdiff_t no wider than | ||||||
|  | 		       long, but that means other environments can | ||||||
|  | 		       have ptrdiff_t as wide as long long.  */ | ||||||
|  | 		    flags |= QUADINT; | ||||||
|  | 		  break; | ||||||
| 		case 'l': | 		case 'l': | ||||||
| 		default: | 		default: | ||||||
| 		  if (*fmt == 'l') | 		  if (*fmt == 'l') | ||||||
| @@ -1621,6 +1714,8 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
| 		      spec_type = LONG_INT; | 		      spec_type = LONG_INT; | ||||||
| 		    else if (flags & SHORTINT) | 		    else if (flags & SHORTINT) | ||||||
| 		      spec_type = SHORT_INT; | 		      spec_type = SHORT_INT; | ||||||
|  | 		    else if (flags & CHARINT) | ||||||
|  | 		      spec_type = CHAR_INT; | ||||||
| #ifndef _NO_LONGLONG | #ifndef _NO_LONGLONG | ||||||
| 		    else if (flags & QUADINT) | 		    else if (flags & QUADINT) | ||||||
| 		      spec_type = QUAD_INT; | 		      spec_type = QUAD_INT; | ||||||
| @@ -1676,6 +1771,7 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
| 			args[numargs++].val_wint_t = va_arg (*ap, wint_t); | 			args[numargs++].val_wint_t = va_arg (*ap, wint_t); | ||||||
| 			break; | 			break; | ||||||
| 		      case CHAR: | 		      case CHAR: | ||||||
|  | 		      case CHAR_INT: | ||||||
| 		      case SHORT_INT: | 		      case SHORT_INT: | ||||||
| 		      case INT: | 		      case INT: | ||||||
| 			args[numargs++].val_int = va_arg (*ap, int); | 			args[numargs++].val_int = va_arg (*ap, int); | ||||||
| @@ -1761,6 +1857,7 @@ _DEFUN(get_arg, (data, n, fmt, ap, numargs_p, args, arg_type, last_fmt), | |||||||
| 	  args[numargs++].val_wint_t = va_arg (*ap, wint_t); | 	  args[numargs++].val_wint_t = va_arg (*ap, wint_t); | ||||||
| 	  break; | 	  break; | ||||||
| 	case INT: | 	case INT: | ||||||
|  | 	case CHAR_INT: | ||||||
| 	case SHORT_INT: | 	case SHORT_INT: | ||||||
| 	case CHAR: | 	case CHAR: | ||||||
| 	default: | 	default: | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user