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

📄 vasnprintf.c

📁 gnu tar 源码包。 tar 软件是 Unix 系统下的一个打包软件
💻 C
📖 第 1 页 / 共 5 页
字号:
		length = augmented_length;	      }	    else	      {		do		  result[length++] = (unsigned char) *cp++;		while (--n > 0);	      }	  }	if (i == d.count)	  break;	/* Execute a single directive.  */	if (dp->conversion == '%')	  {	    size_t augmented_length;	    if (!(dp->arg_index == ARG_NONE))	      abort ();	    augmented_length = xsum (length, 1);	    ENSURE_ALLOCATION (augmented_length);	    result[length] = '%';	    length = augmented_length;	  }	else	  {	    if (!(dp->arg_index != ARG_NONE))	      abort ();	    if (dp->conversion == 'n')	      {		switch (a.arg[dp->arg_index].type)		  {		  case TYPE_COUNT_SCHAR_POINTER:		    *a.arg[dp->arg_index].a.a_count_schar_pointer = length;		    break;		  case TYPE_COUNT_SHORT_POINTER:		    *a.arg[dp->arg_index].a.a_count_short_pointer = length;		    break;		  case TYPE_COUNT_INT_POINTER:		    *a.arg[dp->arg_index].a.a_count_int_pointer = length;		    break;		  case TYPE_COUNT_LONGINT_POINTER:		    *a.arg[dp->arg_index].a.a_count_longint_pointer = length;		    break;#if HAVE_LONG_LONG_INT		  case TYPE_COUNT_LONGLONGINT_POINTER:		    *a.arg[dp->arg_index].a.a_count_longlongint_pointer = length;		    break;#endif		  default:		    abort ();		  }	      }#if ENABLE_UNISTDIO	    /* The unistdio extensions.  */	    else if (dp->conversion == 'U')	      {		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;		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;		      }		  }		switch (type)		  {		  case TYPE_U8_STRING:		    {		      const uint8_t *arg = a.arg[dp->arg_index].a.a_u8_string;		      const uint8_t *arg_end;		      size_t characters;		      if (has_precision)			{			  /* Use only PRECISION characters, from the left.  */			  arg_end = arg;			  characters = 0;			  for (; precision > 0; precision--)			    {			      int count = u8_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else if (has_width)			{			  /* Use the entire string, and count the number of			     characters.  */			  arg_end = arg;			  characters = 0;			  for (;;)			    {			      int count = u8_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else			{			  /* Use the entire string.  */			  arg_end = arg + u8_strlen (arg);			  /* The number of characters doesn't matter.  */			  characters = 0;			}		      if (has_width && width > characters			  && !(dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));			  DCHAR_SET (result + length, ' ', n);			  length += n;			}# if DCHAR_IS_UINT8_T		      {			size_t n = arg_end - arg;			ENSURE_ALLOCATION (xsum (length, n));			DCHAR_CPY (result + length, arg, n);			length += n;		      }# else		      { /* Convert.  */			DCHAR_T *converted = result + length;			size_t converted_len = allocated - length;#  if DCHAR_IS_TCHAR			/* Convert from UTF-8 to locale encoding.  */			if (u8_conv_to_encoding (locale_charset (),						 iconveh_question_mark,						 arg, arg_end - arg, NULL,						 &converted, &converted_len)			    < 0)#  else			/* Convert from UTF-8 to UTF-16/UTF-32.  */			converted =			  U8_TO_DCHAR (arg, arg_end - arg,				       converted, &converted_len);			if (converted == NULL)#  endif			  {			    int saved_errno = errno;			    if (!(result == resultbuf || result == NULL))			      free (result);			    if (buf_malloced != NULL)			      free (buf_malloced);			    CLEANUP ();			    errno = saved_errno;			    return NULL;			  }			if (converted != result + length)			  {			    ENSURE_ALLOCATION (xsum (length, converted_len));			    DCHAR_CPY (result + length, converted, converted_len);			    free (converted);			  }			length += converted_len;		      }# endif		      if (has_width && width > characters			  && (dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));			  DCHAR_SET (result + length, ' ', n);			  length += n;			}		    }		    break;		  case TYPE_U16_STRING:		    {		      const uint16_t *arg = a.arg[dp->arg_index].a.a_u16_string;		      const uint16_t *arg_end;		      size_t characters;		      if (has_precision)			{			  /* Use only PRECISION characters, from the left.  */			  arg_end = arg;			  characters = 0;			  for (; precision > 0; precision--)			    {			      int count = u16_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else if (has_width)			{			  /* Use the entire string, and count the number of			     characters.  */			  arg_end = arg;			  characters = 0;			  for (;;)			    {			      int count = u16_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else			{			  /* Use the entire string.  */			  arg_end = arg + u16_strlen (arg);			  /* The number of characters doesn't matter.  */			  characters = 0;			}		      if (has_width && width > characters			  && !(dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));			  DCHAR_SET (result + length, ' ', n);			  length += n;			}# if DCHAR_IS_UINT16_T		      {			size_t n = arg_end - arg;			ENSURE_ALLOCATION (xsum (length, n));			DCHAR_CPY (result + length, arg, n);			length += n;		      }# else		      { /* Convert.  */			DCHAR_T *converted = result + length;			size_t converted_len = allocated - length;#  if DCHAR_IS_TCHAR			/* Convert from UTF-16 to locale encoding.  */			if (u16_conv_to_encoding (locale_charset (),						  iconveh_question_mark,						  arg, arg_end - arg, NULL,						  &converted, &converted_len)			    < 0)#  else			/* Convert from UTF-16 to UTF-8/UTF-32.  */			converted =			  U16_TO_DCHAR (arg, arg_end - arg,					converted, &converted_len);			if (converted == NULL)#  endif			  {			    int saved_errno = errno;			    if (!(result == resultbuf || result == NULL))			      free (result);			    if (buf_malloced != NULL)			      free (buf_malloced);			    CLEANUP ();			    errno = saved_errno;			    return NULL;			  }			if (converted != result + length)			  {			    ENSURE_ALLOCATION (xsum (length, converted_len));			    DCHAR_CPY (result + length, converted, converted_len);			    free (converted);			  }			length += converted_len;		      }# endif		      if (has_width && width > characters			  && (dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));			  DCHAR_SET (result + length, ' ', n);			  length += n;			}		    }		    break;		  case TYPE_U32_STRING:		    {		      const uint32_t *arg = a.arg[dp->arg_index].a.a_u32_string;		      const uint32_t *arg_end;		      size_t characters;		      if (has_precision)			{			  /* Use only PRECISION characters, from the left.  */			  arg_end = arg;			  characters = 0;			  for (; precision > 0; precision--)			    {			      int count = u32_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else if (has_width)			{			  /* Use the entire string, and count the number of			     characters.  */			  arg_end = arg;			  characters = 0;			  for (;;)			    {			      int count = u32_strmblen (arg_end);			      if (count == 0)				break;			      if (count < 0)				{				  if (!(result == resultbuf || result == NULL))				    free (result);				  if (buf_malloced != NULL)				    free (buf_malloced);				  CLEANUP ();				  errno = EILSEQ;				  return NULL;				}			      arg_end += count;			      characters++;			    }			}		      else			{			  /* Use the entire string.  */			  arg_end = arg + u32_strlen (arg);			  /* The number of characters doesn't matter.  */			  characters = 0;			}		      if (has_width && width > characters			  && !(dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));			  DCHAR_SET (result + length, ' ', n);			  length += n;			}# if DCHAR_IS_UINT32_T		      {			size_t n = arg_end - arg;			ENSURE_ALLOCATION (xsum (length, n));			DCHAR_CPY (result + length, arg, n);			length += n;		      }# else		      { /* Convert.  */			DCHAR_T *converted = result + length;			size_t converted_len = allocated - length;#  if DCHAR_IS_TCHAR			/* Convert from UTF-32 to locale encoding.  */			if (u32_conv_to_encoding (locale_charset (),						  iconveh_question_mark,						  arg, arg_end - arg, NULL,						  &converted, &converted_len)			    < 0)#  else			/* Convert from UTF-32 to UTF-8/UTF-16.  */			converted =			  U32_TO_DCHAR (arg, arg_end - arg,					converted, &converted_len);			if (converted == NULL)#  endif			  {			    int saved_errno = errno;			    if (!(result == resultbuf || result == NULL))			      free (result);			    if (buf_malloced != NULL)			      free (buf_malloced);			    CLEANUP ();			    errno = saved_errno;			    return NULL;			  }			if (converted != result + length)			  {			    ENSURE_ALLOCATION (xsum (length, converted_len));			    DCHAR_CPY (result + length, converted, converted_len);			    free (converted);			  }			length += converted_len;		      }# endif		      if (has_width && width > characters			  && (dp->flags & FLAG_LEFT))			{			  size_t n = width - characters;			  ENSURE_ALLOCATION (xsum (length, n));

⌨️ 快捷键说明

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