OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [libiberty/] [vsnprintf.c] - Blame information for rev 853

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 227 jeremybenn
/* Implement the vsnprintf function.
2
   Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3
   Written by Kaveh R. Ghazi <ghazi@caip.rutgers.edu>.
4
 
5
This file is part of the libiberty library.  This library is free
6
software; you can redistribute it and/or modify it under the
7
terms of the GNU General Public License as published by the
8
Free Software Foundation; either version 2, or (at your option)
9
any later version.
10
 
11
This library is distributed in the hope that it will be useful,
12
but WITHOUT ANY WARRANTY; without even the implied warranty of
13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
GNU General Public License for more details.
15
 
16
You should have received a copy of the GNU General Public License
17
along with GNU CC; see the file COPYING.  If not, write to
18
the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
19
 
20
As a special exception, if you link this library with files
21
compiled with a GNU compiler to produce an executable, this does not cause
22
the resulting executable to be covered by the GNU General Public License.
23
This exception does not however invalidate any other reasons why
24
the executable file might be covered by the GNU General Public License. */
25
 
26
/*
27
 
28
@deftypefn Supplemental int vsnprintf (char *@var{buf}, size_t @var{n}, const char *@var{format}, va_list @var{ap})
29
 
30
This function is similar to @code{vsprintf}, but it will write to
31
@var{buf} at most @code{@var{n}-1} bytes of text, followed by a
32
terminating null byte, for a total of @var{n} bytes.  On error the
33
return value is -1, otherwise it returns the number of characters that
34
would have been printed had @var{n} been sufficiently large,
35
regardless of the actual value of @var{n}.  Note some pre-C99 system
36
libraries do not implement this correctly so users cannot generally
37
rely on the return value if the system version of this function is
38
used.
39
 
40
@end deftypefn
41
 
42
*/
43
 
44
#include "config.h"
45
#include "ansidecl.h"
46
 
47
#include <stdarg.h>
48
#ifdef HAVE_STRING_H
49
#include <string.h>
50
#endif
51
#ifdef HAVE_STDLIB_H
52
#include <stdlib.h>
53
#endif
54
 
55
#include "libiberty.h"
56
 
57
/* This implementation relies on a working vasprintf.  */
58
int
59
vsnprintf (char *s, size_t n, const char *format, va_list ap)
60
{
61
  char *buf = 0;
62
  int result = vasprintf (&buf, format, ap);
63
 
64
  if (!buf)
65
    return -1;
66
  if (result < 0)
67
    {
68
      free (buf);
69
      return -1;
70
    }
71
 
72
  result = strlen (buf);
73
  if (n > 0)
74
    {
75
      if ((long) n > result)
76
        memcpy (s, buf, result+1);
77
      else
78
        {
79
          memcpy (s, buf, n-1);
80
          s[n - 1] = 0;
81
        }
82
    }
83
  free (buf);
84
  return result;
85
}
86
 
87
#ifdef TEST
88
/* Set the buffer to a known state.  */
89
#define CLEAR(BUF) do { memset ((BUF), 'X', sizeof (BUF)); (BUF)[14] = '\0'; } while (0)
90
/* For assertions.  */
91
#define VERIFY(P) do { if (!(P)) abort(); } while (0)
92
 
93
static int ATTRIBUTE_PRINTF_3
94
checkit (char *s, size_t n, const char *format, ...)
95
{
96
  int result;
97
  VA_OPEN (ap, format);
98
  VA_FIXEDARG (ap, char *, s);
99
  VA_FIXEDARG (ap, size_t, n);
100
  VA_FIXEDARG (ap, const char *, format);
101
  result = vsnprintf (s, n, format, ap);
102
  VA_CLOSE (ap);
103
  return result;
104
}
105
 
106
extern int main (void);
107
int
108
main (void)
109
{
110
  char buf[128];
111
  int status;
112
 
113
  CLEAR (buf);
114
  status = checkit (buf, 10, "%s:%d", "foobar", 9);
115
  VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0);
116
 
117
  CLEAR (buf);
118
  status = checkit (buf, 9, "%s:%d", "foobar", 9);
119
  VERIFY (status==8 && memcmp (buf, "foobar:9\0XXXXX\0", 15) == 0);
120
 
121
  CLEAR (buf);
122
  status = checkit (buf, 8, "%s:%d", "foobar", 9);
123
  VERIFY (status==8 && memcmp (buf, "foobar:\0XXXXXX\0", 15) == 0);
124
 
125
  CLEAR (buf);
126
  status = checkit (buf, 7, "%s:%d", "foobar", 9);
127
  VERIFY (status==8 && memcmp (buf, "foobar\0XXXXXXX\0", 15) == 0);
128
 
129
  CLEAR (buf);
130
  status = checkit (buf, 6, "%s:%d", "foobar", 9);
131
  VERIFY (status==8 && memcmp (buf, "fooba\0XXXXXXXX\0", 15) == 0);
132
 
133
  CLEAR (buf);
134
  status = checkit (buf, 2, "%s:%d", "foobar", 9);
135
  VERIFY (status==8 && memcmp (buf, "f\0XXXXXXXXXXXX\0", 15) == 0);
136
 
137
  CLEAR (buf);
138
  status = checkit (buf, 1, "%s:%d", "foobar", 9);
139
  VERIFY (status==8 && memcmp (buf, "\0XXXXXXXXXXXXX\0", 15) == 0);
140
 
141
  CLEAR (buf);
142
  status = checkit (buf, 0, "%s:%d", "foobar", 9);
143
  VERIFY (status==8 && memcmp (buf, "XXXXXXXXXXXXXX\0", 15) == 0);
144
 
145
  return 0;
146
}
147
#endif /* TEST */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.