* Copyright (c) 1989 The Regents of the University of California.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and 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
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
"@(#) Copyright (c) 1989 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)printf.c 5.9 (Berkeley) 6/1/90";
(void)printf(f, fieldwidth, precision, func); \
(void)printf(f, fieldwidth, func); \
(void)printf(f, precision, func); \
static char *skip1
, *skip2
;
register char *format
, *fmt
, *start
;
register int end
, fieldwidth
, precision
;
char convch
, nextch
, *getstr(), *index(), *mklong();
fprintf(stderr
, "usage: printf format [arg ...]\n");
* Basic algorithm is to scan the format string for conversion
* specifications -- once one is found, find out if the field
* width or precision is a '*'; if it is, gather up value. Note,
* format strings are reused as necessary to use up the provided
* arguments, arguments of zero/null string are provided to use
escape(fmt
= format
= *++argv
); /* backslash interpretation */
/* find next format specification */
next
: for (start
= fmt
;; ++fmt
) {
/* avoid infinite loop */
"printf: missing format character.\n");
(void)printf("%s", start
);
(void)printf("%s", start
);
/* skip to field width */
for (; index(skip1
, *fmt
); ++fmt
);
fieldwidth
= *fmt
== '*' ? getint() : 0;
/* skip to possible '.', get following precision */
for (; index(skip2
, *fmt
); ++fmt
);
precision
= *fmt
== '*' ? getint() : 0;
/* skip to conversion char */
for (; index(skip2
, *fmt
); ++fmt
);
fprintf(stderr
, "printf: missing format character.\n");
case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
char *f
= mklong(start
, convch
);
case 'e': case 'E': case 'f': case 'g': case 'G': {
fprintf(stderr
, "printf: illegal format character.\n");
if (!(copy
= malloc((u_int
)len
))) { /* never freed; XXX */
fprintf(stderr
, "printf: out of memory.\n");
bcopy(str
, copy
, len
- 3);
for (store
= fmt
; c
= *fmt
; ++fmt
, ++store
) {
case '\0': /* EOS, user error */
case '\\': /* backslash */
case '\'': /* single quote */
case 'a': /* bell/alert */
case 'b': /* backspace */
case 'f': /* form-feed */
case 'r': /* carriage-return */
case 't': /* horizontal tab */
case 'v': /* vertical tab */
case '0': case '1': case '2': case '3':
case '4': case '5': case '6': case '7':
c
-- && *fmt
>= '0' && *fmt
<= '7'; ++fmt
) {
static char *number
= "+-.0123456789";
if (index(number
, **gargv
))
if (index(number
, **gargv
))
return(strtol(*gargv
++, (char **)NULL
, 0));
return((long)asciicode());
if (index(number
, **gargv
))
return((double)asciicode());
if (ch
== '\'' || ch
== '"')