source: trunk/libs/newlib/src/newlib/libc/stdio/nano-vfscanf_local.h

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

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

File size: 6.1 KB
Line 
1/*-
2 * Copyright (c) 1990 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/*
19 * Copyright (c) 2012-2014 ARM Ltd
20 * All rights reserved.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the above copyright
26 *    notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 *    notice, this list of conditions and the following disclaimer in the
29 *    documentation and/or other materials provided with the distribution.
30 * 3. The name of the company may not be used to endorse or promote
31 *    products derived from this software without specific prior written
32 *    permission.
33 *
34 * THIS SOFTWARE IS PROVIDED BY ARM LTD ``AS IS'' AND ANY EXPRESS OR IMPLIED
35 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
36 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
37 * IN NO EVENT SHALL ARM LTD BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
38 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
39 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
40 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
41 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
42 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
43 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
44 */
45
46#ifndef VFSCANF_LOCAL
47#define VFSCANF_LOCAL
48
49#ifndef NO_FLOATING_POINT
50#define FLOATING_POINT
51#endif
52
53#ifdef STRING_ONLY
54#undef _newlib_flockfile_start
55#undef _newlib_flockfile_exit
56#undef _newlib_flockfile_end
57#define _newlib_flockfile_start(x) {}
58#define _newlib_flockfile_exit(x) {}
59#define _newlib_flockfile_end(x) {}
60#define _ungetc_r _sungetc_r
61#define __srefill_r __ssrefill_r
62#endif
63
64#ifdef FLOATING_POINT
65#include <math.h>
66#include <float.h>
67
68/* Currently a test is made to see if long double processing is warranted.
69   This could be changed in the future should the _ldtoa_r code be
70   preferred over _dtoa_r.  */
71#define _NO_LONGDBL
72
73#include "floatio.h"
74
75#if ((MAXEXP+MAXFRACT+3) > MB_LEN_MAX)
76/* "3 = sign + decimal point + NUL".  */
77# define BUF (MAXEXP+MAXFRACT+3)
78#else
79# define BUF MB_LEN_MAX
80#endif
81
82/* An upper bound for how long a long prints in decimal.  4 / 13 approximates
83   log (2).  Add one char for roundoff compensation and one for the sign.  */
84#define MAX_LONG_LEN ((CHAR_BIT * sizeof (long)  - 1) * 4 / 13 + 2)
85#else
86#define BUF     40
87#endif
88
89
90#define _NO_LONGLONG
91#undef _WANT_IO_C99_FORMATS
92#undef _WANT_IO_POS_ARGS
93
94#define _NO_POS_ARGS
95
96/* Macros for converting digits to letters and vice versa.  */
97#define to_digit(c)     ((c) - '0')
98#define is_digit(c)     ((unsigned)to_digit (c) <= 9)
99#define to_char(n)      ((n) + '0')
100
101/*
102 * Flags used during conversion.
103 */
104
105#define SHORT           0x01    /* "h": short.  */
106#define LONG            0x02    /* "l": long or double.  */
107#define LONGDBL         0x04    /* "L/ll": long double or long long.  */
108#define CHAR            0x08    /* "hh": 8 bit integer.  */
109#define SUPPRESS        0x10    /* Suppress assignment.  */
110#define POINTER         0x20    /* Weird %p pointer (`fake hex').  */
111#define NOSKIP          0x40    /* Do not skip blanks */
112
113/* The following are used in numeric conversions only:
114   SIGNOK, NDIGITS, DPTOK, and EXPOK are for floating point;
115   SIGNOK, NDIGITS, PFXOK, and NZDIGITS are for integral.  */
116
117#define SIGNOK          0x80    /* "+/-" is (still) legal.  */
118#define NDIGITS         0x100   /* No digits detected.  */
119
120#define DPTOK           0x200   /* (Float) decimal point is still legal.  */
121#define EXPOK           0x400   /* (Float) exponent (e+3, etc) still legal.  */
122
123#define PFXOK           0x200   /* "0x" prefix is (still) legal.  */
124#define NZDIGITS        0x400   /* No zero digits detected.  */
125#define NNZDIGITS       0x800   /* No non-zero digits detected.  */
126
127/* Conversion types.  */
128
129#define CT_CHAR         0       /* "%c" conversion.  */
130#define CT_CCL          1       /* "%[...]" conversion.  */
131#define CT_STRING       2       /* "%s" conversion.  */
132#define CT_INT          3       /* Integer, i.e., strtol.  */
133#define CT_UINT         4       /* Unsigned integer, i.e., strtoul.  */
134#define CT_FLOAT        5       /* Floating, i.e., strtod.  */
135
136#define u_char unsigned char
137#define u_long unsigned long
138
139/* Macro to support positional arguments.  */
140#define GET_ARG(n, ap, type) (va_arg ((ap), type))
141
142#define MATCH_FAILURE   1
143#define INPUT_FAILURE   2
144
145
146/* All data needed to decode format string are kept in below struct.  */
147struct _scan_data_t
148{
149  int flags;            /* Flags.  */
150  int base;             /* Base.  */
151  size_t width;         /* Width.  */
152  int nassigned;        /* Number of assignments so far.  */
153  int nread;            /* Number of chars read so far.  */
154  char *ccltab;         /* Table used for [ format.  */
155  int code;             /* Current conversion specifier.  */
156  char buf[BUF];        /* Internal buffer for scan.  */
157  /* Internal buffer for scan.  */
158  int (*pfn_ungetc)(struct _reent*, int, FILE*);
159  /* Internal buffer for scan.  */
160  int (*pfn_refill)(struct _reent*, FILE*);
161};
162
163extern int
164_scanf_chars (struct _reent *rptr,
165              struct _scan_data_t *pdata,
166              FILE *fp, va_list *ap);
167extern int
168_scanf_i (struct _reent *rptr,
169          struct _scan_data_t *pdata,
170          FILE *fp, va_list *ap);
171/* Make _scanf_float weak symbol, so it won't be linked in if target program
172   does not need it.  */
173extern int
174_scanf_float (struct _reent *rptr,
175              struct _scan_data_t *pdata,
176              FILE *fp, va_list *ap) _ATTRIBUTE((__weak__));
177
178#endif
Note: See TracBrowser for help on using the repository browser.