* Copyright (c) 1989 The Regents of the University of California.
* Redistribution and use in source and binary forms are permitted
* provided that the above copyright notice and this paragraph are
* duplicated in all such forms and that any documentation,
* advertising materials, and other materials related to such
* distribution and use acknowledge that the software was developed
* by the University of California, Berkeley. The name of the
* University may not be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
"@(#) Copyright (c) 1989 The Regents of the University of California.\n\
static char sccsid
[] = "@(#)printf.c 5.4 (Berkeley) %G%";
(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
);
if (*fmt
== '%' && *++fmt
!= '%')
/* skip to field width */
for (; index(skip1
, *fmt
); ++fmt
);
/* skip to possible '.' */
for (; index(skip2
, *fmt
); ++fmt
);
/* 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((long)asciicode());
if (index(number
, **gargv
))
return((double)asciicode());
if (ch
== '\'' || ch
== '"')