📄 psnprintf.c
字号:
nprinted = pad; memset(*pinsertion, padchar, nprinted); *pinsertion += nprinted; *nmax -= nprinted; } /* Output string */ if (*nmax <= 1) nprinted = 0; else if (*nmax - 1 < len) nprinted = *nmax - 1; else nprinted = len; memcpy(*pinsertion, str, nprinted); *pinsertion += nprinted; *nmax -= nprinted; /* If left aligned, add pad */ if (flags & FLAG_LEFT_ALIGN) { if (*nmax <= 1) nprinted = 0; else if (*nmax - 1 < pad) nprinted = *nmax - 1; else nprinted = pad; memset(*pinsertion, ' ', nprinted); *pinsertion += nprinted; *nmax -= nprinted; } return len + pad; /* Return total length of pad + string even if some * was truncated */}/* Format an integer into the buffer. Parameters: * **pinsertion Pointer to pointer to buffer (can be reference to NULL) * *nmax Pointer to size of buffer. This is may be modified * fmt Format character (one of "diuoxX") * flags 0 or combination of flags (see .h file for #defines) * width Width of integer, as defined in printf * precision Precision of integer, as defined in printf * ap Argument list */int pvsnfmt_int(char **pinsertion, size_t *nmax, char fmt, int flags, int width, int precision, char prefix, va_list *ap){ long int number = 0; unsigned long int unumber = 0; char numbersigned = 1; char iszero = 0; /* bool */ int base = 0; int len = 0; /* length of number component (no sign or padding) */ char char10 = 0; char sign = 0; int widthpad = 0; int addprefix = 0; /* optional "0x" = 2 */ int totallen = 0; /* Stack used to hold digits, which are generated backwards * and need to be popped off in the correct order */ char numstack[22]; /* largest 64 bit number has 22 octal digits */ char *stackpos = numstack; #define PUSH(x) \ *stackpos++ = x #define POP() \ *(--stackpos) /* Retrieve value */ switch (prefix) { case 'h': switch (fmt) { case 'd': case 'i': number = (signed short int) va_arg(*ap, int); break; case 'u': case 'o': case 'x': case 'X': unumber = (unsigned short int) va_arg(*ap, int); numbersigned = 0; break; case 'p': unumber = (unsigned long) va_arg(*ap, void *); numbersigned = 0; } break; case 'l': switch (fmt) { case 'd': case 'i': number = va_arg(*ap, signed long int); break; case 'u': case 'o': case 'x': case 'X': unumber = va_arg(*ap, unsigned long int); numbersigned = 0; break; case 'p': unumber = (unsigned long) va_arg(*ap, void *); numbersigned = numbersigned; } break; default: switch (fmt) { case 'd': case 'i': number = va_arg(*ap, signed int); break; case 'u': case 'o': case 'x': case 'X': unumber = va_arg(*ap, unsigned int); numbersigned = 0; break; case 'p': unumber = (unsigned long) va_arg(*ap, void *); numbersigned = 0; } } /* switch fmt to retrieve number */ if (fmt == 'p') { fmt = 'x'; flags |= FLAG_HASH; } /* Discover base */ switch (fmt) { case 'd': case 'i': case 'u': base = 10; break; case 'o': base = 8; break; case 'X': base = 16; char10 = 'A'; break; case 'x': base = 16; char10 = 'a'; } if (numbersigned) { if (number < 0) { /* Deal with negativity */ sign = '-'; number = -number; } else if (flags & FLAG_SIGNED) { sign = '+'; } else if (flags & FLAG_SIGN_PAD) { sign = ' '; } } /* Create number */ if (numbersigned) { if (number == 0) iszero = 1; do { PUSH(number % base); number /= base; len++; } while (number != 0); } else { if (unumber == 0) iszero = 1; do { PUSH(unumber % base); unumber /= base; len++; } while (unumber != 0); } /* Octal hash character (alternate form) */ if (fmt == 'o' && (flags & FLAG_HASH) && precision <= len && precision != 0 && !iszero ) { precision = len + 1; } /* Determine width of sign, if any. */ if ( (fmt == 'x' || fmt == 'X') && (flags & FLAG_HASH) && !iszero ) addprefix = 2; else if (sign != 0) addprefix = 1; /* Make up precision (zero pad on left) */ while (len < precision) { PUSH(0); len++; } if (len + addprefix < width) { totallen = width; widthpad = width - (len + addprefix); } else totallen = len + addprefix; if (*nmax <= 1) return totallen; /* Write sign or "0x" */ if (flags & FLAG_ZERO_PAD) { if (addprefix == 2) /* 0x */ { if (*nmax > 1) { *(*pinsertion)++ = '0'; (*nmax)--; } if (*nmax > 1) { *(*pinsertion)++ = fmt; (*nmax)--; } } else if (addprefix == 1) /* sign */ { if (*nmax > 1) { *(*pinsertion)++ = sign; (*nmax)--; } } } /* Width pad */ if ( !(flags & FLAG_LEFT_ALIGN) ) { if (*nmax <= 1) widthpad = 0; else if (*nmax + 1 < widthpad) widthpad = *nmax - 1; if (flags & FLAG_ZERO_PAD) memset(*pinsertion, '0', widthpad); else memset(*pinsertion, ' ', widthpad); *pinsertion += widthpad; *nmax -= widthpad; } /* Write sign or "0x" */ if ( !(flags & FLAG_ZERO_PAD) ) { if (addprefix == 2) /* 0x */ { if (*nmax > 1) { *(*pinsertion)++ = '0'; (*nmax)--; } if (*nmax > 1) { *(*pinsertion)++ = fmt; (*nmax)--; } } else if (addprefix == 1) /* sign */ { if (*nmax > 1) { *(*pinsertion)++ = sign; (*nmax)--; } } } /* Write number */ if (*nmax <= 1) len = 0; else if (*nmax + 1 < len) len = *nmax - 1; for (; len > 0; len--) { char n = POP(); if (n <= 9) *(*pinsertion)++ = n + '0'; else *(*pinsertion)++ = n - 10 + char10; } *nmax -= len; if (flags & FLAG_LEFT_ALIGN) { if (*nmax <= 1) widthpad = 0; else if (*nmax + 1 < widthpad) widthpad = *nmax - 1; memset(*pinsertion, ' ', widthpad); *pinsertion += widthpad; *nmax -= widthpad; } return totallen;}/* Almost 400 lines of floating point stuff have been cut out. Sorry Alex!*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -