Fix snprintf.c for machines that don't have long long, like some Irix.

This commit is contained in:
Bruce Momjian 1998-10-07 17:12:52 +00:00
parent 7d4b59f024
commit 9549a8cd7d
2 changed files with 310 additions and 243 deletions

View File

@ -7,7 +7,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.82 1998/09/23 04:22:05 momjian Exp $ * $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.83 1998/10/07 17:12:50 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -576,8 +576,8 @@ vc_vacone(Oid relid, bool analyze, List *va_cols)
heap_close(rel); heap_close(rel);
/* update statistics in pg_class */ /* update statistics in pg_class */
vc_updstats(vacrelstats->relid, vacrelstats->num_pages, vacrelstats->num_tuples, vc_updstats(vacrelstats->relid, vacrelstats->num_pages,
vacrelstats->hasindex, vacrelstats); vacrelstats->num_tuples, vacrelstats->hasindex, vacrelstats);
/* next command frees attribute stats */ /* next command frees attribute stats */

View File

@ -7,22 +7,22 @@
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
* are met: * are met:
* 1. Redistributions of source code must retain the above copyright * 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer. * notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright * 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the * notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. * documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software * 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement: * must display the following acknowledgement:
* This product includes software developed by the University of * This product includes software developed by the University of
* California, Berkeley and its contributors. * California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors * 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software * may be used to endorse or promote products derived from this software
* without specific prior written permission. * without specific prior written permission.
* *
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
@ -32,27 +32,29 @@
* SUCH DAMAGE. * SUCH DAMAGE.
*/ */
#if 0 #if 0
# include "sendmail.h" #include "sendmail.h"
# include "pathnames.h" #include "pathnames.h"
#endif #endif
# include "postgres.h" #include "postgres.h"
# include "regex/cdefs.h" #include "regex/cdefs.h"
# include <stdarg.h> #include <stdarg.h>
# define VA_LOCAL_DECL va_list args; #define VA_LOCAL_DECL va_list args;
# define VA_START(f) va_start(args, f) #define VA_START(f) va_start(args, f)
# define VA_END va_end(args) #define VA_END va_end(args)
# include <sys/ioctl.h> #include <sys/ioctl.h>
# include <sys/param.h> #include <sys/param.h>
/* IRIX doesn't do 'long long' in va_arg(), so use a typedef */ /* IRIX doesn't do 'long long' in va_arg(), so use a typedef */
#ifdef HAVE_LONG_INT_64
typedef long long long_long; typedef long long long_long;
#endif
/* /*
** SNPRINTF, VSNPRINT -- counted versions of printf ** SNPRINTF, VSNPRINT -- counted versions of printf
** **
** These versions have been grabbed off the net. They have been ** These versions have been grabbed off the net. They have been
** cleaned up to compile properly and support for .precision and ** cleaned up to compile properly and support for .precision and
@ -63,7 +65,7 @@ typedef long long long_long;
* Original: * Original:
* Patrick Powell Tue Apr 11 09:48:21 PDT 1995 * Patrick Powell Tue Apr 11 09:48:21 PDT 1995
* A bombproof version of doprnt (dopr) included. * A bombproof version of doprnt (dopr) included.
* Sigh. This sort of thing is always nasty do deal with. Note that * Sigh. This sort of thing is always nasty do deal with. Note that
* the version here does not include floating point... * the version here does not include floating point...
* *
* snprintf() is used instead of sprintf() as it does limit checks * snprintf() is used instead of sprintf() as it does limit checks
@ -73,21 +75,22 @@ typedef long long long_long;
* causing nast effects. * causing nast effects.
**************************************************************/ **************************************************************/
/*static char _id[] = "$Id: snprintf.c,v 1.8 1998/10/02 15:38:01 momjian Exp $";*/ /*static char _id[] = "$Id: snprintf.c,v 1.9 1998/10/07 17:12:52 momjian Exp $";*/
static char *end; static char *end;
static int SnprfOverflow; static int SnprfOverflow;
int snprintf(char *str, size_t count, const char *fmt, ...); int snprintf(char *str, size_t count, const char *fmt,...);
int vsnprintf(char *str, size_t count, const char *fmt, ...); int vsnprintf(char *str, size_t count, const char *fmt,...);
static void dopr (char *buffer, const char *format, ... ); static void dopr(char *buffer, const char *format,...);
int int
snprintf(char *str, size_t count, const char *fmt, ...) snprintf(char *str, size_t count, const char *fmt,...)
{ {
int len; int len;
VA_LOCAL_DECL VA_LOCAL_DECL
VA_START(fmt); VA_START(fmt);
len = vsnprintf(str, count, fmt, args); len = vsnprintf(str, count, fmt, args);
VA_END; VA_END;
return len; return len;
@ -95,7 +98,7 @@ snprintf(char *str, size_t count, const char *fmt, ...)
int int
vsnprintf(char *str, size_t count, const char *fmt, ...) vsnprintf(char *str, size_t count, const char *fmt,...)
{ {
VA_LOCAL_DECL VA_LOCAL_DECL
@ -103,12 +106,12 @@ vsnprintf(char *str, size_t count, const char *fmt, ...)
str[0] = 0; str[0] = 0;
end = str + count - 1; end = str + count - 1;
SnprfOverflow = 0; SnprfOverflow = 0;
dopr( str, fmt, args); dopr(str, fmt, args);
if (count > 0) if (count > 0)
end[0] = 0; end[0] = 0;
if (SnprfOverflow) if (SnprfOverflow)
elog(NOTICE, "vsnprintf overflow, len = %d, str = %s", elog(NOTICE, "vsnprintf overflow, len = %d, str = %s",
count, str); count, str);
VA_END; VA_END;
return strlen(str); return strlen(str);
} }
@ -119,243 +122,307 @@ vsnprintf(char *str, size_t count, const char *fmt, ...)
static void fmtstr __P((char *value, int ljust, int len, int zpad, int maxwidth)); static void fmtstr __P((char *value, int ljust, int len, int zpad, int maxwidth));
static void fmtnum __P((long value, int base, int dosign, int ljust, int len, int zpad)); static void fmtnum __P((long value, int base, int dosign, int ljust, int len, int zpad));
static void dostr __P(( char * , int )); static void dostr __P((char *, int));
static char *output; static char *output;
static void dopr_outch __P(( int c )); static void dopr_outch __P((int c));
static void static void
dopr (char *buffer, const char *format, ... ) dopr(char *buffer, const char *format,...)
{ {
int ch; int ch;
long value; long value;
int longflag = 0; int longflag = 0;
int longlongflag = 0; int longlongflag = 0;
int pointflag = 0; int pointflag = 0;
int maxwidth = 0; int maxwidth = 0;
char *strvalue; char *strvalue;
int ljust; int ljust;
int len; int len;
int zpad; int zpad;
VA_LOCAL_DECL VA_LOCAL_DECL
VA_START(format); VA_START(format);
output = buffer; output = buffer;
while( (ch = *format++) ){ while ((ch = *format++))
switch( ch ){ {
case '%': switch (ch)
ljust = len = zpad = maxwidth = 0; {
longflag = pointflag = 0; case '%':
nextch: ljust = len = zpad = maxwidth = 0;
ch = *format++; longflag = pointflag = 0;
switch( ch ){ nextch:
case 0: ch = *format++;
dostr( "**end of format**" , 0); switch (ch)
VA_END; {
return; case 0:
case '-': ljust = 1; goto nextch; dostr("**end of format**", 0);
case '0': /* set zero padding if len not set */ VA_END;
if(len==0 && !pointflag) zpad = '0'; return;
case '1': case '2': case '3': case '-':
case '4': case '5': case '6': ljust = 1;
case '7': case '8': case '9': goto nextch;
if (pointflag) case '0': /* set zero padding if len not set */
maxwidth = maxwidth*10 + ch - '0'; if (len == 0 && !pointflag)
else zpad = '0';
len = len*10 + ch - '0'; case '1':
goto nextch; case '2':
case '*': case '3':
if (pointflag) case '4':
maxwidth = va_arg( args, int ); case '5':
else case '6':
len = va_arg( args, int ); case '7':
goto nextch; case '8':
case '.': pointflag = 1; goto nextch; case '9':
case 'l': if(longflag) { if (pointflag)
longlongflag = 1; goto nextch; maxwidth = maxwidth * 10 + ch - '0';
} else { else
longflag = 1; goto nextch; len = len * 10 + ch - '0';
} goto nextch;
case 'u': case 'U': case '*':
/*fmtnum(value,base,dosign,ljust,len,zpad) */ if (pointflag)
if( longflag ){ maxwidth = va_arg(args, int);
value = va_arg( args, long ); else
} else { len = va_arg(args, int);
value = va_arg( args, int ); goto nextch;
} case '.':
fmtnum( value, 10,0, ljust, len, zpad ); break; pointflag = 1;
case 'o': case 'O': goto nextch;
/*fmtnum(value,base,dosign,ljust,len,zpad) */ case 'l':
if( longflag ){ if (longflag)
value = va_arg( args, long ); {
} else { longlongflag = 1;
value = va_arg( args, int ); goto nextch;
} }
fmtnum( value, 8,0, ljust, len, zpad ); break; else
case 'd': case 'D': {
if( longflag ){ longflag = 1;
if( longlongflag ) { goto nextch;
value = va_arg( args, long_long ); }
} else { case 'u':
value = va_arg( args, long ); case 'U':
} /* fmtnum(value,base,dosign,ljust,len,zpad) */
} else { if (longflag)
value = va_arg( args, int ); value = va_arg(args, long);
} else
fmtnum( value, 10,1, ljust, len, zpad ); break; value = va_arg(args, int);
case 'x': fmtnum(value, 10, 0, ljust, len, zpad);
if( longflag ){ break;
value = va_arg( args, long ); case 'o':
} else { case 'O':
value = va_arg( args, int ); /* fmtnum(value,base,dosign,ljust,len,zpad) */
} if (longflag)
fmtnum( value, 16,0, ljust, len, zpad ); break; value = va_arg(args, long);
case 'X': else
if( longflag ){ value = va_arg(args, int);
value = va_arg( args, long ); fmtnum(value, 8, 0, ljust, len, zpad);
} else { break;
value = va_arg( args, int ); case 'd':
} case 'D':
fmtnum( value,-16,0, ljust, len, zpad ); break; if (longflag)
case 's': {
strvalue = va_arg( args, char *); #ifdef HAVE_LONG_INT_64
if (maxwidth > 0 || !pointflag) { if (longlongflag)
if (pointflag && len > maxwidth) value = va_arg(args, long_long);
len = maxwidth; /* Adjust padding */ else
fmtstr( strvalue,ljust,len,zpad, maxwidth); #endif
} value = va_arg(args, long);
break; }
case 'c': else
ch = va_arg( args, int ); value = va_arg(args, int);
dopr_outch( ch ); break; fmtnum(value, 10, 1, ljust, len, zpad);
case '%': dopr_outch( ch ); continue; break;
default: case 'x':
dostr( "???????" , 0); if (longflag)
} value = va_arg(args, long);
break; else
default: value = va_arg(args, int);
dopr_outch( ch ); fmtnum(value, 16, 0, ljust, len, zpad);
break; break;
} case 'X':
} if (longflag)
*output = 0; value = va_arg(args, long);
VA_END; else
value = va_arg(args, int);
fmtnum(value, -16, 0, ljust, len, zpad);
break;
case 's':
strvalue = va_arg(args, char *);
if (maxwidth > 0 || !pointflag)
{
if (pointflag && len > maxwidth)
len = maxwidth; /* Adjust padding */
fmtstr(strvalue, ljust, len, zpad, maxwidth);
}
break;
case 'c':
ch = va_arg(args, int);
dopr_outch(ch);
break;
case '%':
dopr_outch(ch);
continue;
default:
dostr("???????", 0);
}
break;
default:
dopr_outch(ch);
break;
}
}
*output = 0;
VA_END;
} }
static void static void
fmtstr( value, ljust, len, zpad, maxwidth ) fmtstr(value, ljust, len, zpad, maxwidth)
char *value; char *value;
int ljust, len, zpad, maxwidth; int ljust,
len,
zpad,
maxwidth;
{ {
int padlen, strlen; /* amount to pad */ int padlen,
strlen; /* amount to pad */
if( value == 0 ){ if (value == 0)
value = "<NULL>"; value = "<NULL>";
} for (strlen = 0; value[strlen]; ++strlen); /* strlen */
for( strlen = 0; value[strlen]; ++ strlen ); /* strlen */ if (strlen > maxwidth && maxwidth)
if (strlen > maxwidth && maxwidth) strlen = maxwidth;
strlen = maxwidth; padlen = len - strlen;
padlen = len - strlen; if (padlen < 0)
if( padlen < 0 ) padlen = 0; padlen = 0;
if( ljust ) padlen = -padlen; if (ljust)
while( padlen > 0 ) { padlen = -padlen;
dopr_outch( ' ' ); while (padlen > 0)
--padlen; {
} dopr_outch(' ');
dostr( value, maxwidth ); --padlen;
while( padlen < 0 ) { }
dopr_outch( ' ' ); dostr(value, maxwidth);
++padlen; while (padlen < 0)
} {
dopr_outch(' ');
++padlen;
}
} }
static void static void
fmtnum( value, base, dosign, ljust, len, zpad ) fmtnum(value, base, dosign, ljust, len, zpad)
long value; long value;
int base, dosign, ljust, len, zpad; int base,
dosign,
ljust,
len,
zpad;
{ {
int signvalue = 0; int signvalue = 0;
unsigned long uvalue; unsigned long uvalue;
char convert[20]; char convert[20];
int place = 0; int place = 0;
int padlen = 0; /* amount to pad */ int padlen = 0; /* amount to pad */
int caps = 0; int caps = 0;
/* DEBUGP(("value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n", /*
value, base, dosign, ljust, len, zpad )); */ * DEBUGP(("value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad
uvalue = value; * %d\n", value, base, dosign, ljust, len, zpad ));
if( dosign ){ */
if( value < 0 ) { uvalue = value;
signvalue = '-'; if (dosign)
uvalue = -value; {
} if (value < 0)
} {
if( base < 0 ){ signvalue = '-';
caps = 1; uvalue = -value;
base = -base; }
} }
do{ if (base < 0)
convert[place++] = {
(caps? "0123456789ABCDEF":"0123456789abcdef") caps = 1;
[uvalue % (unsigned)base ]; base = -base;
uvalue = (uvalue / (unsigned)base ); }
}while(uvalue); do
convert[place] = 0; {
padlen = len - place; convert[place++] =
if( padlen < 0 ) padlen = 0; (caps ? "0123456789ABCDEF" : "0123456789abcdef")
if( ljust ) padlen = -padlen; [uvalue % (unsigned) base];
/* DEBUGP(( "str '%s', place %d, sign %c, padlen %d\n", uvalue = (uvalue / (unsigned) base);
convert,place,signvalue,padlen)); */ } while (uvalue);
if( zpad && padlen > 0 ){ convert[place] = 0;
if( signvalue ){ padlen = len - place;
dopr_outch( signvalue ); if (padlen < 0)
--padlen; padlen = 0;
signvalue = 0; if (ljust)
} padlen = -padlen;
while( padlen > 0 ){
dopr_outch( zpad ); /*
--padlen; * DEBUGP(( "str '%s', place %d, sign %c, padlen %d\n",
} * convert,place,signvalue,padlen));
} */
while( padlen > 0 ) { if (zpad && padlen > 0)
dopr_outch( ' ' ); {
--padlen; if (signvalue)
} {
if( signvalue ) dopr_outch( signvalue ); dopr_outch(signvalue);
while( place > 0 ) dopr_outch( convert[--place] ); --padlen;
while( padlen < 0 ){ signvalue = 0;
dopr_outch( ' ' ); }
++padlen; while (padlen > 0)
} {
dopr_outch(zpad);
--padlen;
}
}
while (padlen > 0)
{
dopr_outch(' ');
--padlen;
}
if (signvalue)
dopr_outch(signvalue);
while (place > 0)
dopr_outch(convert[--place]);
while (padlen < 0)
{
dopr_outch(' ');
++padlen;
}
} }
static void static void
dostr( str , cut) dostr(str, cut)
char *str; char *str;
int cut; int cut;
{ {
if (cut) { if (cut)
while(*str && cut-- > 0) dopr_outch(*str++); {
} else { while (*str && cut-- > 0)
while(*str) dopr_outch(*str++); dopr_outch(*str++);
} }
else
{
while (*str)
dopr_outch(*str++);
}
} }
static void static void
dopr_outch( c ) dopr_outch(c)
int c; int c;
{ {
#if 0 #if 0
if( iscntrl(c) && c != '\n' && c != '\t' ){ if (iscntrl(c) && c != '\n' && c != '\t')
c = '@' + (c & 0x1F); {
if( end == 0 || output < end ) c = '@' + (c & 0x1F);
*output++ = '^'; if (end == 0 || output < end)
} *output++ = '^';
}
#endif #endif
if( end == 0 || output < end ) if (end == 0 || output < end)
*output++ = c; *output++ = c;
else else
SnprfOverflow++; SnprfOverflow++;
} }