source: trunk/libs/newlib/src/newlib/libc/stdio/sniprintf.c @ 567

Last change on this file since 567 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.1 KB
Line 
1/*
2 * Copyright (c) 1990, 2007 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
6 * provided that the above copyright notice and this paragraph are
7 * duplicated in all such forms and that any documentation,
8 * advertising materials, and other materials related to such
9 * distribution and use acknowledge that the software was developed
10 * by the University of California, Berkeley.  The name of the
11 * University may not be used to endorse or promote products derived
12 * from this software without specific prior written permission.
13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16 */
17
18/* This code created by modifying snprintf.c so copyright inherited. */
19/* doc in siprintf.c */
20
21#include <_ansi.h>
22#include <reent.h>
23#include <stdio.h>
24#include <stdarg.h>
25#include <limits.h>
26#include <errno.h>
27#include "local.h"
28
29int
30_sniprintf_r (struct _reent *ptr,
31        char *str,
32        size_t size,
33        const char *fmt, ...)
34{
35  int ret;
36  va_list ap;
37  FILE f;
38
39  if (size > INT_MAX)
40    {
41      ptr->_errno = EOVERFLOW;
42      return EOF;
43    }
44  f._flags = __SWR | __SSTR;
45  f._bf._base = f._p = (unsigned char *) str;
46  f._bf._size = f._w = (size > 0 ? size - 1 : 0);
47  f._file = -1;  /* No file. */
48  va_start (ap, fmt);
49  ret = _svfiprintf_r (ptr, &f, fmt, ap);
50  va_end (ap);
51  if (ret < EOF)
52    ptr->_errno = EOVERFLOW;
53  if (size > 0)
54    *f._p = 0;
55  return (ret);
56}
57
58#ifndef _REENT_ONLY
59
60int
61sniprintf (char *str,
62        size_t size,
63        const char *fmt, ...)
64{
65  int ret;
66  va_list ap;
67  FILE f;
68  struct _reent *ptr = _REENT;
69
70  if (size > INT_MAX)
71    {
72      ptr->_errno = EOVERFLOW;
73      return EOF;
74    }
75  f._flags = __SWR | __SSTR;
76  f._bf._base = f._p = (unsigned char *) str;
77  f._bf._size = f._w = (size > 0 ? size - 1 : 0);
78  f._file = -1;  /* No file. */
79  va_start (ap, fmt);
80  ret = _svfiprintf_r (ptr, &f, fmt, ap);
81  va_end (ap);
82  if (ret < EOF)
83    ptr->_errno = EOVERFLOW;
84  if (size > 0)
85    *f._p = 0;
86  return (ret);
87}
88
89#endif
Note: See TracBrowser for help on using the repository browser.