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

📄 vasnprintf.c

📁 gnu tar 源码包。 tar 软件是 Unix 系统下的一个打包软件
💻 C
📖 第 1 页 / 共 5 页
字号:
			  DCHAR_SET (result + length, ' ', n);			  length += n;			}		    }		    break;		  default:		    abort ();		  }	      }#endif#if (NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE || NEED_PRINTF_DOUBLE) && !defined IN_LIBINTL	    else if ((dp->conversion == 'a' || dp->conversion == 'A')# if !(NEED_PRINTF_DIRECTIVE_A || (NEED_PRINTF_LONG_DOUBLE && NEED_PRINTF_DOUBLE))		     && (0#  if NEED_PRINTF_DOUBLE			 || a.arg[dp->arg_index].type == TYPE_DOUBLE#  endif#  if NEED_PRINTF_LONG_DOUBLE			 || a.arg[dp->arg_index].type == TYPE_LONGDOUBLE#  endif			)# endif		    )	      {		arg_type type = a.arg[dp->arg_index].type;		int flags = dp->flags;		int has_width;		size_t width;		int has_precision;		size_t precision;		size_t tmp_length;		DCHAR_T tmpbuf[700];		DCHAR_T *tmp;		DCHAR_T *pad_ptr;		DCHAR_T *p;		has_width = 0;		width = 0;		if (dp->width_start != dp->width_end)		  {		    if (dp->width_arg_index != ARG_NONE)		      {			int arg;			if (!(a.arg[dp->width_arg_index].type == TYPE_INT))			  abort ();			arg = a.arg[dp->width_arg_index].a.a_int;			if (arg < 0)			  {			    /* "A negative field width is taken as a '-' flag			        followed by a positive field width."  */			    flags |= FLAG_LEFT;			    width = (unsigned int) (-arg);			  }			else			  width = arg;		      }		    else		      {			const FCHAR_T *digitp = dp->width_start;			do			  width = xsum (xtimes (width, 10), *digitp++ - '0');			while (digitp != dp->width_end);		      }		    has_width = 1;		  }		has_precision = 0;		precision = 0;		if (dp->precision_start != dp->precision_end)		  {		    if (dp->precision_arg_index != ARG_NONE)		      {			int arg;			if (!(a.arg[dp->precision_arg_index].type == TYPE_INT))			  abort ();			arg = a.arg[dp->precision_arg_index].a.a_int;			/* "A negative precision is taken as if the precision			    were omitted."  */			if (arg >= 0)			  {			    precision = arg;			    has_precision = 1;			  }		      }		    else		      {			const FCHAR_T *digitp = dp->precision_start + 1;			precision = 0;			while (digitp != dp->precision_end)			  precision = xsum (xtimes (precision, 10), *digitp++ - '0');			has_precision = 1;		      }		  }		/* Allocate a temporary buffer of sufficient size.  */		if (type == TYPE_LONGDOUBLE)		  tmp_length =		    (unsigned int) ((LDBL_DIG + 1)				    * 0.831 /* decimal -> hexadecimal */				   )		    + 1; /* turn floor into ceil */		else		  tmp_length =		    (unsigned int) ((DBL_DIG + 1)				    * 0.831 /* decimal -> hexadecimal */				   )		    + 1; /* turn floor into ceil */		if (tmp_length < precision)		  tmp_length = precision;		/* Account for sign, decimal point etc. */		tmp_length = xsum (tmp_length, 12);		if (tmp_length < width)		  tmp_length = width;		tmp_length = xsum (tmp_length, 1); /* account for trailing NUL */		if (tmp_length <= sizeof (tmpbuf) / sizeof (DCHAR_T))		  tmp = tmpbuf;		else		  {		    size_t tmp_memsize = xtimes (tmp_length, sizeof (DCHAR_T));		    if (size_overflow_p (tmp_memsize))		      /* Overflow, would lead to out of memory.  */		      goto out_of_memory;		    tmp = (DCHAR_T *) malloc (tmp_memsize);		    if (tmp == NULL)		      /* Out of memory.  */		      goto out_of_memory;		  }		pad_ptr = NULL;		p = tmp;		if (type == TYPE_LONGDOUBLE)		  {# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_LONG_DOUBLE		    long double arg = a.arg[dp->arg_index].a.a_longdouble;		    if (isnanl (arg))		      {			if (dp->conversion == 'A')			  {			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';			  }			else			  {			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';			  }		      }		    else		      {			int sign = 0;			DECL_LONG_DOUBLE_ROUNDING			BEGIN_LONG_DOUBLE_ROUNDING ();			if (signbit (arg)) /* arg < 0.0L or negative zero */			  {			    sign = -1;			    arg = -arg;			  }			if (sign < 0)			  *p++ = '-';			else if (flags & FLAG_SHOWSIGN)			  *p++ = '+';			else if (flags & FLAG_SPACE)			  *p++ = ' ';			if (arg > 0.0L && arg + arg == arg)			  {			    if (dp->conversion == 'A')			      {				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';			      }			    else			      {				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';			      }			  }			else			  {			    int exponent;			    long double mantissa;			    if (arg > 0.0L)			      mantissa = printf_frexpl (arg, &exponent);			    else			      {				exponent = 0;				mantissa = 0.0L;			      }			    if (has_precision				&& precision < (unsigned int) ((LDBL_DIG + 1) * 0.831) + 1)			      {				/* Round the mantissa.  */				long double tail = mantissa;				size_t q;				for (q = precision; ; q--)				  {				    int digit = (int) tail;				    tail -= digit;				    if (q == 0)				      {					if (digit & 1 ? tail >= 0.5L : tail > 0.5L)					  tail = 1 - tail;					else					  tail = - tail;					break;				      }				    tail *= 16.0L;				  }				if (tail != 0.0L)				  for (q = precision; q > 0; q--)				    tail *= 0.0625L;				mantissa += tail;			      }			    *p++ = '0';			    *p++ = dp->conversion - 'A' + 'X';			    pad_ptr = p;			    {			      int digit;			      digit = (int) mantissa;			      mantissa -= digit;			      *p++ = '0' + digit;			      if ((flags & FLAG_ALT)				  || mantissa > 0.0L || precision > 0)				{				  *p++ = decimal_point_char ();				  /* This loop terminates because we assume				     that FLT_RADIX is a power of 2.  */				  while (mantissa > 0.0L)				    {				      mantissa *= 16.0L;				      digit = (int) mantissa;				      mantissa -= digit;				      *p++ = digit					     + (digit < 10						? '0'						: dp->conversion - 10);				      if (precision > 0)					precision--;				    }				  while (precision > 0)				    {				      *p++ = '0';				      precision--;				    }				}			      }			      *p++ = dp->conversion - 'A' + 'P';#  if WIDE_CHAR_VERSION			      {				static const wchar_t decimal_format[] =				  { '%', '+', 'd', '\0' };				SNPRINTF (p, 6 + 1, decimal_format, exponent);			      }			      while (*p != '\0')				p++;#  else			      if (sizeof (DCHAR_T) == 1)				{				  sprintf ((char *) p, "%+d", exponent);				  while (*p != '\0')				    p++;				}			      else				{				  char expbuf[6 + 1];				  const char *ep;				  sprintf (expbuf, "%+d", exponent);				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)				    p++;				}#  endif			  }			END_LONG_DOUBLE_ROUNDING ();		      }# else		    abort ();# endif		  }		else		  {# if NEED_PRINTF_DIRECTIVE_A || NEED_PRINTF_DOUBLE		    double arg = a.arg[dp->arg_index].a.a_double;		    if (isnand (arg))		      {			if (dp->conversion == 'A')			  {			    *p++ = 'N'; *p++ = 'A'; *p++ = 'N';			  }			else			  {			    *p++ = 'n'; *p++ = 'a'; *p++ = 'n';			  }		      }		    else		      {			int sign = 0;			if (signbit (arg)) /* arg < 0.0 or negative zero */			  {			    sign = -1;			    arg = -arg;			  }			if (sign < 0)			  *p++ = '-';			else if (flags & FLAG_SHOWSIGN)			  *p++ = '+';			else if (flags & FLAG_SPACE)			  *p++ = ' ';			if (arg > 0.0 && arg + arg == arg)			  {			    if (dp->conversion == 'A')			      {				*p++ = 'I'; *p++ = 'N'; *p++ = 'F';			      }			    else			      {				*p++ = 'i'; *p++ = 'n'; *p++ = 'f';			      }			  }			else			  {			    int exponent;			    double mantissa;			    if (arg > 0.0)			      mantissa = printf_frexp (arg, &exponent);			    else			      {				exponent = 0;				mantissa = 0.0;			      }			    if (has_precision				&& precision < (unsigned int) ((DBL_DIG + 1) * 0.831) + 1)			      {				/* Round the mantissa.  */				double tail = mantissa;				size_t q;				for (q = precision; ; q--)				  {				    int digit = (int) tail;				    tail -= digit;				    if (q == 0)				      {					if (digit & 1 ? tail >= 0.5 : tail > 0.5)					  tail = 1 - tail;					else					  tail = - tail;					break;				      }				    tail *= 16.0;				  }				if (tail != 0.0)				  for (q = precision; q > 0; q--)				    tail *= 0.0625;				mantissa += tail;			      }			    *p++ = '0';			    *p++ = dp->conversion - 'A' + 'X';			    pad_ptr = p;			    {			      int digit;			      digit = (int) mantissa;			      mantissa -= digit;			      *p++ = '0' + digit;			      if ((flags & FLAG_ALT)				  || mantissa > 0.0 || precision > 0)				{				  *p++ = decimal_point_char ();				  /* This loop terminates because we assume				     that FLT_RADIX is a power of 2.  */				  while (mantissa > 0.0)				    {				      mantissa *= 16.0;				      digit = (int) mantissa;				      mantissa -= digit;				      *p++ = digit					     + (digit < 10						? '0'						: dp->conversion - 10);				      if (precision > 0)					precision--;				    }				  while (precision > 0)				    {				      *p++ = '0';				      precision--;				    }				}			      }			      *p++ = dp->conversion - 'A' + 'P';#  if WIDE_CHAR_VERSION			      {				static const wchar_t decimal_format[] =				  { '%', '+', 'd', '\0' };				SNPRINTF (p, 6 + 1, decimal_format, exponent);			      }			      while (*p != '\0')				p++;#  else			      if (sizeof (DCHAR_T) == 1)				{				  sprintf ((char *) p, "%+d", exponent);				  while (*p != '\0')				    p++;				}			      else				{				  char expbuf[6 + 1];				  const char *ep;				  sprintf (expbuf, "%+d", exponent);				  for (ep = expbuf; (*p = *ep) != '\0'; ep++)				    p++;				}#  endif			  }		      }# else		    abort ();# endif		  }		/* The generated string now extends from tmp to p, with the		   zero padding insertion point being at pad_ptr.  */		if (has_width && p - tmp < width)		  {		    size_t pad = width - (p - tmp);		    DCHAR_T *end = p + pad;		    if (flags & FLAG_LEFT)		      {			/* Pad with spaces on the right.  */			for (; pad > 0; pad--)			  *p++ = ' ';		      }		    else if ((flags & FLAG_ZERO) && pad_ptr != NULL)		      {			/* Pad with zeroes.  */			DCHAR_T *q = end;			while (p > pad_ptr)			  *--q = *--p;			for (; pad > 0; pad--)			  *p++ = '0';		      }		    else		      {			/* Pad with spaces on the left.  */			DCHAR_T *q = end;			while (p > tmp)			  *--q = *--p;			for (; pad > 0; pad--)			  *p++ = ' ';		      }		    p = end;		  }		{		  size_t count = p - tmp;		  if (count >= tmp_length)		    /* tmp_length was incorrectly calculated - fix the		       code above!  */		    abort ();		  /* Make room for the result.  */		  if (count >= allocated - length)		    {		      size_t n = xsum (length, count);		      ENSURE_ALLOCATION (n);		    }		  /* Append the result.  */		  memcpy (result + length, tmp, count * sizeof (DCHAR_T));		  if (tmp != tmpbuf)		    free (tmp);		  length += count;		}	      }#endif#if (NEED_PRINTF_INFINITE_DOUBLE || NEED_PRINTF_DOUBLE || NEED_PRINTF_INFINITE_LONG_DOUBLE

⌨️ 快捷键说明

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