'i'): /* signed decimal output */ flags |= FL_SIGNED; radix = 10; goto COMMON_INT; case _T('u'): radix = 10; goto COMMON_INT; case _T('p'): /* write a pointer -- this is like an integer or long */ /* except we force precision to pad with zeros and */ /* output in big hex. */ precision = 2 * sizeof(void *); /* number of hex digits needed */ #if !PTR_IS_INT flags |= FL_LONG; /* assume we're converting a long */ #endif /* DROP THROUGH to hex formatting */ case _T('X'): /* unsigned upper hex output */ hexadd = _T('A') - _T('9') - 1; /* set hexadd for uppercase hex */ goto COMMON_HEX; case _T('x'): /* unsigned lower hex output */ hexadd = _T('a') - _T('9') - 1; /* set hexadd for lowercase hex */ /* DROP THROUGH TO COMMON_HEX */ COMMON_HEX: radix = 16; if (flags & FL_ALTERNATE) { /* alternate form means '0x' prefix */ prefix[0] = _T('0'); prefix[1] = (TCHAR)(_T('x') - _T('a') + _T('9') + 1 + hexadd); /* 'x' or 'X' */ prefixlen = 2; } goto COMMON_INT; case _T('o'): /* unsigned octal output */ radix = 8; if (flags & FL_ALTERNATE) { /* alternate form means force a leading 0 */ flags |= FL_FORCEOCTAL; } /* DROP THROUGH to COMMON_INT */ COMMON_INT: { /* This is the general integer formatting routine. */ /* Basically, we get an argument, make it positive */ /* if necessary, and convert it according to the */ /* correct radix, setting text and textlen */ /* appropriately. */ #ifdef _ALPHA_ unsigned __int64 number; /* number to convert */ int digit; /* ascii value of digit */ __int64 l; /* temp long value */ #else unsigned long number; /* number to convert */ int digit; /* ascii value of digit */ long l; /* temp long value */ #endif /* 1. read argument into l, sign extend as needed */ #ifdef _ALPHA_ if (flags & FL_LONGDOUBLE) l = get_quad_arg(&argptr); else #endif #if !LONG_IS_INT if (flags & FL_LONG) l = get_long_arg(&argptr); else #endif #if !SHORT_IS_INT if (flags & FL_SHORT) { if (flags & FL_SIGNED) l = (short) get_int_arg(&argptr); /* sign extend */ else l = (unsigned short) get_int_arg(&argptr); /* zero-extend*/ } else #endif { if (flags & FL_SIGNED) l = get_int_arg(&argptr); /* sign extend */ else l = (unsigned int) get_int_arg(&argptr); /* zero-extend*/ } /* 2. check for negative; copy into number */ if ( (flags & FL_SIGNED) && l < 0) { number = -l; flags |= FL_NEGATIVE; /* remember negative sign */ } else { number = l; } #ifdef _ALPHA_ if ((flags & FL_LONGDOUBLE) == 0) { /* * Unless printing a full 64-bit value, insure values * here are not in cananical longword format to prevent * the sign extended upper 32-bits from being printed. */ number &= 0xffffffff; } #endif /* 3. check precision value for default; non-default */ /* turns off 0 flag, according to A |