Annotation of sys/lib/libsa/snprintf.c, Revision 1.1.1.1
1.1 nbrk 1: /* $OpenBSD: snprintf.c,v 1.4 2004/01/03 14:08:53 espie Exp $ */
2: /* $NetBSD: printf.c,v 1.10 1996/11/30 04:19:21 gwr Exp $ */
3:
4: /*-
5: * Copyright (c) 1993
6: * The Regents of the University of California. All rights reserved.
7: *
8: * Redistribution and use in source and binary forms, with or without
9: * modification, are permitted provided that the following conditions
10: * are met:
11: * 1. Redistributions of source code must retain the above copyright
12: * notice, this list of conditions and the following disclaimer.
13: * 2. Redistributions in binary form must reproduce the above copyright
14: * notice, this list of conditions and the following disclaimer in the
15: * documentation and/or other materials provided with the distribution.
16: * 3. Neither the name of the University nor the names of its contributors
17: * may be used to endorse or promote products derived from this software
18: * without specific prior written permission.
19: *
20: * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23: * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30: * SUCH DAMAGE.
31: *
32: * @(#)printf.c 8.1 (Berkeley) 6/11/93
33: */
34:
35: #include <sys/cdefs.h>
36: #include <sys/types.h>
37: #include <sys/stdarg.h>
38:
39: #include "stand.h"
40:
41: extern void kprintn(void (*)(int), u_long, int);
42: extern void kdoprnt(void (*)(int), const char *, va_list);
43:
44: #ifndef STRIPPED
45: static void sputchar(int);
46:
47: static char *sbuf, *sbuf_end;
48: static size_t sbuf_len;
49:
50: void
51: sputchar(int c)
52: {
53: if (sbuf < sbuf_end)
54: *sbuf = c;
55: sbuf++;
56: }
57:
58: int
59: snprintf(char *buf, size_t len, const char *fmt, ...)
60: {
61: va_list ap;
62:
63: sbuf = buf;
64: sbuf_len = len;
65: sbuf_end = sbuf + len;
66: va_start(ap, fmt);
67: kdoprnt(sputchar, fmt, ap);
68: va_end(ap);
69:
70: if (sbuf < sbuf_end)
71: *sbuf = '\0';
72: else if (len > 0)
73: *(sbuf_end - 1) = '\0';
74:
75: return sbuf - buf;
76: }
77:
78: #endif /* STRIPPED */
CVSweb