xref: /dflybsd-src/contrib/gmp/scanf/vsscanf.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
1*86d7f5d3SJohn Marino /* gmp_vsscanf -- formatted input from a string.
2*86d7f5d3SJohn Marino 
3*86d7f5d3SJohn Marino Copyright 2001, 2002 Free Software Foundation, Inc.
4*86d7f5d3SJohn Marino 
5*86d7f5d3SJohn Marino This file is part of the GNU MP Library.
6*86d7f5d3SJohn Marino 
7*86d7f5d3SJohn Marino The GNU MP Library is free software; you can redistribute it and/or modify
8*86d7f5d3SJohn Marino it under the terms of the GNU Lesser General Public License as published by
9*86d7f5d3SJohn Marino the Free Software Foundation; either version 3 of the License, or (at your
10*86d7f5d3SJohn Marino option) any later version.
11*86d7f5d3SJohn Marino 
12*86d7f5d3SJohn Marino The GNU MP Library is distributed in the hope that it will be useful, but
13*86d7f5d3SJohn Marino WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14*86d7f5d3SJohn Marino or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
15*86d7f5d3SJohn Marino License for more details.
16*86d7f5d3SJohn Marino 
17*86d7f5d3SJohn Marino You should have received a copy of the GNU Lesser General Public License
18*86d7f5d3SJohn Marino along with the GNU MP Library.  If not, see http://www.gnu.org/licenses/.  */
19*86d7f5d3SJohn Marino 
20*86d7f5d3SJohn Marino #include "config.h"
21*86d7f5d3SJohn Marino 
22*86d7f5d3SJohn Marino #if HAVE_STDARG
23*86d7f5d3SJohn Marino #include <stdarg.h>
24*86d7f5d3SJohn Marino #else
25*86d7f5d3SJohn Marino #include <varargs.h>
26*86d7f5d3SJohn Marino #endif
27*86d7f5d3SJohn Marino 
28*86d7f5d3SJohn Marino #include <string.h>
29*86d7f5d3SJohn Marino 
30*86d7f5d3SJohn Marino #include "gmp.h"
31*86d7f5d3SJohn Marino #include "gmp-impl.h"
32*86d7f5d3SJohn Marino 
33*86d7f5d3SJohn Marino 
34*86d7f5d3SJohn Marino int
gmp_vsscanf(const char * s,const char * fmt,va_list ap)35*86d7f5d3SJohn Marino gmp_vsscanf (const char *s, const char *fmt, va_list ap)
36*86d7f5d3SJohn Marino {
37*86d7f5d3SJohn Marino #if SSCANF_WRITABLE_INPUT
38*86d7f5d3SJohn Marino   /* We only actually need this if there's standard C types in fmt, and if
39*86d7f5d3SJohn Marino      "s" is not already writable, but it's too much trouble to check that,
40*86d7f5d3SJohn Marino      and in any case this writable sscanf input business is only for a few
41*86d7f5d3SJohn Marino      old systems. */
42*86d7f5d3SJohn Marino   size_t size;
43*86d7f5d3SJohn Marino   char   *alloc;
44*86d7f5d3SJohn Marino   int    ret;
45*86d7f5d3SJohn Marino   size = strlen (s) + 1;
46*86d7f5d3SJohn Marino   alloc = (char *) (*__gmp_allocate_func) (size);
47*86d7f5d3SJohn Marino   memcpy (alloc, s, size);
48*86d7f5d3SJohn Marino   s = alloc;
49*86d7f5d3SJohn Marino   ret = __gmp_doscan (&__gmp_sscanf_funs, (void *) &s, fmt, ap);
50*86d7f5d3SJohn Marino   (*__gmp_free_func) (alloc, size);
51*86d7f5d3SJohn Marino   return ret;
52*86d7f5d3SJohn Marino 
53*86d7f5d3SJohn Marino #else
54*86d7f5d3SJohn Marino   return __gmp_doscan (&__gmp_sscanf_funs, (void *) &s, fmt, ap);
55*86d7f5d3SJohn Marino #endif
56*86d7f5d3SJohn Marino }
57