add support for printing long long (if available)

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10310 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Assar Westerlund
2001-07-11 03:19:01 +00:00
parent 7cb78dc73f
commit 07c3e7899b

View File

@@ -109,24 +109,34 @@ as_append_char (struct state *state, unsigned char c)
*state->s++ = c; *state->s++ = c;
} }
/* longest integer types */
#ifdef HAVE_LONG_LONG
typedef unsigned long long u_longest;
typedef long long longest;
#else
typedef unsigned long u_longest;
typedef long longest;
#endif
/* /*
* is # supposed to do anything? * is # supposed to do anything?
*/ */
static int static int
use_alternative (int flags, unsigned long num, unsigned base) use_alternative (int flags, u_longest num, unsigned base)
{ {
return flags & alternate_flag && (base == 16 || base == 8) && num != 0; return flags & alternate_flag && (base == 16 || base == 8) && num != 0;
} }
static int static int
append_number(struct state *state, append_number(struct state *state,
unsigned long num, unsigned base, char *rep, u_longest num, unsigned base, char *rep,
int width, int prec, int flags, int minusp) int width, int prec, int flags, int minusp)
{ {
int len = 0; int len = 0;
int i; int i;
unsigned long n = num; u_longest n = num;
/* given precision, ignore zero flag */ /* given precision, ignore zero flag */
if(prec != -1) if(prec != -1)
@@ -268,6 +278,20 @@ append_char(struct state *state,
* This can't be made into a function... * This can't be made into a function...
*/ */
#ifdef HAVE_LONG_LONG
#define PARSE_INT_FORMAT(res, arg, unsig) \
if (long_long_flag) \
res = (unsig long long)va_arg(arg, unsig long long); \
else if (long_flag) \
res = (unsig long)va_arg(arg, unsig long); \
else if (short_flag) \
res = (unsig short)va_arg(arg, unsig int); \
else \
res = (unsig int)va_arg(arg, unsig int)
#else
#define PARSE_INT_FORMAT(res, arg, unsig) \ #define PARSE_INT_FORMAT(res, arg, unsig) \
if (long_flag) \ if (long_flag) \
res = (unsig long)va_arg(arg, unsig long); \ res = (unsig long)va_arg(arg, unsig long); \
@@ -276,6 +300,8 @@ else if (short_flag) \
else \ else \
res = (unsig int)va_arg(arg, unsig int) res = (unsig int)va_arg(arg, unsig int)
#endif
/* /*
* zyxprintf - return length, as snprintf * zyxprintf - return length, as snprintf
*/ */
@@ -289,11 +315,12 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
while((c = *format++)) { while((c = *format++)) {
if (c == '%') { if (c == '%') {
int flags = 0; int flags = 0;
int width = 0; int width = 0;
int prec = -1; int prec = -1;
int long_flag = 0; int long_long_flag = 0;
int short_flag = 0; int long_flag = 0;
int short_flag = 0;
/* flags */ /* flags */
while((c = *format++)){ while((c = *format++)){
@@ -351,6 +378,10 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
} else if (c == 'l') { } else if (c == 'l') {
long_flag = 1; long_flag = 1;
c = *format++; c = *format++;
if (c == 'l') {
long_long_flag = 1;
c = *format++;
}
} }
switch (c) { switch (c) {
@@ -367,8 +398,8 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
break; break;
case 'd' : case 'd' :
case 'i' : { case 'i' : {
long arg; longest arg;
unsigned long num; u_longest num;
int minusp = 0; int minusp = 0;
PARSE_INT_FORMAT(arg, ap, signed); PARSE_INT_FORMAT(arg, ap, signed);
@@ -384,7 +415,7 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
break; break;
} }
case 'u' : { case 'u' : {
unsigned long arg; u_longest arg;
PARSE_INT_FORMAT(arg, ap, unsigned); PARSE_INT_FORMAT(arg, ap, unsigned);
@@ -393,7 +424,7 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
break; break;
} }
case 'o' : { case 'o' : {
unsigned long arg; u_longest arg;
PARSE_INT_FORMAT(arg, ap, unsigned); PARSE_INT_FORMAT(arg, ap, unsigned);
@@ -402,7 +433,7 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
break; break;
} }
case 'x' : { case 'x' : {
unsigned long arg; u_longest arg;
PARSE_INT_FORMAT(arg, ap, unsigned); PARSE_INT_FORMAT(arg, ap, unsigned);
@@ -411,7 +442,7 @@ xyzprintf (struct state *state, const char *char_format, va_list ap)
break; break;
} }
case 'X' :{ case 'X' :{
unsigned long arg; u_longest arg;
PARSE_INT_FORMAT(arg, ap, unsigned); PARSE_INT_FORMAT(arg, ap, unsigned);