|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* snpf.c -- snprintf() empulation functions for lsof library
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* V. Abell
|
|
Packit |
6f02de |
* Purdue University Computing Center
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* Copyright 2000 Purdue Research Foundation, West Lafayette, Indiana
|
|
Packit |
6f02de |
* 47907. All rights reserved.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* Written by Victor A. Abell
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* This software is not subject to any license of the American Telephone
|
|
Packit |
6f02de |
* and Telegraph Company or the Regents of the University of California.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* This software has been adapted from snprintf.c in sendmail 8.9.3. It
|
|
Packit |
6f02de |
* is subject to the sendmail copyright statements listed below, and the
|
|
Packit |
6f02de |
* sendmail licensing terms stated in the sendmail LICENSE file comment
|
|
Packit |
6f02de |
* section of this file.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* Permission is granted to anyone to use this software for any purpose on
|
|
Packit |
6f02de |
* any computer system, and to alter it and redistribute it freely, subject
|
|
Packit |
6f02de |
* to the following restrictions:
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* 1. Neither the authors nor Purdue University are responsible for any
|
|
Packit |
6f02de |
* consequences of the use of this software.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* 2. The origin of this software must not be misrepresented, either by
|
|
Packit |
6f02de |
* explicit claim or by omission. Credit to the authors and Purdue
|
|
Packit |
6f02de |
* University must appear in documentation and sources.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* 3. Altered versions must be plainly marked as such, and must not be
|
|
Packit |
6f02de |
* misrepresented as being the original software.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* 4. This notice may not be removed or altered.
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
#include "../machine.h"
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
#ifdef USE_LIB_SNPF
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* Sendmail copyright statements:
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* Copyright (c) 1998 Sendmail, Inc. All rights reserved.
|
|
Packit |
6f02de |
* Copyright (c) 1997 Eric P. Allman. All rights reserved.
|
|
Packit |
6f02de |
* Copyright (c) 1988, 1993
|
|
Packit |
6f02de |
* The Regents of the University of California. All rights reserved.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* By using this file, you agree to the terms and conditions set
|
|
Packit |
6f02de |
* forth in the LICENSE file which can be found at the top level of
|
|
Packit |
6f02de |
* the sendmail distribution.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* The LICENSE file may be found in the following comment section.
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* Begin endmail LICENSE file.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
SENDMAIL LICENSE
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
The following license terms and conditions apply, unless a different
|
|
Packit |
6f02de |
license is obtained from Sendmail, Inc., 1401 Park Avenue, Emeryville, CA
|
|
Packit |
6f02de |
94608, or by electronic mail at license@sendmail.com.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
License Terms:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
Use, Modification and Redistribution (including distribution of any
|
|
Packit |
6f02de |
modified or derived work) in source and binary forms is permitted only if
|
|
Packit |
6f02de |
each of the following conditions is met:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
1. Redistributions qualify as "freeware" or "Open Source Software" under
|
|
Packit |
6f02de |
one of the following terms:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(a) Redistributions are made at no charge beyond the reasonable cost of
|
|
Packit |
6f02de |
materials and delivery.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(b) Redistributions are accompanied by a copy of the Source Code or by an
|
|
Packit |
6f02de |
irrevocable offer to provide a copy of the Source Code for up to three
|
|
Packit |
6f02de |
years at the cost of materials and delivery. Such redistributions
|
|
Packit |
6f02de |
must allow further use, modification, and redistribution of the Source
|
|
Packit |
6f02de |
Code under substantially the same terms as this license. For the
|
|
Packit |
6f02de |
purposes of redistribution "Source Code" means the complete source
|
|
Packit |
6f02de |
code of sendmail including all modifications.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
Other forms of redistribution are allowed only under a separate royalty-
|
|
Packit |
6f02de |
free agreement permitting such redistribution subject to standard
|
|
Packit |
6f02de |
commercial terms and conditions. A copy of such agreement may be
|
|
Packit |
6f02de |
obtained from Sendmail, Inc. at the above address.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
2. Redistributions of source code must retain the copyright notices as they
|
|
Packit |
6f02de |
appear in each source code file, these license terms, and the
|
|
Packit |
6f02de |
disclaimer/limitation of liability set forth as paragraph 6 below.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
3. Redistributions in binary form must reproduce the Copyright Notice,
|
|
Packit |
6f02de |
these license terms, and the disclaimer/limitation of liability set
|
|
Packit |
6f02de |
forth as paragraph 6 below, in the documentation and/or other materials
|
|
Packit |
6f02de |
provided with the distribution. For the purposes of binary distribution
|
|
Packit |
6f02de |
the "Copyright Notice" refers to the following language:
|
|
Packit |
6f02de |
"Copyright (c) 1998 Sendmail, Inc. All rights reserved."
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
4. Neither the name of Sendmail, Inc. nor the University of California nor
|
|
Packit |
6f02de |
the names of their contributors may be used to endorse or promote
|
|
Packit |
6f02de |
products derived from this software without specific prior written
|
|
Packit |
6f02de |
permission. The name "sendmail" is a trademark of Sendmail, Inc.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
5. All redistributions must comply with the conditions imposed by the
|
|
Packit |
6f02de |
University of California on certain embedded code, whose copyright
|
|
Packit |
6f02de |
notice and conditions for redistribution are as follows:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(a) Copyright (c) 1988, 1993 The Regents of the University of
|
|
Packit |
6f02de |
California. All rights reserved.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(b) Redistribution and use in source and binary forms, with or without
|
|
Packit |
6f02de |
modification, are permitted provided that the following conditions
|
|
Packit |
6f02de |
are met:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(i) Redistributions of source code must retain the above copyright
|
|
Packit |
6f02de |
notice, this list of conditions and the following disclaimer.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(ii) Redistributions in binary form must reproduce the above
|
|
Packit |
6f02de |
copyright notice, this list of conditions and the following
|
|
Packit |
6f02de |
disclaimer in the documentation and/or other materials provided
|
|
Packit |
6f02de |
with the distribution.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(iii) All advertising materials mentioning features or use of this
|
|
Packit |
6f02de |
software must display the following acknowledgement: "This
|
|
Packit |
6f02de |
product includes software developed by the University of
|
|
Packit |
6f02de |
California, Berkeley and its contributors."
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(iv) Neither the name of the University nor the names of its
|
|
Packit |
6f02de |
contributors may be used to endorse or promote products derived
|
|
Packit |
6f02de |
from this software without specific prior written permission.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY
|
|
Packit |
6f02de |
SENDMAIL, INC. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
Packit |
6f02de |
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
Packit |
6f02de |
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
|
|
Packit |
6f02de |
NO EVENT SHALL SENDMAIL, INC., THE REGENTS OF THE UNIVERSITY OF
|
|
Packit |
6f02de |
CALIFORNIA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
Packit |
6f02de |
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
Packit |
6f02de |
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
|
|
Packit |
6f02de |
USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
Packit |
6f02de |
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
Packit |
6f02de |
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
Packit |
6f02de |
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
(Version 8.6, last updated 6/24/1998)
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
* End endmail LICENSE file.
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* If "ll" format support is not possible -- e.g., the long long type isn't
|
|
Packit |
6f02de |
* supported -- define HAS_NO_LONG_LONG.
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# ifndef lint
|
|
Packit |
6f02de |
static char copyright[] =
|
|
Packit |
6f02de |
"@(#) Copyright 2000 Purdue Research Foundation.\nAll rights reserved.\n";
|
|
Packit |
6f02de |
# endif /* !defined(lint) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
#include <varargs.h>
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
#if defined(__STDC__)
|
|
Packit |
6f02de |
#define _PROTOTYPE(function, params) function params
|
|
Packit |
6f02de |
#else /* !defined(__STDC__) */
|
|
Packit |
6f02de |
#define _PROTOTYPE(function, params) function()
|
|
Packit |
6f02de |
#endif /* defined(__STDC__) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
** SNPRINTF, VSNPRINT -- counted versions of printf
|
|
Packit |
6f02de |
**
|
|
Packit |
6f02de |
** These versions have been grabbed off the net. They have been
|
|
Packit |
6f02de |
** cleaned up to compile properly and support for .precision and
|
|
Packit |
6f02de |
** %lx has been added.
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/**************************************************************
|
|
Packit |
6f02de |
* Original:
|
|
Packit |
6f02de |
* Patrick Powell Tue Apr 11 09:48:21 PDT 1995
|
|
Packit |
6f02de |
* A bombproof version of doprnt (dopr) included.
|
|
Packit |
6f02de |
* Sigh. This sort of thing is always nasty do deal with. Note that
|
|
Packit |
6f02de |
* the version here does not include floating point...
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* snprintf() is used instead of sprintf() as it does limit checks
|
|
Packit |
6f02de |
* for string length. This covers a nasty loophole.
|
|
Packit |
6f02de |
*
|
|
Packit |
6f02de |
* The other functions are there to prevent NULL pointers from
|
|
Packit |
6f02de |
* causing nast effects.
|
|
Packit |
6f02de |
**************************************************************/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*static char _id[] = "$Id: snpf.c,v 1.5 2008/10/21 16:13:23 abe Exp $";*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* Local function prototypes
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
_PROTOTYPE(static void dopr,(char *bp, char *ep, char *fmt, va_list args));
|
|
Packit |
6f02de |
_PROTOTYPE(static void dopr_outch,(char **bp, char *ep, int c));
|
|
Packit |
6f02de |
_PROTOTYPE(static void dostr,(char **bp, char *ep, char *str, int));
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
_PROTOTYPE(static void fmtllnum,(char **bp, char *ep, long long value,
|
|
Packit |
6f02de |
int base, int dosign, int ljust, int len,
|
|
Packit |
6f02de |
int zpad));
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
_PROTOTYPE(static void fmtnum,(char **bp, char *ep, long value, int base,
|
|
Packit |
6f02de |
int dosign, int ljust, int len, int zpad));
|
|
Packit |
6f02de |
_PROTOTYPE(static void fmtstr,(char **bp, char *ep, char *value, int ljust,
|
|
Packit |
6f02de |
int len, int zpad,
|
|
Packit |
6f02de |
int maxwidth));
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* Local variables
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static int Length;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* snpf() -- count-controlled sprintf()
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
int
|
|
Packit |
6f02de |
snpf(va_alist)
|
|
Packit |
6f02de |
va_dcl /* requires at least three arguments:
|
|
Packit |
6f02de |
* bp = receiving buffer pointer
|
|
Packit |
6f02de |
* ct = length of buffer
|
|
Packit |
6f02de |
* fmt = format string
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
va_list args;
|
|
Packit |
6f02de |
char *bp, *fmt;
|
|
Packit |
6f02de |
int ct, len;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
va_start(args);
|
|
Packit |
6f02de |
bp = va_arg(args, char *);
|
|
Packit |
6f02de |
ct = va_arg(args, int);
|
|
Packit |
6f02de |
fmt = va_arg(args, char *);
|
|
Packit |
6f02de |
len = vsnpf(bp, ct, fmt, args);
|
|
Packit |
6f02de |
va_end(args);
|
|
Packit |
6f02de |
return(len);
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* vsnpf() -- count-controlled vsprintf()
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
int
|
|
Packit |
6f02de |
vsnpf(str, count, fmt, args)
|
|
Packit |
6f02de |
char *str; /* result buffer */
|
|
Packit |
6f02de |
int count; /* size of buffer */
|
|
Packit |
6f02de |
char *fmt; /* format */
|
|
Packit |
6f02de |
va_list args; /* variable length argument list */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
char *ep = str + count - 1;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
*str = '\0';
|
|
Packit |
6f02de |
(void) dopr(str, ep, fmt, args);
|
|
Packit |
6f02de |
if (count > 0)
|
|
Packit |
6f02de |
*ep = '\0';
|
|
Packit |
6f02de |
return(Length);
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* dopr() -- poor man's version of doprintf
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
dopr(bp, ep, fmt, args)
|
|
Packit |
6f02de |
char *bp; /* buffer start */
|
|
Packit |
6f02de |
char *ep; /* buffer end (start + length - 1) */
|
|
Packit |
6f02de |
char *fmt; /* format */
|
|
Packit |
6f02de |
va_list args; /* variable length argument list */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
int ch;
|
|
Packit |
6f02de |
char ebuf[64];
|
|
Packit |
6f02de |
int ebufl = (int)(sizeof(ebuf) - 1);
|
|
Packit |
6f02de |
long value;
|
|
Packit |
6f02de |
int longflag = 0;
|
|
Packit |
6f02de |
int longlongflag = 0;
|
|
Packit |
6f02de |
int pointflag = 0;
|
|
Packit |
6f02de |
int maxwidth = 0;
|
|
Packit |
6f02de |
char *strvalue;
|
|
Packit |
6f02de |
int ljust;
|
|
Packit |
6f02de |
int len;
|
|
Packit |
6f02de |
int zpad;
|
|
Packit |
6f02de |
int zxflag = 0;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
long long llvalue;
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
Length = 0;
|
|
Packit |
6f02de |
while((ch = *fmt++)) {
|
|
Packit |
6f02de |
switch (ch) {
|
|
Packit |
6f02de |
case '%':
|
|
Packit |
6f02de |
ljust = len = zpad = zxflag = maxwidth = 0;
|
|
Packit |
6f02de |
longflag = longlongflag = pointflag = 0;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
nextch:
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
ch = *fmt++;
|
|
Packit |
6f02de |
switch (ch) {
|
|
Packit |
6f02de |
case '\0':
|
|
Packit |
6f02de |
dostr(&bp, ep, "**end of format**" , 0);
|
|
Packit |
6f02de |
return;
|
|
Packit |
6f02de |
case '-':
|
|
Packit |
6f02de |
ljust = 1;
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case '0': /* set zero padding if len not set */
|
|
Packit |
6f02de |
if ((len == 0) && !pointflag)
|
|
Packit |
6f02de |
zpad = '0';
|
|
Packit |
6f02de |
case '1':
|
|
Packit |
6f02de |
case '2':
|
|
Packit |
6f02de |
case '3':
|
|
Packit |
6f02de |
case '4':
|
|
Packit |
6f02de |
case '5':
|
|
Packit |
6f02de |
case '6':
|
|
Packit |
6f02de |
case '7':
|
|
Packit |
6f02de |
case '8':
|
|
Packit |
6f02de |
case '9':
|
|
Packit |
6f02de |
if (pointflag)
|
|
Packit |
6f02de |
maxwidth = (maxwidth * 10) + (int)(ch - '0');
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
len = (len * 10) + (int)(ch - '0');
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case '*':
|
|
Packit |
6f02de |
if (pointflag)
|
|
Packit |
6f02de |
maxwidth = va_arg(args, int);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
len = va_arg(args, int);
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case '#':
|
|
Packit |
6f02de |
zxflag = 1;
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case '.':
|
|
Packit |
6f02de |
pointflag = 1;
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case 'l':
|
|
Packit |
6f02de |
if (longflag) {
|
|
Packit |
6f02de |
longflag = 0;
|
|
Packit |
6f02de |
longlongflag = 1;
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
longflag = 1;
|
|
Packit |
6f02de |
goto nextch;
|
|
Packit |
6f02de |
case 'u':
|
|
Packit |
6f02de |
case 'U':
|
|
Packit |
6f02de |
if (longlongflag) {
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
llvalue = va_arg(args, long long);
|
|
Packit |
6f02de |
(void) fmtllnum(&bp,ep,llvalue,10,0,ljust,len,zpad);
|
|
Packit |
6f02de |
# else /* defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
(void) strncpy(ebuf, "ll is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (longflag)
|
|
Packit |
6f02de |
value = va_arg(args, long);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
value = va_arg(args, int);
|
|
Packit |
6f02de |
(void) fmtnum(&bp, ep, value, 10,0, ljust, len, zpad);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 'o':
|
|
Packit |
6f02de |
case 'O':
|
|
Packit |
6f02de |
if (longlongflag) {
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
llvalue = va_arg(args, long long);
|
|
Packit |
6f02de |
(void) fmtllnum(&bp,ep,llvalue,8,0,ljust,len,zpad);
|
|
Packit |
6f02de |
# else /* defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
(void) strncpy(ebuf, "ll is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (longflag)
|
|
Packit |
6f02de |
value = va_arg(args, long);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
value = va_arg(args, int);
|
|
Packit |
6f02de |
(void) fmtnum(&bp, ep, value, 8,0, ljust, len, zpad);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 'd':
|
|
Packit |
6f02de |
case 'D':
|
|
Packit |
6f02de |
if (longlongflag) {
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
llvalue = va_arg(args, long long);
|
|
Packit |
6f02de |
(void) fmtllnum(&bp,ep,llvalue,10,1,ljust,len,zpad);
|
|
Packit |
6f02de |
# else /* defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
(void) strncpy(ebuf, "ll is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (longflag)
|
|
Packit |
6f02de |
value = va_arg(args, long);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
value = va_arg(args, int);
|
|
Packit |
6f02de |
(void) fmtnum(&bp, ep, value, 10,1, ljust, len, zpad);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 'x':
|
|
Packit |
6f02de |
if (longlongflag) {
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
llvalue = va_arg(args, long long);
|
|
Packit |
6f02de |
if (zxflag && llvalue) {
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, "0x", 0);
|
|
Packit |
6f02de |
if (len >= 2)
|
|
Packit |
6f02de |
len -= 2;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
(void) fmtllnum(&bp,ep,llvalue,16,0,ljust,len,zpad);
|
|
Packit |
6f02de |
# else /* defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
(void) strncpy(ebuf, "ll is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (longflag)
|
|
Packit |
6f02de |
value = va_arg(args, long);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
value = va_arg(args, int);
|
|
Packit |
6f02de |
if (zxflag && value) {
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, "0x", 0);
|
|
Packit |
6f02de |
if (len >= 2)
|
|
Packit |
6f02de |
len -= 2;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
(void) fmtnum(&bp, ep, value, 16,0, ljust, len, zpad);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 'X':
|
|
Packit |
6f02de |
if (longlongflag) {
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
llvalue = va_arg(args, long long);
|
|
Packit |
6f02de |
if (zxflag && llvalue) {
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, "0x", 0);
|
|
Packit |
6f02de |
if (len >= 2)
|
|
Packit |
6f02de |
len -= 2;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
(void) fmtllnum(&bp,ep,llvalue,-16,0,ljust,len,zpad);
|
|
Packit |
6f02de |
# else /* defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
(void) strncpy(ebuf, "ll is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (longflag)
|
|
Packit |
6f02de |
value = va_arg(args, long);
|
|
Packit |
6f02de |
else
|
|
Packit |
6f02de |
value = va_arg(args, int);
|
|
Packit |
6f02de |
if (zxflag && value) {
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, "0x", 0);
|
|
Packit |
6f02de |
if (len >= 2)
|
|
Packit |
6f02de |
len -= 2;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
(void) fmtnum(&bp, ep, value,-16,0, ljust, len, zpad);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 's':
|
|
Packit |
6f02de |
strvalue = va_arg(args, char *);
|
|
Packit |
6f02de |
if (maxwidth > 0 || !pointflag) {
|
|
Packit |
6f02de |
if (pointflag && len > maxwidth)
|
|
Packit |
6f02de |
len = maxwidth; /* Adjust padding */
|
|
Packit |
6f02de |
(void) fmtstr(&bp, ep, strvalue, ljust, len, zpad,
|
|
Packit |
6f02de |
maxwidth);
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case 'c':
|
|
Packit |
6f02de |
ch = va_arg(args, int);
|
|
Packit |
6f02de |
dopr_outch(&bp, ep, ch);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
case '%':
|
|
Packit |
6f02de |
(void) dopr_outch(&bp, ep, ch);
|
|
Packit |
6f02de |
continue;
|
|
Packit |
6f02de |
default:
|
|
Packit |
6f02de |
ebuf[0] = ch;
|
|
Packit |
6f02de |
(void) strncpy(&ebuf[1], " is unsupported", ebufl);
|
|
Packit |
6f02de |
ebuf[(int)ebufl] = '\0';
|
|
Packit |
6f02de |
(void) dostr(&bp, ep, ebuf, 0);
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
default:
|
|
Packit |
6f02de |
(void) dopr_outch(&bp, ep, ch);
|
|
Packit |
6f02de |
break;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
*bp = '\0';
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
# if !defined(HAS_NO_LONG_LONG)
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* fmtllnum() -- format long long number for output
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
fmtllnum(bp, ep, value, base, dosign, ljust, len, zpad)
|
|
Packit |
6f02de |
char **bp; /* current buffer pointer */
|
|
Packit |
6f02de |
char *ep; /* end of buffer (-1) */
|
|
Packit |
6f02de |
long long value; /* number to format */
|
|
Packit |
6f02de |
int base; /* number base */
|
|
Packit |
6f02de |
int dosign; /* sign request */
|
|
Packit |
6f02de |
int ljust; /* left justfication request */
|
|
Packit |
6f02de |
int len; /* length request */
|
|
Packit |
6f02de |
int zpad; /* zero padding request */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
int signvalue = 0;
|
|
Packit |
6f02de |
unsigned long long uvalue;
|
|
Packit |
6f02de |
char convert[20];
|
|
Packit |
6f02de |
int place = 0;
|
|
Packit |
6f02de |
int padlen = 0; /* amount to pad */
|
|
Packit |
6f02de |
int caps = 0;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
uvalue = value;
|
|
Packit |
6f02de |
if (dosign) {
|
|
Packit |
6f02de |
if (value < 0) {
|
|
Packit |
6f02de |
signvalue = '-';
|
|
Packit |
6f02de |
uvalue = -value;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (base < 0) {
|
|
Packit |
6f02de |
caps = 1;
|
|
Packit |
6f02de |
base = -base;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
do {
|
|
Packit |
6f02de |
convert[place++] =
|
|
Packit |
6f02de |
(caps ? "0123456789ABCDEF" : "0123456789abcdef")
|
|
Packit |
6f02de |
[uvalue % (unsigned)base];
|
|
Packit |
6f02de |
uvalue = (uvalue / (unsigned)base);
|
|
Packit |
6f02de |
} while (uvalue && (place < (int)(sizeof(convert) - 1)));
|
|
Packit |
6f02de |
convert[place] = 0;
|
|
Packit |
6f02de |
padlen = len - place;
|
|
Packit |
6f02de |
if (padlen < 0)
|
|
Packit |
6f02de |
padlen = 0;
|
|
Packit |
6f02de |
if(ljust)
|
|
Packit |
6f02de |
padlen = -padlen;
|
|
Packit |
6f02de |
if (zpad && padlen > 0) {
|
|
Packit |
6f02de |
if (signvalue) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, signvalue);
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
signvalue = 0;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
while (padlen > 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, zpad);
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
while (padlen > 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (signvalue)
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, signvalue);
|
|
Packit |
6f02de |
while (place > 0)
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, convert[--place]);
|
|
Packit |
6f02de |
while (padlen < 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
++padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
# endif /* !defined(HAS_NO_LONG_LONG) */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* fmtnum() -- format number for output
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
fmtnum(bp, ep, value, base, dosign, ljust, len, zpad)
|
|
Packit |
6f02de |
char **bp; /* current buffer pointer */
|
|
Packit |
6f02de |
char *ep; /* end of buffer (-1) */
|
|
Packit |
6f02de |
long value; /* number to format */
|
|
Packit |
6f02de |
int base; /* number base */
|
|
Packit |
6f02de |
int dosign; /* sign request */
|
|
Packit |
6f02de |
int ljust; /* left justfication request */
|
|
Packit |
6f02de |
int len; /* length request */
|
|
Packit |
6f02de |
int zpad; /* zero padding request */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
int signvalue = 0;
|
|
Packit |
6f02de |
unsigned long uvalue;
|
|
Packit |
6f02de |
char convert[20];
|
|
Packit |
6f02de |
int place = 0;
|
|
Packit |
6f02de |
int padlen = 0; /* amount to pad */
|
|
Packit |
6f02de |
int caps = 0;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
uvalue = value;
|
|
Packit |
6f02de |
if (dosign) {
|
|
Packit |
6f02de |
if (value < 0) {
|
|
Packit |
6f02de |
signvalue = '-';
|
|
Packit |
6f02de |
uvalue = -value;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (base < 0) {
|
|
Packit |
6f02de |
caps = 1;
|
|
Packit |
6f02de |
base = -base;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
do {
|
|
Packit |
6f02de |
convert[place++] =
|
|
Packit |
6f02de |
(caps ? "0123456789ABCDEF" : "0123456789abcdef")
|
|
Packit |
6f02de |
[uvalue % (unsigned)base];
|
|
Packit |
6f02de |
uvalue = (uvalue / (unsigned)base);
|
|
Packit |
6f02de |
} while (uvalue && (place < (int)(sizeof(convert) - 1)));
|
|
Packit |
6f02de |
convert[place] = 0;
|
|
Packit |
6f02de |
padlen = len - place;
|
|
Packit |
6f02de |
if (padlen < 0)
|
|
Packit |
6f02de |
padlen = 0;
|
|
Packit |
6f02de |
if(ljust)
|
|
Packit |
6f02de |
padlen = -padlen;
|
|
Packit |
6f02de |
if (zpad && padlen > 0) {
|
|
Packit |
6f02de |
if (signvalue) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, signvalue);
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
signvalue = 0;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
while (padlen > 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, zpad);
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
while (padlen > 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (signvalue)
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, signvalue);
|
|
Packit |
6f02de |
while (place > 0)
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, convert[--place]);
|
|
Packit |
6f02de |
while (padlen < 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
++padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* fmtstr() -- format string for output
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
fmtstr(bp, ep, value, ljust, len, zpad, maxwidth)
|
|
Packit |
6f02de |
char **bp; /* current buffer pointer */
|
|
Packit |
6f02de |
char *ep; /* end of buffer (-1) */
|
|
Packit |
6f02de |
char *value; /* string to format */
|
|
Packit |
6f02de |
int ljust; /* left justification request */
|
|
Packit |
6f02de |
int len; /* length request */
|
|
Packit |
6f02de |
int zpad; /* zero padding request */
|
|
Packit |
6f02de |
int maxwidth; /* maximum width request */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
int padlen, strlen; /* amount to pad */
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
if (value == 0)
|
|
Packit |
6f02de |
value = "<NULL>";
|
|
Packit |
6f02de |
for (strlen = 0; value[strlen]; ++ strlen) /* strlen() */
|
|
Packit |
6f02de |
;
|
|
Packit |
6f02de |
if ((strlen > maxwidth) && maxwidth)
|
|
Packit |
6f02de |
strlen = maxwidth;
|
|
Packit |
6f02de |
padlen = len - strlen;
|
|
Packit |
6f02de |
if (padlen < 0)
|
|
Packit |
6f02de |
padlen = 0;
|
|
Packit |
6f02de |
if (ljust)
|
|
Packit |
6f02de |
padlen = -padlen;
|
|
Packit |
6f02de |
while (padlen > 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
--padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
(void) dostr(bp, ep, value, maxwidth);
|
|
Packit |
6f02de |
while (padlen < 0) {
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, ' ');
|
|
Packit |
6f02de |
++padlen;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* dostr() -- do string output
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
dostr(bp, ep, str, cut)
|
|
Packit |
6f02de |
char **bp; /* current buffer pointer */
|
|
Packit |
6f02de |
char *ep; /* end of buffer (-1) */
|
|
Packit |
6f02de |
char *str; /* string to output */
|
|
Packit |
6f02de |
int cut; /* limit on amount of string to output:
|
|
Packit |
6f02de |
* 0 == no limit */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
int f;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
f = cut ? 1 : 0;
|
|
Packit |
6f02de |
while (*str) {
|
|
Packit |
6f02de |
if (f) {
|
|
Packit |
6f02de |
if (cut-- > 0)
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, *str);
|
|
Packit |
6f02de |
} else
|
|
Packit |
6f02de |
(void) dopr_outch(bp, ep, *str);
|
|
Packit |
6f02de |
str++;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
/*
|
|
Packit |
6f02de |
* dopr_outch() -- output a character (or two)
|
|
Packit |
6f02de |
*/
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
static void
|
|
Packit |
6f02de |
dopr_outch(bp, ep, c)
|
|
Packit |
6f02de |
char **bp; /* current buffer pointer */
|
|
Packit |
6f02de |
char *ep; /* end of buffer (-1) */
|
|
Packit |
6f02de |
int c; /* character to output */
|
|
Packit |
6f02de |
{
|
|
Packit |
6f02de |
register char *cp = *bp;
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
if (iscntrl(c) && c != '\n' && c != '\t') {
|
|
Packit |
6f02de |
c = '@' + (c & 0x1F);
|
|
Packit |
6f02de |
if (cp < ep)
|
|
Packit |
6f02de |
*cp++ = '^';
|
|
Packit |
6f02de |
Length++;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
if (cp < ep)
|
|
Packit |
6f02de |
*cp++ = c;
|
|
Packit |
6f02de |
*bp = cp;
|
|
Packit |
6f02de |
Length++;
|
|
Packit |
6f02de |
}
|
|
Packit |
6f02de |
|
|
Packit |
6f02de |
#else /* !defined(USE_LIB_SNPF) */
|
|
Packit |
6f02de |
char snpf_d1[] = "d"; char *snpf_d2 = snpf_d1;
|
|
Packit |
6f02de |
#endif /* defined(USE_LIB_SNPF) */
|