1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/* $NetBSD: vprintf.c,v 1.9 2006/03/14 17:42:06 christos Exp $ */
/*
* Copyright (c) 1991 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie the rights
* to redistribute these changes.
*/
/*
* varargs versions of printf routines
*
**********************************************************************
* HISTORY
* Revision 2.5 89/09/08 18:15:55 mbj
* Use _doprnt() for the Multimax (an "old" architecture).
* [89/09/08 mbj]
*
* Revision 2.4 89/08/03 14:40:10 mja
* Add vsnprintf() routine.
* [89/07/12 mja]
*
* Terminate vsprintf() string with null byte.
* [89/04/21 mja]
*
* Change to use new hidden name for _doprnt on MIPS.
* [89/04/18 mja]
*
* Revision 2.3 89/06/10 14:13:43 gm0w
* Added putc of NULL byte to vsprintf.
* [89/06/10 gm0w]
*
* Revision 2.2 88/12/13 13:53:17 gm0w
* From Brad White.
* [88/12/13 gm0w]
************************************************************
*/
#include <stdio.h>
#include <stdarg.h>
#ifdef _IOSTRG
#define STRFLAG (_IOSTRG|_IOWRT)/* no _IOWRT: avoid stdio bug */
#else
#define STRFLAG (_IOREAD) /* XXX: Assume svr4 stdio */
#endif
#ifdef DOPRINT_VA
/*
* system provides _doprnt_va routine
*/
#define _doprnt _doprnt_va
#else
/*
* system provides _doprnt routine
*/
#define _doprnt_va _doprnt
#endif
#ifdef NEED_VPRINTF
int
vprintf(fmt, args)
char *fmt;
va_list args;
{
_doprnt(fmt, args, stdout);
return (ferror(stdout) ? EOF : 0);
}
int
vfprintf(f, fmt, args)
FILE *f;
char *fmt;
va_list args;
{
_doprnt(fmt, args, f);
return (ferror(f) ? EOF : 0);
}
int
vsprintf(s, fmt, args)
char *s, *fmt;
va_list args;
{
FILE fakebuf;
fakebuf._flag = STRFLAG;
fakebuf._base = (void *) s;
fakebuf._ptr = (void *) s;
fakebuf._cnt = 32767;
_doprnt(fmt, args, &fakebuf);
putc('\0', &fakebuf);
return (strlen(s));
}
#endif /* NEED_VPRINTF */
#if defined(NEED_VSNPRINTF) || defined(NEED_VPRINTF)
int
vsnprintf(s, n, fmt, args)
char *s, *fmt;
va_list args;
{
FILE fakebuf;
fakebuf._flag = STRFLAG;
fakebuf._base = (void *) s;
fakebuf._ptr = (void *) s;
fakebuf._cnt = n - 1;
fakebuf._file = -1;
_doprnt(fmt, args, &fakebuf);
fakebuf._cnt++;
putc('\0', &fakebuf);
if (fakebuf._cnt < 0)
fakebuf._cnt = 0;
return (n - fakebuf._cnt - 1);
}
#endif /* NEED_VPRINTF || NEED_VSNPRINTF */
|