From 046ff0edbba626fc32c37c08cfba99cfeef41b6d Mon Sep 17 00:00:00 2001 From: Chip Salzenberg Date: Wed, 5 Feb 1997 11:54:13 +1200 Subject: [PATCH] Support '%i' format and 'h' modifier in s?printf --- doop.c | 72 +++++++++++++++++++++++++++-------------------- pod/perldelta.pod | 6 ++++ 2 files changed, 48 insertions(+), 30 deletions(-) diff --git a/doop.c b/doop.c index cb5560cc3b..f16ec6471f 100644 --- a/doop.c +++ b/doop.c @@ -149,10 +149,7 @@ register SV **sarg; register char *s; register char *t; register char *f; - bool dolong; -#ifdef HAS_QUAD - bool doquad; -#endif /* HAS_QUAD */ + char dotype; char ch; register char *send; register SV *arg; @@ -181,10 +178,7 @@ register SV **sarg; f = t; *buf = '\0'; xs = buf; -#ifdef HAS_QUAD - doquad = -#endif /* HAS_QUAD */ - dolong = FALSE; + dotype = '\0'; pre = post = 0; for (t++; t < send; t++) { switch (*t) { @@ -204,12 +198,14 @@ register SV **sarg; continue; case 'l': #ifdef HAS_QUAD - if (dolong) { - dolong = FALSE; - doquad = TRUE; - } else + if (dotype == 'l') + dotype = 'q'; + else #endif - dolong = TRUE; + dotype = 'l'; + continue; + case 'h': + dotype = 's'; continue; case 'c': ch = *(++t); @@ -226,38 +222,54 @@ register SV **sarg; } break; case 'D': - dolong = TRUE; + dotype = 'l'; /* FALL THROUGH */ case 'd': + case 'i': ch = *(++t); *t = '\0'; + switch (dotype) { #ifdef HAS_QUAD - if (doquad) - (void)sprintf(buf,s,(Quad_t)SvNV(arg)); - else + case 'q': + /* perl.h says that if quad is available, IV is quad */ + (void)sprintf(xs,f,(Quad_t)SvIV(arg)); + break; #endif - if (dolong) - (void)sprintf(xs,f,(long)SvNV(arg)); - else - (void)sprintf(xs,f,SvIV(arg)); + case 'l': + (void)sprintf(xs,f,(long)SvIV(arg)); + break; + default: + (void)sprintf(xs,f,(int)SvIV(arg)); + break; + case 's': + (void)sprintf(xs,f,(short)SvIV(arg)); + break; + } xlen = strlen(xs); break; case 'X': case 'O': - dolong = TRUE; + dotype = 'l'; /* FALL THROUGH */ case 'x': case 'o': case 'u': ch = *(++t); *t = '\0'; - value = SvNV(arg); + switch (dotype) { #ifdef HAS_QUAD - if (doquad) - (void)sprintf(buf,s,(unsigned Quad_t)value); - else + case 'q': + /* perl.h says that if quad is available, UV is quad */ + (void)sprintf(xs,f,(unsigned Quad_t)SvUV(arg)); + break; #endif - if (dolong) - (void)sprintf(xs,f,U_L(value)); - else - (void)sprintf(xs,f,U_I(value)); + case 'l': + (void)sprintf(xs,f,(unsigned long)SvUV(arg)); + break; + default: + (void)sprintf(xs,f,(unsigned int)SvUV(arg)); + break; + case 's': + (void)sprintf(xs,f,(unsigned short)SvUV(arg)); + break; + } xlen = strlen(xs); break; case 'E': case 'e': case 'f': case 'G': case 'g': diff --git a/pod/perldelta.pod b/pod/perldelta.pod index 56745d1d98..bfaeedcc11 100644 --- a/pod/perldelta.pod +++ b/pod/perldelta.pod @@ -103,6 +103,12 @@ This now works. (e.g. C) is now supported on more platforms, and prefers fcntl to lockf when emulating. +=item printf and sprintf + +now support "%i" as a synonym for "%d", and the "h" modifier. +So "%hi" means "short integer in decimal", and "%ho" means +"unsigned short integer as octal". + =item keys as an lvalue As an lvalue, C allows you to increase the number of hash buckets -- 2.34.1