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

📄 vfprintf.c

📁 绝对正真的stdio.h的实现
💻 C
📖 第 1 页 / 共 5 页
字号:
      REF (form_strerror),	/* for 'm' */				      \      REF (form_wcharacter),	/* for 'C' */				      \      REF (form_floathex),	/* for 'A', 'a' */			      \      REF (mod_ptrdiff_t),      /* for 't' */				      \      REF (mod_intmax_t),       /* for 'j' */				      \      REF (form_unknown)        /* for 'I' */				      \    };									      \    /* Step 3a: after processing first 'h' modifier.  */		      \    static JUMP_TABLE_TYPE step3a_jumps[30] =				      \    {									      \      REF (form_unknown),						      \      REF (form_unknown),	/* for ' ' */				      \      REF (form_unknown),	/* for '+' */				      \      REF (form_unknown),	/* for '-' */				      \      REF (form_unknown),	/* for '<hash>' */			      \      REF (form_unknown),	/* for '0' */				      \      REF (form_unknown),	/* for '\'' */				      \      REF (form_unknown),	/* for '*' */				      \      REF (form_unknown),	/* for '1'...'9' */			      \      REF (form_unknown),	/* for '.' */				      \      REF (mod_halfhalf),	/* for 'h' */				      \      REF (form_unknown),	/* for 'l' */				      \      REF (form_unknown),	/* for 'L', 'q' */			      \      REF (form_unknown),	/* for 'z', 'Z' */			      \      REF (form_percent),	/* for '%' */				      \      REF (form_integer),	/* for 'd', 'i' */			      \      REF (form_unsigned),	/* for 'u' */				      \      REF (form_octal),		/* for 'o' */				      \      REF (form_hexa),		/* for 'X', 'x' */			      \      REF (form_unknown),	/* for 'E', 'e', 'F', 'f', 'G', 'g' */	      \      REF (form_unknown),	/* for 'c' */				      \      REF (form_unknown),	/* for 's', 'S' */			      \      REF (form_unknown),	/* for 'p' */				      \      REF (form_number),	/* for 'n' */				      \      REF (form_unknown),	/* for 'm' */				      \      REF (form_unknown),	/* for 'C' */				      \      REF (form_unknown),	/* for 'A', 'a' */			      \      REF (form_unknown),       /* for 't' */				      \      REF (form_unknown),       /* for 'j' */				      \      REF (form_unknown)        /* for 'I' */				      \    };									      \    /* Step 3b: after processing first 'l' modifier.  */		      \    static JUMP_TABLE_TYPE step3b_jumps[30] =				      \    {									      \      REF (form_unknown),						      \      REF (form_unknown),	/* for ' ' */				      \      REF (form_unknown),	/* for '+' */				      \      REF (form_unknown),	/* for '-' */				      \      REF (form_unknown),	/* for '<hash>' */			      \      REF (form_unknown),	/* for '0' */				      \      REF (form_unknown),	/* for '\'' */				      \      REF (form_unknown),	/* for '*' */				      \      REF (form_unknown),	/* for '1'...'9' */			      \      REF (form_unknown),	/* for '.' */				      \      REF (form_unknown),	/* for 'h' */				      \      REF (mod_longlong),	/* for 'l' */				      \      REF (form_unknown),	/* for 'L', 'q' */			      \      REF (form_unknown),	/* for 'z', 'Z' */			      \      REF (form_percent),	/* for '%' */				      \      REF (form_integer),	/* for 'd', 'i' */			      \      REF (form_unsigned),	/* for 'u' */				      \      REF (form_octal),		/* for 'o' */				      \      REF (form_hexa),		/* for 'X', 'x' */			      \      REF (form_float),		/* for 'E', 'e', 'F', 'f', 'G', 'g' */	      \      REF (form_character),	/* for 'c' */				      \      REF (form_string),	/* for 's', 'S' */			      \      REF (form_pointer),	/* for 'p' */				      \      REF (form_number),	/* for 'n' */				      \      REF (form_strerror),	/* for 'm' */				      \      REF (form_wcharacter),	/* for 'C' */				      \      REF (form_floathex),	/* for 'A', 'a' */			      \      REF (form_unknown),       /* for 't' */				      \      REF (form_unknown),       /* for 'j' */				      \      REF (form_unknown)        /* for 'I' */				      \    }#define STEP4_TABLE							      \    /* Step 4: processing format specifier.  */				      \    static JUMP_TABLE_TYPE step4_jumps[30] =				      \    {									      \      REF (form_unknown),						      \      REF (form_unknown),	/* for ' ' */				      \      REF (form_unknown),	/* for '+' */				      \      REF (form_unknown),	/* for '-' */				      \      REF (form_unknown),	/* for '<hash>' */			      \      REF (form_unknown),	/* for '0' */				      \      REF (form_unknown),	/* for '\'' */				      \      REF (form_unknown),	/* for '*' */				      \      REF (form_unknown),	/* for '1'...'9' */			      \      REF (form_unknown),	/* for '.' */				      \      REF (form_unknown),	/* for 'h' */				      \      REF (form_unknown),	/* for 'l' */				      \      REF (form_unknown),	/* for 'L', 'q' */			      \      REF (form_unknown),	/* for 'z', 'Z' */			      \      REF (form_percent),	/* for '%' */				      \      REF (form_integer),	/* for 'd', 'i' */			      \      REF (form_unsigned),	/* for 'u' */				      \      REF (form_octal),		/* for 'o' */				      \      REF (form_hexa),		/* for 'X', 'x' */			      \      REF (form_float),		/* for 'E', 'e', 'F', 'f', 'G', 'g' */	      \      REF (form_character),	/* for 'c' */				      \      REF (form_string),	/* for 's', 'S' */			      \      REF (form_pointer),	/* for 'p' */				      \      REF (form_number),	/* for 'n' */				      \      REF (form_strerror),	/* for 'm' */				      \      REF (form_wcharacter),	/* for 'C' */				      \      REF (form_floathex),	/* for 'A', 'a' */			      \      REF (form_unknown),       /* for 't' */				      \      REF (form_unknown),       /* for 'j' */				      \      REF (form_unknown)        /* for 'I' */				      \    }#define process_arg(fspec)						      \      /* Start real work.  We know about all flags and modifiers and	      \	 now process the wanted format specifier.  */			      \    LABEL (form_percent):						      \      /* Write a literal "%".  */					      \      outchar (L_('%'));						      \      break;								      \									      \    LABEL (form_integer):						      \      /* Signed decimal integer.  */					      \      base = 10;							      \									      \      if (is_longlong)							      \	{								      \	  long long int signed_number;					      \									      \	  if (fspec == NULL)						      \	    signed_number = va_arg (ap, long long int);			      \	  else								      \	    signed_number = args_value[fspec->data_arg].pa_long_long_int;     \									      \	  is_negative = signed_number < 0;				      \	  number.longlong = is_negative ? (- signed_number) : signed_number;  \									      \	  goto LABEL (longlong_number);					      \	}								      \      else								      \	{								      \	  long int signed_number;					      \									      \	  if (fspec == NULL)						      \	    {								      \	      if (is_long_num)						      \		signed_number = va_arg (ap, long int);			      \	      else  /* `char' and `short int' will be promoted to `int'.  */  \		signed_number = va_arg (ap, int);			      \	    }								      \	  else								      \	    if (is_long_num)						      \	      signed_number = args_value[fspec->data_arg].pa_long_int;	      \	    else  /* `char' and `short int' will be promoted to `int'.  */    \	      signed_number = args_value[fspec->data_arg].pa_int;	      \									      \	  is_negative = signed_number < 0;				      \	  number.word = is_negative ? (- signed_number) : signed_number;      \									      \	  goto LABEL (number);						      \	}								      \      /* NOTREACHED */							      \									      \    LABEL (form_unsigned):						      \      /* Unsigned decimal integer.  */					      \      base = 10;							      \      goto LABEL (unsigned_number);					      \      /* NOTREACHED */							      \									      \    LABEL (form_octal):							      \      /* Unsigned octal integer.  */					      \      base = 8;								      \      goto LABEL (unsigned_number);					      \      /* NOTREACHED */							      \									      \    LABEL (form_hexa):							      \      /* Unsigned hexadecimal integer.  */				      \      base = 16;							      \									      \    LABEL (unsigned_number):	  /* Unsigned number of base BASE.  */	      \									      \      /* ISO specifies the `+' and ` ' flags only for signed		      \	 conversions.  */						      \      is_negative = 0;							      \      showsign = 0;							      \      space = 0;							      \									      \      if (is_longlong)							      \	{								      \	  if (fspec == NULL)						      \	    number.longlong = va_arg (ap, unsigned long long int);	      \	  else								      \	    number.longlong = args_value[fspec->data_arg].pa_u_long_long_int; \									      \	LABEL (longlong_number):					      \	  if (prec < 0)							      \	    /* Supply a default precision if none was given.  */	      \	    prec = 1;							      \	  else								      \	    /* We have to take care for the '0' flag.  If a precision	      \	       is given it must be ignored.  */				      \	    pad = L_(' ');						      \									      \	  /* If the precision is 0 and the number is 0 nothing has to	      \	     be written for the number, except for the 'o' format in	      \	     alternate form.  */					      \	  if (prec == 0 && number.longlong == 0)			      \	    {								      \	      string = workend;						      \	      if (base == 8 && alt)					      \		*--string = L_('0');					      \	    }								      \	  else								      \	    {								      \	      /* Put the number in WORK.  */				      \	      string = _itoa (number.longlong, workend, base,		      \			      spec == L_('X'));				      \	      if (group && grouping)					      \		string = group_number (string, workend, grouping,	      \				       thousands_sep);			      \									      \	      if (use_outdigits && base == 10)				      \		string = _i18n_number_rewrite (string, workend);	      \	    }								      \	  /* Simplify further test for num != 0.  */			      \	  number.word = number.longlong != 0;				      \	}								      \      else								      \	{								      \	  if (fspec == NULL)						      \	    {								      \	      if (is_long_num)						      \		number.word = va_arg (ap, unsigned long int);		      \	      else if (is_char)						      \	        number.word = (unsigned char) va_arg (ap, unsigned int);      \	      else if (!is_short)					      \		number.word = va_arg (ap, unsigned int);		      \	      else							      \		number.word = (unsigned short int) va_arg (ap, unsigned int); \	    }								      \	  else								      \	    if (is_long_num)						      \	      number.word = args_value[fspec->data_arg].pa_u_long_int;	      \	    else if (is_char)						      \	      number.word = (unsigned char)				      \		args_value[fspec->data_arg].pa_u_int;			      \	    else if (!is_short)						      \	      number.word = args_value[fspec->data_arg].pa_u_int;	      \	    else							      \	      number.word = (unsigned short int)			      \		args_value[fspec->data_arg].pa_u_int;			      \									      \	LABEL (number):							      \	  if (prec < 0)							      \	    /* Supply a default precision if none was given.  */	      \	    prec = 1;							      \	  else								      \	    /* We have to take care for the '0' flag.  If a precision	      \	       is given it must be ignored.  */				      \	    pad = L_(' ');						      \									      \	  /* If the precision is 0 and the number is 0 nothing has to	      \	     be written for the number, except for the 'o' format in	      \	     alternate form.  */					      \	  if (prec == 0 && number.word == 0)				      \	    {								      \	      string = workend;						      \	      if (base == 8 && alt)					      \		*--string = L_('0');					      \	    }								      \	  else								      \	    {								      \	      /* Put the number in WORK.  */				      \	      string = _itoa_word (number.word, workend, base,		      \				   spec == L_('X'));			      \	      if (group && grouping)					      \		string = group_number (string, workend, grouping,	      \				       thousands_sep);			      \									      \	      if (use_outdigits && base == 10)				      \		string = _i18n_number_rewrite (string, workend);	      \	    }								      \	}								      \									      \      if (prec <= workend - string && number.word != 0 && alt && base == 8)   \	/* Add octal marker.  */					      \	*--string = L_('0');						      \									      \      prec = MAX (0, prec - (workend - string));			      \									      \      if (!left)							      \	{								      \	  width -= workend - string + prec;				      \									      \	  if (number.word != 0 && alt && base == 16)			      \	    /* Account for 0X hex marker.  */				      \	    width -= 2;							      \									      \	  if (is_negative || showsign || space)				      \	    --width;							      \									      \	  if (pad == L_(' '))						      \	    {								      \	      PAD (L_(' '));						      \	      width = 0;						      \	    }								      \									      \	  if (is_negative)						      \	    outchar (L_('-'));						      \	  else if (showsign)						      \	    outchar (L_('+'));						      \	  else if (space)						      \	    outchar (L_(' '));						      \									      \	  if (number.word != 0 && alt && base == 16)			      \	    {								      \	      outchar (L_('0'));					      \	      outchar (spec);						      \	    }								      \									      \	  width += prec;						      \	  PAD (L_('0'));						      \									      \	  outstring (string, workend - string);				      \									      \	  break;							      \	}								      \      else								      \	{								      \	  if (is_negative)						      \	    {								      \	      outchar (L_('-'));					      \	      --width;							      \	    }								      \	  else if (showsign)						      \	    {								      \	      outchar (L_('+'));					      \	      --width;							      \	    }								      \	  else if (space)						      \	    {								      \	      outchar (L_(' '));					      \	      --width;							      \	    }								      \									      \	  if (number.word != 0 && alt && base == 16)			      \	    {								      \	      outchar (L_('0'));					      \	      outchar (spec);						      \	      width -= 2;						      \	    }								      \									      \	  width -= workend - string + prec;				      \									      \	  if (prec > 0)							      \	    {								      \	      int temp = width;						      \	      width = prec;						      \	      PAD (L_('0'));;						      \	      width = temp;						      \	    }								      \									      \	  outstring (string, workend - string);				      \									      \	  PAD (L_(' '));						      \	  break;							      \	}								      \									      \    LABEL (form_float):							      \      {									      \	/* Floating-point number.  This is handled by printf_fp.c.  */	      \	const void *ptr;						      \	int function_done;						      \									      \	if (fspec == NULL)						      \	  {								      \	    struct printf_info info = { .prec = prec,			      \					.width = width,			      \					.spec = spec,			      \					.is_long_double = is_long_double,     \					.is_short = is_short,		      \					.is_long = is_long,		      \					.alt = alt,			      \					.space = space,			      \

⌨️ 快捷键说明

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