Blame lib/snpf.c

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) */