📄 vfprintf.c
字号:
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 + -